]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Adjust the xBestIndex methods on both the fuzzer and transitive_closure
authordrh <drh@noemail.net>
Mon, 3 Jun 2013 21:25:28 +0000 (21:25 +0000)
committerdrh <drh@noemail.net>
Mon, 3 Jun 2013 21:25:28 +0000 (21:25 +0000)
virtual tables so that an unused MATCH operator gets a really large cost.
Remove ambiguities from the fuzzer test cases.

FossilOrigin-Name: e2c1af78b65a8ace976fa6c035db212e1ffc79b8

ext/misc/closure.c
ext/misc/fuzzer.c
manifest
manifest.uuid
test/fuzzer1.test

index 665cc7ce449151963c3f8af5d0fcd879ef21a0ac..260a783042ccab7ba9cea7a9485b1bc113817f8b 100644 (file)
@@ -826,12 +826,17 @@ static int closureBestIndex(
   int iPlan = 0;
   int i;
   int idx = 1;
+  int seenMatch = 0;
   const struct sqlite3_index_constraint *pConstraint;
   closure_vtab *pVtab = (closure_vtab*)pTab;
   double rCost = 10000000.0;
 
   pConstraint = pIdxInfo->aConstraint;
   for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
+    if( pConstraint->iColumn==CLOSURE_COL_ROOT
+     && pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){
+      seenMatch = 1;
+    }
     if( pConstraint->usable==0 ) continue;
     if( (iPlan & 1)==0 
      && pConstraint->iColumn==CLOSURE_COL_ROOT
@@ -895,6 +900,7 @@ static int closureBestIndex(
   ){
     pIdxInfo->orderByConsumed = 1;
   }
+  if( seenMatch && (iPlan&1)==0 ) rCost *= 1e30;
   pIdxInfo->estimatedCost = rCost;
    
   return SQLITE_OK;
index 642b8f9e92d667e0bba1494b7db48fb05118fa77..023bdb1d092151026c3415b2e26fd8028f7a1551 100644 (file)
@@ -1077,9 +1077,16 @@ static int fuzzerBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
   int iDistTerm = -1;
   int iRulesetTerm = -1;
   int i;
+  int seenMatch = 0;
   const struct sqlite3_index_constraint *pConstraint;
+  double rCost = 100000;
+
   pConstraint = pIdxInfo->aConstraint;
   for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
+    if( pConstraint->iColumn==0
+     && pConstraint->op==SQLITE_INDEX_CONSTRAINT_MATCH ){
+      seenMatch = 1;
+    }
     if( pConstraint->usable==0 ) continue;
     if( (iPlan & 1)==0 
      && pConstraint->iColumn==0
@@ -1088,6 +1095,7 @@ static int fuzzerBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
       iPlan |= 1;
       pIdxInfo->aConstraintUsage[i].argvIndex = 1;
       pIdxInfo->aConstraintUsage[i].omit = 1;
+      rCost /= 1000000.0;
     }
     if( (iPlan & 2)==0
      && pConstraint->iColumn==1
@@ -1096,6 +1104,7 @@ static int fuzzerBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
     ){
       iPlan |= 2;
       iDistTerm = i;
+      rCost /= 10.0;
     }
     if( (iPlan & 4)==0
      && pConstraint->iColumn==2
@@ -1104,6 +1113,7 @@ static int fuzzerBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
       iPlan |= 4;
       pIdxInfo->aConstraintUsage[i].omit = 1;
       iRulesetTerm = i;
+      rCost /= 10.0;
     }
   }
   if( iPlan & 2 ){
@@ -1122,7 +1132,8 @@ static int fuzzerBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
   ){
     pIdxInfo->orderByConsumed = 1;
   }
-  pIdxInfo->estimatedCost = (double)10000;
+  if( seenMatch && (iPlan&1)==0 ) rCost *= 1e30;
+  pIdxInfo->estimatedCost = rCost;
    
   return SQLITE_OK;
 }
index dba927beb09e3b3d4c73c8fd5ac1830ed4001773..75f057b5a8b517ca13c2e39e3d3a94d74f8cf418 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Pull\sin\srecent\strunk\schanges.\s\sFix\sthe\sORDER\sBY\soptimizer\sso\sthat\sit\sis\sbetter\nable\sto\sdeal\swith\sCOLLATE\sclauses.\s\sClean\sup\sambiguities\sin\sthe\sdescidx1.test\nscript.
-D 2013-06-03T20:46:35.011
+C Adjust\sthe\sxBestIndex\smethods\son\sboth\sthe\sfuzzer\sand\stransitive_closure\nvirtual\stables\sso\sthat\san\sunused\sMATCH\soperator\sgets\sa\sreally\slarge\scost.\nRemove\sambiguities\sfrom\sthe\sfuzzer\stest\scases.
+D 2013-06-03T21:25:28.624
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 5e41da95d92656a5004b03d3576e8b226858a28e
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -107,8 +107,8 @@ F ext/icu/README.txt d9fbbad0c2f647c3fdf715fc9fd64af53aedfc43
 F ext/icu/icu.c 7538f98eab2854cf17fa5f7797bffa6c76e3863b
 F ext/icu/sqliteicu.h 728867a802baa5a96de7495e9689a8e01715ef37
 F ext/misc/amatch.c eae8454cd9dcb287b2a3ec2e65a865a4ac5f0d06
-F ext/misc/closure.c b88aa95fbe32edc74e16ed5bb6646d249a2bf6ad
-F ext/misc/fuzzer.c 51bd96960b6b077d41d6f3cedefbcb57f29efaa2
+F ext/misc/closure.c 997c20ddf35f85ab399f4a02a557a9baa822ec32
+F ext/misc/fuzzer.c 79ac20b68794dfe03626f3a31681e6c240583052
 F ext/misc/ieee754.c 2565ce373d842977efe0922dc50b8a41b3289556
 F ext/misc/nextchar.c 1131e2b36116ffc6fe6b2e3464bfdace27978b1e
 F ext/misc/percentile.c 4fb5e46c4312b0be74e8e497ac18f805f0e3e6c5
@@ -561,7 +561,7 @@ F test/fuzz2.test 207d0f9d06db3eaf47a6b7bfc835b8e2fc397167
 F test/fuzz3.test aec64345184d1662bd30e6a17851ff659d596dc5
 F test/fuzz_common.tcl a87dfbb88c2a6b08a38e9a070dabd129e617b45b
 F test/fuzz_malloc.test 328f70aaca63adf29b4c6f06505ed0cf57ca7c26
-F test/fuzzer1.test 41bd5aa6ae0cf18d06342a4476e3cad98604ae48
+F test/fuzzer1.test d4c52aaf3ef923da293a2653cfab33d02f718a36
 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536
 F test/hook.test 45cb22b940c3cc0af616ba7430f666e245711a48
 F test/icu.test 70df4faca133254c042d02ae342c0a141f2663f4
@@ -1093,7 +1093,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
 F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac
-P fabb21854e662b1d8e5631e79f828d5322ceb595 4d74fccf02134a998a84097b021ba9d501e34ff0
-R b746dc544342dfc07463de0423275bdc
+P 6bc71dfcf0ef757c5c2b426dd8fddc1e5ae0f598
+R 9f95af129af308d556c3b0bed3929212
 U drh
-Z 5182eac11ae0820ee1af6bccc6719c26
+Z 30d36dfc5ff4e44e38a2e90ed964881e
index 1e5db89b771205191301a7edd950317653246b33..5fac46b81c3941b321a20be98916d4271898d177 100644 (file)
@@ -1 +1 @@
-6bc71dfcf0ef757c5c2b426dd8fddc1e5ae0f598
\ No newline at end of file
+e2c1af78b65a8ace976fa6c035db212e1ffc79b8
\ No newline at end of file
index 473d0e18687d01d88a0a46552568daae9eaa44ec..4ee573080762edbe2f658c7dd19a6a793ef7ecdf 100644 (file)
@@ -1728,36 +1728,41 @@ do_execsql_test 8.1 {
 do_execsql_test 8.2.1 {
   SELECT cFrom, cTo, word 
     FROM x3_rules CROSS JOIN x3 
-    WHERE word MATCH 'a' AND cost=distance AND ruleset=2;
+    WHERE word MATCH 'a' AND cost=distance AND ruleset=2
+    ORDER BY +cTo;
 } {a x x a y y a z z}
 
 do_execsql_test 8.2.2 {
   SELECT cFrom, cTo, word 
     FROM x3 CROSS JOIN x3_rules
-    WHERE word MATCH 'a' AND cost=distance AND ruleset=2;
+    WHERE word MATCH 'a' AND cost=distance AND ruleset=2
+    ORDER BY +cTo DESC
 } {a z z a y y a x x}
 
 do_execsql_test 8.2.3 {
   SELECT cFrom, cTo, word 
     FROM x3_rules, x3 
-    WHERE word MATCH 'a' AND cost=distance AND ruleset=2;
+    WHERE word MATCH 'a' AND cost=distance AND ruleset=2
+    ORDER BY +cTo DESC;
 } {a z z a y y a x x}
 
 do_execsql_test 8.2.4 {
   SELECT cFrom, cTo, word 
     FROM x3, x3_rules
-    WHERE word MATCH 'a' AND cost=distance AND ruleset=2;
+    WHERE word MATCH 'a' AND cost=distance AND ruleset=2
+    ORDER BY +cTo DESC;
 } {a z z a y y a x x}
 
 do_execsql_test 8.2.5 {
   CREATE INDEX i1 ON x3_rules(cost);
   SELECT cFrom, cTo, word 
     FROM x3_rules, x3 
-    WHERE word MATCH 'a' AND cost=distance AND ruleset=2;
+    WHERE word MATCH 'a' AND cost=distance AND ruleset=2
+    ORDER BY +cTo DESC;
 } {a z z a y y a x x}
 
 do_execsql_test 8.2.5 {
-  SELECT word FROM x3_rules, x3 WHERE word MATCH x3_rules.cFrom AND ruleset=2;
+  SELECT word FROM x3_rules, x3 WHERE word MATCH x3_rules.cFrom AND ruleset=2
 } {a z y x a z y x a z y x}
 
 do_execsql_test 8.2.6 {