xref: /sqlite-3.40.0/src/legacy.c (revision b80bb6ce)
1 /*
2 ** 2001 September 15
3 **
4 ** The author disclaims copyright to this source code.  In place of
5 ** a legal notice, here is a blessing:
6 **
7 **    May you do good and not evil.
8 **    May you find forgiveness for yourself and forgive others.
9 **    May you share freely, never taking more than you give.
10 **
11 *************************************************************************
12 ** Main file for the SQLite library.  The routines in this file
13 ** implement the programmer interface to the library.  Routines in
14 ** other files are for internal use by SQLite and should not be
15 ** accessed by users of the library.
16 */
17 
18 #include "sqliteInt.h"
19 
20 /*
21 ** Execute SQL code.  Return one of the SQLITE_ success/failure
22 ** codes.  Also write an error message into memory obtained from
23 ** malloc() and make *pzErrMsg point to that message.
24 **
25 ** If the SQL is a query, then for each row in the query result
26 ** the xCallback() function is called.  pArg becomes the first
27 ** argument to xCallback().  If xCallback=NULL then no callback
28 ** is invoked, even for queries.
29 */
30 int sqlite3_exec(
31   sqlite3 *db,                /* The database on which the SQL executes */
32   const char *zSql,           /* The SQL to be executed */
33   sqlite3_callback xCallback, /* Invoke this callback routine */
34   void *pArg,                 /* First argument to xCallback() */
35   char **pzErrMsg             /* Write error messages here */
36 ){
37   int rc = SQLITE_OK;         /* Return code */
38   const char *zLeftover;      /* Tail of unprocessed SQL */
39   sqlite3_stmt *pStmt = 0;    /* The current SQL statement */
40   char **azCols = 0;          /* Names of result columns */
41   int callbackIsInit;         /* True if callback data is initialized */
42 
43   if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT;
44   if( zSql==0 ) zSql = "";
45 
46   sqlite3_mutex_enter(db->mutex);
47   sqlite3Error(db, SQLITE_OK);
48   while( rc==SQLITE_OK && zSql[0] ){
49     int nCol;
50     char **azVals = 0;
51 
52     pStmt = 0;
53     rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover);
54     assert( rc==SQLITE_OK || pStmt==0 );
55     if( rc!=SQLITE_OK ){
56       continue;
57     }
58     if( !pStmt ){
59       /* this happens for a comment or white-space */
60       zSql = zLeftover;
61       continue;
62     }
63 
64     callbackIsInit = 0;
65     nCol = sqlite3_column_count(pStmt);
66 
67     while( 1 ){
68       int i;
69       rc = sqlite3_step(pStmt);
70 
71       /* Invoke the callback function if required */
72       if( xCallback && (SQLITE_ROW==rc ||
73           (SQLITE_DONE==rc && !callbackIsInit
74                            && db->flags&SQLITE_NullCallback)) ){
75         if( !callbackIsInit ){
76           azCols = sqlite3DbMallocRaw(db, (2*nCol+1)*sizeof(const char*));
77           if( azCols==0 ){
78             goto exec_out;
79           }
80           for(i=0; i<nCol; i++){
81             azCols[i] = (char *)sqlite3_column_name(pStmt, i);
82             /* sqlite3VdbeSetColName() installs column names as UTF8
83             ** strings so there is no way for sqlite3_column_name() to fail. */
84             assert( azCols[i]!=0 );
85           }
86           callbackIsInit = 1;
87         }
88         if( rc==SQLITE_ROW ){
89           azVals = &azCols[nCol];
90           for(i=0; i<nCol; i++){
91             azVals[i] = (char *)sqlite3_column_text(pStmt, i);
92             if( !azVals[i] && sqlite3_column_type(pStmt, i)!=SQLITE_NULL ){
93               sqlite3OomFault(db);
94               goto exec_out;
95             }
96           }
97           azVals[i] = 0;
98         }
99         if( xCallback(pArg, nCol, azVals, azCols) ){
100           /* EVIDENCE-OF: R-38229-40159 If the callback function to
101           ** sqlite3_exec() returns non-zero, then sqlite3_exec() will
102           ** return SQLITE_ABORT. */
103           rc = SQLITE_ABORT;
104           sqlite3VdbeFinalize((Vdbe *)pStmt);
105           pStmt = 0;
106           sqlite3Error(db, SQLITE_ABORT);
107           goto exec_out;
108         }
109       }
110 
111       if( rc!=SQLITE_ROW ){
112         rc = sqlite3VdbeFinalize((Vdbe *)pStmt);
113         pStmt = 0;
114         zSql = zLeftover;
115         while( sqlite3Isspace(zSql[0]) ) zSql++;
116         break;
117       }
118     }
119 
120     sqlite3DbFree(db, azCols);
121     azCols = 0;
122   }
123 
124 exec_out:
125   if( pStmt ) sqlite3VdbeFinalize((Vdbe *)pStmt);
126   sqlite3DbFree(db, azCols);
127 
128   rc = sqlite3ApiExit(db, rc);
129   if( rc!=SQLITE_OK && pzErrMsg ){
130     *pzErrMsg = sqlite3DbStrDup(0, sqlite3_errmsg(db));
131     if( *pzErrMsg==0 ){
132       rc = SQLITE_NOMEM_BKPT;
133       sqlite3Error(db, SQLITE_NOMEM);
134     }
135   }else if( pzErrMsg ){
136     *pzErrMsg = 0;
137   }
138 
139   assert( (rc&db->errMask)==rc );
140   sqlite3_mutex_leave(db->mutex);
141   return rc;
142 }
143