Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2a36a83ad4 |
@@ -1,5 +1,5 @@
|
||||
C Fix\stypo\sin\scomment.
|
||||
D 2022-10-24T18:42:45.118
|
||||
C This\scheck-in\sattempts\sto\smake\sthe\sSrcItem\sobject\ssmaller\sby\scombining\sthe\nzDatabase\sand\spSchema\sfields\sinto\sa\ssingle\sunion.\s\sIt\smostly\sworks,\sbut\sthere\nare\ssome\sissues,\sand\sthe\sperformance\ssavings\sis\sminimal.\s\sSo\sit\sis\sside-tracked\nonto\sthis\sdead-end\sbranch.
|
||||
D 2022-10-24T21:58:51.621
|
||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
||||
@@ -554,7 +554,7 @@ F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
|
||||
F sqlite_cfg.h.in baf2e409c63d4e7a765e17769b6ff17c5a82bbd9cbf1e284fd2e4cefaff3fcf2
|
||||
F src/alter.c 0390ca1d69ec3626cfa9f153114b7ab233e6b2bada6a9eb91361ed385fe90deb
|
||||
F src/analyze.c d2fce73f6a024897593012c6ca25368629fa4aeb49960d88a52fac664582e483
|
||||
F src/attach.c 4431f82f0247bf3aaf91589acafdff77d1882235c95407b36da1585c765fbbc8
|
||||
F src/attach.c a00838bc34e10cd4e4ff889b452097fc2c6cbbec5f3a9c2519220fbfb9eb1ef6
|
||||
F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf
|
||||
F src/backup.c a2891172438e385fdbe97c11c9745676bec54f518d4447090af97189fd8e52d7
|
||||
F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d
|
||||
@@ -562,15 +562,15 @@ F src/btmutex.c 6ffb0a22c19e2f9110be0964d0731d2ef1c67b5f7fabfbaeb7b9dabc4b7740ca
|
||||
F src/btree.c 74fc5f6a0577df703d6f98d0c51ee0d8d91d22dbc0ba86e42e056517e2b45576
|
||||
F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22
|
||||
F src/btreeInt.h 8ce1332edd89dfd2461d561ac10a0ab5601c8e06200cb5230596c3caaf54482e
|
||||
F src/build.c d3e43e950e4e377c1d451a4862556792acdef1faba14a03f899d30d09731c48b
|
||||
F src/build.c 532fa3bebc352fb6853425e5955a9bd29eeb9d5e8e226a68b4a9d3cfed4e9207
|
||||
F src/callback.c 4cd7225b26a97f7de5fee5ae10464bed5a78f2adefe19534cc2095b3a8ca484a
|
||||
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
|
||||
F src/ctime.c 20507cc0b0a6c19cd882fcd0eaeda32ae6a4229fb4b024cfdf3183043d9b703d
|
||||
F src/date.c 94ce83b4cd848a387680a5f920c9018c16655db778c4d36525af0a0f34679ac5
|
||||
F src/dbpage.c 5808e91bc27fa3981b028000f8fadfdc10ce9e59a34ce7dc4e035a69be3906ec
|
||||
F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d
|
||||
F src/delete.c 86573edae75e3d3e9a8b590d87db8e47222103029df4f3e11fa56044459b514e
|
||||
F src/expr.c 847f87d9df3ede2b2b0a8db088af0b9c1923b21009f8ea1b9b7b28cb0a383170
|
||||
F src/delete.c 9b57791bc6f0a8efb4e31ebbf8a4fb8ed0c4e534bc0010d61e2fe77a6ee24114
|
||||
F src/expr.c f48f0535844b0126e4e0f480da790cc2d4230eae5acdf4bf42a853aa66b78961
|
||||
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
||||
F src/fkey.c 722f20779f5342a787922deded3628d8c74b5249cab04098cf17ee2f2aaff002
|
||||
F src/func.c fe2a795ad647ce42054873ac91c43beb7b5d204892903a67f6e7e314379b9d4a
|
||||
@@ -609,23 +609,23 @@ F src/os_win.c 8d129ae3e59e0fa900e20d0ad789e96f2e08177f0b00b53cdda65c40331e0902
|
||||
F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
|
||||
F src/pager.c 6176d9752eb580419e8fef4592dc417a6b00ddfd43ee22f818819bf8840ceee8
|
||||
F src/pager.h f82e9844166e1585f5786837ddc7709966138ced17f568c16af7ccf946c2baa3
|
||||
F src/parse.y 8e67d820030d2655b9942ffe61c1e7e6b96cea2f2f72183533299393907d0564
|
||||
F src/parse.y c9f1b67e76a042b8d50e299d061b74d3f7a74f262c378dc80ceea184b376fdb0
|
||||
F src/pcache.c f4268f7f73c6a3db12ce22fd25bc68dc42315d19599414ab1207d7cf32f79197
|
||||
F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586
|
||||
F src/pcache1.c dee95e3cd2b61e6512dc814c5ab76d5eb36f0bfc9441dbb4260fccc0d12bbddc
|
||||
F src/pragma.c 41430ca04735cc8e5d003bfd9315eadede3ec326e50805cc81bcf34e46601292
|
||||
F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7
|
||||
F src/prepare.c 1b02be0441eda4579471fea097f678effcbb77ef0c39ab3f703c837822bcd674
|
||||
F src/printf.c e99ee9741e79ae3873458146f59644276657340385ade4e76a5f5d1c25793764
|
||||
F src/printf.c 615d24684bee3c3217070b19865ab6b9f4f346fb5fc0b92bddc54d45050e5634
|
||||
F src/random.c 546d6feb15ec69c1aafe9bb351a277cbb498fd5410e646add673acb805714960
|
||||
F src/resolve.c efea4e5fbecfd6d0a9071b0be0d952620991673391b6ffaaf4c277b0bb674633
|
||||
F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92
|
||||
F src/select.c e5b6f930f068c9c5362fc76c704ae5cb5ef1e3f18759c2126f23b0cf04c0e263
|
||||
F src/select.c 90883c8b0d8bfc6623a77d24d7f822f0c50545f02860634d962ae09b3ea525e3
|
||||
F src/shell.c.in 97f4ee3966d7d8ffcd976658ea3b92bc9a670eb988d2e8aeb2243789631689a6
|
||||
F src/sqlite.h.in d9c8a6243fc0a1c270d69db33758e34b810af3462f9bc5b4af113b347e07c69d
|
||||
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
||||
F src/sqlite3ext.h 5336beea1868d99d2f62e628dbea55e97267dbff8193291ab175e960c5df9141
|
||||
F src/sqliteInt.h 9a40d5b075cd2e78bac6f9ae724e3fa4281373cb728f961272cb182f6ba94ce6
|
||||
F src/sqliteInt.h b12ab310eefa22ec23af050ff163cf5e0332404583f0252f5843132b9a25c1c2
|
||||
F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657
|
||||
F src/status.c 160c445d7d28c984a0eae38c144f6419311ed3eace59b44ac6dafc20db4af749
|
||||
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
|
||||
@@ -686,7 +686,7 @@ F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
|
||||
F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
|
||||
F src/tokenize.c 1305797eab3542a0896b552c6e7669c972c1468e11e92b370533c1f37a37082b
|
||||
F src/treeview.c 07787f67cd297a6d09d04b8d70c06769c60c9c1d9080378f93929c16f8fd3298
|
||||
F src/trigger.c 4163ada044af89d51caba1cb713a73165347b2ec05fe84a283737c134d61fcd5
|
||||
F src/trigger.c 70431e371037390ca45d373a3b1b87f427f3883a352a42051f427e44fc9a5e9a
|
||||
F src/update.c 5b0302c47cf31b533d5dff04c497ca1d8b9d89c39727e633fbe7b882fd5ac5aa
|
||||
F src/upsert.c 5303dc6c518fa7d4b280ec65170f465c7a70b7ac2b22491598f6d0b4875b3145
|
||||
F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
|
||||
@@ -2037,8 +2037,11 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||
P 69d704224e9ed022fcec591beff2ffcc4daf3e7fc586debfdcf00b25c1fddd87
|
||||
R e2a88fcf6a9d4446fa629ea861bc8ca4
|
||||
P f65c95658fe4d30817da8de7eb88e823ea1cd8be40e347d626870bad3cc13359
|
||||
R bd44daf142420861734ecc490ea27084
|
||||
T *branch * failed-opt-attempt
|
||||
T *sym-failed-opt-attempt *
|
||||
T -sym-trunk *
|
||||
U drh
|
||||
Z ea85a8ca90f8837e6e02f1969966b7f9
|
||||
Z 625f2743307b64b5e1b75f4704026ffe
|
||||
# Remove this line to create a well-formed Fossil manifest.
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
f65c95658fe4d30817da8de7eb88e823ea1cd8be40e347d626870bad3cc13359
|
||||
80fbb30f28c8a468d71a367968bb0c4b17cbc8080dff333a359fea09e9907550
|
||||
+7
-6
@@ -465,19 +465,20 @@ static int fixSelectCb(Walker *p, Select *pSelect){
|
||||
if( NEVER(pList==0) ) return WRC_Continue;
|
||||
for(i=0, pItem=pList->a; i<pList->nSrc; i++, pItem++){
|
||||
if( pFix->bTemp==0 ){
|
||||
if( pItem->zDatabase ){
|
||||
if( iDb!=sqlite3FindDbName(db, pItem->zDatabase) ){
|
||||
if( pItem->fg.useSchema==0 && pItem->u4.zDatabase!=0 ){
|
||||
if( iDb!=sqlite3FindDbName(db, pItem->u4.zDatabase) ){
|
||||
sqlite3ErrorMsg(pFix->pParse,
|
||||
"%s %T cannot reference objects in database %s",
|
||||
pFix->zType, pFix->pName, pItem->zDatabase);
|
||||
pFix->zType, pFix->pName, pItem->u4.zDatabase);
|
||||
return WRC_Abort;
|
||||
}
|
||||
sqlite3DbFree(db, pItem->zDatabase);
|
||||
pItem->zDatabase = 0;
|
||||
sqlite3DbFree(db, pItem->u4.zDatabase);
|
||||
pItem->u4.zDatabase = 0;
|
||||
pItem->fg.notCte = 1;
|
||||
}
|
||||
pItem->pSchema = pFix->pSchema;
|
||||
pItem->fg.useSchema = 1;
|
||||
pItem->fg.fromDDL = 1;
|
||||
pItem->u4.pSchema = pFix->pSchema;
|
||||
}
|
||||
#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER)
|
||||
if( pList->a[i].fg.isUsing==0
|
||||
|
||||
+15
-11
@@ -499,12 +499,11 @@ Table *sqlite3LocateTableItem(
|
||||
SrcItem *p
|
||||
){
|
||||
const char *zDb;
|
||||
assert( p->pSchema==0 || p->zDatabase==0 );
|
||||
if( p->pSchema ){
|
||||
int iDb = sqlite3SchemaToIndex(pParse->db, p->pSchema);
|
||||
if( p->fg.useSchema ){
|
||||
int iDb = sqlite3SchemaToIndex(pParse->db, p->u4.pSchema);
|
||||
zDb = pParse->db->aDb[iDb].zDbSName;
|
||||
}else{
|
||||
zDb = p->zDatabase;
|
||||
zDb = p->u4.zDatabase;
|
||||
}
|
||||
return sqlite3LocateTable(pParse, flags, p->zName, zDb);
|
||||
}
|
||||
@@ -3474,7 +3473,8 @@ void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView, int noErr){
|
||||
|
||||
if( pTab==0 ){
|
||||
if( noErr ){
|
||||
sqlite3CodeVerifyNamedSchema(pParse, pName->a[0].zDatabase);
|
||||
assert( pName->a[0].fg.useSchema==0 );
|
||||
sqlite3CodeVerifyNamedSchema(pParse, pName->a[0].u4.zDatabase);
|
||||
sqlite3ForceNotReadOnly(pParse);
|
||||
}
|
||||
goto exit_drop_table;
|
||||
@@ -4568,12 +4568,13 @@ void sqlite3DropIndex(Parse *pParse, SrcList *pName, int ifExists){
|
||||
if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){
|
||||
goto exit_drop_index;
|
||||
}
|
||||
pIndex = sqlite3FindIndex(db, pName->a[0].zName, pName->a[0].zDatabase);
|
||||
assert( pName->a[0].fg.useSchema==0 );
|
||||
pIndex = sqlite3FindIndex(db, pName->a[0].zName, pName->a[0].u4.zDatabase);
|
||||
if( pIndex==0 ){
|
||||
if( !ifExists ){
|
||||
sqlite3ErrorMsg(pParse, "no such index: %S", pName->a);
|
||||
}else{
|
||||
sqlite3CodeVerifyNamedSchema(pParse, pName->a[0].zDatabase);
|
||||
sqlite3CodeVerifyNamedSchema(pParse, pName->a[0].u4.zDatabase);
|
||||
sqlite3ForceNotReadOnly(pParse);
|
||||
}
|
||||
pParse->checkSchema = 1;
|
||||
@@ -4818,7 +4819,7 @@ SrcList *sqlite3SrcListEnlarge(
|
||||
** points to the table name and the pTable points to the database name.
|
||||
** The SrcList.a[].zName field is filled with the table name which might
|
||||
** come from pTable (if pDatabase is NULL) or from pDatabase.
|
||||
** SrcList.a[].zDatabase is filled with the database name from pTable,
|
||||
** SrcList.a[].u4.zDatabase is filled with the database name from pTable,
|
||||
** or with NULL if no database is specified.
|
||||
**
|
||||
** In other words, if call like this:
|
||||
@@ -4870,12 +4871,13 @@ SrcList *sqlite3SrcListAppend(
|
||||
if( pDatabase && pDatabase->z==0 ){
|
||||
pDatabase = 0;
|
||||
}
|
||||
assert( pItem->fg.useSchema==0 );
|
||||
if( pDatabase ){
|
||||
pItem->zName = sqlite3NameFromToken(db, pDatabase);
|
||||
pItem->zDatabase = sqlite3NameFromToken(db, pTable);
|
||||
pItem->u4.zDatabase = sqlite3NameFromToken(db, pTable);
|
||||
}else{
|
||||
pItem->zName = sqlite3NameFromToken(db, pTable);
|
||||
pItem->zDatabase = 0;
|
||||
pItem->u4.zDatabase = 0;
|
||||
}
|
||||
return pList;
|
||||
}
|
||||
@@ -4907,9 +4909,11 @@ void sqlite3SrcListDelete(sqlite3 *db, SrcList *pList){
|
||||
assert( db!=0 );
|
||||
if( pList==0 ) return;
|
||||
for(pItem=pList->a, i=0; i<pList->nSrc; i++, pItem++){
|
||||
if( pItem->zDatabase ) sqlite3DbNNFreeNN(db, pItem->zDatabase);
|
||||
if( pItem->zName ) sqlite3DbNNFreeNN(db, pItem->zName);
|
||||
if( pItem->zAlias ) sqlite3DbNNFreeNN(db, pItem->zAlias);
|
||||
if( pItem->fg.useSchema==0 && pItem->u4.zDatabase ){
|
||||
sqlite3DbNNFreeNN(db, pItem->u4.zDatabase);
|
||||
}
|
||||
if( pItem->fg.isIndexedBy ) sqlite3DbFree(db, pItem->u1.zIndexedBy);
|
||||
if( pItem->fg.isTabFunc ) sqlite3ExprListDelete(db, pItem->u1.pFuncArg);
|
||||
sqlite3DeleteTable(db, pItem->pTab);
|
||||
|
||||
+2
-1
@@ -153,7 +153,8 @@ void sqlite3MaterializeView(
|
||||
if( pFrom ){
|
||||
assert( pFrom->nSrc==1 );
|
||||
pFrom->a[0].zName = sqlite3DbStrDup(db, pView->zName);
|
||||
pFrom->a[0].zDatabase = sqlite3DbStrDup(db, db->aDb[iDb].zDbSName);
|
||||
assert( pFrom->a[0].fg.useSchema==0 );
|
||||
pFrom->a[0].u4.zDatabase = sqlite3DbStrDup(db, db->aDb[iDb].zDbSName);
|
||||
assert( pFrom->a[0].fg.isUsing==0 );
|
||||
assert( pFrom->a[0].u3.pOn==0 );
|
||||
}
|
||||
|
||||
+5
-2
@@ -1664,8 +1664,11 @@ SrcList *sqlite3SrcListDup(sqlite3 *db, const SrcList *p, int flags){
|
||||
SrcItem *pNewItem = &pNew->a[i];
|
||||
const SrcItem *pOldItem = &p->a[i];
|
||||
Table *pTab;
|
||||
pNewItem->pSchema = pOldItem->pSchema;
|
||||
pNewItem->zDatabase = sqlite3DbStrDup(db, pOldItem->zDatabase);
|
||||
if( pOldItem->fg.useSchema ){
|
||||
pNewItem->u4.pSchema = pOldItem->u4.pSchema;
|
||||
}else{
|
||||
pNewItem->u4.zDatabase = sqlite3DbStrDup(db, pOldItem->u4.zDatabase);
|
||||
}
|
||||
pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName);
|
||||
pNewItem->zAlias = sqlite3DbStrDup(db, pOldItem->zAlias);
|
||||
pNewItem->fg = pOldItem->fg;
|
||||
|
||||
+4
-2
@@ -719,7 +719,9 @@ seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) LP exprlist(E) RP as(Z) on_using(N
|
||||
SrcItem *pNew = &A->a[A->nSrc-1];
|
||||
SrcItem *pOld = F->a;
|
||||
pNew->zName = pOld->zName;
|
||||
pNew->zDatabase = pOld->zDatabase;
|
||||
assert( pOld->fg.useSchema==0 );
|
||||
assert( pNew->fg.useSchema==0 );
|
||||
pNew->u4.zDatabase = pOld->u4.zDatabase;
|
||||
pNew->pSelect = pOld->pSelect;
|
||||
if( pNew->pSelect && (pNew->pSelect->selFlags & SF_NestedFrom)!=0 ){
|
||||
pNew->fg.isNestedFrom = 1;
|
||||
@@ -730,7 +732,7 @@ seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) LP exprlist(E) RP as(Z) on_using(N
|
||||
pOld->fg.isTabFunc = 0;
|
||||
pNew->fg.isTabFunc = 1;
|
||||
}
|
||||
pOld->zName = pOld->zDatabase = 0;
|
||||
pOld->zName = pOld->u4.zDatabase = 0;
|
||||
pOld->pSelect = 0;
|
||||
}
|
||||
sqlite3SrcListDelete(pParse->db, F);
|
||||
|
||||
+2
-2
@@ -877,8 +877,8 @@ void sqlite3_str_vappendf(
|
||||
if( pItem->zAlias && !flag_altform2 ){
|
||||
sqlite3_str_appendall(pAccum, pItem->zAlias);
|
||||
}else if( pItem->zName ){
|
||||
if( pItem->zDatabase ){
|
||||
sqlite3_str_appendall(pAccum, pItem->zDatabase);
|
||||
if( pItem->fg.useSchema==0 && pItem->u4.zDatabase!=0 ){
|
||||
sqlite3_str_appendall(pAccum, pItem->u4.zDatabase);
|
||||
sqlite3_str_append(pAccum, ".", 1);
|
||||
}
|
||||
sqlite3_str_appendall(pAccum, pItem->zName);
|
||||
|
||||
+11
-6
@@ -4386,10 +4386,12 @@ static int flattenSubquery(
|
||||
|
||||
/* Delete the transient structures associated with thesubquery */
|
||||
pSub1 = pSubitem->pSelect;
|
||||
sqlite3DbFree(db, pSubitem->zDatabase);
|
||||
if( pSubitem->fg.useSchema==0 && pSubitem->u4.zDatabase ){
|
||||
sqlite3DbFree(db, pSubitem->u4.zDatabase);
|
||||
pSubitem->u4.zDatabase = 0;
|
||||
}
|
||||
sqlite3DbFree(db, pSubitem->zName);
|
||||
sqlite3DbFree(db, pSubitem->zAlias);
|
||||
pSubitem->zDatabase = 0;
|
||||
pSubitem->zName = 0;
|
||||
pSubitem->zAlias = 0;
|
||||
pSubitem->pSelect = 0;
|
||||
@@ -5347,7 +5349,8 @@ static struct Cte *searchWith(
|
||||
){
|
||||
const char *zName = pItem->zName;
|
||||
With *p;
|
||||
assert( pItem->zDatabase==0 );
|
||||
assert( pItem->fg.useSchema==0 );
|
||||
assert( pItem->u4.zDatabase==0 );
|
||||
assert( zName!=0 );
|
||||
for(p=pWith; p; p=p->pOuter){
|
||||
int i;
|
||||
@@ -5428,7 +5431,7 @@ static int resolveFromTermToCte(
|
||||
** go no further. */
|
||||
return 0;
|
||||
}
|
||||
if( pFrom->zDatabase!=0 ){
|
||||
if( pFrom->fg.useSchema || pFrom->u4.zDatabase!=0 ){
|
||||
/* The FROM term contains a schema qualifier (ex: main.t1) and so
|
||||
** it cannot possibly be a CTE reference. */
|
||||
return 0;
|
||||
@@ -5508,7 +5511,8 @@ static int resolveFromTermToCte(
|
||||
assert( pRecTerm->pPrior!=0 );
|
||||
for(i=0; i<pSrc->nSrc; i++){
|
||||
SrcItem *pItem = &pSrc->a[i];
|
||||
if( pItem->zDatabase==0
|
||||
if( pItem->fg.useSchema==0
|
||||
&& pItem->u4.zDatabase==0
|
||||
&& pItem->zName!=0
|
||||
&& 0==sqlite3StrICmp(pItem->zName, pCte->zName)
|
||||
){
|
||||
@@ -6940,7 +6944,8 @@ int sqlite3Select(
|
||||
** string for the fake column name seems safer.
|
||||
*/
|
||||
if( pItem->colUsed==0 && pItem->zName!=0 ){
|
||||
sqlite3AuthCheck(pParse, SQLITE_READ, pItem->zName, "", pItem->zDatabase);
|
||||
sqlite3AuthCheck(pParse, SQLITE_READ, pItem->zName, "",
|
||||
pItem->fg.useSchema ? "" : pItem->u4.zDatabase);
|
||||
}
|
||||
|
||||
#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW)
|
||||
|
||||
+5
-2
@@ -3110,8 +3110,6 @@ struct IdList {
|
||||
** u2.pCteUse fg.isCte && !fg.isIndexedBy
|
||||
*/
|
||||
struct SrcItem {
|
||||
Schema *pSchema; /* Schema to which this item is fixed */
|
||||
char *zDatabase; /* Name of database holding this table */
|
||||
char *zName; /* Name of the table */
|
||||
char *zAlias; /* The "B" part of a "A AS B" phrase. zName is the "A" */
|
||||
Table *pTab; /* An SQL table corresponding to zName */
|
||||
@@ -3135,8 +3133,13 @@ struct SrcItem {
|
||||
unsigned isOn :1; /* u3.pOn was once valid and non-NULL */
|
||||
unsigned isSynthUsing :1; /* u3.pUsing is synthensized from NATURAL */
|
||||
unsigned isNestedFrom :1; /* pSelect is a SF_NestedFrom subquery */
|
||||
unsigned useSchema :1; /* use u4.pSchema rather than u4.zDatabase */
|
||||
} fg;
|
||||
int iCursor; /* The VDBE cursor number used to access this table */
|
||||
union {
|
||||
Schema *pSchema; /* Schema to which this item is fixed */
|
||||
char *zDatabase; /* Name of database holding this table */
|
||||
} u4;
|
||||
union {
|
||||
Expr *pOn; /* fg.isUsing==0 => The ON clause of a join */
|
||||
IdList *pUsing; /* fg.isUsing==1 => The USING clause of a join */
|
||||
|
||||
+7
-4
@@ -152,8 +152,9 @@ void sqlite3BeginTrigger(
|
||||
** name on pTableName if we are reparsing out of the schema table
|
||||
*/
|
||||
if( db->init.busy && iDb!=1 ){
|
||||
sqlite3DbFree(db, pTableName->a[0].zDatabase);
|
||||
pTableName->a[0].zDatabase = 0;
|
||||
assert( pTableName->a[0].fg.useSchema==0 );
|
||||
sqlite3DbFree(db, pTableName->a[0].u4.zDatabase);
|
||||
pTableName->a[0].u4.zDatabase = 0;
|
||||
}
|
||||
|
||||
/* If the trigger name was unqualified, and the table is a temp table,
|
||||
@@ -626,7 +627,8 @@ void sqlite3DropTrigger(Parse *pParse, SrcList *pName, int noErr){
|
||||
}
|
||||
|
||||
assert( pName->nSrc==1 );
|
||||
zDb = pName->a[0].zDatabase;
|
||||
assert( pName->a[0].fg.useSchema==0 );
|
||||
zDb = pName->a[0].u4.zDatabase;
|
||||
zName = pName->a[0].zName;
|
||||
assert( zDb!=0 || sqlite3BtreeHoldsAllMutexes(db) );
|
||||
for(i=OMIT_TEMPDB; i<db->nDb; i++){
|
||||
@@ -863,7 +865,8 @@ SrcList *sqlite3TriggerStepSrc(
|
||||
Schema *pSchema = pStep->pTrig->pSchema;
|
||||
pSrc->a[0].zName = zName;
|
||||
if( pSchema!=db->aDb[1].pSchema ){
|
||||
pSrc->a[0].pSchema = pSchema;
|
||||
pSrc->a[0].fg.useSchema = 1;
|
||||
pSrc->a[0].u4.pSchema = pSchema;
|
||||
}
|
||||
if( pStep->pFrom ){
|
||||
SrcList *pDup = sqlite3SrcListDup(db, pStep->pFrom, 0);
|
||||
|
||||
Reference in New Issue
Block a user