]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add SQLITE_DBCONFIG_RANDOM_SCANORDER. This option causes unconstrained table random-scanorder
authordrh <>
Wed, 14 Jun 2023 13:45:41 +0000 (13:45 +0000)
committerdrh <>
Wed, 14 Jun 2023 13:45:41 +0000 (13:45 +0000)
and index scan to happen in a random order, in order to help detect
under-constrained queries in applications.

FossilOrigin-Name: 330219863c4d9554843bd77a056a43a4c3265e6072b5006f6ac6a0c5103f5349

manifest
manifest.uuid
src/main.c
src/shell.c.in
src/sqlite.h.in
src/sqliteInt.h
src/vacuum.c
src/where.c

index 4f4560a756d2418a7e96cbb445ac3dc5039bbb02..fca3b34ec9b05208500ca0e1054c286bb3df078b 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Work\saround\swhat\sappears\sto\sbe\sa\sGCC\s32-bit\soptimization\sproblem\sin\sthe\ncomputeHMS()\sroutine\sof\sthe\sdate/time\slogic.
-D 2023-06-14T12:19:07.968
+C Add\sSQLITE_DBCONFIG_RANDOM_SCANORDER.\s\sThis\soption\scauses\sunconstrained\stable\nand\sindex\sscan\sto\shappen\sin\sa\srandom\sorder,\sin\sorder\sto\shelp\sdetect\nunder-constrained\squeries\sin\sapplications.
+D 2023-06-14T13:45:41.449
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -599,7 +599,7 @@ F src/insert.c a38bbb944a4f2771d70140db9c5d57e36c37e28d5a366497b4f93272a6d2567e
 F src/json.c 14c474fb1249a46eb44e878e2361f36abfe686b134039b0d1883d93d61505b4a
 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
 F src/loadext.c 176d6b2cb18a6ad73b133db17f6fc351c4d9a2d510deebdb76c22bde9cfd1465
-F src/main.c 5fd4b65d61ae6155f36756ed508a39b38b49355b031188961e8d923f43f4bc49
+F src/main.c 50464e704e5abce2051fcd899fb0185c7eb1066ba79b8dc8fd1e96ac8b4fa7ec
 F src/malloc.c 47b82c5daad557d9b963e3873e99c22570fb470719082c6658bf64e3012f7d23
 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
 F src/mem1.c 3bb59158c38e05f6270e761a9f435bf19827a264c13d1631c58b84bdc96d73b2
@@ -637,11 +637,11 @@ F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
 F src/resolve.c c1457b920aeb33ed106bf478fad31b7473a8950a755ea898980c428928f3a514
 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
 F src/select.c 383b9dba12493c365ee2036bcadd73013b7c0f7d2afcda0c378317c335d60ac2
-F src/shell.c.in 0c420738cf95292c394c2451281f76f2638c9234943805375974a20d2a5be8c3
-F src/sqlite.h.in 3076d78836b6dac53b3ab0875fc8fd15bca8077aad4d33c85336e05af6aef8c7
+F src/shell.c.in 87f5144038867d88d0d9957632bcfc311ae2cfb6696146bb0119c393f21a8943
+F src/sqlite.h.in c63ec595d928e22706bf13c8b397f3d2520d141b06e5c550c8cc705d2c564f87
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h da473ce2b3d0ae407a6300c4a164589b9a6bfdbec9462688a8593ff16f3bb6e4
-F src/sqliteInt.h 51409a4f9456865fe7b15a9c0563bcf193d52f8a1c4f7a951ee988160ed2654f
+F src/sqliteInt.h 4381b76b160fdcc9d311293b3ffa9f9deffe792250f23932ddb77a9906b1423f
 F src/sqliteLimit.h 33b1c9baba578d34efe7dfdb43193b366111cdf41476b1e82699e14c11ee1fb6
 F src/status.c 160c445d7d28c984a0eae38c144f6419311ed3eace59b44ac6dafc20db4af749
 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
@@ -705,7 +705,7 @@ F src/update.c 9fa127b8f13d39440996fdfa2323eeb1b565aba7b09ef820114ad2e77c25bdf1
 F src/upsert.c 5303dc6c518fa7d4b280ec65170f465c7a70b7ac2b22491598f6d0b4875b3145
 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
 F src/util.c 6f9d2f278dcc8d41c618980cd3cfe88e1bafc0626209b917c6773d8202d29ef6
-F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104
+F src/vacuum.c 4d77f708c01b9ff37f2e06f87dbdf3dee9fda9d3952a6af616459dafc324e03c
 F src/vdbe.c 6c0de640ef3be08cf2992d588a7501aee0f1003027bc952a6916a35f6e33b4cf
 F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0
 F src/vdbeInt.h 7bd49eef8f89c1a271fbf12d80a206bf56c876814c5fc6bee340f4e1907095ae
@@ -721,7 +721,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
 F src/wal.c cbfeeb7415baa545efa244dd34bb5af4ae953a206fed720c6fa7f1ef763ec122
 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a
 F src/walker.c 1f1c4743e064873efff71509d8839d9f7509b8960699aa2eeb906dec41a0f667
-F src/where.c 2dc708cf8b6a691fb79f16bbc46567497ee6f991043318d421e294b2da114d93
+F src/where.c 234b8e24af578698344eb66ebee6e80931af1601b3fecdce41525ab107a67d4a
 F src/whereInt.h c7d19902863beadec1d04e66aca39c0bcd60b74f05f0eaa7422c7005dfc5d51a
 F src/wherecode.c bff0bc56cb1a382de266c2db3a691135c18a4360b6ad5e069e5c415d57eb0c38
 F src/whereexpr.c f0a29594a2c143e10af7adf513b32d11223d76c6981c7f428433ec1ccbc33f84
@@ -2040,8 +2040,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 118fe600876686273f85d0a080a21267e83c11826365f3220336b1bd39562518
-R 636b0de7e817acb69f938b4ec83d6997
+P aebdbcbebff1319dd00551c9fb9ad4b08859f10e87f097295d564ae1ba188c02
+R 3abcf8fa676409a51ee8c9d184de47a1
+T *branch * random-scanorder
+T *sym-random-scanorder *
+T -sym-trunk *
 U drh
-Z 5b8bcd505fc6af17eee1501e48c257a1
+Z 5d125949520e1ed38fd4e32024e865ec
 # Remove this line to create a well-formed Fossil manifest.
index 6218540ec22f226e0c3b912b5e7df9d9dbb615f6..766b13de2e86c71a3c9caa0c0d0c109ec9807eb9 100644 (file)
@@ -1 +1 @@
-aebdbcbebff1319dd00551c9fb9ad4b08859f10e87f097295d564ae1ba188c02
\ No newline at end of file
+330219863c4d9554843bd77a056a43a4c3265e6072b5006f6ac6a0c5103f5349
\ No newline at end of file
index 7e3fab88614885a374f5e3207459e0302bd1508c..d93203fba383103bbdedccc3809e7fa95dcb4e45 100644 (file)
@@ -960,6 +960,7 @@ int sqlite3_db_config(sqlite3 *db, int op, ...){
         { SQLITE_DBCONFIG_TRUSTED_SCHEMA,        SQLITE_TrustedSchema  },
         { SQLITE_DBCONFIG_STMT_SCANSTATUS,       SQLITE_StmtScanStatus },
         { SQLITE_DBCONFIG_REVERSE_SCANORDER,     SQLITE_ReverseOrder   },
+        { SQLITE_DBCONFIG_RANDOM_SCANORDER,      SQLITE_RandomOrder    },
       };
       unsigned int i;
       rc = SQLITE_ERROR; /* IMP: R-42790-23372 */
index d02ec7fb9cda72a5ec430d74b6bb2ff28c0ebfc8..8739d963901f82621a74ad0ef7a82fad2af34da7 100644 (file)
@@ -8278,6 +8278,7 @@ static int do_meta_command(char *zLine, ShellState *p){
         { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT    },
         { "load_extension",     SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION },
         { "no_ckpt_on_close",   SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE      },
+        { "random_scanorder",   SQLITE_DBCONFIG_RANDOM_SCANORDER      },
         { "reset_database",     SQLITE_DBCONFIG_RESET_DATABASE        },
         { "reverse_scanorder",  SQLITE_DBCONFIG_REVERSE_SCANORDER     },
         { "stmt_scanstatus",    SQLITE_DBCONFIG_STMT_SCANSTATUS       },
index c5a50c01be90d72da43d0e691497ca89382f5842..d5deb79d79f902c127c56063dfa140f291845197 100644 (file)
@@ -2488,6 +2488,25 @@ struct sqlite3_mem_methods {
 ** first argument.
 ** </dd>
 **
+** [[SQLITE_DBCONFIG_RANDOM_SCANORDER]]
+** <dt>SQLITE_DBCONFIG_RANDOM_SCANORDER</dt>
+** <dd>The SQLITE_DBCONFIG_RANDOM_SCANORDER option is similar to the
+** [SQLITE_DBCOFNIG_REVERSE_SCANORDER] option in that it changes the order
+** in which tables and indexes are scanned when in cases where there is no
+** ORDER BY clause.  The difference is that this option causes the scan order
+** to be selected at random, whereas REVERSE_SCANORDER causes scans to always
+** go from the end toward the beginning.  This option is recommended for all
+** applications during development and testing in order to help locate cases
+** where the scan order is important but unconstrainted.
+** This option takes
+** two arguments which are an integer and a pointer to an integer.  The first
+** argument is 1, 0, or -1 to enable, disable, or leave unchanged the
+** reverse scan order flag, respectively.  If the second argument is not NULL,
+** then 0 or 1 is written into the integer that the second argument points to
+** depending on if the reverse scan order flag is set after processing the
+** first argument.
+** </dd>
+**
 ** </dl>
 */
 #define SQLITE_DBCONFIG_MAINDBNAME            1000 /* const char* */
@@ -2510,7 +2529,8 @@ struct sqlite3_mem_methods {
 #define SQLITE_DBCONFIG_TRUSTED_SCHEMA        1017 /* int int* */
 #define SQLITE_DBCONFIG_STMT_SCANSTATUS       1018 /* int int* */
 #define SQLITE_DBCONFIG_REVERSE_SCANORDER     1019 /* int int* */
-#define SQLITE_DBCONFIG_MAX                   1019 /* Largest DBCONFIG */
+#define SQLITE_DBCONFIG_RANDOM_SCANORDER      1020 /* int int* */
+#define SQLITE_DBCONFIG_MAX                   1020 /* Largest DBCONFIG */
 
 /*
 ** CAPI3REF: Enable Or Disable Extended Result Codes
index 4009d4f8d5e1800038ab747e2a6ee03f5ebd8e09..aca2a9a37c0096b7f7c291919ebcb429bb9bdce6 100644 (file)
@@ -1767,7 +1767,7 @@ struct sqlite3 {
 #define SQLITE_StmtScanStatus 0x00000400  /* Enable stmt_scanstats() counters */
 #define SQLITE_NoCkptOnClose  0x00000800  /* No checkpoint on close()/DETACH */
 #define SQLITE_ReverseOrder   0x00001000  /* Reverse unordered SELECTs */
-#define SQLITE_RecTriggers    0x00002000  /* Enable recursive triggers */
+#define SQLITE_RandomOrder    0x00002000  /* Random scan order */
 #define SQLITE_ForeignKeys    0x00004000  /* Enforce foreign key constraints  */
 #define SQLITE_AutoIndex      0x00008000  /* Enable automatic indexes */
 #define SQLITE_LoadExtension  0x00010000  /* Enable load_extension */
@@ -1791,6 +1791,7 @@ struct sqlite3 {
                                           /*   the count using a callback. */
 #define SQLITE_CorruptRdOnly  HI(0x00002) /* Prohibit writes due to error */
 #define SQLITE_ReadUncommit   HI(0x00004) /* READ UNCOMMITTED in shared-cache */
+#define SQLITE_RecTriggers    HI(0x00008) /* Enable recursive triggers */
 
 /* Flags used only if debugging */
 #ifdef SQLITE_DEBUG
index c0ae4bc1e1f746e4cb9c3748b85ea41e692cfc4a..70c025317b0c03e08725315f6da27a2c0d076624 100644 (file)
@@ -195,7 +195,7 @@ SQLITE_NOINLINE int sqlite3RunVacuum(
   db->flags |= SQLITE_WriteSchema | SQLITE_IgnoreChecks;
   db->mDbFlags |= DBFLAG_PreferBuiltin | DBFLAG_Vacuum;
   db->flags &= ~(u64)(SQLITE_ForeignKeys | SQLITE_ReverseOrder
-                   | SQLITE_Defensive | SQLITE_CountRows);
+                   | SQLITE_RandomOrder | SQLITE_Defensive | SQLITE_CountRows);
   db->mTrace = 0;
 
   zDbMain = db->aDb[iDb].zDbSName;
index 858e33c8ac355379622747eed217778740a59c29..cd7b67c6f1ce08b45228d9a66034a4b48717c690 100644 (file)
@@ -6120,8 +6120,14 @@ WhereInfo *sqlite3WhereBegin(
        if( db->mallocFailed ) goto whereBeginError;
     }
   }
-  if( pWInfo->pOrderBy==0 && (db->flags & SQLITE_ReverseOrder)!=0 ){
-     pWInfo->revMask = ALLBITS;
+  if( pWInfo->pOrderBy==0
+   && (db->flags & (SQLITE_ReverseOrder|SQLITE_RandomOrder))!=0
+  ){
+    if( db->flags & SQLITE_RandomOrder ){
+      sqlite3_randomness(sizeof(pWInfo->revMask), &pWInfo->revMask);
+    }else{
+      pWInfo->revMask = ALLBITS;
+    }
   }
   if( pParse->nErr ){
     goto whereBeginError;