Index: third_party/sqlite/src/src/prepare.c |
diff --git a/third_party/sqlite/src/src/prepare.c b/third_party/sqlite/src/src/prepare.c |
index fc45b8e6aa46dbd307fb1609e8eab28e0e2c3714..a05e619f3ed596c360ebd2f829a1b0d2d4fa6ee3 100644 |
--- a/third_party/sqlite/src/src/prepare.c |
+++ b/third_party/sqlite/src/src/prepare.c |
@@ -134,7 +134,9 @@ int sqlite3InitCallback(void *pInit, int argc, char **argv, char **NotUsed){ |
static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){ |
int rc; |
int i; |
+#ifndef SQLITE_OMIT_DEPRECATED |
int size; |
+#endif |
Table *pTab; |
Db *pDb; |
char const *azArg[4]; |
@@ -177,7 +179,7 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){ |
/* zMasterSchema and zInitScript are set to point at the master schema |
** and initialisation script appropriate for the database being |
- ** initialised. zMasterName is the name of the master table. |
+ ** initialized. zMasterName is the name of the master table. |
*/ |
if( !OMIT_TEMPDB && iDb==1 ){ |
zMasterSchema = temp_master_schema; |
@@ -257,12 +259,15 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){ |
*/ |
if( meta[BTREE_TEXT_ENCODING-1] ){ /* text encoding */ |
if( iDb==0 ){ |
+#ifndef SQLITE_OMIT_UTF16 |
u8 encoding; |
/* If opening the main database, set ENC(db). */ |
encoding = (u8)meta[BTREE_TEXT_ENCODING-1] & 3; |
if( encoding==0 ) encoding = SQLITE_UTF8; |
ENC(db) = encoding; |
- db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "BINARY", 0); |
+#else |
+ ENC(db) = SQLITE_UTF8; |
+#endif |
}else{ |
/* If opening an attached database, the encoding much match ENC(db) */ |
if( meta[BTREE_TEXT_ENCODING-1]!=ENC(db) ){ |
@@ -278,9 +283,13 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){ |
pDb->pSchema->enc = ENC(db); |
if( pDb->pSchema->cache_size==0 ){ |
+#ifndef SQLITE_OMIT_DEPRECATED |
size = sqlite3AbsInt32(meta[BTREE_DEFAULT_CACHE_SIZE-1]); |
if( size==0 ){ size = SQLITE_DEFAULT_CACHE_SIZE; } |
pDb->pSchema->cache_size = size; |
+#else |
+ pDb->pSchema->cache_size = SQLITE_DEFAULT_CACHE_SIZE; |
+#endif |
sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); |
} |
@@ -319,7 +328,7 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){ |
db->aDb[iDb].zName, zMasterName); |
#ifndef SQLITE_OMIT_AUTHORIZATION |
{ |
- int (*xAuth)(void*,int,const char*,const char*,const char*,const char*); |
+ sqlite3_xauth xAuth; |
xAuth = db->xAuth; |
db->xAuth = 0; |
#endif |
@@ -338,7 +347,7 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){ |
} |
if( db->mallocFailed ){ |
rc = SQLITE_NOMEM; |
- sqlite3ResetInternalSchema(db, -1); |
+ sqlite3ResetAllSchemasOfConnection(db); |
} |
if( rc==SQLITE_OK || (db->flags&SQLITE_RecoveryMode)){ |
/* Black magic: If the SQLITE_RecoveryMode flag is set, then consider |
@@ -385,26 +394,27 @@ int sqlite3Init(sqlite3 *db, char **pzErrMsg){ |
int commit_internal = !(db->flags&SQLITE_InternChanges); |
assert( sqlite3_mutex_held(db->mutex) ); |
+ assert( db->init.busy==0 ); |
rc = SQLITE_OK; |
db->init.busy = 1; |
for(i=0; rc==SQLITE_OK && i<db->nDb; i++){ |
if( DbHasProperty(db, i, DB_SchemaLoaded) || i==1 ) continue; |
rc = sqlite3InitOne(db, i, pzErrMsg); |
if( rc ){ |
- sqlite3ResetInternalSchema(db, i); |
+ sqlite3ResetOneSchema(db, i); |
} |
} |
- /* Once all the other databases have been initialised, load the schema |
+ /* Once all the other databases have been initialized, load the schema |
** for the TEMP database. This is loaded last, as the TEMP database |
** schema may contain references to objects in other databases. |
*/ |
#ifndef SQLITE_OMIT_TEMPDB |
- if( rc==SQLITE_OK && ALWAYS(db->nDb>1) |
- && !DbHasProperty(db, 1, DB_SchemaLoaded) ){ |
+ assert( db->nDb>1 ); |
+ if( rc==SQLITE_OK && !DbHasProperty(db, 1, DB_SchemaLoaded) ){ |
rc = sqlite3InitOne(db, 1, pzErrMsg); |
if( rc ){ |
- sqlite3ResetInternalSchema(db, 1); |
+ sqlite3ResetOneSchema(db, 1); |
} |
} |
#endif |
@@ -418,7 +428,7 @@ int sqlite3Init(sqlite3 *db, char **pzErrMsg){ |
} |
/* |
-** This routine is a no-op if the database schema is already initialised. |
+** This routine is a no-op if the database schema is already initialized. |
** Otherwise, the schema is loaded. An error code is returned. |
*/ |
int sqlite3ReadSchema(Parse *pParse){ |
@@ -472,7 +482,7 @@ static void schemaIsValid(Parse *pParse){ |
sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&cookie); |
assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); |
if( cookie!=db->aDb[iDb].pSchema->schema_cookie ){ |
- sqlite3ResetInternalSchema(db, iDb); |
+ sqlite3ResetOneSchema(db, iDb); |
pParse->rc = SQLITE_SCHEMA; |
} |
@@ -516,6 +526,17 @@ int sqlite3SchemaToIndex(sqlite3 *db, Schema *pSchema){ |
} |
/* |
+** Free all memory allocations in the pParse object |
+*/ |
+void sqlite3ParserReset(Parse *pParse){ |
+ if( pParse ){ |
+ sqlite3 *db = pParse->db; |
+ sqlite3DbFree(db, pParse->aLabel); |
+ sqlite3ExprListDelete(db, pParse->pConstExpr); |
+ } |
+} |
+ |
+/* |
** Compile the UTF-8 encoded SQL statement zSql into a statement handle. |
*/ |
static int sqlite3Prepare( |
@@ -573,7 +594,7 @@ static int sqlite3Prepare( |
rc = sqlite3BtreeSchemaLocked(pBt); |
if( rc ){ |
const char *zDb = db->aDb[i].zName; |
- sqlite3Error(db, rc, "database schema is locked: %s", zDb); |
+ sqlite3ErrorWithMsg(db, rc, "database schema is locked: %s", zDb); |
testcase( db->flags & SQLITE_ReadUncommitted ); |
goto end_prepare; |
} |
@@ -583,14 +604,14 @@ static int sqlite3Prepare( |
sqlite3VtabUnlockList(db); |
pParse->db = db; |
- pParse->nQueryLoop = (double)1; |
+ pParse->nQueryLoop = 0; /* Logarithmic, so 0 really means 1 */ |
if( nBytes>=0 && (nBytes==0 || zSql[nBytes-1]!=0) ){ |
char *zSqlCopy; |
int mxLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH]; |
testcase( nBytes==mxLen ); |
testcase( nBytes==mxLen+1 ); |
if( nBytes>mxLen ){ |
- sqlite3Error(db, SQLITE_TOOBIG, "statement too long"); |
+ sqlite3ErrorWithMsg(db, SQLITE_TOOBIG, "statement too long"); |
rc = sqlite3ApiExit(db, SQLITE_TOOBIG); |
goto end_prepare; |
} |
@@ -605,7 +626,7 @@ static int sqlite3Prepare( |
}else{ |
sqlite3RunParser(pParse, zSql, &zErrMsg); |
} |
- assert( 1==(int)pParse->nQueryLoop ); |
+ assert( 0==pParse->nQueryLoop ); |
if( db->mallocFailed ){ |
pParse->rc = SQLITE_NOMEM; |
@@ -645,7 +666,6 @@ static int sqlite3Prepare( |
} |
#endif |
- assert( db->init.busy==0 || saveSqlFlag==0 ); |
if( db->init.busy==0 ){ |
Vdbe *pVdbe = pParse->pVdbe; |
sqlite3VdbeSetSql(pVdbe, zSql, (int)(pParse->zTail-zSql), saveSqlFlag); |
@@ -658,10 +678,10 @@ static int sqlite3Prepare( |
} |
if( zErrMsg ){ |
- sqlite3Error(db, rc, "%s", zErrMsg); |
+ sqlite3ErrorWithMsg(db, rc, "%s", zErrMsg); |
sqlite3DbFree(db, zErrMsg); |
}else{ |
- sqlite3Error(db, rc, 0); |
+ sqlite3Error(db, rc); |
} |
/* Delete any TriggerPrg structures allocated while parsing this statement. */ |
@@ -673,6 +693,7 @@ static int sqlite3Prepare( |
end_prepare: |
+ sqlite3ParserReset(pParse); |
sqlite3StackFree(db, pParse); |
rc = sqlite3ApiExit(db, rc); |
assert( (rc&db->errMask)==rc ); |
@@ -702,6 +723,7 @@ static int sqlite3LockAndPrepare( |
} |
sqlite3BtreeLeaveAll(db); |
sqlite3_mutex_leave(db->mutex); |
+ assert( rc==SQLITE_OK || *ppStmt==0 ); |
return rc; |
} |
@@ -801,6 +823,12 @@ static int sqlite3Prepare16( |
if( !sqlite3SafetyCheckOk(db) ){ |
return SQLITE_MISUSE_BKPT; |
} |
+ if( nBytes>=0 ){ |
+ int sz; |
+ const char *z = (const char*)zSql; |
+ for(sz=0; sz<nBytes && (z[sz]!=0 || z[sz+1]!=0); sz += 2){} |
+ nBytes = sz; |
+ } |
sqlite3_mutex_enter(db->mutex); |
zSql8 = sqlite3Utf16to8(db, zSql, nBytes, SQLITE_UTF16NATIVE); |
if( zSql8 ){ |