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