Perhaps. In order for the sqlite3_errcode(db) to have any meaning then the immediately preceding API call must have failed with an error (that is, returned a result other than SQLITE_OK, SQLITE_ROW, or SQLITE_DONE). The sqlite3_errcode is *ONLY* updated when there is an error (ie, the return code from an API call is not OK / ROW / DONE). Otherwise calling the sqlite3_errcode function will either return the errorcode from the most recently called failing API call or whatever garbage happens to be contained in that memory location.
According to the documentation: "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." where undefined means that the value returned has no meaning ... "If an interface fails with SQLITE_MISUSE, that means the interface was invoked incorrectly by the application. In that case, the error code and message may or may not be set." So, if and only if "rc = sqlite3_<api>(...)" returns a code (rc) which is *NOT* SQLITE_OK (0), SQLITE_ROW (100), SQLITE_DONE (101) is the sqlite3_errcode meaningful with the caveat that if rc is SQLITE_MISUSE (23) then mayhaps yes and mayhaps no be meaningful. It also only returns data for the last API call on a connection. so the idea is that you get the return code of the API call ... if and only if this is a failure (not in [SQLITE_OK, SQLITE_ROW, SQLITE_DONE]) should you even look at the sqlite3_errcode if the original API return code was SQLITE_MISUSE then the result of sqlite3_errcode may mean something and may not --- The fact that there's a Highway to Hell but only a Stairway to Heaven says a lot about anticipated traffic volume. >-----Original Message----- >From: sqlite-users [mailto:sqlite-users- >boun...@mailinglists.sqlite.org] On Behalf Of Igor Korot >Sent: Monday, 4 June, 2018 12:15 >To: SQLite mailing list >Subject: Re: [sqlite] Reset the cursor > >Keith, > >On Mon, Jun 4, 2018 at 12:59 PM, Keith Medcalf <kmedc...@dessus.com> >wrote: >> >> Yes, if it is 3.6.23.1 or earlier or the sqlite3 library was >compiled with SQLITE_OMIT_AUTORESET you will get an SQLITE_MISUSE >error on the 3rd loop because the statement was not reset. > >One more thing: > >Is my assumption correct that sqlite3_errcode() returning 0, indicate >there was no error? > >Thank you. > >> >> --- >> The fact that there's a Highway to Hell but only a Stairway to >Heaven says a lot about anticipated traffic volume. >> >> >>>-----Original Message----- >>>From: sqlite-users [mailto:sqlite-users- >>>boun...@mailinglists.sqlite.org] On Behalf Of Igor Korot >>>Sent: Monday, 4 June, 2018 11:50 >>>To: SQLite mailing list >>>Subject: Re: [sqlite] Reset the cursor >>> >>>Keith, >>> >>>On Mon, Jun 4, 2018 at 12:35 PM, Keith Medcalf ><kmedc...@dessus.com> >>>wrote: >>>> >>>> #include "sqlite3.h" >>>> #include <stdio.h> >>>> >>>> void main(int argc, char** argv) >>>> { >>>> sqlite3* db = 0; >>>> sqlite3_stmt* stmt = 0; >>>> char* rest = 0; >>>> int rc = 0; >>>> int value = 0; >>>> sqlite3_open(":memory:", &db); >>>> rc = sqlite3_prepare_v2(db, "select value from >generate_series >>>where start=1 and stop=10;", -1, &stmt, (void*)&rest); >>>> if (rc != SQLITE_OK) >>>> { >>>> printf("Error %d during prepare\n", rc); >>>> return; >>>> } >>>> printf("\nLoop 1, no reset, reset at 5\n"); >>>> for (;;) >>>> { >>>> rc = sqlite3_step(stmt); >>>> if (rc == SQLITE_DONE | value == 5) >>>> { >>>> printf("!\n"); >>>> rc = sqlite3_reset(stmt); >>>> printf("sqlite3_reset returns %d\n", rc); >>>> break; >>>> } >>>> if (rc == SQLITE_ROW) >>>> { >>>> value = sqlite3_column_int(stmt, 0); >>>> printf("%d ", value); >>>> continue; >>>> } >>>> printf("Error during stepping %d\n", rc); >>>> rc = sqlite3_reset(stmt); >>>> printf("sqlite3_reset returns %d\n", rc); >>>> break; >>>> } >>>> printf("\nLoop 2, After Reset\n"); >>>> for (;;) >>>> { >>>> rc = sqlite3_step(stmt); >>>> if (rc == SQLITE_DONE) >>>> { >>>> printf("!\n"); >>>> // rc = sqlite3_reset(stmt); >>>> // printf("sqlite3_reset returns %d\n", rc); >>>> break; >>>> } >>>> if (rc == SQLITE_ROW) >>>> { >>>> value = sqlite3_column_int(stmt, 0); >>>> printf("%d ", value); >>>> continue; >>>> } >>>> printf("Error during stepping %d\n", rc); >>>> rc = sqlite3_reset(stmt); >>>> printf("sqlite3_reset returns %d\n", rc); >>>> break; >>>> } >>>> printf("\nLoop 3, No Reset, Got SQLITE_DONE\n"); >>>> for (;;) >>>> { >>>> rc = sqlite3_step(stmt); >>>> if (rc == SQLITE_DONE) >>>> { >>>> printf("!\n"); >>>> rc = sqlite3_reset(stmt); >>>> printf("sqlite3_reset returns %d\n", rc); >>>> break; >>>> } >>>> if (rc == SQLITE_ROW) >>>> { >>>> value = sqlite3_column_int(stmt, 0); >>>> printf("%d ", value); >>>> continue; >>>> } >>>> printf("Error during stepping %d\n", rc); >>>> rc = sqlite3_reset(stmt); >>>> printf("sqlite3_reset returns %d\n", rc); >>>> break; >>>> } >>>> } >>>> >>>> 2018-06-04 11:32:12 MinGW [D:\work] >>>>>test >>>> >>>> Loop 1, no reset, reset at 5 >>>> 1 2 3 4 5 ! >>>> sqlite3_reset returns 0 >>>> >>>> Loop 2, After Reset >>>> 1 2 3 4 5 6 7 8 9 10 ! >>>> >>>> Loop 3, No Reset, Got SQLITE_DONE >>>> 1 2 3 4 5 6 7 8 9 10 ! >>>> sqlite3_reset returns 0 >>> >>>I will try without this call tonight when I'm back from work and >let >>>you know. >>> >>>But if the system have an older version of SQLite this code will >>>break right? >>> >>>Thank you. >>> >>>> >>>> >>>> --- >>>> The fact that there's a Highway to Hell but only a Stairway to >>>Heaven says a lot about anticipated traffic volume. >>>> >>>> >>>>>-----Original Message----- >>>>>From: sqlite-users [mailto:sqlite-users- >>>>>boun...@mailinglists.sqlite.org] On Behalf Of Keith Medcalf >>>>>Sent: Monday, 4 June, 2018 11:25 >>>>>To: SQLite mailing list >>>>>Subject: Re: [sqlite] Reset the cursor >>>>> >>>>> >>>>>Note also that you do not need to do an sqlite3_reset after >>>>>sqlite3_step returns SQLITE_DONE as reset is called automatically >>>the >>>>>next time you call sqlite3_step. You only need to call >>>sqlite3_reset >>>>>if you want to reset the statement before all the rows have been >>>>>retrieved (this is documented somewhere, and I believe there is a >>>>>compile time #define to turn off the auto-reset). Yes, it is >>>>>documented in the sqlite3_step documentation >>>>> >>>>>"For all versions of SQLite up to and including 3.6.23.1, a call >to >>>>>sqlite3_reset() was required after sqlite3_step() returned >anything >>>>>other than SQLITE_ROW before any subsequent invocation of >>>>>sqlite3_step(). Failure to reset the prepared statement using >>>>>sqlite3_reset() would result in an SQLITE_MISUSE return from >>>>>sqlite3_step(). But after version 3.6.23.1 (2010-03-26, >>>>>sqlite3_step() began calling sqlite3_reset() automatically in >this >>>>>circumstance rather than returning SQLITE_MISUSE. This is not >>>>>considered a compatibility break because any application that >ever >>>>>receives an SQLITE_MISUSE error is broken by definition. The >>>>>SQLITE_OMIT_AUTORESET compile-time option can be used to restore >>>the >>>>>legacy behavior." >>>>> >>>>>Neither the automatic nor the manual sqlite3_reset reset any >>>bindings >>>>>-- if you want to do this I believe you must call the >>>>>sqlite3_clear_bindings() >>>>> >>>>>--- >>>>>The fact that there's a Highway to Hell but only a Stairway to >>>Heaven >>>>>says a lot about anticipated traffic volume. >>>>> >>>>> >>>>>>-----Original Message----- >>>>>>From: sqlite-users [mailto:sqlite-users- >>>>>>boun...@mailinglists.sqlite.org] On Behalf Of Keith Medcalf >>>>>>Sent: Monday, 4 June, 2018 11:06 >>>>>>To: SQLite mailing list >>>>>>Subject: Re: [sqlite] Reset the cursor >>>>>> >>>>>> >>>>>>>Currently running w/MSVC 2010 under Win 8.1. >>>>>> >>>>>>>I also presume you are testing under the latest SQLite source? >>>>>> >>>>>>Yes, I believe so ... >>>>>>SQLite 3.24.0 2018-06-02 19:14:58 >>>>>>1ecb3aa13de5c8dc611b814ff34010de0bd90aae73d88aa37a59c4627be4alt2 >>>>>> >>>>>>Using GCC (MinGW-w64 8.1.0) on Windows 10 Pro for Workstations >>>>>>version 1803 build 17134.81 (current) >>>>>> >>>>>>MSVC (the one I have, I think VS 2008) also works fine ... >though >>>>>the >>>>>>.dll is still compiled with GCC MinGW-w64 8.1.0 (with -O3 and >then >>>>>>some). >>>>>> >>>>>>Microsoft (R) 32-bit C/C++ Optimizing Compiler Version >>>>>15.00.21022.08 >>>>>>for 80x86 >>>>>>Copyright (C) Microsoft Corporation. All rights reserved. >>>>>> >>>>>>test.c >>>>>>Microsoft (R) Incremental Linker Version 9.00.21022.08 >>>>>>Copyright (C) Microsoft Corporation. All rights reserved. >>>>>> >>>>>>/out:test.exe >>>>>>test.obj >>>>>>sqlite3.lib >>>>>> >>>>>> >>>>>>2018-06-04 10:59:24 MinGW [D:\work] >>>>>>>test.exe >>>>>> >>>>>>Loop 1, no reset >>>>>>1 2 3 4 5 6 7 8 9 10 ! >>>>>>sqlite3_reset returns 0 >>>>>> >>>>>>Loop 2, after reset >>>>>>1 2 3 4 5 6 7 8 9 10 ! >>>>>>sqlite3_reset returns 0 >>>>>> >>>>>>--- >>>>>>The fact that there's a Highway to Hell but only a Stairway to >>>>>Heaven >>>>>>says a lot about anticipated traffic volume. >>>>>> >>>>>> >>>>>> >>>>>> >>>>>>_______________________________________________ >>>>>>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 >>>> >>>> >>>> >>>> _______________________________________________ >>>> 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 >> >> >> >> _______________________________________________ >> 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 _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users