Fossil SCM
Update the built-in SQLite to the latest alpha for 3.37.0 that includes the fix for using the preferred schema table name in PRAGMA table_list output.
Commit
d6d4c14b0e1d10c837f735b1fd7339c53d630bf2abbb1a8204b2da1535b42818
Parent
00650cf0208528e…
2 files changed
+71
-39
+1
-1
+71
-39
| --- src/sqlite3.c | ||
| +++ src/sqlite3.c | ||
| @@ -452,11 +452,11 @@ | ||
| 452 | 452 | ** [sqlite3_libversion_number()], [sqlite3_sourceid()], |
| 453 | 453 | ** [sqlite_version()] and [sqlite_source_id()]. |
| 454 | 454 | */ |
| 455 | 455 | #define SQLITE_VERSION "3.37.0" |
| 456 | 456 | #define SQLITE_VERSION_NUMBER 3037000 |
| 457 | -#define SQLITE_SOURCE_ID "2021-11-04 00:51:53 005a8642773556825fe4c5d0b2c12517d35289308a30df0151ef7f080acb0172" | |
| 457 | +#define SQLITE_SOURCE_ID "2021-11-04 14:04:20 9147390d9885a37a62edc1058f313434627f1b59965c890877d2cb119e355c78" | |
| 458 | 458 | |
| 459 | 459 | /* |
| 460 | 460 | ** CAPI3REF: Run-Time Library Version Numbers |
| 461 | 461 | ** KEYWORDS: sqlite3_version sqlite3_sourceid |
| 462 | 462 | ** |
| @@ -14144,15 +14144,29 @@ | ||
| 14144 | 14144 | int nBusy; /* Incremented with each busy call */ |
| 14145 | 14145 | }; |
| 14146 | 14146 | |
| 14147 | 14147 | /* |
| 14148 | 14148 | ** Name of table that holds the database schema. |
| 14149 | +** | |
| 14150 | +** The PREFERRED names are used whereever possible. But LEGACY is also | |
| 14151 | +** used for backwards compatibility. | |
| 14152 | +** | |
| 14153 | +** 1. Queries can use either the PREFERRED or the LEGACY names | |
| 14154 | +** 2. The sqlite3_set_authorizer() callback uses the LEGACY name | |
| 14155 | +** 3. The PRAGMA table_list statement uses the PREFERRED name | |
| 14156 | +** | |
| 14157 | +** The LEGACY names are stored in the internal symbol hash table | |
| 14158 | +** in support of (2). Names are translated using sqlite3PreferredTableName() | |
| 14159 | +** for (3). The sqlite3FindTable() function takes care of translating | |
| 14160 | +** names for (1). | |
| 14161 | +** | |
| 14162 | +** Note that "sqlite_temp_schema" can also be called "temp.sqlite_schema". | |
| 14149 | 14163 | */ |
| 14150 | -#define DFLT_SCHEMA_TABLE "sqlite_master" | |
| 14151 | -#define DFLT_TEMP_SCHEMA_TABLE "sqlite_temp_master" | |
| 14152 | -#define ALT_SCHEMA_TABLE "sqlite_schema" | |
| 14153 | -#define ALT_TEMP_SCHEMA_TABLE "sqlite_temp_schema" | |
| 14164 | +#define LEGACY_SCHEMA_TABLE "sqlite_master" | |
| 14165 | +#define LEGACY_TEMP_SCHEMA_TABLE "sqlite_temp_master" | |
| 14166 | +#define PREFERRED_SCHEMA_TABLE "sqlite_schema" | |
| 14167 | +#define PREFERRED_TEMP_SCHEMA_TABLE "sqlite_temp_schema" | |
| 14154 | 14168 | |
| 14155 | 14169 | |
| 14156 | 14170 | /* |
| 14157 | 14171 | ** The root-page of the schema table. |
| 14158 | 14172 | */ |
| @@ -14160,11 +14174,11 @@ | ||
| 14160 | 14174 | |
| 14161 | 14175 | /* |
| 14162 | 14176 | ** The name of the schema table. The name is different for TEMP. |
| 14163 | 14177 | */ |
| 14164 | 14178 | #define SCHEMA_TABLE(x) \ |
| 14165 | - ((!OMIT_TEMPDB)&&(x==1)?DFLT_TEMP_SCHEMA_TABLE:DFLT_SCHEMA_TABLE) | |
| 14179 | + ((!OMIT_TEMPDB)&&(x==1)?LEGACY_TEMP_SCHEMA_TABLE:LEGACY_SCHEMA_TABLE) | |
| 14166 | 14180 | |
| 14167 | 14181 | /* |
| 14168 | 14182 | ** A convenience macro that returns the number of elements in |
| 14169 | 14183 | ** an array. |
| 14170 | 14184 | */ |
| @@ -19529,10 +19543,11 @@ | ||
| 19529 | 19543 | SQLITE_PRIVATE void sqlite3ExprIfFalseDup(Parse*, Expr*, int, int); |
| 19530 | 19544 | SQLITE_PRIVATE Table *sqlite3FindTable(sqlite3*,const char*, const char*); |
| 19531 | 19545 | #define LOCATE_VIEW 0x01 |
| 19532 | 19546 | #define LOCATE_NOERR 0x02 |
| 19533 | 19547 | SQLITE_PRIVATE Table *sqlite3LocateTable(Parse*,u32 flags,const char*, const char*); |
| 19548 | +SQLITE_PRIVATE const char *sqlite3PreferredTableName(const char*); | |
| 19534 | 19549 | SQLITE_PRIVATE Table *sqlite3LocateTableItem(Parse*,u32 flags,SrcItem *); |
| 19535 | 19550 | SQLITE_PRIVATE Index *sqlite3FindIndex(sqlite3*,const char*, const char*); |
| 19536 | 19551 | SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTable(sqlite3*,int,const char*); |
| 19537 | 19552 | SQLITE_PRIVATE void sqlite3UnlinkAndDeleteIndex(sqlite3*,int,const char*); |
| 19538 | 19553 | SQLITE_PRIVATE void sqlite3Vacuum(Parse*,Token*,Expr*); |
| @@ -93133,11 +93148,11 @@ | ||
| 93133 | 93148 | db->mDbFlags |= DBFLAG_SchemaChange; |
| 93134 | 93149 | p->expired = 0; |
| 93135 | 93150 | }else |
| 93136 | 93151 | #endif |
| 93137 | 93152 | { |
| 93138 | - zSchema = DFLT_SCHEMA_TABLE; | |
| 93153 | + zSchema = LEGACY_SCHEMA_TABLE; | |
| 93139 | 93154 | initData.db = db; |
| 93140 | 93155 | initData.iDb = iDb; |
| 93141 | 93156 | initData.pzErrMsg = &p->zErrMsg; |
| 93142 | 93157 | initData.mInitFlags = 0; |
| 93143 | 93158 | initData.mxPage = sqlite3BtreeLastPage(db->aDb[iDb].pBt); |
| @@ -107895,11 +107910,11 @@ | ||
| 107895 | 107910 | int bNoDQS /* Do not allow DQS in the schema */ |
| 107896 | 107911 | ){ |
| 107897 | 107912 | pParse->colNamesSet = 1; |
| 107898 | 107913 | sqlite3NestedParse(pParse, |
| 107899 | 107914 | "SELECT 1 " |
| 107900 | - "FROM \"%w\"." DFLT_SCHEMA_TABLE " " | |
| 107915 | + "FROM \"%w\"." LEGACY_SCHEMA_TABLE " " | |
| 107901 | 107916 | "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" |
| 107902 | 107917 | " AND sql NOT LIKE 'create virtual%%'" |
| 107903 | 107918 | " AND sqlite_rename_test(%Q, sql, type, name, %d, %Q, %d)=NULL ", |
| 107904 | 107919 | zDb, |
| 107905 | 107920 | zDb, bTemp, zWhen, bNoDQS |
| @@ -107906,11 +107921,11 @@ | ||
| 107906 | 107921 | ); |
| 107907 | 107922 | |
| 107908 | 107923 | if( bTemp==0 ){ |
| 107909 | 107924 | sqlite3NestedParse(pParse, |
| 107910 | 107925 | "SELECT 1 " |
| 107911 | - "FROM temp." DFLT_SCHEMA_TABLE " " | |
| 107926 | + "FROM temp." LEGACY_SCHEMA_TABLE " " | |
| 107912 | 107927 | "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" |
| 107913 | 107928 | " AND sql NOT LIKE 'create virtual%%'" |
| 107914 | 107929 | " AND sqlite_rename_test(%Q, sql, type, name, 1, %Q, %d)=NULL ", |
| 107915 | 107930 | zDb, zWhen, bNoDQS |
| 107916 | 107931 | ); |
| @@ -107924,18 +107939,18 @@ | ||
| 107924 | 107939 | ** not true, similarly update all SQL statements in the sqlite_schema table |
| 107925 | 107940 | ** of the temp db. |
| 107926 | 107941 | */ |
| 107927 | 107942 | static void renameFixQuotes(Parse *pParse, const char *zDb, int bTemp){ |
| 107928 | 107943 | sqlite3NestedParse(pParse, |
| 107929 | - "UPDATE \"%w\"." DFLT_SCHEMA_TABLE | |
| 107944 | + "UPDATE \"%w\"." LEGACY_SCHEMA_TABLE | |
| 107930 | 107945 | " SET sql = sqlite_rename_quotefix(%Q, sql)" |
| 107931 | 107946 | "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" |
| 107932 | 107947 | " AND sql NOT LIKE 'create virtual%%'" , zDb, zDb |
| 107933 | 107948 | ); |
| 107934 | 107949 | if( bTemp==0 ){ |
| 107935 | 107950 | sqlite3NestedParse(pParse, |
| 107936 | - "UPDATE temp." DFLT_SCHEMA_TABLE | |
| 107951 | + "UPDATE temp." LEGACY_SCHEMA_TABLE | |
| 107937 | 107952 | " SET sql = sqlite_rename_quotefix('temp', sql)" |
| 107938 | 107953 | "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" |
| 107939 | 107954 | " AND sql NOT LIKE 'create virtual%%'" |
| 107940 | 107955 | ); |
| 107941 | 107956 | } |
| @@ -108049,21 +108064,21 @@ | ||
| 108049 | 108064 | nTabName = sqlite3Utf8CharLen(zTabName, -1); |
| 108050 | 108065 | |
| 108051 | 108066 | /* Rewrite all CREATE TABLE, INDEX, TRIGGER or VIEW statements in |
| 108052 | 108067 | ** the schema to use the new table name. */ |
| 108053 | 108068 | sqlite3NestedParse(pParse, |
| 108054 | - "UPDATE \"%w\"." DFLT_SCHEMA_TABLE " SET " | |
| 108069 | + "UPDATE \"%w\"." LEGACY_SCHEMA_TABLE " SET " | |
| 108055 | 108070 | "sql = sqlite_rename_table(%Q, type, name, sql, %Q, %Q, %d) " |
| 108056 | 108071 | "WHERE (type!='index' OR tbl_name=%Q COLLATE nocase)" |
| 108057 | 108072 | "AND name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" |
| 108058 | 108073 | , zDb, zDb, zTabName, zName, (iDb==1), zTabName |
| 108059 | 108074 | ); |
| 108060 | 108075 | |
| 108061 | 108076 | /* Update the tbl_name and name columns of the sqlite_schema table |
| 108062 | 108077 | ** as required. */ |
| 108063 | 108078 | sqlite3NestedParse(pParse, |
| 108064 | - "UPDATE %Q." DFLT_SCHEMA_TABLE " SET " | |
| 108079 | + "UPDATE %Q." LEGACY_SCHEMA_TABLE " SET " | |
| 108065 | 108080 | "tbl_name = %Q, " |
| 108066 | 108081 | "name = CASE " |
| 108067 | 108082 | "WHEN type='table' THEN %Q " |
| 108068 | 108083 | "WHEN name LIKE 'sqliteX_autoindex%%' ESCAPE 'X' " |
| 108069 | 108084 | " AND type='index' THEN " |
| @@ -108248,11 +108263,11 @@ | ||
| 108248 | 108263 | /* substr() operations on characters, but addColOffset is in bytes. So we |
| 108249 | 108264 | ** have to use printf() to translate between these units: */ |
| 108250 | 108265 | assert( IsOrdinaryTable(pTab) ); |
| 108251 | 108266 | assert( IsOrdinaryTable(pNew) ); |
| 108252 | 108267 | sqlite3NestedParse(pParse, |
| 108253 | - "UPDATE \"%w\"." DFLT_SCHEMA_TABLE " SET " | |
| 108268 | + "UPDATE \"%w\"." LEGACY_SCHEMA_TABLE " SET " | |
| 108254 | 108269 | "sql = printf('%%.%ds, ',sql) || %Q" |
| 108255 | 108270 | " || substr(sql,1+length(printf('%%.%ds',sql))) " |
| 108256 | 108271 | "WHERE type = 'table' AND name = %Q", |
| 108257 | 108272 | zDb, pNew->u.tab.addColOffset, zCol, pNew->u.tab.addColOffset, |
| 108258 | 108273 | zTab |
| @@ -108482,21 +108497,21 @@ | ||
| 108482 | 108497 | zNew = sqlite3NameFromToken(db, pNew); |
| 108483 | 108498 | if( !zNew ) goto exit_rename_column; |
| 108484 | 108499 | assert( pNew->n>0 ); |
| 108485 | 108500 | bQuote = sqlite3Isquote(pNew->z[0]); |
| 108486 | 108501 | sqlite3NestedParse(pParse, |
| 108487 | - "UPDATE \"%w\"." DFLT_SCHEMA_TABLE " SET " | |
| 108502 | + "UPDATE \"%w\"." LEGACY_SCHEMA_TABLE " SET " | |
| 108488 | 108503 | "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, %d) " |
| 108489 | 108504 | "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X' " |
| 108490 | 108505 | " AND (type != 'index' OR tbl_name = %Q)", |
| 108491 | 108506 | zDb, |
| 108492 | 108507 | zDb, pTab->zName, iCol, zNew, bQuote, iSchema==1, |
| 108493 | 108508 | pTab->zName |
| 108494 | 108509 | ); |
| 108495 | 108510 | |
| 108496 | 108511 | sqlite3NestedParse(pParse, |
| 108497 | - "UPDATE temp." DFLT_SCHEMA_TABLE " SET " | |
| 108512 | + "UPDATE temp." LEGACY_SCHEMA_TABLE " SET " | |
| 108498 | 108513 | "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, 1) " |
| 108499 | 108514 | "WHERE type IN ('trigger', 'view')", |
| 108500 | 108515 | zDb, pTab->zName, iCol, zNew, bQuote |
| 108501 | 108516 | ); |
| 108502 | 108517 | |
| @@ -109973,11 +109988,11 @@ | ||
| 109973 | 109988 | assert( iDb>=0 ); |
| 109974 | 109989 | zDb = db->aDb[iDb].zDbSName; |
| 109975 | 109990 | renameTestSchema(pParse, zDb, iDb==1, "", 0); |
| 109976 | 109991 | renameFixQuotes(pParse, zDb, iDb==1); |
| 109977 | 109992 | sqlite3NestedParse(pParse, |
| 109978 | - "UPDATE \"%w\"." DFLT_SCHEMA_TABLE " SET " | |
| 109993 | + "UPDATE \"%w\"." LEGACY_SCHEMA_TABLE " SET " | |
| 109979 | 109994 | "sql = sqlite_drop_column(%d, sql, %d) " |
| 109980 | 109995 | "WHERE (type=='table' AND tbl_name=%Q COLLATE nocase)" |
| 109981 | 109996 | , zDb, iDb, iCol, pTab->zName |
| 109982 | 109997 | ); |
| 109983 | 109998 | |
| @@ -113262,21 +113277,21 @@ | ||
| 113262 | 113277 | } |
| 113263 | 113278 | } |
| 113264 | 113279 | p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, zName); |
| 113265 | 113280 | if( p==0 && sqlite3StrNICmp(zName, "sqlite_", 7)==0 ){ |
| 113266 | 113281 | if( i==1 ){ |
| 113267 | - if( sqlite3StrICmp(zName+7, &ALT_TEMP_SCHEMA_TABLE[7])==0 | |
| 113268 | - || sqlite3StrICmp(zName+7, &ALT_SCHEMA_TABLE[7])==0 | |
| 113269 | - || sqlite3StrICmp(zName+7, &DFLT_SCHEMA_TABLE[7])==0 | |
| 113282 | + if( sqlite3StrICmp(zName+7, &PREFERRED_TEMP_SCHEMA_TABLE[7])==0 | |
| 113283 | + || sqlite3StrICmp(zName+7, &PREFERRED_SCHEMA_TABLE[7])==0 | |
| 113284 | + || sqlite3StrICmp(zName+7, &LEGACY_SCHEMA_TABLE[7])==0 | |
| 113270 | 113285 | ){ |
| 113271 | 113286 | p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, |
| 113272 | - DFLT_TEMP_SCHEMA_TABLE); | |
| 113287 | + LEGACY_TEMP_SCHEMA_TABLE); | |
| 113273 | 113288 | } |
| 113274 | 113289 | }else{ |
| 113275 | - if( sqlite3StrICmp(zName+7, &ALT_SCHEMA_TABLE[7])==0 ){ | |
| 113290 | + if( sqlite3StrICmp(zName+7, &PREFERRED_SCHEMA_TABLE[7])==0 ){ | |
| 113276 | 113291 | p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, |
| 113277 | - DFLT_SCHEMA_TABLE); | |
| 113292 | + LEGACY_SCHEMA_TABLE); | |
| 113278 | 113293 | } |
| 113279 | 113294 | } |
| 113280 | 113295 | } |
| 113281 | 113296 | }else{ |
| 113282 | 113297 | /* Match against TEMP first */ |
| @@ -113290,15 +113305,15 @@ | ||
| 113290 | 113305 | assert( sqlite3SchemaMutexHeld(db, i, 0) ); |
| 113291 | 113306 | p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, zName); |
| 113292 | 113307 | if( p ) break; |
| 113293 | 113308 | } |
| 113294 | 113309 | if( p==0 && sqlite3StrNICmp(zName, "sqlite_", 7)==0 ){ |
| 113295 | - if( sqlite3StrICmp(zName+7, &ALT_SCHEMA_TABLE[7])==0 ){ | |
| 113296 | - p = sqlite3HashFind(&db->aDb[0].pSchema->tblHash, DFLT_SCHEMA_TABLE); | |
| 113297 | - }else if( sqlite3StrICmp(zName+7, &ALT_TEMP_SCHEMA_TABLE[7])==0 ){ | |
| 113310 | + if( sqlite3StrICmp(zName+7, &PREFERRED_SCHEMA_TABLE[7])==0 ){ | |
| 113311 | + p = sqlite3HashFind(&db->aDb[0].pSchema->tblHash, LEGACY_SCHEMA_TABLE); | |
| 113312 | + }else if( sqlite3StrICmp(zName+7, &PREFERRED_TEMP_SCHEMA_TABLE[7])==0 ){ | |
| 113298 | 113313 | p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, |
| 113299 | - DFLT_TEMP_SCHEMA_TABLE); | |
| 113314 | + LEGACY_TEMP_SCHEMA_TABLE); | |
| 113300 | 113315 | } |
| 113301 | 113316 | } |
| 113302 | 113317 | } |
| 113303 | 113318 | return p; |
| 113304 | 113319 | } |
| @@ -113389,10 +113404,26 @@ | ||
| 113389 | 113404 | }else{ |
| 113390 | 113405 | zDb = p->zDatabase; |
| 113391 | 113406 | } |
| 113392 | 113407 | return sqlite3LocateTable(pParse, flags, p->zName, zDb); |
| 113393 | 113408 | } |
| 113409 | + | |
| 113410 | +/* | |
| 113411 | +** Return the preferred table name for system tables. Translate legacy | |
| 113412 | +** names into the new preferred names, as appropriate. | |
| 113413 | +*/ | |
| 113414 | +SQLITE_PRIVATE const char *sqlite3PreferredTableName(const char *zName){ | |
| 113415 | + if( sqlite3StrNICmp(zName, "sqlite_", 7)==0 ){ | |
| 113416 | + if( sqlite3StrICmp(zName+7, &LEGACY_SCHEMA_TABLE[7])==0 ){ | |
| 113417 | + return PREFERRED_SCHEMA_TABLE; | |
| 113418 | + } | |
| 113419 | + if( sqlite3StrICmp(zName+7, &LEGACY_TEMP_SCHEMA_TABLE[7])==0 ){ | |
| 113420 | + return PREFERRED_TEMP_SCHEMA_TABLE; | |
| 113421 | + } | |
| 113422 | + } | |
| 113423 | + return zName; | |
| 113424 | +} | |
| 113394 | 113425 | |
| 113395 | 113426 | /* |
| 113396 | 113427 | ** Locate the in-memory structure that describes |
| 113397 | 113428 | ** a particular index given the name of that index |
| 113398 | 113429 | ** and the name of the database that contains the index. |
| @@ -113788,11 +113819,11 @@ | ||
| 113788 | 113819 | ** Open the sqlite_schema table stored in database number iDb for |
| 113789 | 113820 | ** writing. The table is opened using cursor 0. |
| 113790 | 113821 | */ |
| 113791 | 113822 | SQLITE_PRIVATE void sqlite3OpenSchemaTable(Parse *p, int iDb){ |
| 113792 | 113823 | Vdbe *v = sqlite3GetVdbe(p); |
| 113793 | - sqlite3TableLock(p, iDb, SCHEMA_ROOT, 1, DFLT_SCHEMA_TABLE); | |
| 113824 | + sqlite3TableLock(p, iDb, SCHEMA_ROOT, 1, LEGACY_SCHEMA_TABLE); | |
| 113794 | 113825 | sqlite3VdbeAddOp4Int(v, OP_OpenWrite, 0, SCHEMA_ROOT, iDb, 5); |
| 113795 | 113826 | if( p->nTab==0 ){ |
| 113796 | 113827 | p->nTab = 1; |
| 113797 | 113828 | } |
| 113798 | 113829 | } |
| @@ -115729,11 +115760,11 @@ | ||
| 115729 | 115760 | /* A slot for the record has already been allocated in the |
| 115730 | 115761 | ** schema table. We just need to update that slot with all |
| 115731 | 115762 | ** the information we've collected. |
| 115732 | 115763 | */ |
| 115733 | 115764 | sqlite3NestedParse(pParse, |
| 115734 | - "UPDATE %Q." DFLT_SCHEMA_TABLE | |
| 115765 | + "UPDATE %Q." LEGACY_SCHEMA_TABLE | |
| 115735 | 115766 | " SET type='%s', name=%Q, tbl_name=%Q, rootpage=#%d, sql=%Q" |
| 115736 | 115767 | " WHERE rowid=#%d", |
| 115737 | 115768 | db->aDb[iDb].zDbSName, |
| 115738 | 115769 | zType, |
| 115739 | 115770 | p->zName, |
| @@ -116108,11 +116139,11 @@ | ||
| 116108 | 116139 | ** The "#NNN" in the SQL is a special constant that means whatever value |
| 116109 | 116140 | ** is in register NNN. See grammar rules associated with the TK_REGISTER |
| 116110 | 116141 | ** token for additional information. |
| 116111 | 116142 | */ |
| 116112 | 116143 | sqlite3NestedParse(pParse, |
| 116113 | - "UPDATE %Q." DFLT_SCHEMA_TABLE | |
| 116144 | + "UPDATE %Q." LEGACY_SCHEMA_TABLE | |
| 116114 | 116145 | " SET rootpage=%d WHERE #%d AND rootpage=#%d", |
| 116115 | 116146 | pParse->db->aDb[iDb].zDbSName, iTable, r1, r1); |
| 116116 | 116147 | #endif |
| 116117 | 116148 | sqlite3ReleaseTempReg(pParse, r1); |
| 116118 | 116149 | } |
| @@ -116243,11 +116274,11 @@ | ||
| 116243 | 116274 | ** dropped. Triggers are handled separately because a trigger can be |
| 116244 | 116275 | ** created in the temp database that refers to a table in another |
| 116245 | 116276 | ** database. |
| 116246 | 116277 | */ |
| 116247 | 116278 | sqlite3NestedParse(pParse, |
| 116248 | - "DELETE FROM %Q." DFLT_SCHEMA_TABLE | |
| 116279 | + "DELETE FROM %Q." LEGACY_SCHEMA_TABLE | |
| 116249 | 116280 | " WHERE tbl_name=%Q and type!='trigger'", |
| 116250 | 116281 | pDb->zDbSName, pTab->zName); |
| 116251 | 116282 | if( !isView && !IsVirtual(pTab) ){ |
| 116252 | 116283 | destroyTable(pParse, pTab); |
| 116253 | 116284 | } |
| @@ -117260,11 +117291,11 @@ | ||
| 117260 | 117291 | } |
| 117261 | 117292 | |
| 117262 | 117293 | /* Add an entry in sqlite_schema for this index |
| 117263 | 117294 | */ |
| 117264 | 117295 | sqlite3NestedParse(pParse, |
| 117265 | - "INSERT INTO %Q." DFLT_SCHEMA_TABLE " VALUES('index',%Q,%Q,#%d,%Q);", | |
| 117296 | + "INSERT INTO %Q." LEGACY_SCHEMA_TABLE " VALUES('index',%Q,%Q,#%d,%Q);", | |
| 117266 | 117297 | db->aDb[iDb].zDbSName, |
| 117267 | 117298 | pIndex->zName, |
| 117268 | 117299 | pTab->zName, |
| 117269 | 117300 | iMem, |
| 117270 | 117301 | zStmt |
| @@ -117446,11 +117477,11 @@ | ||
| 117446 | 117477 | /* Generate code to remove the index and from the schema table */ |
| 117447 | 117478 | v = sqlite3GetVdbe(pParse); |
| 117448 | 117479 | if( v ){ |
| 117449 | 117480 | sqlite3BeginWriteOperation(pParse, 1, iDb); |
| 117450 | 117481 | sqlite3NestedParse(pParse, |
| 117451 | - "DELETE FROM %Q." DFLT_SCHEMA_TABLE " WHERE name=%Q AND type='index'", | |
| 117482 | + "DELETE FROM %Q." LEGACY_SCHEMA_TABLE " WHERE name=%Q AND type='index'", | |
| 117452 | 117483 | db->aDb[iDb].zDbSName, pIndex->zName |
| 117453 | 117484 | ); |
| 117454 | 117485 | sqlite3ClearStatTables(pParse, iDb, "idx", pIndex->zName); |
| 117455 | 117486 | sqlite3ChangeCookie(pParse, iDb); |
| 117456 | 117487 | destroyRootPage(pParse, pIndex->tnum, iDb); |
| @@ -130583,11 +130614,11 @@ | ||
| 130583 | 130614 | }else{ |
| 130584 | 130615 | zType = "table"; |
| 130585 | 130616 | } |
| 130586 | 130617 | sqlite3VdbeMultiLoad(v, 1, "sssiii", |
| 130587 | 130618 | db->aDb[ii].zDbSName, |
| 130588 | - pTab->zName, | |
| 130619 | + sqlite3PreferredTableName(pTab->zName), | |
| 130589 | 130620 | zType, |
| 130590 | 130621 | pTab->nCol, |
| 130591 | 130622 | (pTab->tabFlags & TF_WithoutRowid)!=0, |
| 130592 | 130623 | (pTab->tabFlags & TF_Strict)!=0 |
| 130593 | 130624 | ); |
| @@ -130603,11 +130634,11 @@ | ||
| 130603 | 130634 | pParse->nMem = 5; |
| 130604 | 130635 | sqlite3CodeVerifySchema(pParse, iDb); |
| 130605 | 130636 | for(i=sqliteHashFirst(&pDb->pSchema->tblHash); i; i=sqliteHashNext(i)){ |
| 130606 | 130637 | Table *pTab = sqliteHashData(i); |
| 130607 | 130638 | sqlite3VdbeMultiLoad(v, 1, "ssiii", |
| 130608 | - pTab->zName, | |
| 130639 | + sqlite3PreferredTableName(pTab->zName), | |
| 130609 | 130640 | 0, |
| 130610 | 130641 | pTab->szTabRow, |
| 130611 | 130642 | pTab->nRowLogEst, |
| 130612 | 130643 | pTab->tabFlags); |
| 130613 | 130644 | for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ |
| @@ -141131,11 +141162,11 @@ | ||
| 141131 | 141162 | if( v==0 ) goto triggerfinish_cleanup; |
| 141132 | 141163 | sqlite3BeginWriteOperation(pParse, 0, iDb); |
| 141133 | 141164 | z = sqlite3DbStrNDup(db, (char*)pAll->z, pAll->n); |
| 141134 | 141165 | testcase( z==0 ); |
| 141135 | 141166 | sqlite3NestedParse(pParse, |
| 141136 | - "INSERT INTO %Q." DFLT_SCHEMA_TABLE | |
| 141167 | + "INSERT INTO %Q." LEGACY_SCHEMA_TABLE | |
| 141137 | 141168 | " VALUES('trigger',%Q,%Q,0,'CREATE TRIGGER %q')", |
| 141138 | 141169 | db->aDb[iDb].zDbSName, zName, |
| 141139 | 141170 | pTrig->table, z); |
| 141140 | 141171 | sqlite3DbFree(db, z); |
| 141141 | 141172 | sqlite3ChangeCookie(pParse, iDb); |
| @@ -141445,11 +141476,11 @@ | ||
| 141445 | 141476 | |
| 141446 | 141477 | /* Generate code to destroy the database record of the trigger. |
| 141447 | 141478 | */ |
| 141448 | 141479 | if( (v = sqlite3GetVdbe(pParse))!=0 ){ |
| 141449 | 141480 | sqlite3NestedParse(pParse, |
| 141450 | - "DELETE FROM %Q." DFLT_SCHEMA_TABLE " WHERE name=%Q AND type='trigger'", | |
| 141481 | + "DELETE FROM %Q." LEGACY_SCHEMA_TABLE " WHERE name=%Q AND type='trigger'", | |
| 141451 | 141482 | db->aDb[iDb].zDbSName, pTrigger->zName |
| 141452 | 141483 | ); |
| 141453 | 141484 | sqlite3ChangeCookie(pParse, iDb); |
| 141454 | 141485 | sqlite3VdbeAddOp4(v, OP_DropTrigger, iDb, 0, 0, pTrigger->zName, 0); |
| 141455 | 141486 | } |
| @@ -144742,11 +144773,11 @@ | ||
| 144742 | 144773 | ** entry in the sqlite_schema table tht was created for this vtab |
| 144743 | 144774 | ** by sqlite3StartTable(). |
| 144744 | 144775 | */ |
| 144745 | 144776 | iDb = sqlite3SchemaToIndex(db, pTab->pSchema); |
| 144746 | 144777 | sqlite3NestedParse(pParse, |
| 144747 | - "UPDATE %Q." DFLT_SCHEMA_TABLE " " | |
| 144778 | + "UPDATE %Q." LEGACY_SCHEMA_TABLE " " | |
| 144748 | 144779 | "SET type='table', name=%Q, tbl_name=%Q, rootpage=0, sql=%Q " |
| 144749 | 144780 | "WHERE rowid=#%d", |
| 144750 | 144781 | db->aDb[iDb].zDbSName, |
| 144751 | 144782 | pTab->zName, |
| 144752 | 144783 | pTab->zName, |
| @@ -144953,11 +144984,12 @@ | ||
| 144953 | 144984 | const char *zMod; |
| 144954 | 144985 | Module *pMod; |
| 144955 | 144986 | int rc; |
| 144956 | 144987 | |
| 144957 | 144988 | assert( pTab ); |
| 144958 | - if( !IsVirtual(pTab) || sqlite3GetVTable(db, pTab) ){ | |
| 144989 | + assert( IsVirtual(pTab) ); | |
| 144990 | + if( sqlite3GetVTable(db, pTab) ){ | |
| 144959 | 144991 | return SQLITE_OK; |
| 144960 | 144992 | } |
| 144961 | 144993 | |
| 144962 | 144994 | /* Locate the required virtual table module */ |
| 144963 | 144995 | zMod = pTab->u.vtab.azArg[0]; |
| 144964 | 144996 |
| --- src/sqlite3.c | |
| +++ src/sqlite3.c | |
| @@ -452,11 +452,11 @@ | |
| 452 | ** [sqlite3_libversion_number()], [sqlite3_sourceid()], |
| 453 | ** [sqlite_version()] and [sqlite_source_id()]. |
| 454 | */ |
| 455 | #define SQLITE_VERSION "3.37.0" |
| 456 | #define SQLITE_VERSION_NUMBER 3037000 |
| 457 | #define SQLITE_SOURCE_ID "2021-11-04 00:51:53 005a8642773556825fe4c5d0b2c12517d35289308a30df0151ef7f080acb0172" |
| 458 | |
| 459 | /* |
| 460 | ** CAPI3REF: Run-Time Library Version Numbers |
| 461 | ** KEYWORDS: sqlite3_version sqlite3_sourceid |
| 462 | ** |
| @@ -14144,15 +14144,29 @@ | |
| 14144 | int nBusy; /* Incremented with each busy call */ |
| 14145 | }; |
| 14146 | |
| 14147 | /* |
| 14148 | ** Name of table that holds the database schema. |
| 14149 | */ |
| 14150 | #define DFLT_SCHEMA_TABLE "sqlite_master" |
| 14151 | #define DFLT_TEMP_SCHEMA_TABLE "sqlite_temp_master" |
| 14152 | #define ALT_SCHEMA_TABLE "sqlite_schema" |
| 14153 | #define ALT_TEMP_SCHEMA_TABLE "sqlite_temp_schema" |
| 14154 | |
| 14155 | |
| 14156 | /* |
| 14157 | ** The root-page of the schema table. |
| 14158 | */ |
| @@ -14160,11 +14174,11 @@ | |
| 14160 | |
| 14161 | /* |
| 14162 | ** The name of the schema table. The name is different for TEMP. |
| 14163 | */ |
| 14164 | #define SCHEMA_TABLE(x) \ |
| 14165 | ((!OMIT_TEMPDB)&&(x==1)?DFLT_TEMP_SCHEMA_TABLE:DFLT_SCHEMA_TABLE) |
| 14166 | |
| 14167 | /* |
| 14168 | ** A convenience macro that returns the number of elements in |
| 14169 | ** an array. |
| 14170 | */ |
| @@ -19529,10 +19543,11 @@ | |
| 19529 | SQLITE_PRIVATE void sqlite3ExprIfFalseDup(Parse*, Expr*, int, int); |
| 19530 | SQLITE_PRIVATE Table *sqlite3FindTable(sqlite3*,const char*, const char*); |
| 19531 | #define LOCATE_VIEW 0x01 |
| 19532 | #define LOCATE_NOERR 0x02 |
| 19533 | SQLITE_PRIVATE Table *sqlite3LocateTable(Parse*,u32 flags,const char*, const char*); |
| 19534 | SQLITE_PRIVATE Table *sqlite3LocateTableItem(Parse*,u32 flags,SrcItem *); |
| 19535 | SQLITE_PRIVATE Index *sqlite3FindIndex(sqlite3*,const char*, const char*); |
| 19536 | SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTable(sqlite3*,int,const char*); |
| 19537 | SQLITE_PRIVATE void sqlite3UnlinkAndDeleteIndex(sqlite3*,int,const char*); |
| 19538 | SQLITE_PRIVATE void sqlite3Vacuum(Parse*,Token*,Expr*); |
| @@ -93133,11 +93148,11 @@ | |
| 93133 | db->mDbFlags |= DBFLAG_SchemaChange; |
| 93134 | p->expired = 0; |
| 93135 | }else |
| 93136 | #endif |
| 93137 | { |
| 93138 | zSchema = DFLT_SCHEMA_TABLE; |
| 93139 | initData.db = db; |
| 93140 | initData.iDb = iDb; |
| 93141 | initData.pzErrMsg = &p->zErrMsg; |
| 93142 | initData.mInitFlags = 0; |
| 93143 | initData.mxPage = sqlite3BtreeLastPage(db->aDb[iDb].pBt); |
| @@ -107895,11 +107910,11 @@ | |
| 107895 | int bNoDQS /* Do not allow DQS in the schema */ |
| 107896 | ){ |
| 107897 | pParse->colNamesSet = 1; |
| 107898 | sqlite3NestedParse(pParse, |
| 107899 | "SELECT 1 " |
| 107900 | "FROM \"%w\"." DFLT_SCHEMA_TABLE " " |
| 107901 | "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" |
| 107902 | " AND sql NOT LIKE 'create virtual%%'" |
| 107903 | " AND sqlite_rename_test(%Q, sql, type, name, %d, %Q, %d)=NULL ", |
| 107904 | zDb, |
| 107905 | zDb, bTemp, zWhen, bNoDQS |
| @@ -107906,11 +107921,11 @@ | |
| 107906 | ); |
| 107907 | |
| 107908 | if( bTemp==0 ){ |
| 107909 | sqlite3NestedParse(pParse, |
| 107910 | "SELECT 1 " |
| 107911 | "FROM temp." DFLT_SCHEMA_TABLE " " |
| 107912 | "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" |
| 107913 | " AND sql NOT LIKE 'create virtual%%'" |
| 107914 | " AND sqlite_rename_test(%Q, sql, type, name, 1, %Q, %d)=NULL ", |
| 107915 | zDb, zWhen, bNoDQS |
| 107916 | ); |
| @@ -107924,18 +107939,18 @@ | |
| 107924 | ** not true, similarly update all SQL statements in the sqlite_schema table |
| 107925 | ** of the temp db. |
| 107926 | */ |
| 107927 | static void renameFixQuotes(Parse *pParse, const char *zDb, int bTemp){ |
| 107928 | sqlite3NestedParse(pParse, |
| 107929 | "UPDATE \"%w\"." DFLT_SCHEMA_TABLE |
| 107930 | " SET sql = sqlite_rename_quotefix(%Q, sql)" |
| 107931 | "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" |
| 107932 | " AND sql NOT LIKE 'create virtual%%'" , zDb, zDb |
| 107933 | ); |
| 107934 | if( bTemp==0 ){ |
| 107935 | sqlite3NestedParse(pParse, |
| 107936 | "UPDATE temp." DFLT_SCHEMA_TABLE |
| 107937 | " SET sql = sqlite_rename_quotefix('temp', sql)" |
| 107938 | "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" |
| 107939 | " AND sql NOT LIKE 'create virtual%%'" |
| 107940 | ); |
| 107941 | } |
| @@ -108049,21 +108064,21 @@ | |
| 108049 | nTabName = sqlite3Utf8CharLen(zTabName, -1); |
| 108050 | |
| 108051 | /* Rewrite all CREATE TABLE, INDEX, TRIGGER or VIEW statements in |
| 108052 | ** the schema to use the new table name. */ |
| 108053 | sqlite3NestedParse(pParse, |
| 108054 | "UPDATE \"%w\"." DFLT_SCHEMA_TABLE " SET " |
| 108055 | "sql = sqlite_rename_table(%Q, type, name, sql, %Q, %Q, %d) " |
| 108056 | "WHERE (type!='index' OR tbl_name=%Q COLLATE nocase)" |
| 108057 | "AND name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" |
| 108058 | , zDb, zDb, zTabName, zName, (iDb==1), zTabName |
| 108059 | ); |
| 108060 | |
| 108061 | /* Update the tbl_name and name columns of the sqlite_schema table |
| 108062 | ** as required. */ |
| 108063 | sqlite3NestedParse(pParse, |
| 108064 | "UPDATE %Q." DFLT_SCHEMA_TABLE " SET " |
| 108065 | "tbl_name = %Q, " |
| 108066 | "name = CASE " |
| 108067 | "WHEN type='table' THEN %Q " |
| 108068 | "WHEN name LIKE 'sqliteX_autoindex%%' ESCAPE 'X' " |
| 108069 | " AND type='index' THEN " |
| @@ -108248,11 +108263,11 @@ | |
| 108248 | /* substr() operations on characters, but addColOffset is in bytes. So we |
| 108249 | ** have to use printf() to translate between these units: */ |
| 108250 | assert( IsOrdinaryTable(pTab) ); |
| 108251 | assert( IsOrdinaryTable(pNew) ); |
| 108252 | sqlite3NestedParse(pParse, |
| 108253 | "UPDATE \"%w\"." DFLT_SCHEMA_TABLE " SET " |
| 108254 | "sql = printf('%%.%ds, ',sql) || %Q" |
| 108255 | " || substr(sql,1+length(printf('%%.%ds',sql))) " |
| 108256 | "WHERE type = 'table' AND name = %Q", |
| 108257 | zDb, pNew->u.tab.addColOffset, zCol, pNew->u.tab.addColOffset, |
| 108258 | zTab |
| @@ -108482,21 +108497,21 @@ | |
| 108482 | zNew = sqlite3NameFromToken(db, pNew); |
| 108483 | if( !zNew ) goto exit_rename_column; |
| 108484 | assert( pNew->n>0 ); |
| 108485 | bQuote = sqlite3Isquote(pNew->z[0]); |
| 108486 | sqlite3NestedParse(pParse, |
| 108487 | "UPDATE \"%w\"." DFLT_SCHEMA_TABLE " SET " |
| 108488 | "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, %d) " |
| 108489 | "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X' " |
| 108490 | " AND (type != 'index' OR tbl_name = %Q)", |
| 108491 | zDb, |
| 108492 | zDb, pTab->zName, iCol, zNew, bQuote, iSchema==1, |
| 108493 | pTab->zName |
| 108494 | ); |
| 108495 | |
| 108496 | sqlite3NestedParse(pParse, |
| 108497 | "UPDATE temp." DFLT_SCHEMA_TABLE " SET " |
| 108498 | "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, 1) " |
| 108499 | "WHERE type IN ('trigger', 'view')", |
| 108500 | zDb, pTab->zName, iCol, zNew, bQuote |
| 108501 | ); |
| 108502 | |
| @@ -109973,11 +109988,11 @@ | |
| 109973 | assert( iDb>=0 ); |
| 109974 | zDb = db->aDb[iDb].zDbSName; |
| 109975 | renameTestSchema(pParse, zDb, iDb==1, "", 0); |
| 109976 | renameFixQuotes(pParse, zDb, iDb==1); |
| 109977 | sqlite3NestedParse(pParse, |
| 109978 | "UPDATE \"%w\"." DFLT_SCHEMA_TABLE " SET " |
| 109979 | "sql = sqlite_drop_column(%d, sql, %d) " |
| 109980 | "WHERE (type=='table' AND tbl_name=%Q COLLATE nocase)" |
| 109981 | , zDb, iDb, iCol, pTab->zName |
| 109982 | ); |
| 109983 | |
| @@ -113262,21 +113277,21 @@ | |
| 113262 | } |
| 113263 | } |
| 113264 | p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, zName); |
| 113265 | if( p==0 && sqlite3StrNICmp(zName, "sqlite_", 7)==0 ){ |
| 113266 | if( i==1 ){ |
| 113267 | if( sqlite3StrICmp(zName+7, &ALT_TEMP_SCHEMA_TABLE[7])==0 |
| 113268 | || sqlite3StrICmp(zName+7, &ALT_SCHEMA_TABLE[7])==0 |
| 113269 | || sqlite3StrICmp(zName+7, &DFLT_SCHEMA_TABLE[7])==0 |
| 113270 | ){ |
| 113271 | p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, |
| 113272 | DFLT_TEMP_SCHEMA_TABLE); |
| 113273 | } |
| 113274 | }else{ |
| 113275 | if( sqlite3StrICmp(zName+7, &ALT_SCHEMA_TABLE[7])==0 ){ |
| 113276 | p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, |
| 113277 | DFLT_SCHEMA_TABLE); |
| 113278 | } |
| 113279 | } |
| 113280 | } |
| 113281 | }else{ |
| 113282 | /* Match against TEMP first */ |
| @@ -113290,15 +113305,15 @@ | |
| 113290 | assert( sqlite3SchemaMutexHeld(db, i, 0) ); |
| 113291 | p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, zName); |
| 113292 | if( p ) break; |
| 113293 | } |
| 113294 | if( p==0 && sqlite3StrNICmp(zName, "sqlite_", 7)==0 ){ |
| 113295 | if( sqlite3StrICmp(zName+7, &ALT_SCHEMA_TABLE[7])==0 ){ |
| 113296 | p = sqlite3HashFind(&db->aDb[0].pSchema->tblHash, DFLT_SCHEMA_TABLE); |
| 113297 | }else if( sqlite3StrICmp(zName+7, &ALT_TEMP_SCHEMA_TABLE[7])==0 ){ |
| 113298 | p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, |
| 113299 | DFLT_TEMP_SCHEMA_TABLE); |
| 113300 | } |
| 113301 | } |
| 113302 | } |
| 113303 | return p; |
| 113304 | } |
| @@ -113389,10 +113404,26 @@ | |
| 113389 | }else{ |
| 113390 | zDb = p->zDatabase; |
| 113391 | } |
| 113392 | return sqlite3LocateTable(pParse, flags, p->zName, zDb); |
| 113393 | } |
| 113394 | |
| 113395 | /* |
| 113396 | ** Locate the in-memory structure that describes |
| 113397 | ** a particular index given the name of that index |
| 113398 | ** and the name of the database that contains the index. |
| @@ -113788,11 +113819,11 @@ | |
| 113788 | ** Open the sqlite_schema table stored in database number iDb for |
| 113789 | ** writing. The table is opened using cursor 0. |
| 113790 | */ |
| 113791 | SQLITE_PRIVATE void sqlite3OpenSchemaTable(Parse *p, int iDb){ |
| 113792 | Vdbe *v = sqlite3GetVdbe(p); |
| 113793 | sqlite3TableLock(p, iDb, SCHEMA_ROOT, 1, DFLT_SCHEMA_TABLE); |
| 113794 | sqlite3VdbeAddOp4Int(v, OP_OpenWrite, 0, SCHEMA_ROOT, iDb, 5); |
| 113795 | if( p->nTab==0 ){ |
| 113796 | p->nTab = 1; |
| 113797 | } |
| 113798 | } |
| @@ -115729,11 +115760,11 @@ | |
| 115729 | /* A slot for the record has already been allocated in the |
| 115730 | ** schema table. We just need to update that slot with all |
| 115731 | ** the information we've collected. |
| 115732 | */ |
| 115733 | sqlite3NestedParse(pParse, |
| 115734 | "UPDATE %Q." DFLT_SCHEMA_TABLE |
| 115735 | " SET type='%s', name=%Q, tbl_name=%Q, rootpage=#%d, sql=%Q" |
| 115736 | " WHERE rowid=#%d", |
| 115737 | db->aDb[iDb].zDbSName, |
| 115738 | zType, |
| 115739 | p->zName, |
| @@ -116108,11 +116139,11 @@ | |
| 116108 | ** The "#NNN" in the SQL is a special constant that means whatever value |
| 116109 | ** is in register NNN. See grammar rules associated with the TK_REGISTER |
| 116110 | ** token for additional information. |
| 116111 | */ |
| 116112 | sqlite3NestedParse(pParse, |
| 116113 | "UPDATE %Q." DFLT_SCHEMA_TABLE |
| 116114 | " SET rootpage=%d WHERE #%d AND rootpage=#%d", |
| 116115 | pParse->db->aDb[iDb].zDbSName, iTable, r1, r1); |
| 116116 | #endif |
| 116117 | sqlite3ReleaseTempReg(pParse, r1); |
| 116118 | } |
| @@ -116243,11 +116274,11 @@ | |
| 116243 | ** dropped. Triggers are handled separately because a trigger can be |
| 116244 | ** created in the temp database that refers to a table in another |
| 116245 | ** database. |
| 116246 | */ |
| 116247 | sqlite3NestedParse(pParse, |
| 116248 | "DELETE FROM %Q." DFLT_SCHEMA_TABLE |
| 116249 | " WHERE tbl_name=%Q and type!='trigger'", |
| 116250 | pDb->zDbSName, pTab->zName); |
| 116251 | if( !isView && !IsVirtual(pTab) ){ |
| 116252 | destroyTable(pParse, pTab); |
| 116253 | } |
| @@ -117260,11 +117291,11 @@ | |
| 117260 | } |
| 117261 | |
| 117262 | /* Add an entry in sqlite_schema for this index |
| 117263 | */ |
| 117264 | sqlite3NestedParse(pParse, |
| 117265 | "INSERT INTO %Q." DFLT_SCHEMA_TABLE " VALUES('index',%Q,%Q,#%d,%Q);", |
| 117266 | db->aDb[iDb].zDbSName, |
| 117267 | pIndex->zName, |
| 117268 | pTab->zName, |
| 117269 | iMem, |
| 117270 | zStmt |
| @@ -117446,11 +117477,11 @@ | |
| 117446 | /* Generate code to remove the index and from the schema table */ |
| 117447 | v = sqlite3GetVdbe(pParse); |
| 117448 | if( v ){ |
| 117449 | sqlite3BeginWriteOperation(pParse, 1, iDb); |
| 117450 | sqlite3NestedParse(pParse, |
| 117451 | "DELETE FROM %Q." DFLT_SCHEMA_TABLE " WHERE name=%Q AND type='index'", |
| 117452 | db->aDb[iDb].zDbSName, pIndex->zName |
| 117453 | ); |
| 117454 | sqlite3ClearStatTables(pParse, iDb, "idx", pIndex->zName); |
| 117455 | sqlite3ChangeCookie(pParse, iDb); |
| 117456 | destroyRootPage(pParse, pIndex->tnum, iDb); |
| @@ -130583,11 +130614,11 @@ | |
| 130583 | }else{ |
| 130584 | zType = "table"; |
| 130585 | } |
| 130586 | sqlite3VdbeMultiLoad(v, 1, "sssiii", |
| 130587 | db->aDb[ii].zDbSName, |
| 130588 | pTab->zName, |
| 130589 | zType, |
| 130590 | pTab->nCol, |
| 130591 | (pTab->tabFlags & TF_WithoutRowid)!=0, |
| 130592 | (pTab->tabFlags & TF_Strict)!=0 |
| 130593 | ); |
| @@ -130603,11 +130634,11 @@ | |
| 130603 | pParse->nMem = 5; |
| 130604 | sqlite3CodeVerifySchema(pParse, iDb); |
| 130605 | for(i=sqliteHashFirst(&pDb->pSchema->tblHash); i; i=sqliteHashNext(i)){ |
| 130606 | Table *pTab = sqliteHashData(i); |
| 130607 | sqlite3VdbeMultiLoad(v, 1, "ssiii", |
| 130608 | pTab->zName, |
| 130609 | 0, |
| 130610 | pTab->szTabRow, |
| 130611 | pTab->nRowLogEst, |
| 130612 | pTab->tabFlags); |
| 130613 | for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ |
| @@ -141131,11 +141162,11 @@ | |
| 141131 | if( v==0 ) goto triggerfinish_cleanup; |
| 141132 | sqlite3BeginWriteOperation(pParse, 0, iDb); |
| 141133 | z = sqlite3DbStrNDup(db, (char*)pAll->z, pAll->n); |
| 141134 | testcase( z==0 ); |
| 141135 | sqlite3NestedParse(pParse, |
| 141136 | "INSERT INTO %Q." DFLT_SCHEMA_TABLE |
| 141137 | " VALUES('trigger',%Q,%Q,0,'CREATE TRIGGER %q')", |
| 141138 | db->aDb[iDb].zDbSName, zName, |
| 141139 | pTrig->table, z); |
| 141140 | sqlite3DbFree(db, z); |
| 141141 | sqlite3ChangeCookie(pParse, iDb); |
| @@ -141445,11 +141476,11 @@ | |
| 141445 | |
| 141446 | /* Generate code to destroy the database record of the trigger. |
| 141447 | */ |
| 141448 | if( (v = sqlite3GetVdbe(pParse))!=0 ){ |
| 141449 | sqlite3NestedParse(pParse, |
| 141450 | "DELETE FROM %Q." DFLT_SCHEMA_TABLE " WHERE name=%Q AND type='trigger'", |
| 141451 | db->aDb[iDb].zDbSName, pTrigger->zName |
| 141452 | ); |
| 141453 | sqlite3ChangeCookie(pParse, iDb); |
| 141454 | sqlite3VdbeAddOp4(v, OP_DropTrigger, iDb, 0, 0, pTrigger->zName, 0); |
| 141455 | } |
| @@ -144742,11 +144773,11 @@ | |
| 144742 | ** entry in the sqlite_schema table tht was created for this vtab |
| 144743 | ** by sqlite3StartTable(). |
| 144744 | */ |
| 144745 | iDb = sqlite3SchemaToIndex(db, pTab->pSchema); |
| 144746 | sqlite3NestedParse(pParse, |
| 144747 | "UPDATE %Q." DFLT_SCHEMA_TABLE " " |
| 144748 | "SET type='table', name=%Q, tbl_name=%Q, rootpage=0, sql=%Q " |
| 144749 | "WHERE rowid=#%d", |
| 144750 | db->aDb[iDb].zDbSName, |
| 144751 | pTab->zName, |
| 144752 | pTab->zName, |
| @@ -144953,11 +144984,12 @@ | |
| 144953 | const char *zMod; |
| 144954 | Module *pMod; |
| 144955 | int rc; |
| 144956 | |
| 144957 | assert( pTab ); |
| 144958 | if( !IsVirtual(pTab) || sqlite3GetVTable(db, pTab) ){ |
| 144959 | return SQLITE_OK; |
| 144960 | } |
| 144961 | |
| 144962 | /* Locate the required virtual table module */ |
| 144963 | zMod = pTab->u.vtab.azArg[0]; |
| 144964 |
| --- src/sqlite3.c | |
| +++ src/sqlite3.c | |
| @@ -452,11 +452,11 @@ | |
| 452 | ** [sqlite3_libversion_number()], [sqlite3_sourceid()], |
| 453 | ** [sqlite_version()] and [sqlite_source_id()]. |
| 454 | */ |
| 455 | #define SQLITE_VERSION "3.37.0" |
| 456 | #define SQLITE_VERSION_NUMBER 3037000 |
| 457 | #define SQLITE_SOURCE_ID "2021-11-04 14:04:20 9147390d9885a37a62edc1058f313434627f1b59965c890877d2cb119e355c78" |
| 458 | |
| 459 | /* |
| 460 | ** CAPI3REF: Run-Time Library Version Numbers |
| 461 | ** KEYWORDS: sqlite3_version sqlite3_sourceid |
| 462 | ** |
| @@ -14144,15 +14144,29 @@ | |
| 14144 | int nBusy; /* Incremented with each busy call */ |
| 14145 | }; |
| 14146 | |
| 14147 | /* |
| 14148 | ** Name of table that holds the database schema. |
| 14149 | ** |
| 14150 | ** The PREFERRED names are used whereever possible. But LEGACY is also |
| 14151 | ** used for backwards compatibility. |
| 14152 | ** |
| 14153 | ** 1. Queries can use either the PREFERRED or the LEGACY names |
| 14154 | ** 2. The sqlite3_set_authorizer() callback uses the LEGACY name |
| 14155 | ** 3. The PRAGMA table_list statement uses the PREFERRED name |
| 14156 | ** |
| 14157 | ** The LEGACY names are stored in the internal symbol hash table |
| 14158 | ** in support of (2). Names are translated using sqlite3PreferredTableName() |
| 14159 | ** for (3). The sqlite3FindTable() function takes care of translating |
| 14160 | ** names for (1). |
| 14161 | ** |
| 14162 | ** Note that "sqlite_temp_schema" can also be called "temp.sqlite_schema". |
| 14163 | */ |
| 14164 | #define LEGACY_SCHEMA_TABLE "sqlite_master" |
| 14165 | #define LEGACY_TEMP_SCHEMA_TABLE "sqlite_temp_master" |
| 14166 | #define PREFERRED_SCHEMA_TABLE "sqlite_schema" |
| 14167 | #define PREFERRED_TEMP_SCHEMA_TABLE "sqlite_temp_schema" |
| 14168 | |
| 14169 | |
| 14170 | /* |
| 14171 | ** The root-page of the schema table. |
| 14172 | */ |
| @@ -14160,11 +14174,11 @@ | |
| 14174 | |
| 14175 | /* |
| 14176 | ** The name of the schema table. The name is different for TEMP. |
| 14177 | */ |
| 14178 | #define SCHEMA_TABLE(x) \ |
| 14179 | ((!OMIT_TEMPDB)&&(x==1)?LEGACY_TEMP_SCHEMA_TABLE:LEGACY_SCHEMA_TABLE) |
| 14180 | |
| 14181 | /* |
| 14182 | ** A convenience macro that returns the number of elements in |
| 14183 | ** an array. |
| 14184 | */ |
| @@ -19529,10 +19543,11 @@ | |
| 19543 | SQLITE_PRIVATE void sqlite3ExprIfFalseDup(Parse*, Expr*, int, int); |
| 19544 | SQLITE_PRIVATE Table *sqlite3FindTable(sqlite3*,const char*, const char*); |
| 19545 | #define LOCATE_VIEW 0x01 |
| 19546 | #define LOCATE_NOERR 0x02 |
| 19547 | SQLITE_PRIVATE Table *sqlite3LocateTable(Parse*,u32 flags,const char*, const char*); |
| 19548 | SQLITE_PRIVATE const char *sqlite3PreferredTableName(const char*); |
| 19549 | SQLITE_PRIVATE Table *sqlite3LocateTableItem(Parse*,u32 flags,SrcItem *); |
| 19550 | SQLITE_PRIVATE Index *sqlite3FindIndex(sqlite3*,const char*, const char*); |
| 19551 | SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTable(sqlite3*,int,const char*); |
| 19552 | SQLITE_PRIVATE void sqlite3UnlinkAndDeleteIndex(sqlite3*,int,const char*); |
| 19553 | SQLITE_PRIVATE void sqlite3Vacuum(Parse*,Token*,Expr*); |
| @@ -93133,11 +93148,11 @@ | |
| 93148 | db->mDbFlags |= DBFLAG_SchemaChange; |
| 93149 | p->expired = 0; |
| 93150 | }else |
| 93151 | #endif |
| 93152 | { |
| 93153 | zSchema = LEGACY_SCHEMA_TABLE; |
| 93154 | initData.db = db; |
| 93155 | initData.iDb = iDb; |
| 93156 | initData.pzErrMsg = &p->zErrMsg; |
| 93157 | initData.mInitFlags = 0; |
| 93158 | initData.mxPage = sqlite3BtreeLastPage(db->aDb[iDb].pBt); |
| @@ -107895,11 +107910,11 @@ | |
| 107910 | int bNoDQS /* Do not allow DQS in the schema */ |
| 107911 | ){ |
| 107912 | pParse->colNamesSet = 1; |
| 107913 | sqlite3NestedParse(pParse, |
| 107914 | "SELECT 1 " |
| 107915 | "FROM \"%w\"." LEGACY_SCHEMA_TABLE " " |
| 107916 | "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" |
| 107917 | " AND sql NOT LIKE 'create virtual%%'" |
| 107918 | " AND sqlite_rename_test(%Q, sql, type, name, %d, %Q, %d)=NULL ", |
| 107919 | zDb, |
| 107920 | zDb, bTemp, zWhen, bNoDQS |
| @@ -107906,11 +107921,11 @@ | |
| 107921 | ); |
| 107922 | |
| 107923 | if( bTemp==0 ){ |
| 107924 | sqlite3NestedParse(pParse, |
| 107925 | "SELECT 1 " |
| 107926 | "FROM temp." LEGACY_SCHEMA_TABLE " " |
| 107927 | "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" |
| 107928 | " AND sql NOT LIKE 'create virtual%%'" |
| 107929 | " AND sqlite_rename_test(%Q, sql, type, name, 1, %Q, %d)=NULL ", |
| 107930 | zDb, zWhen, bNoDQS |
| 107931 | ); |
| @@ -107924,18 +107939,18 @@ | |
| 107939 | ** not true, similarly update all SQL statements in the sqlite_schema table |
| 107940 | ** of the temp db. |
| 107941 | */ |
| 107942 | static void renameFixQuotes(Parse *pParse, const char *zDb, int bTemp){ |
| 107943 | sqlite3NestedParse(pParse, |
| 107944 | "UPDATE \"%w\"." LEGACY_SCHEMA_TABLE |
| 107945 | " SET sql = sqlite_rename_quotefix(%Q, sql)" |
| 107946 | "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" |
| 107947 | " AND sql NOT LIKE 'create virtual%%'" , zDb, zDb |
| 107948 | ); |
| 107949 | if( bTemp==0 ){ |
| 107950 | sqlite3NestedParse(pParse, |
| 107951 | "UPDATE temp." LEGACY_SCHEMA_TABLE |
| 107952 | " SET sql = sqlite_rename_quotefix('temp', sql)" |
| 107953 | "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" |
| 107954 | " AND sql NOT LIKE 'create virtual%%'" |
| 107955 | ); |
| 107956 | } |
| @@ -108049,21 +108064,21 @@ | |
| 108064 | nTabName = sqlite3Utf8CharLen(zTabName, -1); |
| 108065 | |
| 108066 | /* Rewrite all CREATE TABLE, INDEX, TRIGGER or VIEW statements in |
| 108067 | ** the schema to use the new table name. */ |
| 108068 | sqlite3NestedParse(pParse, |
| 108069 | "UPDATE \"%w\"." LEGACY_SCHEMA_TABLE " SET " |
| 108070 | "sql = sqlite_rename_table(%Q, type, name, sql, %Q, %Q, %d) " |
| 108071 | "WHERE (type!='index' OR tbl_name=%Q COLLATE nocase)" |
| 108072 | "AND name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" |
| 108073 | , zDb, zDb, zTabName, zName, (iDb==1), zTabName |
| 108074 | ); |
| 108075 | |
| 108076 | /* Update the tbl_name and name columns of the sqlite_schema table |
| 108077 | ** as required. */ |
| 108078 | sqlite3NestedParse(pParse, |
| 108079 | "UPDATE %Q." LEGACY_SCHEMA_TABLE " SET " |
| 108080 | "tbl_name = %Q, " |
| 108081 | "name = CASE " |
| 108082 | "WHEN type='table' THEN %Q " |
| 108083 | "WHEN name LIKE 'sqliteX_autoindex%%' ESCAPE 'X' " |
| 108084 | " AND type='index' THEN " |
| @@ -108248,11 +108263,11 @@ | |
| 108263 | /* substr() operations on characters, but addColOffset is in bytes. So we |
| 108264 | ** have to use printf() to translate between these units: */ |
| 108265 | assert( IsOrdinaryTable(pTab) ); |
| 108266 | assert( IsOrdinaryTable(pNew) ); |
| 108267 | sqlite3NestedParse(pParse, |
| 108268 | "UPDATE \"%w\"." LEGACY_SCHEMA_TABLE " SET " |
| 108269 | "sql = printf('%%.%ds, ',sql) || %Q" |
| 108270 | " || substr(sql,1+length(printf('%%.%ds',sql))) " |
| 108271 | "WHERE type = 'table' AND name = %Q", |
| 108272 | zDb, pNew->u.tab.addColOffset, zCol, pNew->u.tab.addColOffset, |
| 108273 | zTab |
| @@ -108482,21 +108497,21 @@ | |
| 108497 | zNew = sqlite3NameFromToken(db, pNew); |
| 108498 | if( !zNew ) goto exit_rename_column; |
| 108499 | assert( pNew->n>0 ); |
| 108500 | bQuote = sqlite3Isquote(pNew->z[0]); |
| 108501 | sqlite3NestedParse(pParse, |
| 108502 | "UPDATE \"%w\"." LEGACY_SCHEMA_TABLE " SET " |
| 108503 | "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, %d) " |
| 108504 | "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X' " |
| 108505 | " AND (type != 'index' OR tbl_name = %Q)", |
| 108506 | zDb, |
| 108507 | zDb, pTab->zName, iCol, zNew, bQuote, iSchema==1, |
| 108508 | pTab->zName |
| 108509 | ); |
| 108510 | |
| 108511 | sqlite3NestedParse(pParse, |
| 108512 | "UPDATE temp." LEGACY_SCHEMA_TABLE " SET " |
| 108513 | "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, 1) " |
| 108514 | "WHERE type IN ('trigger', 'view')", |
| 108515 | zDb, pTab->zName, iCol, zNew, bQuote |
| 108516 | ); |
| 108517 | |
| @@ -109973,11 +109988,11 @@ | |
| 109988 | assert( iDb>=0 ); |
| 109989 | zDb = db->aDb[iDb].zDbSName; |
| 109990 | renameTestSchema(pParse, zDb, iDb==1, "", 0); |
| 109991 | renameFixQuotes(pParse, zDb, iDb==1); |
| 109992 | sqlite3NestedParse(pParse, |
| 109993 | "UPDATE \"%w\"." LEGACY_SCHEMA_TABLE " SET " |
| 109994 | "sql = sqlite_drop_column(%d, sql, %d) " |
| 109995 | "WHERE (type=='table' AND tbl_name=%Q COLLATE nocase)" |
| 109996 | , zDb, iDb, iCol, pTab->zName |
| 109997 | ); |
| 109998 | |
| @@ -113262,21 +113277,21 @@ | |
| 113277 | } |
| 113278 | } |
| 113279 | p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, zName); |
| 113280 | if( p==0 && sqlite3StrNICmp(zName, "sqlite_", 7)==0 ){ |
| 113281 | if( i==1 ){ |
| 113282 | if( sqlite3StrICmp(zName+7, &PREFERRED_TEMP_SCHEMA_TABLE[7])==0 |
| 113283 | || sqlite3StrICmp(zName+7, &PREFERRED_SCHEMA_TABLE[7])==0 |
| 113284 | || sqlite3StrICmp(zName+7, &LEGACY_SCHEMA_TABLE[7])==0 |
| 113285 | ){ |
| 113286 | p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, |
| 113287 | LEGACY_TEMP_SCHEMA_TABLE); |
| 113288 | } |
| 113289 | }else{ |
| 113290 | if( sqlite3StrICmp(zName+7, &PREFERRED_SCHEMA_TABLE[7])==0 ){ |
| 113291 | p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, |
| 113292 | LEGACY_SCHEMA_TABLE); |
| 113293 | } |
| 113294 | } |
| 113295 | } |
| 113296 | }else{ |
| 113297 | /* Match against TEMP first */ |
| @@ -113290,15 +113305,15 @@ | |
| 113305 | assert( sqlite3SchemaMutexHeld(db, i, 0) ); |
| 113306 | p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, zName); |
| 113307 | if( p ) break; |
| 113308 | } |
| 113309 | if( p==0 && sqlite3StrNICmp(zName, "sqlite_", 7)==0 ){ |
| 113310 | if( sqlite3StrICmp(zName+7, &PREFERRED_SCHEMA_TABLE[7])==0 ){ |
| 113311 | p = sqlite3HashFind(&db->aDb[0].pSchema->tblHash, LEGACY_SCHEMA_TABLE); |
| 113312 | }else if( sqlite3StrICmp(zName+7, &PREFERRED_TEMP_SCHEMA_TABLE[7])==0 ){ |
| 113313 | p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, |
| 113314 | LEGACY_TEMP_SCHEMA_TABLE); |
| 113315 | } |
| 113316 | } |
| 113317 | } |
| 113318 | return p; |
| 113319 | } |
| @@ -113389,10 +113404,26 @@ | |
| 113404 | }else{ |
| 113405 | zDb = p->zDatabase; |
| 113406 | } |
| 113407 | return sqlite3LocateTable(pParse, flags, p->zName, zDb); |
| 113408 | } |
| 113409 | |
| 113410 | /* |
| 113411 | ** Return the preferred table name for system tables. Translate legacy |
| 113412 | ** names into the new preferred names, as appropriate. |
| 113413 | */ |
| 113414 | SQLITE_PRIVATE const char *sqlite3PreferredTableName(const char *zName){ |
| 113415 | if( sqlite3StrNICmp(zName, "sqlite_", 7)==0 ){ |
| 113416 | if( sqlite3StrICmp(zName+7, &LEGACY_SCHEMA_TABLE[7])==0 ){ |
| 113417 | return PREFERRED_SCHEMA_TABLE; |
| 113418 | } |
| 113419 | if( sqlite3StrICmp(zName+7, &LEGACY_TEMP_SCHEMA_TABLE[7])==0 ){ |
| 113420 | return PREFERRED_TEMP_SCHEMA_TABLE; |
| 113421 | } |
| 113422 | } |
| 113423 | return zName; |
| 113424 | } |
| 113425 | |
| 113426 | /* |
| 113427 | ** Locate the in-memory structure that describes |
| 113428 | ** a particular index given the name of that index |
| 113429 | ** and the name of the database that contains the index. |
| @@ -113788,11 +113819,11 @@ | |
| 113819 | ** Open the sqlite_schema table stored in database number iDb for |
| 113820 | ** writing. The table is opened using cursor 0. |
| 113821 | */ |
| 113822 | SQLITE_PRIVATE void sqlite3OpenSchemaTable(Parse *p, int iDb){ |
| 113823 | Vdbe *v = sqlite3GetVdbe(p); |
| 113824 | sqlite3TableLock(p, iDb, SCHEMA_ROOT, 1, LEGACY_SCHEMA_TABLE); |
| 113825 | sqlite3VdbeAddOp4Int(v, OP_OpenWrite, 0, SCHEMA_ROOT, iDb, 5); |
| 113826 | if( p->nTab==0 ){ |
| 113827 | p->nTab = 1; |
| 113828 | } |
| 113829 | } |
| @@ -115729,11 +115760,11 @@ | |
| 115760 | /* A slot for the record has already been allocated in the |
| 115761 | ** schema table. We just need to update that slot with all |
| 115762 | ** the information we've collected. |
| 115763 | */ |
| 115764 | sqlite3NestedParse(pParse, |
| 115765 | "UPDATE %Q." LEGACY_SCHEMA_TABLE |
| 115766 | " SET type='%s', name=%Q, tbl_name=%Q, rootpage=#%d, sql=%Q" |
| 115767 | " WHERE rowid=#%d", |
| 115768 | db->aDb[iDb].zDbSName, |
| 115769 | zType, |
| 115770 | p->zName, |
| @@ -116108,11 +116139,11 @@ | |
| 116139 | ** The "#NNN" in the SQL is a special constant that means whatever value |
| 116140 | ** is in register NNN. See grammar rules associated with the TK_REGISTER |
| 116141 | ** token for additional information. |
| 116142 | */ |
| 116143 | sqlite3NestedParse(pParse, |
| 116144 | "UPDATE %Q." LEGACY_SCHEMA_TABLE |
| 116145 | " SET rootpage=%d WHERE #%d AND rootpage=#%d", |
| 116146 | pParse->db->aDb[iDb].zDbSName, iTable, r1, r1); |
| 116147 | #endif |
| 116148 | sqlite3ReleaseTempReg(pParse, r1); |
| 116149 | } |
| @@ -116243,11 +116274,11 @@ | |
| 116274 | ** dropped. Triggers are handled separately because a trigger can be |
| 116275 | ** created in the temp database that refers to a table in another |
| 116276 | ** database. |
| 116277 | */ |
| 116278 | sqlite3NestedParse(pParse, |
| 116279 | "DELETE FROM %Q." LEGACY_SCHEMA_TABLE |
| 116280 | " WHERE tbl_name=%Q and type!='trigger'", |
| 116281 | pDb->zDbSName, pTab->zName); |
| 116282 | if( !isView && !IsVirtual(pTab) ){ |
| 116283 | destroyTable(pParse, pTab); |
| 116284 | } |
| @@ -117260,11 +117291,11 @@ | |
| 117291 | } |
| 117292 | |
| 117293 | /* Add an entry in sqlite_schema for this index |
| 117294 | */ |
| 117295 | sqlite3NestedParse(pParse, |
| 117296 | "INSERT INTO %Q." LEGACY_SCHEMA_TABLE " VALUES('index',%Q,%Q,#%d,%Q);", |
| 117297 | db->aDb[iDb].zDbSName, |
| 117298 | pIndex->zName, |
| 117299 | pTab->zName, |
| 117300 | iMem, |
| 117301 | zStmt |
| @@ -117446,11 +117477,11 @@ | |
| 117477 | /* Generate code to remove the index and from the schema table */ |
| 117478 | v = sqlite3GetVdbe(pParse); |
| 117479 | if( v ){ |
| 117480 | sqlite3BeginWriteOperation(pParse, 1, iDb); |
| 117481 | sqlite3NestedParse(pParse, |
| 117482 | "DELETE FROM %Q." LEGACY_SCHEMA_TABLE " WHERE name=%Q AND type='index'", |
| 117483 | db->aDb[iDb].zDbSName, pIndex->zName |
| 117484 | ); |
| 117485 | sqlite3ClearStatTables(pParse, iDb, "idx", pIndex->zName); |
| 117486 | sqlite3ChangeCookie(pParse, iDb); |
| 117487 | destroyRootPage(pParse, pIndex->tnum, iDb); |
| @@ -130583,11 +130614,11 @@ | |
| 130614 | }else{ |
| 130615 | zType = "table"; |
| 130616 | } |
| 130617 | sqlite3VdbeMultiLoad(v, 1, "sssiii", |
| 130618 | db->aDb[ii].zDbSName, |
| 130619 | sqlite3PreferredTableName(pTab->zName), |
| 130620 | zType, |
| 130621 | pTab->nCol, |
| 130622 | (pTab->tabFlags & TF_WithoutRowid)!=0, |
| 130623 | (pTab->tabFlags & TF_Strict)!=0 |
| 130624 | ); |
| @@ -130603,11 +130634,11 @@ | |
| 130634 | pParse->nMem = 5; |
| 130635 | sqlite3CodeVerifySchema(pParse, iDb); |
| 130636 | for(i=sqliteHashFirst(&pDb->pSchema->tblHash); i; i=sqliteHashNext(i)){ |
| 130637 | Table *pTab = sqliteHashData(i); |
| 130638 | sqlite3VdbeMultiLoad(v, 1, "ssiii", |
| 130639 | sqlite3PreferredTableName(pTab->zName), |
| 130640 | 0, |
| 130641 | pTab->szTabRow, |
| 130642 | pTab->nRowLogEst, |
| 130643 | pTab->tabFlags); |
| 130644 | for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ |
| @@ -141131,11 +141162,11 @@ | |
| 141162 | if( v==0 ) goto triggerfinish_cleanup; |
| 141163 | sqlite3BeginWriteOperation(pParse, 0, iDb); |
| 141164 | z = sqlite3DbStrNDup(db, (char*)pAll->z, pAll->n); |
| 141165 | testcase( z==0 ); |
| 141166 | sqlite3NestedParse(pParse, |
| 141167 | "INSERT INTO %Q." LEGACY_SCHEMA_TABLE |
| 141168 | " VALUES('trigger',%Q,%Q,0,'CREATE TRIGGER %q')", |
| 141169 | db->aDb[iDb].zDbSName, zName, |
| 141170 | pTrig->table, z); |
| 141171 | sqlite3DbFree(db, z); |
| 141172 | sqlite3ChangeCookie(pParse, iDb); |
| @@ -141445,11 +141476,11 @@ | |
| 141476 | |
| 141477 | /* Generate code to destroy the database record of the trigger. |
| 141478 | */ |
| 141479 | if( (v = sqlite3GetVdbe(pParse))!=0 ){ |
| 141480 | sqlite3NestedParse(pParse, |
| 141481 | "DELETE FROM %Q." LEGACY_SCHEMA_TABLE " WHERE name=%Q AND type='trigger'", |
| 141482 | db->aDb[iDb].zDbSName, pTrigger->zName |
| 141483 | ); |
| 141484 | sqlite3ChangeCookie(pParse, iDb); |
| 141485 | sqlite3VdbeAddOp4(v, OP_DropTrigger, iDb, 0, 0, pTrigger->zName, 0); |
| 141486 | } |
| @@ -144742,11 +144773,11 @@ | |
| 144773 | ** entry in the sqlite_schema table tht was created for this vtab |
| 144774 | ** by sqlite3StartTable(). |
| 144775 | */ |
| 144776 | iDb = sqlite3SchemaToIndex(db, pTab->pSchema); |
| 144777 | sqlite3NestedParse(pParse, |
| 144778 | "UPDATE %Q." LEGACY_SCHEMA_TABLE " " |
| 144779 | "SET type='table', name=%Q, tbl_name=%Q, rootpage=0, sql=%Q " |
| 144780 | "WHERE rowid=#%d", |
| 144781 | db->aDb[iDb].zDbSName, |
| 144782 | pTab->zName, |
| 144783 | pTab->zName, |
| @@ -144953,11 +144984,12 @@ | |
| 144984 | const char *zMod; |
| 144985 | Module *pMod; |
| 144986 | int rc; |
| 144987 | |
| 144988 | assert( pTab ); |
| 144989 | assert( IsVirtual(pTab) ); |
| 144990 | if( sqlite3GetVTable(db, pTab) ){ |
| 144991 | return SQLITE_OK; |
| 144992 | } |
| 144993 | |
| 144994 | /* Locate the required virtual table module */ |
| 144995 | zMod = pTab->u.vtab.azArg[0]; |
| 144996 |
+1
-1
| --- src/sqlite3.h | ||
| +++ src/sqlite3.h | ||
| @@ -146,11 +146,11 @@ | ||
| 146 | 146 | ** [sqlite3_libversion_number()], [sqlite3_sourceid()], |
| 147 | 147 | ** [sqlite_version()] and [sqlite_source_id()]. |
| 148 | 148 | */ |
| 149 | 149 | #define SQLITE_VERSION "3.37.0" |
| 150 | 150 | #define SQLITE_VERSION_NUMBER 3037000 |
| 151 | -#define SQLITE_SOURCE_ID "2021-11-04 00:51:53 005a8642773556825fe4c5d0b2c12517d35289308a30df0151ef7f080acb0172" | |
| 151 | +#define SQLITE_SOURCE_ID "2021-11-04 14:04:20 9147390d9885a37a62edc1058f313434627f1b59965c890877d2cb119e355c78" | |
| 152 | 152 | |
| 153 | 153 | /* |
| 154 | 154 | ** CAPI3REF: Run-Time Library Version Numbers |
| 155 | 155 | ** KEYWORDS: sqlite3_version sqlite3_sourceid |
| 156 | 156 | ** |
| 157 | 157 |
| --- src/sqlite3.h | |
| +++ src/sqlite3.h | |
| @@ -146,11 +146,11 @@ | |
| 146 | ** [sqlite3_libversion_number()], [sqlite3_sourceid()], |
| 147 | ** [sqlite_version()] and [sqlite_source_id()]. |
| 148 | */ |
| 149 | #define SQLITE_VERSION "3.37.0" |
| 150 | #define SQLITE_VERSION_NUMBER 3037000 |
| 151 | #define SQLITE_SOURCE_ID "2021-11-04 00:51:53 005a8642773556825fe4c5d0b2c12517d35289308a30df0151ef7f080acb0172" |
| 152 | |
| 153 | /* |
| 154 | ** CAPI3REF: Run-Time Library Version Numbers |
| 155 | ** KEYWORDS: sqlite3_version sqlite3_sourceid |
| 156 | ** |
| 157 |
| --- src/sqlite3.h | |
| +++ src/sqlite3.h | |
| @@ -146,11 +146,11 @@ | |
| 146 | ** [sqlite3_libversion_number()], [sqlite3_sourceid()], |
| 147 | ** [sqlite_version()] and [sqlite_source_id()]. |
| 148 | */ |
| 149 | #define SQLITE_VERSION "3.37.0" |
| 150 | #define SQLITE_VERSION_NUMBER 3037000 |
| 151 | #define SQLITE_SOURCE_ID "2021-11-04 14:04:20 9147390d9885a37a62edc1058f313434627f1b59965c890877d2cb119e355c78" |
| 152 | |
| 153 | /* |
| 154 | ** CAPI3REF: Run-Time Library Version Numbers |
| 155 | ** KEYWORDS: sqlite3_version sqlite3_sourceid |
| 156 | ** |
| 157 |