]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Only continue an ORDER BY optimization into inner loops if the equality
authordrh <drh@noemail.net>
Tue, 2 Oct 2012 14:11:29 +0000 (14:11 +0000)
committerdrh <drh@noemail.net>
Tue, 2 Oct 2012 14:11:29 +0000 (14:11 +0000)
constraints on the inner loop match terms of an outer ordered index that
are actually used by the ORDER BY clause.

FossilOrigin-Name: b0e7b4df6c2a8c479f8d210bde50c737eaa248f0

manifest
manifest.uuid
src/where.c
test/orderby1.test
test/orderby2.test

index 0d1e3cf201b1f9e0b626c858d218edf312bdfc4d..a0b9b77d8a09f5af34a1aefc939609846670d969 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Factor\san\sinvariant\sout\sthe\sloop\stermination\scondition\sfor\sthe\sORDER\sBY\nsatisfied-by-index\sanalyzer\sroutine.
-D 2012-10-02T01:46:48.203
+C Only\scontinue\san\sORDER\sBY\soptimization\sinto\sinner\sloops\sif\sthe\sequality\nconstraints\son\sthe\sinner\sloop\smatch\sterms\sof\san\souter\sordered\sindex\sthat\nare\sactually\sused\sby\sthe\sORDER\sBY\sclause.
+D 2012-10-02T14:11:29.949
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 5f4f26109f9d80829122e0e09f9cda008fa065fb
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -249,7 +249,7 @@ F src/vtab.c d8020c0a0e8ccc490ca449d7e665311b6e9f3ba9
 F src/wal.c e1fe8f92a0ea0fef8faa87ec43a127a478589d22
 F src/wal.h 29c197540b19044e6cd73487017e5e47a1d3dac6
 F src/walker.c 3d75ba73de15e0f8cd0737643badbeb0e002f07b
-F src/where.c 58a99bf57e1e216210fa143f3ae3cd1a5928a36f
+F src/where.c d40f2fa13bbda673cc681a2baeb490fe7a22f17e
 F test/8_3_names.test 631ea964a3edb091cf73c3b540f6bcfdb36ce823
 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
 F test/aggnested.test 0be144b453e0622a085fae8665c32f5676708e00
@@ -634,8 +634,8 @@ F test/notify3.test a86259abbfb923aa27d30f0fc038c88e5251488a
 F test/notnull.test cc7c78340328e6112a13c3e311a9ab3127114347
 F test/null.test a8b09b8ed87852742343b33441a9240022108993
 F test/openv2.test 0d3040974bf402e19b7df4b783e447289d7ab394
-F test/orderby1.test 31c9865626046666e81cd22ecf8e1c24a4ea41b6
-F test/orderby2.test 295d6639e1ce522195354b88ab298d7ede169736
+F test/orderby1.test 1f7e942aec6074725d823edfff258e9187dd255f
+F test/orderby2.test d8fa5991d8948ae1f335c2f91d751e955bfee815
 F test/oserror.test 50417780d0e0d7cd23cf12a8277bb44024765df3
 F test/pager1.test 2163c6ef119f497a71a84137c957c63763e640ab
 F test/pager2.test 745b911dde3d1f24ae0870bd433dfa83d7c658c1
@@ -1018,7 +1018,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
 F tool/win/sqlite.vsix 67d8a99aceb56384a81b3f30d6c71743146d2cc9
-P 351dc8d9cab8a222f28fb865d3a7d1c622d60d6f
-R e2343532e1485c60fb209fa3ba6a8cc6
+P 545bb33688663066cf3f09e4cdc4d5cfe59fb8db
+R 0244ec6263deff2d19e204ecc996e53d
 U drh
-Z 8f9278868782471bac046c34faf9fbb1
+Z 17cee407676b72dedd8bc51219c654fe
index bd7521b1fccd1a1d95f714a2398e5360cc9d5b72..73689c0af941965b427d6c9faba29f247180e478 100644 (file)
@@ -1 +1 @@
-545bb33688663066cf3f09e4cdc4d5cfe59fb8db
\ No newline at end of file
+b0e7b4df6c2a8c479f8d210bde50c737eaa248f0
\ No newline at end of file
index 77f9fb2b7c43a6dbb591a890ced521c03d266f99..ca998269b96286ef6867efe3d7d285de0e956d3e 100644 (file)
@@ -2736,10 +2736,13 @@ static int isOrderedColumn(WhereBestIdx *p, int iTab, int iCol, int *pbRev){
         sortOrder = 0;
         testcase( (pLevel->plan.wsFlags & WHERE_REVERSE)!=0 );
       }else{
-        for(j=0; j<pIdx->nColumn; j++){
+        int n = pLevel->plan.nOBSat;
+        if( p->i>=2 ) n -= pLevel[-1].plan.nOBSat;
+        assert( n<=pIdx->nColumn );
+        for(j=0; j<n; j++){
           if( iCol==pIdx->aiColumn[j] ) break;
         }
-        if( j>=pIdx->nColumn ) return 0;
+        if( j>=n ) return 0;
         sortOrder = pIdx->aSortOrder[j];
         testcase( (pLevel->plan.wsFlags & WHERE_REVERSE)!=0 );
       }
index 400659b4754ec5b6832021c21122cf405049a6ed..77ceadae093600a761b050b492f4e75489d12661 100644 (file)
@@ -170,14 +170,14 @@ do_test 2.0 {
       name TEXT,
       UNIQUE(aid, tn)
     );
-    INSERT INTO album VALUES(1, '1-one'), (2, '2-two'), (3, '3-three');
+    INSERT INTO album VALUES(1, '1-one'), (20, '2-two'), (3, '3-three');
     INSERT INTO track VALUES
-        (1, 1, 'one-a'),
-        (2, 2, 'two-b'),
-        (3, 3, 'three-c'),
-        (1, 3, 'one-c'),
-        (2, 1, 'two-a'),
-        (3, 1, 'three-a');
+        (1,  1, 'one-a'),
+        (20, 2, 'two-b'),
+        (3,  3, 'three-c'),
+        (1,  3, 'one-c'),
+        (20, 1, 'two-a'),
+        (3,  1, 'three-a');
     COMMIT;
   }
 } {}
@@ -194,6 +194,18 @@ do_test 2.1b {
     EXPLAIN QUERY PLAN
     SELECT name FROM album JOIN track USING (aid) ORDER BY title, tn
   }
+} {/ORDER BY/}  ;# ORDER BY required because of missing aid term in ORDER BY
+
+do_test 2.1c {
+  db eval {
+    SELECT name FROM album JOIN track USING (aid) ORDER BY title, aid, tn
+  }
+} {one-a one-c two-a two-b three-a three-c}
+do_test 2.1d {
+  db eval {
+    EXPLAIN QUERY PLAN
+    SELECT name FROM album JOIN track USING (aid) ORDER BY title, aid, tn
+  }
 } {~/ORDER BY/}  ;# ORDER BY optimized out
 
 # The same query with ORDER BY clause optimization disabled via + operators
@@ -284,7 +296,7 @@ do_test 2.6c {
     EXPLAIN QUERY PLAN
     SELECT name FROM album JOIN track USING (aid) ORDER BY title DESC, tn DESC
   }
-} {~/ORDER BY/}  ;# ORDER BY optimized-out
+} {/ORDER BY/}  ;# ORDER BY required
 
 
 # Generate another test dataset, but this time using mixed ASC/DESC indices.
index f07cc57b008d059938129f308bd3ffd7f0d10ca7..7d543229c0643e309eed02c917d6ef95c4cd8c05 100644 (file)
@@ -67,5 +67,31 @@ do_test 1.3b {
   }
 } {~/ORDER BY/}
 
+# After where34.314 in TH3:
+do_test 2.0 {
+  db eval {
+    CREATE TABLE t31(a,b); CREATE INDEX t31ab ON t31(a,b);
+    CREATE TABLE t32(c,d); CREATE INDEX t32cd ON t32(c,d);
+    CREATE TABLE t33(e,f); CREATE INDEX t33ef ON t33(e,f);
+    CREATE TABLE t34(g,h); CREATE INDEX t34gh ON t34(g,h);
+    
+    INSERT INTO t31 VALUES(1,4), (2,3), (1,3);
+    INSERT INTO t32 VALUES(4,5), (3,6), (3,7), (4,8);
+    INSERT INTO t33 VALUES(5,9), (7,10), (6,11), (8,12), (8,13), (7,14);
+    INSERT INTO t34 VALUES(11,20), (10,21), (12,22), (9,23), (13,24),
+                          (14,25), (12,26);
+    SELECT a||','||c||','||e||','||g FROM t31, t32, t33, t34
+     WHERE c=b AND e=d AND g=f
+     ORDER BY a ASC, c ASC, e DESC, g ASC;
+  }
+} {1,3,7,10 1,3,7,14 1,3,6,11 1,4,8,12 1,4,8,12 1,4,8,13 1,4,5,9 2,3,7,10 2,3,7,14 2,3,6,11}
+do_test 2.1 {
+  db eval {
+    SELECT a||','||c||','||e||','||g FROM t31, t32, t33, t34
+     WHERE c=b AND e=d AND g=f
+     ORDER BY +a ASC, +c ASC, +e DESC, +g ASC;
+  }
+} {1,3,7,10 1,3,7,14 1,3,6,11 1,4,8,12 1,4,8,12 1,4,8,13 1,4,5,9 2,3,7,10 2,3,7,14 2,3,6,11}
+    
 
 finish_test