From: drh <> Date: Wed, 14 Jun 2023 13:45:41 +0000 (+0000) Subject: Add SQLITE_DBCONFIG_RANDOM_SCANORDER. This option causes unconstrained table X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6291abd06dd35f4fbd18a9ca67d8401a2d9872a3;p=thirdparty%2Fsqlite.git Add SQLITE_DBCONFIG_RANDOM_SCANORDER. This option causes unconstrained table and index scan to happen in a random order, in order to help detect under-constrained queries in applications. FossilOrigin-Name: 330219863c4d9554843bd77a056a43a4c3265e6072b5006f6ac6a0c5103f5349 --- diff --git a/manifest b/manifest index 4f4560a756..fca3b34ec9 100644 --- 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. diff --git a/manifest.uuid b/manifest.uuid index 6218540ec2..766b13de2e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -aebdbcbebff1319dd00551c9fb9ad4b08859f10e87f097295d564ae1ba188c02 \ No newline at end of file +330219863c4d9554843bd77a056a43a4c3265e6072b5006f6ac6a0c5103f5349 \ No newline at end of file diff --git a/src/main.c b/src/main.c index 7e3fab8861..d93203fba3 100644 --- a/src/main.c +++ b/src/main.c @@ -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 */ diff --git a/src/shell.c.in b/src/shell.c.in index d02ec7fb9c..8739d96390 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -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 }, diff --git a/src/sqlite.h.in b/src/sqlite.h.in index c5a50c01be..d5deb79d79 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -2488,6 +2488,25 @@ struct sqlite3_mem_methods { ** first argument. ** ** +** [[SQLITE_DBCONFIG_RANDOM_SCANORDER]] +**
SQLITE_DBCONFIG_RANDOM_SCANORDER
+**
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. +**
+** ** */ #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 diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 4009d4f8d5..aca2a9a37c 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -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 diff --git a/src/vacuum.c b/src/vacuum.c index c0ae4bc1e1..70c025317b 100644 --- a/src/vacuum.c +++ b/src/vacuum.c @@ -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; diff --git a/src/where.c b/src/where.c index 858e33c8ac..cd7b67c6f1 100644 --- a/src/where.c +++ b/src/where.c @@ -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;