Hi,

The sample code is below. I am trying this on windows(xp)(sqlite 3.3.13) and
have disabled almost all sqlite features. 
When createUsingExec variable is true in the sample code, I am able to
reproduce the problem.

Thanks
karthik

//================================== begin
==================================
int select_while_update ();
int main ()
{
        select_while_update ();
}

int select_while_update ()
{
        int i = 0;
        int ret;
        sqlite3 *pDb = NULL;
        const char *dbName  = "./t.db";
        const char *crTable = "CREATE TABLE A ( ID INTEGER, NAME TEXT) ;";
        const char *selAll  = "SELECT * from A;";
        const char *insRow  = "INSERT INTO A VALUES (?,?);";
        const char *updRow  = "UPDATE A SET NAME=? WHERE ID=?;";

        sqlite3_stmt *pSelAll = NULL;
        sqlite3_stmt *pInsRow = NULL;
        sqlite3_stmt *pUpdRow = NULL;
        int createUsingExec = 1;
        
        char buf [64] = { 0 };

        remove (dbName);
        ret = sqlite3_open (dbName, &pDb);
        sqlite3_busy_timeout (pDb, 3000);

        if (createUsingExec) {
                const char *c2 = "INSERT INTO A VALUES ( 1, 'name is 1' )
;";
                const char *c3 = "INSERT INTO A VALUES ( 2, 'name is 2' )
;";
                const char *c4 = "INSERT INTO A VALUES ( 3, 'name is 3') ;";
                const char *c5 = "INSERT INTO A VALUES ( 4, 'name is 4' )
;";
                const char *c6 = "INSERT INTO A VALUES ( 5, 'name is 5' )
;";

                sqlite3_exec (pDb, crTable, 0, 0, 0);
                sqlite3_exec (pDb, c2, 0, 0, 0);
                sqlite3_exec (pDb, c3, 0, 0, 0);
                sqlite3_exec (pDb, c4, 0, 0, 0);
                sqlite3_exec (pDb, c5, 0, 0, 0);
                sqlite3_exec (pDb, c6, 0, 0, 0);
                
        } else {
        
                ret = sqlite3_exec (pDb, crTable, NULL, NULL, NULL);
                if (SQLITE_OK != ret) {
                        printf ("error creating table\n");
                        return -1;
                }

                ret = sqlite3_prepare_v2 (pDb, insRow, -1, &pInsRow, NULL);

                
                for (i = 0; i < 5; i ++) {
                        sprintf (buf, "name is %d", i);
                        
                        sqlite3_reset (pInsRow);
                        sqlite3_bind_int (pInsRow, 1, i);
                        sqlite3_bind_text (pInsRow, 2, buf, -1,
SQLITE_STATIC);
                        sqlite3_step (pInsRow);
                        
                }

                sqlite3_finalize (pInsRow);
        }

        ret = sqlite3_prepare_v2 (pDb, selAll, -1, &pSelAll, NULL);
        sqlite3_bind_parameter_count (pSelAll);
        sqlite3_reset (pSelAll);
        ret = sqlite3_step (pSelAll);
        
        while (SQLITE_ROW == ret) {
                // get id from select statemnt results
                int id; 
                char *text;
                
                sqlite3_data_count (pSelAll);
                sqlite3_column_count (pSelAll);                 
                
                sqlite3_column_type (pSelAll, 0);
                sqlite3_column_bytes (pSelAll, 0);
                // get id
                id = sqlite3_column_int (pSelAll, 0);
                
                sqlite3_column_type (pSelAll, 1);
                sqlite3_column_bytes (pSelAll, 1);
                // get text
                text = sqlite3_column_text (pSelAll, 1);
                
                sprintf (buf, "name is %d", ++i);

                // prepare update statements    
                if (!pUpdRow) {
                        sqlite3_prepare_v2 (pDb, updRow, -1, &pUpdRow,
NULL);
                }

                sqlite3_bind_parameter_count (pUpdRow);
                sqlite3_reset (pUpdRow);
                
                // bind values to update statement
                sqlite3_bind_text (pUpdRow, 1, buf, -1, SQLITE_STATIC);
                sqlite3_bind_int (pUpdRow, 2, i);
                sqlite3_step (pUpdRow);

                // step to next result row
                ret = sqlite3_step (pSelAll);
        }

        // need finalize other statements
        return 0;       
}
//================================== end ==================================

****************************************************************************
****************************
This e-mail and attachments contain confidential information from HUAWEI,
which is intended only for the person or entity whose address is listed
above. Any use of the information contained herein in any way (including,
but not limited to, total or partial disclosure, reproduction, or
dissemination) by persons other than the intended recipient's) is
prohibited. If you receive this e-mail in error, please notify the sender by
phone or email immediately and delete it!


-----Original Message-----
From: Joe Wilson [mailto:[EMAIL PROTECTED]
Sent: Sunday, August 05, 2007 12:59 AM
To: sqlite-users@sqlite.org
Subject: Re: [sqlite] Select, update on the row, and step leads to crash

It should be possible to do what you're trying to do as of 3.3.8.
See the Tcl examples at the bottom of this patch:

 Allows UPDATE, INSERT, and DELETEs to occur while  a SELECT is pending on
the same table.

 http://www.sqlite.org/cvstrac/chngview?cn=3355

Post a complete self-contained C program demonstrating the problem if you
need further help.

--- karthikeyan <[EMAIL PROTECTED]> wrote:
> What we are doing in short is below (using Sqlite 3.3.13).
> 
> Select id, data from msgTable;        // ok - returns 100
>       tid = sqlite3_column_int;       
>       data = sqlite3_column_bytes;    
>       // make a copy of the bytes     
>       // update the byte values       
>       update msgTable set data=new data where id=tid; //ok - returns 101
>       sqlite3_step    // not ok 
> 
> Sqlite3_step, crashes because (BtCursor *pCur)->pPage is null in 
> sqlite3BtreeNext.
> 
> I read somewhere that its possible to update while we are in a select. 
> Is this possible?
> Or are there some other api call, which I need to call before 
> sqlite3_step is called?.
> 
> Both the statements are prepared using sqlite3_prepare_v2 and values 
> are assigned using the bind functions.



       
____________________________________________________________________________
________
Need a vacation? Get great deals
to amazing places on Yahoo! Travel.
http://travel.yahoo.com/

----------------------------------------------------------------------------
-
To unsubscribe, send email to [EMAIL PROTECTED]
----------------------------------------------------------------------------
-




-----------------------------------------------------------------------------
To unsubscribe, send email to [EMAIL PROTECTED]
-----------------------------------------------------------------------------

Reply via email to