From: drh Date: Tue, 6 Nov 2018 14:03:07 +0000 (+0000) Subject: Only allow shadow table to be written from within a recursive SQL call. X-Git-Tag: version-3.26.0~47^2~10 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fc25721c9e044a23b2a4ab904c68bbbe338d8165;p=thirdparty%2Fsqlite.git Only allow shadow table to be written from within a recursive SQL call. Omit the SQLITE_PREPARE_SHADOW flag. Some tests are failing because the tests depend on being able to write to shadow tables. FossilOrigin-Name: d890c6582524677666e6f5b5817331dec332ade16b2f744cbb8a3c7dd9b63e21 --- diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 01ff53d4d3..8fc6589121 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -407,8 +407,7 @@ static int fts3SqlStmt( if( !zSql ){ rc = SQLITE_NOMEM; }else{ - rc = sqlite3_prepare_v3(p->db, zSql, -1, - SQLITE_PREPARE_PERSISTENT | SQLITE_PREPARE_SHADOW, + rc = sqlite3_prepare_v3(p->db, zSql, -1, SQLITE_PREPARE_PERSISTENT, &pStmt, NULL); sqlite3_free(zSql); assert( rc==SQLITE_OK || pStmt==0 ); diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index e4c13751f5..394280b3f2 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -729,8 +729,7 @@ static int fts5IndexPrepareStmt( if( p->rc==SQLITE_OK ){ if( zSql ){ p->rc = sqlite3_prepare_v3(p->pConfig->db, zSql, -1, - SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_SHADOW, - ppStmt, 0); + SQLITE_PREPARE_PERSISTENT, ppStmt, 0); }else{ p->rc = SQLITE_NOMEM; } @@ -781,8 +780,7 @@ static void fts5DataDelete(Fts5Index *p, i64 iFirst, i64 iLast){ rc = SQLITE_NOMEM; }else{ rc = sqlite3_prepare_v3(pConfig->db, zSql, -1, - SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_SHADOW, - &p->pDeleter, 0); + SQLITE_PREPARE_PERSISTENT, &p->pDeleter, 0); sqlite3_free(zSql); } if( rc!=SQLITE_OK ){ diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index 41c1c45eb0..e5ff3936ff 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -890,8 +890,7 @@ static int fts5PrepareStatement( rc = SQLITE_NOMEM; }else{ rc = sqlite3_prepare_v3(pConfig->db, zSql, -1, - SQLITE_PREPARE_PERSISTENT |SQLITE_PREPARE_SHADOW, - &pRet, 0); + SQLITE_PREPARE_PERSISTENT, &pRet, 0); if( rc!=SQLITE_OK ){ *pConfig->pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(pConfig->db)); } diff --git a/ext/fts5/fts5_storage.c b/ext/fts5/fts5_storage.c index 2bdc4703b9..70d7135113 100644 --- a/ext/fts5/fts5_storage.c +++ b/ext/fts5/fts5_storage.c @@ -137,8 +137,7 @@ static int fts5StorageGetStmt( rc = SQLITE_NOMEM; }else{ rc = sqlite3_prepare_v3(pC->db, zSql, -1, - SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_SHADOW, - &p->aStmt[eStmt], 0); + SQLITE_PREPARE_PERSISTENT, &p->aStmt[eStmt], 0); sqlite3_free(zSql); if( rc!=SQLITE_OK && pzErrMsg ){ *pzErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pC->db)); diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index fd1abef1ec..4b044cb710 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -3451,8 +3451,7 @@ static int rtreeSqlInit( } zSql = sqlite3_mprintf(zFormat, zDb, zPrefix); if( zSql ){ - rc = sqlite3_prepare_v3(db, zSql, -1, - SQLITE_PREPARE_PERSISTENT | SQLITE_PREPARE_SHADOW, + rc = sqlite3_prepare_v3(db, zSql, -1, SQLITE_PREPARE_PERSISTENT, appStmt[i], 0); }else{ rc = SQLITE_NOMEM; diff --git a/manifest b/manifest index 2b975e775a..99b9061685 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\senforcement\sof\sread-only\son\sshadow\stables.\s\sThis\sdoes\snot\scurrently\swork\nsince\ssome\svirtual\stables\sare\sattempting\sto\supdate\sshadow\stables\susing\nsqlite3_exec(). -D 2018-11-06T13:37:20.946 +C Only\sallow\sshadow\stable\sto\sbe\swritten\sfrom\swithin\sa\srecursive\sSQL\scall.\nOmit\sthe\sSQLITE_PREPARE_SHADOW\sflag.\s\sSome\stests\sare\sfailing\sbecause\sthe\ntests\sdepend\son\sbeing\sable\sto\swrite\sto\sshadow\stables. +D 2018-11-06T14:03:07.413 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in edbb6e20bb1decf65f6c64c9e61004a69bdf8afb39cdce5337c916b03dfcd1e3 @@ -98,7 +98,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 525a3bd9a7564603c5c061b7de55403a565307758a94600e8a2f6b00d1c40d9d F ext/fts3/fts3_unicode2.c cc04fc672bfd42b1e650398cb0bf71f64f9aae032cfe75bbcfe75b9cf966029c -F ext/fts3/fts3_write.c 0031c455ddd9a65cb840dbb844d5d4391cd0324007f43fed1fec2bc782dc0bd2 +F ext/fts3/fts3_write.c a85bc4885fde7f1b44c9de013b62f7cd3332dc59e208053d878729b1d04745bc F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 @@ -115,9 +115,9 @@ F ext/fts5/fts5_buffer.c 1dd1ec0446b3acfc2d7d407eb894762a461613e2695273f48e449bf F ext/fts5/fts5_config.c 5af9c360e99669d29f06492c370892394aba0857 F ext/fts5/fts5_expr.c 5aef080ba3c8947e22f38ce1ff9fe548e4a740e72b77241f35ed941ae128d2c7 F ext/fts5/fts5_hash.c 32be400cf761868c9db33efe81a06eb19a17c5402ad477ee9efb51301546dd55 -F ext/fts5/fts5_index.c ddaea9e164670f4c2d97441da9b11499718114a8920f49f1982eb6a6c06863fa -F ext/fts5/fts5_main.c 5318b205988edf3fcce615182cbe29bd507ccb69a80e1c96f9f9a743db4394b9 -F ext/fts5/fts5_storage.c d35ccef429923a381eb39d834b14c8dc8a86eb0d1bab936f37b3adc3ad84f763 +F ext/fts5/fts5_index.c d1b2d7d92cb2b72b9465da35b7d7c30e4b426c7f208bf6f94ce86b50eed8a1cb +F ext/fts5/fts5_main.c 287a1a56580df304d7fa2fc1890f85b9cb6ac6b9e7c8af7dfa2151528db4b059 +F ext/fts5/fts5_storage.c 4bec8a1b3905978b22a67bca5f4a3cfdb94af234cf51efb36f4f2d733d278634 F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 F ext/fts5/fts5_test_mi.c 65864ba1e5c34a61d409c4c587e0bbe0466eb4f8f478d85dc42a92caad1338e6 F ext/fts5/fts5_test_tok.c 80de1a4b1a3caa216c3be8862440f0117a8357dd9b7cfc5a2a2ce11fe6eb64ae @@ -362,7 +362,7 @@ F ext/repair/test/checkindex01.test 6945d0ffc0c1dc993b2ce88036b26e0f5d6fcc65da70 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c 38ad90cab8dbd3dfba246d642f47366e40418e47fa55fe89f1078483d51b52c0 -F ext/rtree/rtree.c 8367dc4a71968767b2909f3b651905e3d11e22a24340f16b82763a2e08bd991f +F ext/rtree/rtree.c 7125183bf6c37b8b8ee1a04d2b0fe258531fd31650fdd050ed041817f1943d17 F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 309afc04d4287542b2cd74f933296832cc681c7b014d9405cb329b62053a5349 F ext/rtree/rtree2.test 5f25b01acd03470067a2d52783b2eb0a50bf836803d4342d20ca39e541220fe2 @@ -455,7 +455,7 @@ F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 F src/dbpage.c cfa87c8a9e3b5267a72faa3a592a497cd3810146c056c53a3472caf763c8556b F src/dbstat.c 9ad3f2d9d19a915d414870b9405b19493eed41975f3ad0d13f70fdd0831853b4 -F src/delete.c 51c469c1a47740dc2c16277271776101db687b7fa7aa3d6304cb087d4035a9ee +F src/delete.c 5217ceccd488da04d66f86fdb3e833b50b68b7822b26a100d196f5070b4e6028 F src/expr.c 9aacc0b72348ba90010b672dcbbbe2fa56e1182043bc917a3a147b2bc57a5497 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 972a4ba14296bef2303a0abbad1e3d82bc3c61f9e6ce4e8e9528bdee68748812 @@ -499,17 +499,17 @@ F src/pcache.h 072f94d29281cffd99e46c1539849f248c4b56ae7684c1f36626797fee375170 F src/pcache1.c 716975564c15eb6679e97f734cec1bfd6c16ac3d4010f05f1f8e509fc7d19880 F src/pragma.c 3a5f39517cbe90af3271fb5dd2866a50fbcf4ced6cb464dcc80a6f763b415206 F src/pragma.h fdd03d78a7497f74a3f652909f945328480089189526841ae829ce7313d98d13 -F src/prepare.c 108bbf7010d142ea00de1b5eb809e1c2823b1159978e18a7a4c7b2c22ff98b43 +F src/prepare.c f81f8d707e583192c28fea0b2e19385415b7d188123b23f49b038076408d7a69 F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c bc8c79e56439b111e7d9415e44940951f7087e9466c3a9d664558ef0faf31073 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 61e867a906f140b73baf4ce7a201ad6dcba30820969f5618ee40e9a0d32c6f5f F src/shell.c.in 060ccc327959bdc85c895015eb382017fd0cd000ebd47b7e8dda42f8aab0b66f -F src/sqlite.h.in 612b5d40927cce9047413eaedd2f5a662b6360d08b00091c4213b30411c0fcbe +F src/sqlite.h.in 9399b09de527be1d055411d7b826125f8f816bb9ebb052de847969bd8c46d701 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 -F src/sqliteInt.h 91c7a27a6fe563db6e7b8323fc03392edf9371572c1db556e8aed48b07aea7b5 +F src/sqliteInt.h 7a6bbb9a8864af66d864eb4e4619e263b44a35b8604f6775e1e226133d14d5ef F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1776,7 +1776,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 31942b3dd3f66eb0d9977bf1cadc2f2d7be7967cce2b55784be0b939dfef1985 -R a5e7ef5eefde106d658de7abaada1682 +P f79b47c9859de597d5924870752dd7cab89c8f0608e5cceb2281f6ffb2e91930 +R 9c83260cf7477274baab6670a30d627e U drh -Z 105cca41781319666607c23424ff661f +Z 63edb3c381d916b8ce9e25126a1c39db diff --git a/manifest.uuid b/manifest.uuid index 9c0a0a6164..f8f0438cb2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f79b47c9859de597d5924870752dd7cab89c8f0608e5cceb2281f6ffb2e91930 \ No newline at end of file +d890c6582524677666e6f5b5817331dec332ade16b2f744cbb8a3c7dd9b63e21 \ No newline at end of file diff --git a/src/delete.c b/src/delete.c index c015eb43ee..9325203826 100644 --- a/src/delete.c +++ b/src/delete.c @@ -57,8 +57,9 @@ int sqlite3IsReadOnly(Parse *pParse, Table *pTab, int viewOk){ ** 2) It is a system table (i.e. sqlite_master), this call is not ** part of a nested parse and writable_schema pragma has not ** been specified. - ** 3) The table is a shadow table and the SQLITE_PREPARE_SHADOW flag - ** is omitted. + ** 3) The table is a shadow table and the current sqlite3_prepare() + ** is for a top-level SQL statement, not a nested SQL statement + ** issued by a virtual table implementation. ** ** In either case leave an error message in pParse and return non-zero. */ @@ -68,7 +69,7 @@ int sqlite3IsReadOnly(Parse *pParse, Table *pTab, int viewOk){ && sqlite3WritableSchema(pParse->db)==0 && pParse->nested==0) || ( (pTab->tabFlags & TF_Shadow)!=0 - && pParse->writeShadow==0) + && pParse->db->nVdbeExec==0) ){ sqlite3ErrorMsg(pParse, "table %s may not be modified", pTab->zName); return 1; diff --git a/src/prepare.c b/src/prepare.c index a6accbc7df..4d33f0b1e1 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -545,9 +545,6 @@ static int sqlite3Prepare( sParse.disableLookaside++; db->lookaside.bDisable++; } - if( prepFlags & SQLITE_PREPARE_SHADOW ){ - sParse.writeShadow = 1; - } /* Check to verify that it is possible to get a read lock on all ** database schemas. The inability to get a read lock indicates that diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 02963f4542..88476836c5 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -3642,19 +3642,10 @@ int sqlite3_limit(sqlite3*, int id, int newVal); ** normalize a SQL statement are unspecified and subject to change. ** At a minimum, literal values will be replaced with suitable ** placeholders. -** -** [[SQLITE_PREPARE_SHADOW]] ^(
SQLITE_PREPARE_SHADOW
-**
When the SQLITE_PREPARE_SHADOW flag is set, writes to shadow -** tables are allowed. Shadow tables are ordinary tables associated -** with some virtual tables that serve as the storage for the virtual -** table. Shadow tables are normally read-only. Virtual table -** implementations use this flag so that they can write to their own -** shadow tables. ** */ #define SQLITE_PREPARE_PERSISTENT 0x01 #define SQLITE_PREPARE_NORMALIZE 0x02 -#define SQLITE_PREPARE_SHADOW 0x04 /* ** CAPI3REF: Compiling An SQL Statement diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 77f1011836..053ac01dc3 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3086,7 +3086,6 @@ struct Parse { u8 eTriggerOp; /* TK_UPDATE, TK_INSERT or TK_DELETE */ u8 eOrconf; /* Default ON CONFLICT policy for trigger steps */ u8 disableTriggers; /* True to disable triggers */ - u8 writeShadow; /* True if shadow tables are writable */ /************************************************************************** ** Fields above must be initialized to zero. The fields that follow,