Hi, Keith, I'm sorry for that but I just realized what is the difference between you program and mine.
Can you modify the query to not return any rows and re-run your test program? Because when I run it first time the query doesn't return any rows and n the first iteration sqlite3_step() gives SQLITE_DONE. But I guess the next time it runs it just fails for some in-known reason. If that's not it - I guess I will have to give you the test case for it. Thank you and sorry for not thinking about this immediately. On Tue, Jun 5, 2018 at 6:38 AM, Igor Korot <ikoro...@gmail.com> wrote: > Hi, 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 > > Removing thay call made no difference. > I am still getting 1 on the second iteration. > > 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