Keith,

On Mon, Jun 4, 2018 at 1:39 PM, Keith Medcalf <kmedc...@dessus.com> wrote:
>
> 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

But then this is even more confusing.
As I said in the beginning:

The second cycle' sqlite3_step() returns 1, but immediately calling
sqlite3_errcode() returns 0.

I just don't understand how to interpret those results.

Can you?

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 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
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to