]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Only allow shadow table to be written from within a recursive SQL call.
authordrh <drh@noemail.net>
Tue, 6 Nov 2018 14:03:07 +0000 (14:03 +0000)
committerdrh <drh@noemail.net>
Tue, 6 Nov 2018 14:03:07 +0000 (14:03 +0000)
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

ext/fts3/fts3_write.c
ext/fts5/fts5_index.c
ext/fts5/fts5_main.c
ext/fts5/fts5_storage.c
ext/rtree/rtree.c
manifest
manifest.uuid
src/delete.c
src/prepare.c
src/sqlite.h.in
src/sqliteInt.h

index 01ff53d4d320755326e79eb8b0b97eda5a501171..8fc6589121d81820a18eb59072d69fa51be14f9a 100644 (file)
@@ -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 );
index e4c13751f576a72154a1fdd13cb5c14f9379c36a..394280b3f2b790bd493bf424e2bf36a9fbbd21b0 100644 (file)
@@ -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 ){
index 41c1c45eb0081ea36f30a63afb956a0281ba715f..e5ff3936ff233b1afcd930fe34346d3f4f7ceb38 100644 (file)
@@ -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));
     }
index 2bdc4703b962c4e508e0d88029ad4b46bae11227..70d7135113f97658f517e2d0cd6b245af7057f36 100644 (file)
@@ -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));
index fd1abef1ec7c5670d818435782a072fa2c74d700..4b044cb7100e0f54069bd4df62a7ea3eedaf5293 100644 (file)
@@ -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;
index 2b975e775abc1bd47c0b9f15e8196472aaffa9fd..99b9061685e508ce76c1a13ee5a943c61b6dba22 100644 (file)
--- 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
index 9c0a0a6164e129254876a031c7c9182165958dee..f8f0438cb261b27726eed932f27207e3e2aafda5 100644 (file)
@@ -1 +1 @@
-f79b47c9859de597d5924870752dd7cab89c8f0608e5cceb2281f6ffb2e91930
\ No newline at end of file
+d890c6582524677666e6f5b5817331dec332ade16b2f744cbb8a3c7dd9b63e21
\ No newline at end of file
index c015eb43eeea65dec630c2206dc0515f286e1358..932520382690e77f8f0831395d218b310b32cf97 100644 (file)
@@ -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;
index a6accbc7df213de3073a5e829425a60ed43daffe..4d33f0b1e1fe294c89f8ef72fe9bdf89bde5a69d 100644 (file)
@@ -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
index 02963f45425743c0f8077da2c846077a7af58e46..88476836c56ad23da0adca7e25c6e5352254fb26 100644 (file)
@@ -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]] ^(<dt>SQLITE_PREPARE_SHADOW</dt>
-** <dd>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.
 ** </dl>
 */
 #define SQLITE_PREPARE_PERSISTENT              0x01
 #define SQLITE_PREPARE_NORMALIZE               0x02
-#define SQLITE_PREPARE_SHADOW                  0x04
 
 /*
 ** CAPI3REF: Compiling An SQL Statement
index 77f1011836442af3e3479720cd9dbf7c3ff1ddc7..053ac01dc3ba2fec7f0a8569b909fcdd005b1a1f 100644 (file)
@@ -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,