15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2001 September 15
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The author disclaims copyright to this source code.  In place of
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a legal notice, here is a blessing:
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you do good and not evil.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you find forgiveness for yourself and forgive others.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you share freely, never taking more than you give.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*************************************************************************
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Main file for the SQLite library.  The routines in this file
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** implement the programmer interface to the library.  Routines in
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** other files are for internal use by SQLite and should not be
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** accessed by users of the library.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqliteInt.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Execute SQL code.  Return one of the SQLITE_ success/failure
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** codes.  Also write an error message into memory obtained from
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** malloc() and make *pzErrMsg point to that message.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the SQL is a query, then for each row in the query result
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the xCallback() function is called.  pArg becomes the first
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** argument to xCallback().  If xCallback=NULL then no callback
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is invoked, even for queries.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_exec(
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db,                /* The database on which the SQL executes */
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *zSql,           /* The SQL to be executed */
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_callback xCallback, /* Invoke this callback routine */
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void *pArg,                 /* First argument to xCallback() */
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char **pzErrMsg             /* Write error messages here */
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc = SQLITE_OK;         /* Return code */
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *zLeftover;      /* Tail of unprocessed SQL */
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_stmt *pStmt = 0;    /* The current SQL statement */
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char **azCols = 0;          /* Names of result columns */
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nRetry = 0;             /* Number of retry attempts */
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int callbackIsInit;         /* True if callback data is initialized */
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( zSql==0 ) zSql = "";
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_mutex_enter(db->mutex);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3Error(db, SQLITE_OK, 0);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while( (rc==SQLITE_OK || (rc==SQLITE_SCHEMA && (++nRetry)<2)) && zSql[0] ){
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nCol;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char **azVals = 0;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pStmt = 0;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3_prepare(db, zSql, -1, &pStmt, &zLeftover);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( rc==SQLITE_OK || pStmt==0 );
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( rc!=SQLITE_OK ){
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !pStmt ){
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* this happens for a comment or white-space */
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zSql = zLeftover;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callbackIsInit = 0;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nCol = sqlite3_column_count(pStmt);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while( 1 ){
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int i;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = sqlite3_step(pStmt);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Invoke the callback function if required */
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( xCallback && (SQLITE_ROW==rc ||
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (SQLITE_DONE==rc && !callbackIsInit
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           && db->flags&SQLITE_NullCallback)) ){
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( !callbackIsInit ){
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          azCols = sqlite3DbMallocZero(db, 2*nCol*sizeof(const char*) + 1);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( azCols==0 ){
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            goto exec_out;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          for(i=0; i<nCol; i++){
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            azCols[i] = (char *)sqlite3_column_name(pStmt, i);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* sqlite3VdbeSetColName() installs column names as UTF8
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ** strings so there is no way for sqlite3_column_name() to fail. */
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            assert( azCols[i]!=0 );
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          callbackIsInit = 1;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( rc==SQLITE_ROW ){
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          azVals = &azCols[nCol];
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          for(i=0; i<nCol; i++){
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            azVals[i] = (char *)sqlite3_column_text(pStmt, i);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if( !azVals[i] && sqlite3_column_type(pStmt, i)!=SQLITE_NULL ){
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              db->mallocFailed = 1;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              goto exec_out;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( xCallback(pArg, nCol, azVals, azCols) ){
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          rc = SQLITE_ABORT;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          sqlite3VdbeFinalize((Vdbe *)pStmt);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pStmt = 0;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          sqlite3Error(db, SQLITE_ABORT, 0);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          goto exec_out;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( rc!=SQLITE_ROW ){
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rc = sqlite3VdbeFinalize((Vdbe *)pStmt);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pStmt = 0;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( rc!=SQLITE_SCHEMA ){
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          nRetry = 0;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          zSql = zLeftover;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          while( sqlite3Isspace(zSql[0]) ) zSql++;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DbFree(db, azCols);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    azCols = 0;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exec_out:
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pStmt ) sqlite3VdbeFinalize((Vdbe *)pStmt);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DbFree(db, azCols);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = sqlite3ApiExit(db, rc);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc!=SQLITE_OK && ALWAYS(rc==sqlite3_errcode(db)) && pzErrMsg ){
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nErrMsg = 1 + sqlite3Strlen30(sqlite3_errmsg(db));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *pzErrMsg = sqlite3Malloc(nErrMsg);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( *pzErrMsg ){
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      memcpy(*pzErrMsg, sqlite3_errmsg(db), nErrMsg);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = SQLITE_NOMEM;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3Error(db, SQLITE_NOMEM, 0);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( pzErrMsg ){
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *pzErrMsg = 0;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (rc&db->errMask)==rc );
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_mutex_leave(db->mutex);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rc;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
146