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.
--- 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