xref: /sqlite-3.40.0/src/legacy.c (revision f2305414)
198d30677Sdanielk1977 /*
298d30677Sdanielk1977 ** 2001 September 15
398d30677Sdanielk1977 **
498d30677Sdanielk1977 ** The author disclaims copyright to this source code.  In place of
598d30677Sdanielk1977 ** a legal notice, here is a blessing:
698d30677Sdanielk1977 **
798d30677Sdanielk1977 **    May you do good and not evil.
898d30677Sdanielk1977 **    May you find forgiveness for yourself and forgive others.
998d30677Sdanielk1977 **    May you share freely, never taking more than you give.
1098d30677Sdanielk1977 **
1198d30677Sdanielk1977 *************************************************************************
1298d30677Sdanielk1977 ** Main file for the SQLite library.  The routines in this file
1398d30677Sdanielk1977 ** implement the programmer interface to the library.  Routines in
1498d30677Sdanielk1977 ** other files are for internal use by SQLite and should not be
1598d30677Sdanielk1977 ** accessed by users of the library.
1698d30677Sdanielk1977 */
1798d30677Sdanielk1977 
1898d30677Sdanielk1977 #include "sqliteInt.h"
1998d30677Sdanielk1977 
2098d30677Sdanielk1977 /*
2198d30677Sdanielk1977 ** Execute SQL code.  Return one of the SQLITE_ success/failure
2298d30677Sdanielk1977 ** codes.  Also write an error message into memory obtained from
2398d30677Sdanielk1977 ** malloc() and make *pzErrMsg point to that message.
2498d30677Sdanielk1977 **
2598d30677Sdanielk1977 ** If the SQL is a query, then for each row in the query result
2698d30677Sdanielk1977 ** the xCallback() function is called.  pArg becomes the first
2798d30677Sdanielk1977 ** argument to xCallback().  If xCallback=NULL then no callback
2898d30677Sdanielk1977 ** is invoked, even for queries.
2998d30677Sdanielk1977 */
sqlite3_exec(sqlite3 * db,const char * zSql,sqlite3_callback xCallback,void * pArg,char ** pzErrMsg)3098d30677Sdanielk1977 int sqlite3_exec(
319bb575fdSdrh   sqlite3 *db,                /* The database on which the SQL executes */
3298d30677Sdanielk1977   const char *zSql,           /* The SQL to be executed */
3312057d54Sdrh   sqlite3_callback xCallback, /* Invoke this callback routine */
3498d30677Sdanielk1977   void *pArg,                 /* First argument to xCallback() */
3598d30677Sdanielk1977   char **pzErrMsg             /* Write error messages here */
3698d30677Sdanielk1977 ){
3776aeb34fSdrh   int rc = SQLITE_OK;         /* Return code */
3876aeb34fSdrh   const char *zLeftover;      /* Tail of unprocessed SQL */
3976aeb34fSdrh   sqlite3_stmt *pStmt = 0;    /* The current SQL statement */
4076aeb34fSdrh   char **azCols = 0;          /* Names of result columns */
4176aeb34fSdrh   int callbackIsInit;         /* True if callback data is initialized */
4298d30677Sdanielk1977 
43413c3d36Sdrh   if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT;
4435c6190cSdrh   if( zSql==0 ) zSql = "";
45a1644fd8Sdanielk1977 
46a1644fd8Sdanielk1977   sqlite3_mutex_enter(db->mutex);
4713f40da3Sdrh   sqlite3Error(db, SQLITE_OK);
4860625313Sdrh   while( rc==SQLITE_OK && zSql[0] ){
49*f2305414Sdrh     int nCol = 0;
5098d30677Sdanielk1977     char **azVals = 0;
5198d30677Sdanielk1977 
5298d30677Sdanielk1977     pStmt = 0;
5360625313Sdrh     rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
5443617e9aSdrh     assert( rc==SQLITE_OK || pStmt==0 );
5598d30677Sdanielk1977     if( rc!=SQLITE_OK ){
5698d30677Sdanielk1977       continue;
5798d30677Sdanielk1977     }
5898d30677Sdanielk1977     if( !pStmt ){
5998d30677Sdanielk1977       /* this happens for a comment or white-space */
6098d30677Sdanielk1977       zSql = zLeftover;
6198d30677Sdanielk1977       continue;
6298d30677Sdanielk1977     }
6376aeb34fSdrh     callbackIsInit = 0;
6498d30677Sdanielk1977 
6598d30677Sdanielk1977     while( 1 ){
6698d30677Sdanielk1977       int i;
6798d30677Sdanielk1977       rc = sqlite3_step(pStmt);
6898d30677Sdanielk1977 
6998d30677Sdanielk1977       /* Invoke the callback function if required */
7098d30677Sdanielk1977       if( xCallback && (SQLITE_ROW==rc ||
7176aeb34fSdrh           (SQLITE_DONE==rc && !callbackIsInit
7276aeb34fSdrh                            && db->flags&SQLITE_NullCallback)) ){
7376aeb34fSdrh         if( !callbackIsInit ){
74*f2305414Sdrh           nCol = sqlite3_column_count(pStmt);
755c258dc1Sdrh           azCols = sqlite3DbMallocRaw(db, (2*nCol+1)*sizeof(const char*));
763b6f734bSdrh           if( azCols==0 ){
773b6f734bSdrh             goto exec_out;
783b6f734bSdrh           }
7998d30677Sdanielk1977           for(i=0; i<nCol; i++){
8098d30677Sdanielk1977             azCols[i] = (char *)sqlite3_column_name(pStmt, i);
81701bb3b4Sdrh             /* sqlite3VdbeSetColName() installs column names as UTF8
82701bb3b4Sdrh             ** strings so there is no way for sqlite3_column_name() to fail. */
83701bb3b4Sdrh             assert( azCols[i]!=0 );
8498d30677Sdanielk1977           }
8576aeb34fSdrh           callbackIsInit = 1;
8698d30677Sdanielk1977         }
8798d30677Sdanielk1977         if( rc==SQLITE_ROW ){
8898d30677Sdanielk1977           azVals = &azCols[nCol];
8998d30677Sdanielk1977           for(i=0; i<nCol; i++){
904f26d6c4Sdrh             azVals[i] = (char *)sqlite3_column_text(pStmt, i);
91a7a8e14bSdanielk1977             if( !azVals[i] && sqlite3_column_type(pStmt, i)!=SQLITE_NULL ){
924a642b60Sdrh               sqlite3OomFault(db);
93a7a8e14bSdanielk1977               goto exec_out;
94a7a8e14bSdanielk1977             }
9598d30677Sdanielk1977           }
965c258dc1Sdrh           azVals[i] = 0;
9798d30677Sdanielk1977         }
9898d30677Sdanielk1977         if( xCallback(pArg, nCol, azVals, azCols) ){
99ddb17caeSdrh           /* EVIDENCE-OF: R-38229-40159 If the callback function to
100ddb17caeSdrh           ** sqlite3_exec() returns non-zero, then sqlite3_exec() will
101ddb17caeSdrh           ** return SQLITE_ABORT. */
10298d30677Sdanielk1977           rc = SQLITE_ABORT;
103238746a6Sdanielk1977           sqlite3VdbeFinalize((Vdbe *)pStmt);
104f50bebf0Sdrh           pStmt = 0;
10513f40da3Sdrh           sqlite3Error(db, SQLITE_ABORT);
10698d30677Sdanielk1977           goto exec_out;
10798d30677Sdanielk1977         }
10898d30677Sdanielk1977       }
10998d30677Sdanielk1977 
11098d30677Sdanielk1977       if( rc!=SQLITE_ROW ){
111238746a6Sdanielk1977         rc = sqlite3VdbeFinalize((Vdbe *)pStmt);
11298d30677Sdanielk1977         pStmt = 0;
11398d30677Sdanielk1977         zSql = zLeftover;
11478ca0e7eSdanielk1977         while( sqlite3Isspace(zSql[0]) ) zSql++;
11598d30677Sdanielk1977         break;
11698d30677Sdanielk1977       }
11798d30677Sdanielk1977     }
11898d30677Sdanielk1977 
119633e6d57Sdrh     sqlite3DbFree(db, azCols);
12098d30677Sdanielk1977     azCols = 0;
12198d30677Sdanielk1977   }
12298d30677Sdanielk1977 
12398d30677Sdanielk1977 exec_out:
124238746a6Sdanielk1977   if( pStmt ) sqlite3VdbeFinalize((Vdbe *)pStmt);
125633e6d57Sdrh   sqlite3DbFree(db, azCols);
12698d30677Sdanielk1977 
127f3a65f7eSdrh   rc = sqlite3ApiExit(db, rc);
12809e60541Sdrh   if( rc!=SQLITE_OK && pzErrMsg ){
1296e11b162Sdrh     *pzErrMsg = sqlite3DbStrDup(0, sqlite3_errmsg(db));
1306e11b162Sdrh     if( *pzErrMsg==0 ){
131fad3039cSmistachkin       rc = SQLITE_NOMEM_BKPT;
13213f40da3Sdrh       sqlite3Error(db, SQLITE_NOMEM);
13398d30677Sdanielk1977     }
13498d30677Sdanielk1977   }else if( pzErrMsg ){
13598d30677Sdanielk1977     *pzErrMsg = 0;
13698d30677Sdanielk1977   }
13798d30677Sdanielk1977 
1384ac285a1Sdrh   assert( (rc&db->errMask)==rc );
139a1644fd8Sdanielk1977   sqlite3_mutex_leave(db->mutex);
14098d30677Sdanielk1977   return rc;
14198d30677Sdanielk1977 }
142