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