Skip to content

Commit 527cbd4

Browse files
author
drh
committed
Do not allow CREATE TABLE or CREATE VIEW of an object with a name that looks
like a shadow table name. FossilOrigin-Name: 6aef58b629d89955f85f65191ba2be67b2adfac4f0327fe9a7141cb2705dbc00
1 parent 070ae3b commit 527cbd4

File tree

5 files changed

+39
-22
lines changed

5 files changed

+39
-22
lines changed

Diff for: manifest

+8-11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
C Break\sout\sthe\stest\sfor\swritable\sshadow\stables\sinto\sa\sseparate\ssubroutine.
2-
D 2019-11-16T13:51:31.727
1+
C Do\snot\sallow\sCREATE\sTABLE\sor\sCREATE\sVIEW\sof\san\sobject\swith\sa\sname\sthat\slooks\nlike\sa\sshadow\stable\sname.
2+
D 2019-11-16T14:15:19.202
33
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
44
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
55
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -470,7 +470,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
470470
F src/btree.c 12e251f8c3eaad05e6d0db94772bf779b3a644e18d884025da6bcbc98cad1d22
471471
F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484
472472
F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437
473-
F src/build.c 0001fed71cad92f94b3ed3ca38007de9cf61e1d48b209ba22feaeb606bbe6de1
473+
F src/build.c fe0b0b6dfab27a6f5778bd3dba8db879fda114c1d524a9597e5195ac55c8d01b
474474
F src/callback.c 88615dfc0a82167b65b452b4b305dbf86be77200b3343c6ffc6d03e92a01d181
475475
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
476476
F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251
@@ -531,7 +531,7 @@ F src/shell.c.in c06961f202f3cc50b819744b7331d3caea3d79d958402f4900b066824855746
531531
F src/sqlite.h.in 95f50dc42fddab20064bf308c6756fcf2fdd84998dda15ae404a89c5c8d2cd10
532532
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
533533
F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2
534-
F src/sqliteInt.h 7bce951adf6bc8015accda3c204bc8da8127f7c8fa9e8684a9fcbf25e941206d
534+
F src/sqliteInt.h 98bc9562acfc361e34182aa25b00e2c73095732ddd3ba4158f984b94f5601f96
535535
F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
536536
F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e
537537
F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
@@ -634,7 +634,7 @@ F test/altercol.test 54374d2ba18af25bb24e23acf18a60270d4ec120b7ec0558078b59d5aa1
634634
F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3eab2f44b
635635
F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9
636636
F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b
637-
F test/altertab.test 8069e5a8cbd3cb35732d3ec680dcc5273c2587ebd8e6a5d51084fa8059e468e5
637+
F test/altertab.test 4d8b79b0b88b62b90b710390df14fe99e0a3578345526886eaa550e28e3065dc
638638
F test/altertab2.test 8883693952f6d7fb5f754dbf1d694ed780aa883027bef04cb1fb99a3b88c9272
639639
F test/altertab3.test f40013d333e273da57e329fac6c2268a58aa09d17c3575936b343eeb2fa09180
640640
F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f
@@ -1849,10 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
18491849
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
18501850
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
18511851
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
1852-
P 70390bbca49e706649ca5b7c031f0baf416fc38798c17e5f3b73746b3e66e3b5
1853-
R eb1e2d60d183f45db7dd5d6f1b4dd659
1854-
T *branch * defensive-improvements
1855-
T *sym-defensive-improvements *
1856-
T -sym-trunk *
1852+
P 8ad34d36a141fa8f5d9bd784dfeb892c983897a6dc6b867607cc668508acf944
1853+
R eb081275a7e8dd518362d4efeb289e7e
18571854
U drh
1858-
Z 25e7114e721d6c257eca936cdc80fddc
1855+
Z 5fd6ba2bd9359116ce6160036d7c9b86

Diff for: manifest.uuid

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8ad34d36a141fa8f5d9bd784dfeb892c983897a6dc6b867607cc668508acf944
1+
6aef58b629d89955f85f65191ba2be67b2adfac4f0327fe9a7141cb2705dbc00

Diff for: src/build.c

+5-6
Original file line numberDiff line numberDiff line change
@@ -856,13 +856,14 @@ int sqlite3CheckObjectName(
856856
}
857857
}
858858
}else{
859-
if( pParse->nested==0
860-
&& 0==sqlite3StrNICmp(zName, "sqlite_", 7)
859+
if( (pParse->nested==0 && 0==sqlite3StrNICmp(zName, "sqlite_", 7))
860+
|| (sqlite3ReadOnlyShadowTables(db) && sqlite3ShadowTableName(db, zName))
861861
){
862862
sqlite3ErrorMsg(pParse, "object name reserved for internal use: %s",
863863
zName);
864864
return SQLITE_ERROR;
865865
}
866+
866867
}
867868
return SQLITE_OK;
868869
}
@@ -2129,7 +2130,7 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){
21292130
** zName is temporarily modified while this routine is running, but is
21302131
** restored to its original value prior to this routine returning.
21312132
*/
2132-
static int isShadowTableName(sqlite3 *db, char *zName){
2133+
int sqlite3ShadowTableName(sqlite3 *db, const char *zName){
21332134
char *zTail; /* Pointer to the last "_" in zName */
21342135
Table *pTab; /* Table that zName is a shadow of */
21352136
Module *pMod; /* Module for the virtual table */
@@ -2147,8 +2148,6 @@ static int isShadowTableName(sqlite3 *db, char *zName){
21472148
if( pMod->pModule->xShadowName==0 ) return 0;
21482149
return pMod->pModule->xShadowName(zTail+1);
21492150
}
2150-
#else
2151-
# define isShadowTableName(x,y) 0
21522151
#endif /* ifndef SQLITE_OMIT_VIRTUALTABLE */
21532152

21542153
/*
@@ -2190,7 +2189,7 @@ void sqlite3EndTable(
21902189
p = pParse->pNewTable;
21912190
if( p==0 ) return;
21922191

2193-
if( pSelect==0 && isShadowTableName(db, p->zName) ){
2192+
if( pSelect==0 && sqlite3ShadowTableName(db, p->zName) ){
21942193
p->tabFlags |= TF_Shadow;
21952194
}
21962195

Diff for: src/sqliteInt.h

+5
Original file line numberDiff line numberDiff line change
@@ -4548,6 +4548,11 @@ void sqlite3AutoLoadExtensions(sqlite3*);
45484548
# define sqlite3VtabInSync(db) ((db)->nVTrans>0 && (db)->aVTrans==0)
45494549
#endif
45504550
int sqlite3ReadOnlyShadowTables(sqlite3 *db);
4551+
#ifndef SQLITE_OMIT_VIRTUALTABLE
4552+
int sqlite3ShadowTableName(sqlite3 *db, const char *zName);
4553+
#else
4554+
# define sqlite3ShadowTableName(A,B) 0
4555+
#endif
45514556
int sqlite3VtabEponymousTableInit(Parse*,Module*);
45524557
void sqlite3VtabEponymousTableClear(sqlite3*,Module*);
45534558
void sqlite3VtabMakeWritable(Parse*,Table*);

Diff for: test/altertab.test

+20-4
Original file line numberDiff line numberDiff line change
@@ -547,13 +547,29 @@ ifcapable fts3 {
547547
} {1 {table y1_segments may not be modified}}
548548

549549
do_catchsql_test 16.20 {
550-
ALTER TABLE y1_segments RENAME TO abc;
551-
} {1 {table y1_segments may not be altered}}
552-
553-
do_catchsql_test 16.21 {
554550
DROP TABLE y1_segments;
555551
} {1 {table y1_segments may not be dropped}}
556552

553+
do_catchsql_test 16.20 {
554+
ALTER TABLE y1_segments RENAME TO abc;
555+
} {1 {table y1_segments may not be altered}}
556+
sqlite3_db_config db DEFENSIVE 0
557+
do_catchsql_test 16.22 {
558+
ALTER TABLE y1_segments RENAME TO abc;
559+
} {0 {}}
560+
sqlite3_db_config db DEFENSIVE 1
561+
do_catchsql_test 16.23 {
562+
CREATE TABLE y1_segments AS SELECT * FROM abc;
563+
} {1 {object name reserved for internal use: y1_segments}}
564+
do_catchsql_test 16.24 {
565+
CREATE VIEW y1_segments AS SELECT * FROM abc;
566+
} {1 {object name reserved for internal use: y1_segments}}
567+
sqlite3_db_config db DEFENSIVE 0
568+
do_catchsql_test 16.25 {
569+
ALTER TABLE abc RENAME TO y1_segments;
570+
} {0 {}}
571+
sqlite3_db_config db DEFENSIVE 1
572+
557573
do_execsql_test 16.30 {
558574
ALTER TABLE y1 RENAME TO z1;
559575
}

0 commit comments

Comments
 (0)