Fix earliest UID assertion: Closes #7390

MIN() and MAX() in Sqlite returns an unanticipated NULL when a column
result set is empty.  Fix is to catch when that happens.
This commit is contained in:
Jim Nelson 2013-08-26 12:35:47 -07:00
parent 0129af9c81
commit 59c1f1215d
2 changed files with 22 additions and 1 deletions

View file

@ -43,6 +43,18 @@ public class Geary.Db.Result : Geary.Db.Context {
return !finished;
}
/**
* column is zero-based.
*/
public bool is_null_at(int column) throws DatabaseError {
verify_at(column);
bool is_null = statement.stmt.column_type(column) == Sqlite.NULL;
log("is_null_at(%d) -> %s", column, is_null.to_string());
return is_null;
}
/**
* column is zero-based.
*/
@ -148,6 +160,14 @@ public class Geary.Db.Result : Geary.Db.Context {
throw new DatabaseError.LIMITS("column %d >= %d", column, count);
}
/**
* name is the name of the column in the result set. See Statement.get_column_index() for name
* matching rules.
*/
public bool is_null_for(string name) throws DatabaseError {
return is_null_at(convert_for(name));
}
/**
* name is the name of the column in the result set. See Statement.get_column_index() for name
* matching rules.

View file

@ -699,7 +699,8 @@ private class Geary.ImapDB.Folder : BaseObject, Geary.ReferenceSemantics {
stmt.bind_rowid(0, folder_id);
Db.Result results = stmt.exec(cancellable);
if (!results.finished)
// MIN and MAX return NULL if the result set being examined is zero-length
if (!results.finished && !results.is_null_at(0))
id = new ImapDB.EmailIdentifier(results.rowid_at(1), new Imap.UID(results.int64_at(0)));
return Db.TransactionOutcome.DONE;