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

Reply via email to