Add the new SQLITE_TESTCTRL_OPTGET that retrieves the current optimization
setting. Use this in the CLI to provide symbolic fine-grain control over optimization settings using the ".testctrl opt" dot-command. FossilOrigin-Name: 0ea4e1e8fc689cb1af3a8d21dd6af9d483115412b414e85e8a42480f50d65af2
This commit is contained in:
parent
9904d824b8
commit
be1fdbd272
19
manifest
19
manifest
@ -1,5 +1,5 @@
|
||||
C Improved\scomments\son\sbyte-code\ssubroutine\scalls\sto\smaterialize\ssubqueries.\nShould\snot\saffect\sproduction\sbuilds.
|
||||
D 2024-08-21T17:38:50.489
|
||||
C Add\sthe\snew\sSQLITE_TESTCTRL_OPTGET\sthat\sretrieves\sthe\scurrent\soptimization\nsetting.\s\sUse\sthis\sin\sthe\sCLI\sto\sprovide\ssymbolic\sfine-grain\scontrol\nover\soptimization\ssettings\susing\sthe\s".testctrl\sopt"\sdot-command.
|
||||
D 2024-08-21T18:57:55.594
|
||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
||||
@ -727,7 +727,7 @@ F src/insert.c f8d1a0f8ee258411009c6b7f2d93170e351bd19f5ad89d57e1180644297cbe70
|
||||
F src/json.c 5b6a1d6015997b9ee848a32948720bdb26a0ef2de5a2127ebf7355ce66dbdc0d
|
||||
F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
|
||||
F src/loadext.c 7432c944ff197046d67a1207790a1b13eec4548c85a9457eb0896bb3641dfb36
|
||||
F src/main.c 8a59d297ec77e6b78550433bfccb95a1b26f2fb69aaaf233206e21579a1cfcc1
|
||||
F src/main.c a520c325c7400b249242945f2c602acb19662c40f5db1c04d88664cfaa8b85ac
|
||||
F src/malloc.c 410e570b30c26cc36e3372577df50f7a96ee3eed5b2b161c6b6b48773c650c5e
|
||||
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
|
||||
F src/mem1.c 3bb59158c38e05f6270e761a9f435bf19827a264c13d1631c58b84bdc96d73b2
|
||||
@ -765,8 +765,8 @@ F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
|
||||
F src/resolve.c 9afed5fd7b9111633bdb74a73cdc47324e28e4dc6c27113e3e9aee38fb9422ab
|
||||
F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
|
||||
F src/select.c 4b14337a2742f0c0beeba490e9a05507e9b4b12184b9cd12773501d08d48e3fe
|
||||
F src/shell.c.in fb7fe0a39473e7a3ad5ad7076ff49d87aa8ed7fdd98a1595345747ac5d78ac2b
|
||||
F src/sqlite.h.in 1ad9110150773c38ebababbad11b5cb361bcd3997676dec1c91ac5e0416a7b86
|
||||
F src/shell.c.in 9a45cd618ed3cd09927e04bb0ccfd929fb5efa03a7166daec4645d230b7267f3
|
||||
F src/sqlite.h.in c6512f60f9fe06de46e49161e3f8fca72f3875f67dad8eaf469622567f434e48
|
||||
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
||||
F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54
|
||||
F src/sqliteInt.h 28c878bdf528879afefe1994ac007d094f8061f2fdacdc55d6055d7e9341151e
|
||||
@ -2210,8 +2210,11 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080
|
||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||
P c49bfee6b878bd96adfc852fdc76e98bf81e2fb82be8325672fbc7af04e7dffa
|
||||
R 862ab59c7e7e7a7369184a7d27a7302b
|
||||
P 6b024c85ef856e26cddac8ad862e16909b5149c3e3efb4e73ba54c97291f1cc4
|
||||
R 5688f40bf117ffce0b629c4446a727b9
|
||||
T *branch * optimization-onoff
|
||||
T *sym-optimization-onoff *
|
||||
T -sym-trunk *
|
||||
U drh
|
||||
Z 51170964494b840c9c6cd6315a6727db
|
||||
Z b26803088924fd26f08434065f39c8bf
|
||||
# Remove this line to create a well-formed Fossil manifest.
|
||||
|
@ -1 +1 @@
|
||||
6b024c85ef856e26cddac8ad862e16909b5149c3e3efb4e73ba54c97291f1cc4
|
||||
0ea4e1e8fc689cb1af3a8d21dd6af9d483115412b414e85e8a42480f50d65af2
|
||||
|
12
src/main.c
12
src/main.c
@ -4393,6 +4393,18 @@ int sqlite3_test_control(int op, ...){
|
||||
break;
|
||||
}
|
||||
|
||||
/* sqlite3_test_control(SQLITE_TESTCTRL_GETOPT, sqlite3 *db, int *N)
|
||||
**
|
||||
** Write the current optimization settings into *N. A zero bit means that
|
||||
** the optimization is on, and a 1 bit means that the optimization is off.
|
||||
*/
|
||||
case SQLITE_TESTCTRL_GETOPT: {
|
||||
sqlite3 *db = va_arg(ap, sqlite3*);
|
||||
int *pN = va_arg(ap, int*);
|
||||
*pN = db->dbOptFlags;
|
||||
break;
|
||||
}
|
||||
|
||||
/* sqlite3_test_control(SQLITE_TESTCTRL_LOCALTIME_FAULT, onoff, xAlt);
|
||||
**
|
||||
** If parameter onoff is 1, subsequent calls to localtime() fail.
|
||||
|
114
src/shell.c.in
114
src/shell.c.in
@ -10925,7 +10925,7 @@ static int do_meta_command(char *zLine, ShellState *p){
|
||||
{"json_selfcheck", SQLITE_TESTCTRL_JSON_SELFCHECK ,0,"BOOLEAN" },
|
||||
{"localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,0,"BOOLEAN" },
|
||||
{"never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT,1, "BOOLEAN" },
|
||||
{"optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS,0,"DISABLE-MASK" },
|
||||
{"optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS,0,"DISABLE-MASK ..."},
|
||||
#ifdef YYCOVERAGE
|
||||
{"parser_coverage", SQLITE_TESTCTRL_PARSER_COVERAGE,0,"" },
|
||||
#endif
|
||||
@ -10989,8 +10989,118 @@ static int do_meta_command(char *zLine, ShellState *p){
|
||||
}else{
|
||||
switch(testctrl){
|
||||
|
||||
/* Special processing for .testctrl opt MASK ...
|
||||
** Each MASK argument can be one of:
|
||||
**
|
||||
** +LABEL Enable the named optimization
|
||||
**
|
||||
** -LABEL Disable the named optimization
|
||||
**
|
||||
** INTEGER Mask of optimizations to disable
|
||||
*/
|
||||
case SQLITE_TESTCTRL_OPTIMIZATIONS: {
|
||||
static const struct {
|
||||
unsigned int mask; /* Mask for this optimization */
|
||||
unsigned int bDsply; /* Display this on output */
|
||||
const char *zLabel; /* Name of optimization */
|
||||
} aLabel[] = {
|
||||
{ 0x00000001, 1, "QueryFlattener" },
|
||||
{ 0x00000001, 0, "Flatten" },
|
||||
{ 0x00000002, 1, "WindowFunc" },
|
||||
{ 0x00000004, 1, "GroupByOrder" },
|
||||
{ 0x00000008, 1, "FactorOutConst" },
|
||||
{ 0x00000010, 1, "DistinctOpt" },
|
||||
{ 0x00000020, 1, "CoverIdxScan" },
|
||||
{ 0x00000040, 1, "OrderByIdxJoin" },
|
||||
{ 0x00000080, 1, "Transitive" },
|
||||
{ 0x00000100, 1, "OmitNoopJoin" },
|
||||
{ 0x00000200, 1, "CountOfView" },
|
||||
{ 0x00000400, 1, "CurosrHints" },
|
||||
{ 0x00000800, 1, "Stat4" },
|
||||
{ 0x00001000, 1, "PushDown" },
|
||||
{ 0x00002000, 1, "SimplifyJoin" },
|
||||
{ 0x00004000, 1, "SkipScan" },
|
||||
{ 0x00008000, 1, "PropagateConst" },
|
||||
{ 0x00010000, 1, "MinMaxOpt" },
|
||||
{ 0x00020000, 1, "SeekScan" },
|
||||
{ 0x00040000, 1, "OmitOrderBy" },
|
||||
{ 0x00080000, 1, "BloomFilter" },
|
||||
{ 0x00100000, 1, "BloomPulldown" },
|
||||
{ 0x00200000, 1, "BalancedMerge" },
|
||||
{ 0x00400000, 1, "ReleaseReg" },
|
||||
{ 0x00800000, 1, "FlttnUnionAll" },
|
||||
{ 0x01000000, 1, "IndexedEXpr" },
|
||||
{ 0x02000000, 1, "Coroutines" },
|
||||
{ 0x04000000, 1, "NullUnusedCols" },
|
||||
{ 0x08000000, 1, "OnePass" },
|
||||
{ 0x10000000, 1, "OrderBySubq" },
|
||||
{ 0xffffffff, 0, "All" },
|
||||
};
|
||||
unsigned int curOpt;
|
||||
unsigned int newOpt;
|
||||
int ii;
|
||||
sqlite3_test_control(SQLITE_TESTCTRL_GETOPT, p->db, &curOpt);
|
||||
newOpt = curOpt;
|
||||
for(ii=2; ii<nArg; ii++){
|
||||
const char *z = azArg[ii];
|
||||
int useLabel = 0;
|
||||
const char *zLabel;
|
||||
if( (z[0]=='+'|| z[0]=='-') && !IsDigit(z[1]) ){
|
||||
useLabel = z[0];
|
||||
zLabel = &z[1];
|
||||
}else if( !IsDigit(z[0]) && z[0]!=0 && !IsDigit(z[1]) ){
|
||||
useLabel = '+';
|
||||
zLabel = z;
|
||||
}else{
|
||||
newOpt = (unsigned int)strtol(z,0,0);
|
||||
}
|
||||
if( useLabel ){
|
||||
int jj;
|
||||
for(jj=0; jj<ArraySize(aLabel); jj++){
|
||||
if( sqlite3_stricmp(zLabel, aLabel[jj].zLabel)==0 ) break;
|
||||
}
|
||||
if( jj>=ArraySize(aLabel) ){
|
||||
eputf("Error: no such optimization: \"%s\"\n", zLabel);
|
||||
eputf("Should be one of:");
|
||||
for(jj=0; jj<ArraySize(aLabel); jj++){
|
||||
eputf(" %s", aLabel[jj].zLabel);
|
||||
}
|
||||
eputf("\n");
|
||||
rc = 1;
|
||||
goto meta_command_exit;
|
||||
}
|
||||
if( useLabel=='+' ){
|
||||
newOpt &= ~aLabel[jj].mask;
|
||||
}else{
|
||||
newOpt |= aLabel[jj].mask;
|
||||
}
|
||||
}
|
||||
}
|
||||
if( curOpt!=newOpt ){
|
||||
sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS,p->db,newOpt);
|
||||
}else if( nArg<3 ){
|
||||
curOpt = ~newOpt;
|
||||
}
|
||||
if( newOpt==0 ){
|
||||
oputf("+All\n");
|
||||
}else if( newOpt==0xffffffff ){
|
||||
oputf("-All\n");
|
||||
}else{
|
||||
int jj;
|
||||
for(jj=0; jj<ArraySize(aLabel); jj++){
|
||||
unsigned int m = aLabel[jj].mask;
|
||||
if( !aLabel[jj].bDsply ) continue;
|
||||
if( (curOpt&m)!=(newOpt&m) ){
|
||||
oputf("%c%s\n", (newOpt & m)==0 ? '+' : '-',
|
||||
aLabel[jj].zLabel);
|
||||
}
|
||||
}
|
||||
}
|
||||
rc2 = isOk = 3;
|
||||
break;
|
||||
}
|
||||
|
||||
/* sqlite3_test_control(int, db, int) */
|
||||
case SQLITE_TESTCTRL_OPTIMIZATIONS:
|
||||
case SQLITE_TESTCTRL_FK_NO_ACTION:
|
||||
if( nArg==3 ){
|
||||
unsigned int opt = (unsigned int)strtol(azArg[2], 0, 0);
|
||||
|
@ -8330,6 +8330,7 @@ int sqlite3_test_control(int op, ...);
|
||||
#define SQLITE_TESTCTRL_JSON_SELFCHECK 14
|
||||
#define SQLITE_TESTCTRL_OPTIMIZATIONS 15
|
||||
#define SQLITE_TESTCTRL_ISKEYWORD 16 /* NOT USED */
|
||||
#define SQLITE_TESTCTRL_GETOPT 16
|
||||
#define SQLITE_TESTCTRL_SCRATCHMALLOC 17 /* NOT USED */
|
||||
#define SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 17
|
||||
#define SQLITE_TESTCTRL_LOCALTIME_FAULT 18
|
||||
|
Loading…
Reference in New Issue
Block a user