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

Reply via email to