]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Use OP_SorterOpen instead of OP_OpenEphemeral to implement GROUP BY.
authordrh <drh@noemail.net>
Thu, 1 Sep 2011 16:01:27 +0000 (16:01 +0000)
committerdrh <drh@noemail.net>
Thu, 1 Sep 2011 16:01:27 +0000 (16:01 +0000)
FossilOrigin-Name: ebf819aaa555bd79fddfc0a6f9827a2539095d6c

manifest
manifest.uuid
src/select.c
test/distinct.test

index b233b883968b61ecc8ff8c01c8cfdf0d411aead3..4ed8e1a4b94381fe80365f0999d8781b409645b6 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Experimental\scode-generator\schanges\sto\sutilize\snew\sopcodes\sfor\ssorting.
-D 2011-09-01T15:32:47.873
+C Use\sOP_SorterOpen\sinstead\sof\sOP_OpenEphemeral\sto\simplement\sGROUP\sBY.
+D 2011-09-01T16:01:27.777
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in d314143fa6be24828021d3f583ad37d9afdce505
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -179,7 +179,7 @@ F src/printf.c 585a36b6a963df832cfb69505afa3a34ed5ef8a1
 F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50
 F src/resolve.c 36368f44569208fa074e61f4dd0b6c4fb60ca2b4
 F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697
-F src/select.c 20bef6860c5f69c6a90666b4968d4c5cb88056c0
+F src/select.c 037ee5501fe0e743fa98936902c200ed9ed69156
 F src/shell.c bbe7818ff5bc8614105ceb81ad67b8bdc0b671dd
 F src/sqlite.h.in 0a6c9c23337fd1352c5c75a613ff9533aa7d91cb
 F src/sqlite3ext.h 1a1a4f784aa9c3b00edd287940197de52487cd93
@@ -369,7 +369,7 @@ F test/descidx1.test 533dcbda614b0463b0ea029527fd27e5a9ab2d66
 F test/descidx2.test 9f1a0c83fd57f8667c82310ca21b30a350888b5d
 F test/descidx3.test fe720e8b37d59f4cef808b0bf4e1b391c2e56b6f
 F test/diskfull.test 106391384780753ea6896b7b4f005d10e9866b6e
-F test/distinct.test 8c4d951fc40aba84421060e07b16099d2f4c2fdf
+F test/distinct.test df5b11ad606439129c88720a86787bc9ca181f31
 F test/distinctagg.test 1a6ef9c87a58669438fc771450d7a72577417376
 F test/e_createtable.test 4771686a586b6ae414f927c389b2c101cc05c028
 F test/e_delete.test e2ae0d3fce5efd70fef99025e932afffc5616fab
@@ -961,10 +961,7 @@ F tool/symbols.sh caaf6ccc7300fd43353318b44524853e222557d5
 F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
 F tool/warnings.sh b7fdb2cc525f5ef4fa43c80e771636dd3690f9d2
-P 2869ed28299b1c9f355ecc24635830f7f1249126
-R e08eee2093eee8a9fb40d6646a4c9c76
-T *branch * merge-sort
-T *sym-merge-sort *
-T -sym-trunk *
+P bab2e560f6cb989c83a96aad60f666960ede7abe
+R 47ae22012e17b717f429ee6a9d305e96
 U drh
-Z c5e8ef1774d371c2becb6d0057b76727
+Z 4edda214a8d1e652ef01c1f98ad8fd39
index c35621c65925fff37968078208cb50bfe884d53b..e5664d914bfec2da872b39cffb14a2fb3d73f128 100644 (file)
@@ -1 +1 @@
-bab2e560f6cb989c83a96aad60f666960ede7abe
\ No newline at end of file
+ebf819aaa555bd79fddfc0a6f9827a2539095d6c
\ No newline at end of file
index 88253265941e009a655131d598e249776bfe4f83..d8332eaaea5bc35d191f78941081e3cfc532cb0f 100644 (file)
@@ -4033,6 +4033,8 @@ int sqlite3Select(
     int iAbortFlag;     /* Mem address which causes query abort if positive */
     int groupBySort;    /* Rows come from source in GROUP BY order */
     int addrEnd;        /* End of processing for this SELECT */
+    int sortPTab = 0;   /* Pseudotable used to decode sorting results */
+    int sortOut = 0;    /* Output register from the sorter */
 
     /* Remove any and all aliases between the result set and the
     ** GROUP BY clause.
@@ -4094,12 +4096,12 @@ int sqlite3Select(
 
       /* If there is a GROUP BY clause we might need a sorting index to
       ** implement it.  Allocate that sorting index now.  If it turns out
-      ** that we do not need it after all, the OpenEphemeral instruction
+      ** that we do not need it after all, the OP_SorterOpen instruction
       ** will be converted into a Noop.  
       */
       sAggInfo.sortingIdx = pParse->nTab++;
       pKeyInfo = keyInfoFromExprList(pParse, pGroupBy);
-      addrSortingIdx = sqlite3VdbeAddOp4(v, OP_OpenEphemeral
+      addrSortingIdx = sqlite3VdbeAddOp4(v, OP_SorterOpen
           sAggInfo.sortingIdx, sAggInfo.nSortingColumn, 
           0, (char*)pKeyInfo, P4_KEYINFO_HANDOFF);
 
@@ -4180,11 +4182,14 @@ int sqlite3Select(
         }
         regRecord = sqlite3GetTempReg(pParse);
         sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol, regRecord);
-        sqlite3VdbeAddOp2(v, OP_IdxInsert, sAggInfo.sortingIdx, regRecord);
+        sqlite3VdbeAddOp2(v, OP_SorterInsert, sAggInfo.sortingIdx, regRecord);
         sqlite3ReleaseTempReg(pParse, regRecord);
         sqlite3ReleaseTempRange(pParse, regBase, nCol);
         sqlite3WhereEnd(pWInfo);
-        sqlite3VdbeAddOp2(v, OP_Sort, sAggInfo.sortingIdx, addrEnd);
+        sortPTab = pParse->nTab++;
+        sortOut = sqlite3GetTempReg(pParse);
+        sqlite3VdbeAddOp3(v, OP_OpenPseudo, sortPTab, sortOut, nCol);
+        sqlite3VdbeAddOp2(v, OP_SorterSort, sAggInfo.sortingIdx, addrEnd);
         VdbeComment((v, "GROUP BY sort"));
         sAggInfo.useSortingIdx = 1;
         sqlite3ExprCacheClear(pParse);
@@ -4197,9 +4202,13 @@ int sqlite3Select(
       */
       addrTopOfLoop = sqlite3VdbeCurrentAddr(v);
       sqlite3ExprCacheClear(pParse);
+      if( groupBySort ){
+        sqlite3VdbeAddOp2(v, OP_SorterData, sAggInfo.sortingIdx, sortOut);
+      }
       for(j=0; j<pGroupBy->nExpr; j++){
         if( groupBySort ){
-          sqlite3VdbeAddOp3(v, OP_Column, sAggInfo.sortingIdx, j, iBMem+j);
+          sqlite3VdbeAddOp3(v, OP_Column, sortPTab, j, iBMem+j);
+          if( j==0 ) sqlite3VdbeChangeP5(v, OPFLAG_CLEARCACHE);
         }else{
           sAggInfo.directMode = 1;
           sqlite3ExprCode(pParse, pGroupBy->a[j].pExpr, iBMem+j);
@@ -4238,7 +4247,7 @@ int sqlite3Select(
       /* End of the loop
       */
       if( groupBySort ){
-        sqlite3VdbeAddOp2(v, OP_Next, sAggInfo.sortingIdx, addrTopOfLoop);
+        sqlite3VdbeAddOp2(v, OP_SorterNext, sAggInfo.sortingIdx, addrTopOfLoop);
       }else{
         sqlite3WhereEnd(pWInfo);
         sqlite3VdbeChangeToNoop(v, addrSortingIdx, 1);
index 87456de8765873182cced20b1cf01205cf53c783..e0a913604d18cab5d5a5a992d7aced10e545c343 100644 (file)
@@ -45,7 +45,7 @@ proc do_temptables_test {tn sql temptables} {
   uplevel [list do_test $tn [subst -novar {
     set ret ""
     db eval "EXPLAIN [set sql]" {
-      if {$opcode == "OpenEphemeral"} { 
+      if {$opcode == "OpenEphemeral" || $opcode == "SorterOpen"} { 
         if {$p5 != "10" && $p5!="00"} { error "p5 = $p5" }
         if {$p5 == "10"} {
           lappend ret hash