-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
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
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
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
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
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.
-aebdbcbebff1319dd00551c9fb9ad4b08859f10e87f097295d564ae1ba188c02
\ No newline at end of file
+330219863c4d9554843bd77a056a43a4c3265e6072b5006f6ac6a0c5103f5349
\ No newline at end of file
{ 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 */
{ "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 },
** 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* */
#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
#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 */
/* 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
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;
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;