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


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

Reply via email to