On Wed, Sep 5, 2018 at 5:22 AM Richard Hipp <d...@sqlite.org> wrote: > On 9/4/18, Brian Vincent <bra...@gmail.com> wrote: > > Hi, I'm currently writing a Go sqlite package, go-sqlite-lite. I think > it > > provides a good "pure" SQLite experience with Go. > > > > If I want to make sure that the sqlite3_column_* functions never provide > a > > false answer due to an error condition, like a memolry allocation error, > > how should I go about that? The documentation seems inconsistent here. > > > > The documentation about sqlite3_column_*: > > > >> If a memory allocation error occurs during the evaluation of any of > these > > routines, a default value is returned. The default value is either the > > integer 0, the floating point number 0.0, or a NULL pointer. Subsequent > > calls to sqlite3_errcode() will return SQLITE_NOMEM. > > > > The documentation about sqlite3_errcode(): > > > >> If the most recent sqlite3_* API call associated with database > connection > > D failed, then the sqlite3_errcode(D) interface returns the numeric > result > > code or extended result code for that API call. If the most recent API > call > > was successful, then the return value from sqlite3_errcode() is > undefined. > > The sqlite3_extended_errcode() interface is the same except that it > always > > returns the extended result code even when extended result codes are > > disabled. > > > > 1. How can I check the error code if I'm unsure if the column function > was > > successful or not? If it was successful, then the error code is > undefined. > > Just call sqlite3_errcode(). It will return SQLITE_OK if the > sqlite3_column function was successful. If sqlite3_errorcode() > returns something other than SQLITE_OK, then some recent API failed. > It might not have been the sqlite3_column function, but it is still a > failures, so just go with it. >
From my testing, it appears that this information isn't exactly correct. In my tests, when I call sqlite3_column_int64 for example, and it's successful, sqlite_errcode() immediately afterwards is returning SQLITE_ROW, which leads me to believe that it's not setting the error code to SQLITE_OK when it's successful. If I can't trust sqlite_errcode() when it's successful, how can I be sure that it succeeded? > > > 2. Is SQLITE_NOMEM the only error code possible for the sqlite3_column_* > > functions? > > SQLITE_RANGE if you provide an invalid column number. SQLITE_MISUSE > if the prepared statement has been reset or finalized. That is all in > the current implementation, but new error codes might be added in the > future. > > > 3. Is it possible for every single one of the sqlite3_column_* functions > > to fail in this manner? > > I think only the routines that returns TEXT and BLOB use malloc() in > the current implementation. That might change in the future though. > > > -- > D. Richard Hipp > d...@sqlite.org > _______________________________________________ > sqlite-users mailing list > sqlite-users@mailinglists.sqlite.org > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users > _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users