| 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 ){
|
|
|