1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-14 00:22:38 +03:00

Add VM code comments on the group-by processing. Extra group-by test case. (CVS 2731)

FossilOrigin-Name: 655e75ac7d96b05c118226c5b70443da2df319ec
This commit is contained in:
drh
2005-09-20 18:13:23 +00:00
parent d654be803f
commit de29e3e9be
4 changed files with 37 additions and 13 deletions

View File

@@ -1,5 +1,5 @@
C Code\scleanup\sand\ssimplification.\s\sThree\snew\sMem\sopcodes\sadded.\nThe\ssqlite3VdbeJumpHere\sfunction\sadded.\s(CVS\s2730) C Add\sVM\scode\scomments\son\sthe\sgroup-by\sprocessing.\s\sExtra\sgroup-by\stest\scase.\s(CVS\s2731)
D 2005-09-20T17:42:23 D 2005-09-20T18:13:24
F Makefile.in 12784cdce5ffc8dfb707300c34e4f1eb3b8a14f1 F Makefile.in 12784cdce5ffc8dfb707300c34e4f1eb3b8a14f1
F Makefile.linux-gcc 06be33b2a9ad4f005a5f42b22c4a19dab3cbb5c7 F Makefile.linux-gcc 06be33b2a9ad4f005a5f42b22c4a19dab3cbb5c7
F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
@@ -63,7 +63,7 @@ F src/pragma.c 126149668aa7086e86cfa3e32c8523513c19dd63
F src/prepare.c fc098db25d2a121affb08686cf04833fd50452d4 F src/prepare.c fc098db25d2a121affb08686cf04833fd50452d4
F src/printf.c bd421c1ad5e01013c89af63c60eab02852ccd15e F src/printf.c bd421c1ad5e01013c89af63c60eab02852ccd15e
F src/random.c 90adff4e73a3b249eb4f1fc2a6ff9cf78c7233a4 F src/random.c 90adff4e73a3b249eb4f1fc2a6ff9cf78c7233a4
F src/select.c 240f456bc85e60e21b9d16a4b1ac09d6266b340f F src/select.c 034c7f7447b8711f85bef578a437ea12ca7cac53
F src/shell.c 3596c1e559b82663057940d19ba533ad421c7dd3 F src/shell.c 3596c1e559b82663057940d19ba533ad421c7dd3
F src/sqlite.h.in 461b2535550cf77aedfd44385da11ef7d63e57a2 F src/sqlite.h.in 461b2535550cf77aedfd44385da11ef7d63e57a2
F src/sqliteInt.h 53daa72541b4336c5e89773cf39717ed695bd523 F src/sqliteInt.h 53daa72541b4336c5e89773cf39717ed695bd523
@@ -203,7 +203,7 @@ F test/select1.test 480233d4f5a81d7d59a55e40d05084d97e57ecdf
F test/select2.test f3c2678c3a9f3cf08ec4988a3845bda64be6d9e3 F test/select2.test f3c2678c3a9f3cf08ec4988a3845bda64be6d9e3
F test/select3.test 576df1a5cc5e01dadae9176384e2d506315afdcf F test/select3.test 576df1a5cc5e01dadae9176384e2d506315afdcf
F test/select4.test c239f516aa31f42f2ef7c6d7cd01105f08f934ca F test/select4.test c239f516aa31f42f2ef7c6d7cd01105f08f934ca
F test/select5.test 93323dd60ea8dfe2c5fee86644279dee5ad5ea23 F test/select5.test 07a90ab3c7e3f0a241a9cdea1d997b2c8a89ff0b
F test/select6.test 21b72c56e7cbcefd063fdf9bc6c89342aedabccf F test/select6.test 21b72c56e7cbcefd063fdf9bc6c89342aedabccf
F test/select7.test 1bf795b948c133a15a2a5e99d3270e652ec58ce6 F test/select7.test 1bf795b948c133a15a2a5e99d3270e652ec58ce6
F test/sort.test 0c33a8ae1c238377ad197387c3872175f40d3843 F test/sort.test 0c33a8ae1c238377ad197387c3872175f40d3843
@@ -311,7 +311,7 @@ F www/tclsqlite.tcl ddcf912ea48695603c8ed7efb29f0812ef8d1b49
F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
F www/version3.tcl a99cf5f6d8bd4d5537584a2b342f0fb9fa601d8b F www/version3.tcl a99cf5f6d8bd4d5537584a2b342f0fb9fa601d8b
F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513 F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513
P f22d0f64a0b9100e16746fb800efa508d286e40e P 2471957feee57538e5e1e50a704a337f0927d10e
R 3effef3e7ca21a06e1bfa94b9c1adaf9 R fbbb91149671f932014d08503073584b
U drh U drh
Z 30993b6d59068461f41957a47370eeb7 Z 29eed70ee2810d17c2933c512e93e023

View File

@@ -1 +1 @@
2471957feee57538e5e1e50a704a337f0927d10e 655e75ac7d96b05c118226c5b70443da2df319ec

View File

@@ -12,7 +12,7 @@
** This file contains C code routines that are called by the parser ** This file contains C code routines that are called by the parser
** to handle SELECT statements in SQLite. ** to handle SELECT statements in SQLite.
** **
** $Id: select.c,v 1.275 2005/09/20 17:42:23 drh Exp $ ** $Id: select.c,v 1.276 2005/09/20 18:13:24 drh Exp $
*/ */
#include "sqliteInt.h" #include "sqliteInt.h"
@@ -2915,8 +2915,9 @@ int sqlite3Select(
iBMem = pParse->nMem; iBMem = pParse->nMem;
pParse->nMem += pGroupBy->nExpr; pParse->nMem += pGroupBy->nExpr;
sqlite3VdbeAddOp(v, OP_MemInt, 0, iAbortFlag); sqlite3VdbeAddOp(v, OP_MemInt, 0, iAbortFlag);
VdbeComment((v, "# clear abort flag"));
sqlite3VdbeAddOp(v, OP_MemInt, 0, iUseFlag); sqlite3VdbeAddOp(v, OP_MemInt, 0, iUseFlag);
sqlite3VdbeAddOp(v, OP_MemNull, iAMem, 0); VdbeComment((v, "# indicate accumulator empty"));
sqlite3VdbeAddOp(v, OP_Goto, 0, addrInitializeLoop); sqlite3VdbeAddOp(v, OP_Goto, 0, addrInitializeLoop);
/* Generate a subroutine that outputs a single row of the result /* Generate a subroutine that outputs a single row of the result
@@ -2927,10 +2928,12 @@ int sqlite3Select(
** order to signal the caller to abort. ** order to signal the caller to abort.
*/ */
addrSetAbort = sqlite3VdbeCurrentAddr(v); addrSetAbort = sqlite3VdbeCurrentAddr(v);
sqlite3VdbeAddOp(v, OP_MemIncr, iAbortFlag, 0); sqlite3VdbeAddOp(v, OP_MemInt, 1, iAbortFlag);
VdbeComment((v, "# set abort flag"));
sqlite3VdbeAddOp(v, OP_Return, 0, 0); sqlite3VdbeAddOp(v, OP_Return, 0, 0);
addrOutputRow = sqlite3VdbeCurrentAddr(v); addrOutputRow = sqlite3VdbeCurrentAddr(v);
sqlite3VdbeAddOp(v, OP_IfMemPos, iUseFlag, addrOutputRow+2); sqlite3VdbeAddOp(v, OP_IfMemPos, iUseFlag, addrOutputRow+2);
VdbeComment((v, "# Groupby result generator entry point"));
sqlite3VdbeAddOp(v, OP_Return, 0, 0); sqlite3VdbeAddOp(v, OP_Return, 0, 0);
finalizeAggFunctions(pParse, &sAggInfo); finalizeAggFunctions(pParse, &sAggInfo);
if( pHaving ){ if( pHaving ){
@@ -2943,6 +2946,7 @@ int sqlite3Select(
goto select_end; goto select_end;
} }
sqlite3VdbeAddOp(v, OP_Return, 0, 0); sqlite3VdbeAddOp(v, OP_Return, 0, 0);
VdbeComment((v, "# end groupby result generator"));
/* Generate a subroutine that will reset the group-by accumulator /* Generate a subroutine that will reset the group-by accumulator
*/ */
@@ -2990,6 +2994,7 @@ int sqlite3Select(
sqlite3VdbeAddOp(v, OP_IdxInsert, sAggInfo.sortingIdx, 0); sqlite3VdbeAddOp(v, OP_IdxInsert, sAggInfo.sortingIdx, 0);
sqlite3WhereEnd(pWInfo); sqlite3WhereEnd(pWInfo);
sqlite3VdbeAddOp(v, OP_Sort, sAggInfo.sortingIdx, addrEnd); sqlite3VdbeAddOp(v, OP_Sort, sAggInfo.sortingIdx, addrEnd);
VdbeComment((v, "# GROUP BY sort"));
sAggInfo.useSortingIdx = 1; sAggInfo.useSortingIdx = 1;
} }
@@ -3035,15 +3040,19 @@ int sqlite3Select(
sqlite3VdbeAddOp(v, OP_MemMove, iAMem+j, iBMem+j); sqlite3VdbeAddOp(v, OP_MemMove, iAMem+j, iBMem+j);
} }
sqlite3VdbeAddOp(v, OP_Gosub, 0, addrOutputRow); sqlite3VdbeAddOp(v, OP_Gosub, 0, addrOutputRow);
VdbeComment((v, "# output one row"));
sqlite3VdbeAddOp(v, OP_IfMemPos, iAbortFlag, addrEnd); sqlite3VdbeAddOp(v, OP_IfMemPos, iAbortFlag, addrEnd);
VdbeComment((v, "# check abort flag"));
sqlite3VdbeAddOp(v, OP_Gosub, 0, addrReset); sqlite3VdbeAddOp(v, OP_Gosub, 0, addrReset);
VdbeComment((v, "# reset accumulator"));
/* Update the aggregate accumulators based on the content of /* Update the aggregate accumulators based on the content of
** the current row ** the current row
*/ */
sqlite3VdbeResolveLabel(v, addrProcessRow); sqlite3VdbeResolveLabel(v, addrProcessRow);
updateAccumulator(pParse, &sAggInfo); updateAccumulator(pParse, &sAggInfo);
sqlite3VdbeAddOp(v, OP_MemIncr, iUseFlag, 0); sqlite3VdbeAddOp(v, OP_MemInt, 1, iUseFlag);
VdbeComment((v, "# indicate data in accumulator"));
/* End of the loop /* End of the loop
*/ */
@@ -3057,6 +3066,7 @@ int sqlite3Select(
/* Output the final row of result /* Output the final row of result
*/ */
sqlite3VdbeAddOp(v, OP_Gosub, 0, addrOutputRow); sqlite3VdbeAddOp(v, OP_Gosub, 0, addrOutputRow);
VdbeComment((v, "# output final row"));
} /* endif pGroupBy */ } /* endif pGroupBy */
else { else {

View File

@@ -12,7 +12,7 @@
# focus of this file is testing aggregate functions and the # focus of this file is testing aggregate functions and the
# GROUP BY and HAVING clauses of SELECT statements. # GROUP BY and HAVING clauses of SELECT statements.
# #
# $Id: select5.test,v 1.14 2005/09/20 13:12:00 drh Exp $ # $Id: select5.test,v 1.15 2005/09/20 18:13:25 drh Exp $
set testdir [file dirname $argv0] set testdir [file dirname $argv0]
source $testdir/tester.tcl source $testdir/tester.tcl
@@ -168,5 +168,19 @@ do_test select5-6.1 {
SELECT count(x), y FROM t3 GROUP BY y ORDER BY 1 SELECT count(x), y FROM t3 GROUP BY y ORDER BY 1
} }
} {1 4 2 {}} } {1 4 2 {}}
do_test select5-6.2 {
execsql {
CREATE TABLE t4(x,y,z);
INSERT INTO t4 VALUES(1,2,NULL);
INSERT INTO t4 VALUES(2,3,NULL);
INSERT INTO t4 VALUES(3,NULL,5);
INSERT INTO t4 VALUES(4,NULL,6);
INSERT INTO t4 VALUES(4,NULL,6);
INSERT INTO t4 VALUES(5,NULL,NULL);
INSERT INTO t4 VALUES(5,NULL,NULL);
INSERT INTO t4 VALUES(6,7,8);
SELECT max(x), count(x), y, z FROM t4 GROUP BY y, z ORDER BY 1
}
} {1 1 2 {} 2 1 3 {} 3 1 {} 5 4 2 {} 6 5 2 {} {} 6 1 7 8}
finish_test finish_test