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.

drh 2021-11-04 14:16 trunk
Commit d6d4c14b0e1d10c837f735b1fd7339c53d630bf2abbb1a8204b2da1535b42818
2 files changed +71 -39 +1 -1
+71 -39
--- src/sqlite3.c
+++ src/sqlite3.c
@@ -452,11 +452,11 @@
452452
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
453453
** [sqlite_version()] and [sqlite_source_id()].
454454
*/
455455
#define SQLITE_VERSION "3.37.0"
456456
#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"
458458
459459
/*
460460
** CAPI3REF: Run-Time Library Version Numbers
461461
** KEYWORDS: sqlite3_version sqlite3_sourceid
462462
**
@@ -14144,15 +14144,29 @@
1414414144
int nBusy; /* Incremented with each busy call */
1414514145
};
1414614146
1414714147
/*
1414814148
** 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".
1414914163
*/
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"
1415414168
1415514169
1415614170
/*
1415714171
** The root-page of the schema table.
1415814172
*/
@@ -14160,11 +14174,11 @@
1416014174
1416114175
/*
1416214176
** The name of the schema table. The name is different for TEMP.
1416314177
*/
1416414178
#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)
1416614180
1416714181
/*
1416814182
** A convenience macro that returns the number of elements in
1416914183
** an array.
1417014184
*/
@@ -19529,10 +19543,11 @@
1952919543
SQLITE_PRIVATE void sqlite3ExprIfFalseDup(Parse*, Expr*, int, int);
1953019544
SQLITE_PRIVATE Table *sqlite3FindTable(sqlite3*,const char*, const char*);
1953119545
#define LOCATE_VIEW 0x01
1953219546
#define LOCATE_NOERR 0x02
1953319547
SQLITE_PRIVATE Table *sqlite3LocateTable(Parse*,u32 flags,const char*, const char*);
19548
+SQLITE_PRIVATE const char *sqlite3PreferredTableName(const char*);
1953419549
SQLITE_PRIVATE Table *sqlite3LocateTableItem(Parse*,u32 flags,SrcItem *);
1953519550
SQLITE_PRIVATE Index *sqlite3FindIndex(sqlite3*,const char*, const char*);
1953619551
SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTable(sqlite3*,int,const char*);
1953719552
SQLITE_PRIVATE void sqlite3UnlinkAndDeleteIndex(sqlite3*,int,const char*);
1953819553
SQLITE_PRIVATE void sqlite3Vacuum(Parse*,Token*,Expr*);
@@ -93133,11 +93148,11 @@
9313393148
db->mDbFlags |= DBFLAG_SchemaChange;
9313493149
p->expired = 0;
9313593150
}else
9313693151
#endif
9313793152
{
93138
- zSchema = DFLT_SCHEMA_TABLE;
93153
+ zSchema = LEGACY_SCHEMA_TABLE;
9313993154
initData.db = db;
9314093155
initData.iDb = iDb;
9314193156
initData.pzErrMsg = &p->zErrMsg;
9314293157
initData.mInitFlags = 0;
9314393158
initData.mxPage = sqlite3BtreeLastPage(db->aDb[iDb].pBt);
@@ -107895,11 +107910,11 @@
107895107910
int bNoDQS /* Do not allow DQS in the schema */
107896107911
){
107897107912
pParse->colNamesSet = 1;
107898107913
sqlite3NestedParse(pParse,
107899107914
"SELECT 1 "
107900
- "FROM \"%w\"." DFLT_SCHEMA_TABLE " "
107915
+ "FROM \"%w\"." LEGACY_SCHEMA_TABLE " "
107901107916
"WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'"
107902107917
" AND sql NOT LIKE 'create virtual%%'"
107903107918
" AND sqlite_rename_test(%Q, sql, type, name, %d, %Q, %d)=NULL ",
107904107919
zDb,
107905107920
zDb, bTemp, zWhen, bNoDQS
@@ -107906,11 +107921,11 @@
107906107921
);
107907107922
107908107923
if( bTemp==0 ){
107909107924
sqlite3NestedParse(pParse,
107910107925
"SELECT 1 "
107911
- "FROM temp." DFLT_SCHEMA_TABLE " "
107926
+ "FROM temp." LEGACY_SCHEMA_TABLE " "
107912107927
"WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'"
107913107928
" AND sql NOT LIKE 'create virtual%%'"
107914107929
" AND sqlite_rename_test(%Q, sql, type, name, 1, %Q, %d)=NULL ",
107915107930
zDb, zWhen, bNoDQS
107916107931
);
@@ -107924,18 +107939,18 @@
107924107939
** not true, similarly update all SQL statements in the sqlite_schema table
107925107940
** of the temp db.
107926107941
*/
107927107942
static void renameFixQuotes(Parse *pParse, const char *zDb, int bTemp){
107928107943
sqlite3NestedParse(pParse,
107929
- "UPDATE \"%w\"." DFLT_SCHEMA_TABLE
107944
+ "UPDATE \"%w\"." LEGACY_SCHEMA_TABLE
107930107945
" SET sql = sqlite_rename_quotefix(%Q, sql)"
107931107946
"WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'"
107932107947
" AND sql NOT LIKE 'create virtual%%'" , zDb, zDb
107933107948
);
107934107949
if( bTemp==0 ){
107935107950
sqlite3NestedParse(pParse,
107936
- "UPDATE temp." DFLT_SCHEMA_TABLE
107951
+ "UPDATE temp." LEGACY_SCHEMA_TABLE
107937107952
" SET sql = sqlite_rename_quotefix('temp', sql)"
107938107953
"WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'"
107939107954
" AND sql NOT LIKE 'create virtual%%'"
107940107955
);
107941107956
}
@@ -108049,21 +108064,21 @@
108049108064
nTabName = sqlite3Utf8CharLen(zTabName, -1);
108050108065
108051108066
/* Rewrite all CREATE TABLE, INDEX, TRIGGER or VIEW statements in
108052108067
** the schema to use the new table name. */
108053108068
sqlite3NestedParse(pParse,
108054
- "UPDATE \"%w\"." DFLT_SCHEMA_TABLE " SET "
108069
+ "UPDATE \"%w\"." LEGACY_SCHEMA_TABLE " SET "
108055108070
"sql = sqlite_rename_table(%Q, type, name, sql, %Q, %Q, %d) "
108056108071
"WHERE (type!='index' OR tbl_name=%Q COLLATE nocase)"
108057108072
"AND name NOT LIKE 'sqliteX_%%' ESCAPE 'X'"
108058108073
, zDb, zDb, zTabName, zName, (iDb==1), zTabName
108059108074
);
108060108075
108061108076
/* Update the tbl_name and name columns of the sqlite_schema table
108062108077
** as required. */
108063108078
sqlite3NestedParse(pParse,
108064
- "UPDATE %Q." DFLT_SCHEMA_TABLE " SET "
108079
+ "UPDATE %Q." LEGACY_SCHEMA_TABLE " SET "
108065108080
"tbl_name = %Q, "
108066108081
"name = CASE "
108067108082
"WHEN type='table' THEN %Q "
108068108083
"WHEN name LIKE 'sqliteX_autoindex%%' ESCAPE 'X' "
108069108084
" AND type='index' THEN "
@@ -108248,11 +108263,11 @@
108248108263
/* substr() operations on characters, but addColOffset is in bytes. So we
108249108264
** have to use printf() to translate between these units: */
108250108265
assert( IsOrdinaryTable(pTab) );
108251108266
assert( IsOrdinaryTable(pNew) );
108252108267
sqlite3NestedParse(pParse,
108253
- "UPDATE \"%w\"." DFLT_SCHEMA_TABLE " SET "
108268
+ "UPDATE \"%w\"." LEGACY_SCHEMA_TABLE " SET "
108254108269
"sql = printf('%%.%ds, ',sql) || %Q"
108255108270
" || substr(sql,1+length(printf('%%.%ds',sql))) "
108256108271
"WHERE type = 'table' AND name = %Q",
108257108272
zDb, pNew->u.tab.addColOffset, zCol, pNew->u.tab.addColOffset,
108258108273
zTab
@@ -108482,21 +108497,21 @@
108482108497
zNew = sqlite3NameFromToken(db, pNew);
108483108498
if( !zNew ) goto exit_rename_column;
108484108499
assert( pNew->n>0 );
108485108500
bQuote = sqlite3Isquote(pNew->z[0]);
108486108501
sqlite3NestedParse(pParse,
108487
- "UPDATE \"%w\"." DFLT_SCHEMA_TABLE " SET "
108502
+ "UPDATE \"%w\"." LEGACY_SCHEMA_TABLE " SET "
108488108503
"sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, %d) "
108489108504
"WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X' "
108490108505
" AND (type != 'index' OR tbl_name = %Q)",
108491108506
zDb,
108492108507
zDb, pTab->zName, iCol, zNew, bQuote, iSchema==1,
108493108508
pTab->zName
108494108509
);
108495108510
108496108511
sqlite3NestedParse(pParse,
108497
- "UPDATE temp." DFLT_SCHEMA_TABLE " SET "
108512
+ "UPDATE temp." LEGACY_SCHEMA_TABLE " SET "
108498108513
"sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, 1) "
108499108514
"WHERE type IN ('trigger', 'view')",
108500108515
zDb, pTab->zName, iCol, zNew, bQuote
108501108516
);
108502108517
@@ -109973,11 +109988,11 @@
109973109988
assert( iDb>=0 );
109974109989
zDb = db->aDb[iDb].zDbSName;
109975109990
renameTestSchema(pParse, zDb, iDb==1, "", 0);
109976109991
renameFixQuotes(pParse, zDb, iDb==1);
109977109992
sqlite3NestedParse(pParse,
109978
- "UPDATE \"%w\"." DFLT_SCHEMA_TABLE " SET "
109993
+ "UPDATE \"%w\"." LEGACY_SCHEMA_TABLE " SET "
109979109994
"sql = sqlite_drop_column(%d, sql, %d) "
109980109995
"WHERE (type=='table' AND tbl_name=%Q COLLATE nocase)"
109981109996
, zDb, iDb, iCol, pTab->zName
109982109997
);
109983109998
@@ -113262,21 +113277,21 @@
113262113277
}
113263113278
}
113264113279
p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, zName);
113265113280
if( p==0 && sqlite3StrNICmp(zName, "sqlite_", 7)==0 ){
113266113281
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
113270113285
){
113271113286
p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash,
113272
- DFLT_TEMP_SCHEMA_TABLE);
113287
+ LEGACY_TEMP_SCHEMA_TABLE);
113273113288
}
113274113289
}else{
113275
- if( sqlite3StrICmp(zName+7, &ALT_SCHEMA_TABLE[7])==0 ){
113290
+ if( sqlite3StrICmp(zName+7, &PREFERRED_SCHEMA_TABLE[7])==0 ){
113276113291
p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash,
113277
- DFLT_SCHEMA_TABLE);
113292
+ LEGACY_SCHEMA_TABLE);
113278113293
}
113279113294
}
113280113295
}
113281113296
}else{
113282113297
/* Match against TEMP first */
@@ -113290,15 +113305,15 @@
113290113305
assert( sqlite3SchemaMutexHeld(db, i, 0) );
113291113306
p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, zName);
113292113307
if( p ) break;
113293113308
}
113294113309
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 ){
113298113313
p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash,
113299
- DFLT_TEMP_SCHEMA_TABLE);
113314
+ LEGACY_TEMP_SCHEMA_TABLE);
113300113315
}
113301113316
}
113302113317
}
113303113318
return p;
113304113319
}
@@ -113389,10 +113404,26 @@
113389113404
}else{
113390113405
zDb = p->zDatabase;
113391113406
}
113392113407
return sqlite3LocateTable(pParse, flags, p->zName, zDb);
113393113408
}
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
+}
113394113425
113395113426
/*
113396113427
** Locate the in-memory structure that describes
113397113428
** a particular index given the name of that index
113398113429
** and the name of the database that contains the index.
@@ -113788,11 +113819,11 @@
113788113819
** Open the sqlite_schema table stored in database number iDb for
113789113820
** writing. The table is opened using cursor 0.
113790113821
*/
113791113822
SQLITE_PRIVATE void sqlite3OpenSchemaTable(Parse *p, int iDb){
113792113823
Vdbe *v = sqlite3GetVdbe(p);
113793
- sqlite3TableLock(p, iDb, SCHEMA_ROOT, 1, DFLT_SCHEMA_TABLE);
113824
+ sqlite3TableLock(p, iDb, SCHEMA_ROOT, 1, LEGACY_SCHEMA_TABLE);
113794113825
sqlite3VdbeAddOp4Int(v, OP_OpenWrite, 0, SCHEMA_ROOT, iDb, 5);
113795113826
if( p->nTab==0 ){
113796113827
p->nTab = 1;
113797113828
}
113798113829
}
@@ -115729,11 +115760,11 @@
115729115760
/* A slot for the record has already been allocated in the
115730115761
** schema table. We just need to update that slot with all
115731115762
** the information we've collected.
115732115763
*/
115733115764
sqlite3NestedParse(pParse,
115734
- "UPDATE %Q." DFLT_SCHEMA_TABLE
115765
+ "UPDATE %Q." LEGACY_SCHEMA_TABLE
115735115766
" SET type='%s', name=%Q, tbl_name=%Q, rootpage=#%d, sql=%Q"
115736115767
" WHERE rowid=#%d",
115737115768
db->aDb[iDb].zDbSName,
115738115769
zType,
115739115770
p->zName,
@@ -116108,11 +116139,11 @@
116108116139
** The "#NNN" in the SQL is a special constant that means whatever value
116109116140
** is in register NNN. See grammar rules associated with the TK_REGISTER
116110116141
** token for additional information.
116111116142
*/
116112116143
sqlite3NestedParse(pParse,
116113
- "UPDATE %Q." DFLT_SCHEMA_TABLE
116144
+ "UPDATE %Q." LEGACY_SCHEMA_TABLE
116114116145
" SET rootpage=%d WHERE #%d AND rootpage=#%d",
116115116146
pParse->db->aDb[iDb].zDbSName, iTable, r1, r1);
116116116147
#endif
116117116148
sqlite3ReleaseTempReg(pParse, r1);
116118116149
}
@@ -116243,11 +116274,11 @@
116243116274
** dropped. Triggers are handled separately because a trigger can be
116244116275
** created in the temp database that refers to a table in another
116245116276
** database.
116246116277
*/
116247116278
sqlite3NestedParse(pParse,
116248
- "DELETE FROM %Q." DFLT_SCHEMA_TABLE
116279
+ "DELETE FROM %Q." LEGACY_SCHEMA_TABLE
116249116280
" WHERE tbl_name=%Q and type!='trigger'",
116250116281
pDb->zDbSName, pTab->zName);
116251116282
if( !isView && !IsVirtual(pTab) ){
116252116283
destroyTable(pParse, pTab);
116253116284
}
@@ -117260,11 +117291,11 @@
117260117291
}
117261117292
117262117293
/* Add an entry in sqlite_schema for this index
117263117294
*/
117264117295
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);",
117266117297
db->aDb[iDb].zDbSName,
117267117298
pIndex->zName,
117268117299
pTab->zName,
117269117300
iMem,
117270117301
zStmt
@@ -117446,11 +117477,11 @@
117446117477
/* Generate code to remove the index and from the schema table */
117447117478
v = sqlite3GetVdbe(pParse);
117448117479
if( v ){
117449117480
sqlite3BeginWriteOperation(pParse, 1, iDb);
117450117481
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'",
117452117483
db->aDb[iDb].zDbSName, pIndex->zName
117453117484
);
117454117485
sqlite3ClearStatTables(pParse, iDb, "idx", pIndex->zName);
117455117486
sqlite3ChangeCookie(pParse, iDb);
117456117487
destroyRootPage(pParse, pIndex->tnum, iDb);
@@ -130583,11 +130614,11 @@
130583130614
}else{
130584130615
zType = "table";
130585130616
}
130586130617
sqlite3VdbeMultiLoad(v, 1, "sssiii",
130587130618
db->aDb[ii].zDbSName,
130588
- pTab->zName,
130619
+ sqlite3PreferredTableName(pTab->zName),
130589130620
zType,
130590130621
pTab->nCol,
130591130622
(pTab->tabFlags & TF_WithoutRowid)!=0,
130592130623
(pTab->tabFlags & TF_Strict)!=0
130593130624
);
@@ -130603,11 +130634,11 @@
130603130634
pParse->nMem = 5;
130604130635
sqlite3CodeVerifySchema(pParse, iDb);
130605130636
for(i=sqliteHashFirst(&pDb->pSchema->tblHash); i; i=sqliteHashNext(i)){
130606130637
Table *pTab = sqliteHashData(i);
130607130638
sqlite3VdbeMultiLoad(v, 1, "ssiii",
130608
- pTab->zName,
130639
+ sqlite3PreferredTableName(pTab->zName),
130609130640
0,
130610130641
pTab->szTabRow,
130611130642
pTab->nRowLogEst,
130612130643
pTab->tabFlags);
130613130644
for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
@@ -141131,11 +141162,11 @@
141131141162
if( v==0 ) goto triggerfinish_cleanup;
141132141163
sqlite3BeginWriteOperation(pParse, 0, iDb);
141133141164
z = sqlite3DbStrNDup(db, (char*)pAll->z, pAll->n);
141134141165
testcase( z==0 );
141135141166
sqlite3NestedParse(pParse,
141136
- "INSERT INTO %Q." DFLT_SCHEMA_TABLE
141167
+ "INSERT INTO %Q." LEGACY_SCHEMA_TABLE
141137141168
" VALUES('trigger',%Q,%Q,0,'CREATE TRIGGER %q')",
141138141169
db->aDb[iDb].zDbSName, zName,
141139141170
pTrig->table, z);
141140141171
sqlite3DbFree(db, z);
141141141172
sqlite3ChangeCookie(pParse, iDb);
@@ -141445,11 +141476,11 @@
141445141476
141446141477
/* Generate code to destroy the database record of the trigger.
141447141478
*/
141448141479
if( (v = sqlite3GetVdbe(pParse))!=0 ){
141449141480
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'",
141451141482
db->aDb[iDb].zDbSName, pTrigger->zName
141452141483
);
141453141484
sqlite3ChangeCookie(pParse, iDb);
141454141485
sqlite3VdbeAddOp4(v, OP_DropTrigger, iDb, 0, 0, pTrigger->zName, 0);
141455141486
}
@@ -144742,11 +144773,11 @@
144742144773
** entry in the sqlite_schema table tht was created for this vtab
144743144774
** by sqlite3StartTable().
144744144775
*/
144745144776
iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
144746144777
sqlite3NestedParse(pParse,
144747
- "UPDATE %Q." DFLT_SCHEMA_TABLE " "
144778
+ "UPDATE %Q." LEGACY_SCHEMA_TABLE " "
144748144779
"SET type='table', name=%Q, tbl_name=%Q, rootpage=0, sql=%Q "
144749144780
"WHERE rowid=#%d",
144750144781
db->aDb[iDb].zDbSName,
144751144782
pTab->zName,
144752144783
pTab->zName,
@@ -144953,11 +144984,12 @@
144953144984
const char *zMod;
144954144985
Module *pMod;
144955144986
int rc;
144956144987
144957144988
assert( pTab );
144958
- if( !IsVirtual(pTab) || sqlite3GetVTable(db, pTab) ){
144989
+ assert( IsVirtual(pTab) );
144990
+ if( sqlite3GetVTable(db, pTab) ){
144959144991
return SQLITE_OK;
144960144992
}
144961144993
144962144994
/* Locate the required virtual table module */
144963144995
zMod = pTab->u.vtab.azArg[0];
144964144996
--- 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 @@
146146
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
147147
** [sqlite_version()] and [sqlite_source_id()].
148148
*/
149149
#define SQLITE_VERSION "3.37.0"
150150
#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"
152152
153153
/*
154154
** CAPI3REF: Run-Time Library Version Numbers
155155
** KEYWORDS: sqlite3_version sqlite3_sourceid
156156
**
157157
--- 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

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button