Keith, On Mon, Jun 4, 2018 at 1:39 PM, Keith Medcalf <kmedc...@dessus.com> wrote: > > 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
But then this is even more confusing. As I said in the beginning: The second cycle' sqlite3_step() returns 1, but immediately calling sqlite3_errcode() returns 0. I just don't understand how to interpret those results. Can you? 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 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 _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users