mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-12 13:01:09 +03:00
Give the expression pointer fields of AggInfo distinctive names in order to
simplify tracking of all their uses. FossilOrigin-Name: a53bdd311c4154fd5e1131efbb9665362f79db5a35ce9f7b1547f74b8ee2d8ba
This commit is contained in:
16
manifest
16
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Improved\stree-view\sdebugging\soutput\sfor\saggregate\sfunctions.
|
C Give\sthe\sexpression\spointer\sfields\sof\sAggInfo\sdistinctive\snames\sin\sorder\sto\nsimplify\stracking\sof\sall\stheir\suses.
|
||||||
D 2020-06-09T11:59:15.991
|
D 2020-06-09T13:38:12.505
|
||||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||||
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
||||||
@@ -485,7 +485,7 @@ F src/date.c b29b349d277e3d579dcc295b24c0a2caed83fd8f090a9f7cbe6070c0fd662384
|
|||||||
F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a
|
F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a
|
||||||
F src/dbstat.c 793deaf88a0904f88285d93d6713c636d55ede0ffd9f08d10f4ea825531d367f
|
F src/dbstat.c 793deaf88a0904f88285d93d6713c636d55ede0ffd9f08d10f4ea825531d367f
|
||||||
F src/delete.c 88047c8e59878c920fce14582bc1dde4d81157d1ca5ffdf36c2907e6d41996c4
|
F src/delete.c 88047c8e59878c920fce14582bc1dde4d81157d1ca5ffdf36c2907e6d41996c4
|
||||||
F src/expr.c 217bee94b696a061fec28526c5d5ef3049536ace5c10a0a3ff7d15b0d3a9cd11
|
F src/expr.c 5afb8dd59d5617e0eb25f91143ed042b6cd99c006352bdbd441cb9638d2602d8
|
||||||
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
||||||
F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41
|
F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41
|
||||||
F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0
|
F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0
|
||||||
@@ -533,12 +533,12 @@ F src/printf.c 94b5419ad0a17269f76a9e968ca19cf9fa37617abed2e246fc48844e511b6bc6
|
|||||||
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
|
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
|
||||||
F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d
|
F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d
|
||||||
F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92
|
F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92
|
||||||
F src/select.c 1301808307645b008ba7a33647c0ca19f97240c426addd2e0dad2a2867d8b2b5
|
F src/select.c a1f5efdbbfae1f73746242b43daedc974a4ae702d62c305219da650ec10fb08f
|
||||||
F src/shell.c.in c6e26593f2738eefded08a39204bf6b48db135cdfaa458c26ffe57055b4fe365
|
F src/shell.c.in c6e26593f2738eefded08a39204bf6b48db135cdfaa458c26ffe57055b4fe365
|
||||||
F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7
|
F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7
|
||||||
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
||||||
F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197
|
F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197
|
||||||
F src/sqliteInt.h 73968c25461d9edf3b15d5d8f1468c4dd0677cbcb5a0be606e04e19e0d4a6863
|
F src/sqliteInt.h 8fddd3ff00bb5983c45fbe891c9c4134b5d4799d8816a1e97cba38dc66aca4c2
|
||||||
F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032
|
F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032
|
||||||
F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278
|
F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278
|
||||||
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
|
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
|
||||||
@@ -1867,7 +1867,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
|||||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||||
P d48af4d2cfff3d5f4ccc3db5d658e8b503255b577e6e62b5c2b4a4437875b895
|
P b5711b4eead10ef4b0b61f2e2c54768d215a4105f6d47d2ea78991b6e53a6831
|
||||||
R 7f4e9a8ad02c966f79b46556c8deb165
|
R 45115571336eb976de1e3114a0d3911d
|
||||||
U drh
|
U drh
|
||||||
Z 7160527ec9944aa7c5f24e9bdb594d2d
|
Z b9fb75855deff6080f9952a1c1c95794
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
b5711b4eead10ef4b0b61f2e2c54768d215a4105f6d47d2ea78991b6e53a6831
|
a53bdd311c4154fd5e1131efbb9665362f79db5a35ce9f7b1547f74b8ee2d8ba
|
||||||
14
src/expr.c
14
src/expr.c
@@ -5738,20 +5738,20 @@ static int agginfoPersistExprCb(Walker *pWalker, Expr *pExpr){
|
|||||||
assert( pExpr->op==TK_AGG_COLUMN || pExpr->op==TK_AGG_FUNCTION );
|
assert( pExpr->op==TK_AGG_COLUMN || pExpr->op==TK_AGG_FUNCTION );
|
||||||
if( pExpr->op==TK_AGG_COLUMN ){
|
if( pExpr->op==TK_AGG_COLUMN ){
|
||||||
assert( iAgg>=0 && iAgg<pAggInfo->nColumn );
|
assert( iAgg>=0 && iAgg<pAggInfo->nColumn );
|
||||||
if( pAggInfo->aCol[iAgg].pExpr==pExpr ){
|
if( pAggInfo->aCol[iAgg].pCExpr==pExpr ){
|
||||||
pExpr = sqlite3ExprDup(db, pExpr, 0);
|
pExpr = sqlite3ExprDup(db, pExpr, 0);
|
||||||
if( pExpr ){
|
if( pExpr ){
|
||||||
pAggInfo->aCol[iAgg].pExpr = pExpr;
|
pAggInfo->aCol[iAgg].pCExpr = pExpr;
|
||||||
pParse->pConstExpr =
|
pParse->pConstExpr =
|
||||||
sqlite3ExprListAppend(pParse, pParse->pConstExpr, pExpr);
|
sqlite3ExprListAppend(pParse, pParse->pConstExpr, pExpr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
assert( iAgg>=0 && iAgg<pAggInfo->nFunc );
|
assert( iAgg>=0 && iAgg<pAggInfo->nFunc );
|
||||||
if( pAggInfo->aFunc[iAgg].pExpr==pExpr ){
|
if( pAggInfo->aFunc[iAgg].pFExpr==pExpr ){
|
||||||
pExpr = sqlite3ExprDup(db, pExpr, 0);
|
pExpr = sqlite3ExprDup(db, pExpr, 0);
|
||||||
if( pExpr ){
|
if( pExpr ){
|
||||||
pAggInfo->aFunc[iAgg].pExpr = pExpr;
|
pAggInfo->aFunc[iAgg].pFExpr = pExpr;
|
||||||
pParse->pConstExpr =
|
pParse->pConstExpr =
|
||||||
sqlite3ExprListAppend(pParse, pParse->pConstExpr, pExpr);
|
sqlite3ExprListAppend(pParse, pParse->pConstExpr, pExpr);
|
||||||
}
|
}
|
||||||
@@ -5853,7 +5853,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
|
|||||||
pCol->iColumn = pExpr->iColumn;
|
pCol->iColumn = pExpr->iColumn;
|
||||||
pCol->iMem = ++pParse->nMem;
|
pCol->iMem = ++pParse->nMem;
|
||||||
pCol->iSorterColumn = -1;
|
pCol->iSorterColumn = -1;
|
||||||
pCol->pExpr = pExpr;
|
pCol->pCExpr = pExpr;
|
||||||
if( pAggInfo->pGroupBy ){
|
if( pAggInfo->pGroupBy ){
|
||||||
int j, n;
|
int j, n;
|
||||||
ExprList *pGB = pAggInfo->pGroupBy;
|
ExprList *pGB = pAggInfo->pGroupBy;
|
||||||
@@ -5896,7 +5896,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
|
|||||||
*/
|
*/
|
||||||
struct AggInfo_func *pItem = pAggInfo->aFunc;
|
struct AggInfo_func *pItem = pAggInfo->aFunc;
|
||||||
for(i=0; i<pAggInfo->nFunc; i++, pItem++){
|
for(i=0; i<pAggInfo->nFunc; i++, pItem++){
|
||||||
if( sqlite3ExprCompare(0, pItem->pExpr, pExpr, -1)==0 ){
|
if( sqlite3ExprCompare(0, pItem->pFExpr, pExpr, -1)==0 ){
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5908,7 +5908,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
|
|||||||
if( i>=0 ){
|
if( i>=0 ){
|
||||||
assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
|
assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
|
||||||
pItem = &pAggInfo->aFunc[i];
|
pItem = &pAggInfo->aFunc[i];
|
||||||
pItem->pExpr = pExpr;
|
pItem->pFExpr = pExpr;
|
||||||
pItem->iMem = ++pParse->nMem;
|
pItem->iMem = ++pParse->nMem;
|
||||||
assert( !ExprHasProperty(pExpr, EP_IntValue) );
|
assert( !ExprHasProperty(pExpr, EP_IntValue) );
|
||||||
pItem->pFunc = sqlite3FindFunction(pParse->db,
|
pItem->pFunc = sqlite3FindFunction(pParse->db,
|
||||||
|
|||||||
32
src/select.c
32
src/select.c
@@ -5389,7 +5389,7 @@ static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){
|
|||||||
sqlite3VdbeAddOp3(v, OP_Null, 0, pAggInfo->mnReg, pAggInfo->mxReg);
|
sqlite3VdbeAddOp3(v, OP_Null, 0, pAggInfo->mnReg, pAggInfo->mxReg);
|
||||||
for(pFunc=pAggInfo->aFunc, i=0; i<pAggInfo->nFunc; i++, pFunc++){
|
for(pFunc=pAggInfo->aFunc, i=0; i<pAggInfo->nFunc; i++, pFunc++){
|
||||||
if( pFunc->iDistinct>=0 ){
|
if( pFunc->iDistinct>=0 ){
|
||||||
Expr *pE = pFunc->pExpr;
|
Expr *pE = pFunc->pFExpr;
|
||||||
assert( !ExprHasProperty(pE, EP_xIsSelect) );
|
assert( !ExprHasProperty(pE, EP_xIsSelect) );
|
||||||
if( pE->x.pList==0 || pE->x.pList->nExpr!=1 ){
|
if( pE->x.pList==0 || pE->x.pList->nExpr!=1 ){
|
||||||
sqlite3ErrorMsg(pParse, "DISTINCT aggregates must have exactly one "
|
sqlite3ErrorMsg(pParse, "DISTINCT aggregates must have exactly one "
|
||||||
@@ -5413,8 +5413,8 @@ static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){
|
|||||||
int i;
|
int i;
|
||||||
struct AggInfo_func *pF;
|
struct AggInfo_func *pF;
|
||||||
for(i=0, pF=pAggInfo->aFunc; i<pAggInfo->nFunc; i++, pF++){
|
for(i=0, pF=pAggInfo->aFunc; i<pAggInfo->nFunc; i++, pF++){
|
||||||
ExprList *pList = pF->pExpr->x.pList;
|
ExprList *pList = pF->pFExpr->x.pList;
|
||||||
assert( !ExprHasProperty(pF->pExpr, EP_xIsSelect) );
|
assert( !ExprHasProperty(pF->pFExpr, EP_xIsSelect) );
|
||||||
sqlite3VdbeAddOp2(v, OP_AggFinal, pF->iMem, pList ? pList->nExpr : 0);
|
sqlite3VdbeAddOp2(v, OP_AggFinal, pF->iMem, pList ? pList->nExpr : 0);
|
||||||
sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF);
|
sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF);
|
||||||
}
|
}
|
||||||
@@ -5443,11 +5443,11 @@ static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){
|
|||||||
int nArg;
|
int nArg;
|
||||||
int addrNext = 0;
|
int addrNext = 0;
|
||||||
int regAgg;
|
int regAgg;
|
||||||
ExprList *pList = pF->pExpr->x.pList;
|
ExprList *pList = pF->pFExpr->x.pList;
|
||||||
assert( !ExprHasProperty(pF->pExpr, EP_xIsSelect) );
|
assert( !ExprHasProperty(pF->pFExpr, EP_xIsSelect) );
|
||||||
assert( !IsWindowFunc(pF->pExpr) );
|
assert( !IsWindowFunc(pF->pFExpr) );
|
||||||
if( ExprHasProperty(pF->pExpr, EP_WinFunc) ){
|
if( ExprHasProperty(pF->pFExpr, EP_WinFunc) ){
|
||||||
Expr *pFilter = pF->pExpr->y.pWin->pFilter;
|
Expr *pFilter = pF->pFExpr->y.pWin->pFilter;
|
||||||
if( pAggInfo->nAccumulator
|
if( pAggInfo->nAccumulator
|
||||||
&& (pF->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL)
|
&& (pF->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL)
|
||||||
){
|
){
|
||||||
@@ -5509,7 +5509,7 @@ static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){
|
|||||||
addrHitTest = sqlite3VdbeAddOp1(v, OP_If, regHit); VdbeCoverage(v);
|
addrHitTest = sqlite3VdbeAddOp1(v, OP_If, regHit); VdbeCoverage(v);
|
||||||
}
|
}
|
||||||
for(i=0, pC=pAggInfo->aCol; i<pAggInfo->nAccumulator; i++, pC++){
|
for(i=0, pC=pAggInfo->aCol; i<pAggInfo->nAccumulator; i++, pC++){
|
||||||
sqlite3ExprCode(pParse, pC->pExpr, pC->iMem);
|
sqlite3ExprCode(pParse, pC->pCExpr, pC->iMem);
|
||||||
}
|
}
|
||||||
|
|
||||||
pAggInfo->directMode = 0;
|
pAggInfo->directMode = 0;
|
||||||
@@ -6385,12 +6385,12 @@ int sqlite3Select(
|
|||||||
}
|
}
|
||||||
pAggInfo->nAccumulator = pAggInfo->nColumn;
|
pAggInfo->nAccumulator = pAggInfo->nColumn;
|
||||||
if( p->pGroupBy==0 && p->pHaving==0 && pAggInfo->nFunc==1 ){
|
if( p->pGroupBy==0 && p->pHaving==0 && pAggInfo->nFunc==1 ){
|
||||||
minMaxFlag = minMaxQuery(db, pAggInfo->aFunc[0].pExpr, &pMinMaxOrderBy);
|
minMaxFlag = minMaxQuery(db, pAggInfo->aFunc[0].pFExpr, &pMinMaxOrderBy);
|
||||||
}else{
|
}else{
|
||||||
minMaxFlag = WHERE_ORDERBY_NORMAL;
|
minMaxFlag = WHERE_ORDERBY_NORMAL;
|
||||||
}
|
}
|
||||||
for(i=0; i<pAggInfo->nFunc; i++){
|
for(i=0; i<pAggInfo->nFunc; i++){
|
||||||
Expr *pExpr = pAggInfo->aFunc[i].pExpr;
|
Expr *pExpr = pAggInfo->aFunc[i].pFExpr;
|
||||||
assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
|
assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
|
||||||
sNC.ncFlags |= NC_InAggFunc;
|
sNC.ncFlags |= NC_InAggFunc;
|
||||||
sqlite3ExprAnalyzeAggList(&sNC, pExpr->x.pList);
|
sqlite3ExprAnalyzeAggList(&sNC, pExpr->x.pList);
|
||||||
@@ -6412,12 +6412,12 @@ int sqlite3Select(
|
|||||||
for(ii=0; ii<pAggInfo->nColumn; ii++){
|
for(ii=0; ii<pAggInfo->nColumn; ii++){
|
||||||
sqlite3DebugPrintf("agg-column[%d] iMem=%d\n",
|
sqlite3DebugPrintf("agg-column[%d] iMem=%d\n",
|
||||||
ii, pAggInfo->aCol[ii].iMem);
|
ii, pAggInfo->aCol[ii].iMem);
|
||||||
sqlite3TreeViewExpr(0, pAggInfo->aCol[ii].pExpr, 0);
|
sqlite3TreeViewExpr(0, pAggInfo->aCol[ii].pCExpr, 0);
|
||||||
}
|
}
|
||||||
for(ii=0; ii<pAggInfo->nFunc; ii++){
|
for(ii=0; ii<pAggInfo->nFunc; ii++){
|
||||||
sqlite3DebugPrintf("agg-func[%d]: iMem=%d\n",
|
sqlite3DebugPrintf("agg-func[%d]: iMem=%d\n",
|
||||||
ii, pAggInfo->aFunc[ii].iMem);
|
ii, pAggInfo->aFunc[ii].iMem);
|
||||||
sqlite3TreeViewExpr(0, pAggInfo->aFunc[ii].pExpr, 0);
|
sqlite3TreeViewExpr(0, pAggInfo->aFunc[ii].pFExpr, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -6722,7 +6722,7 @@ int sqlite3Select(
|
|||||||
** function visits zero rows. */
|
** function visits zero rows. */
|
||||||
if( pAggInfo->nAccumulator ){
|
if( pAggInfo->nAccumulator ){
|
||||||
for(i=0; i<pAggInfo->nFunc; i++){
|
for(i=0; i<pAggInfo->nFunc; i++){
|
||||||
if( ExprHasProperty(pAggInfo->aFunc[i].pExpr, EP_WinFunc) ){
|
if( ExprHasProperty(pAggInfo->aFunc[i].pFExpr, EP_WinFunc) ){
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if( pAggInfo->aFunc[i].pFunc->funcFlags&SQLITE_FUNC_NEEDCOLL ){
|
if( pAggInfo->aFunc[i].pFunc->funcFlags&SQLITE_FUNC_NEEDCOLL ){
|
||||||
@@ -6806,14 +6806,14 @@ select_end:
|
|||||||
#ifdef SQLITE_DEBUG
|
#ifdef SQLITE_DEBUG
|
||||||
if( pAggInfo ){
|
if( pAggInfo ){
|
||||||
for(i=0; i<pAggInfo->nColumn; i++){
|
for(i=0; i<pAggInfo->nColumn; i++){
|
||||||
Expr *pExpr = pAggInfo->aCol[i].pExpr;
|
Expr *pExpr = pAggInfo->aCol[i].pCExpr;
|
||||||
assert( pExpr!=0 || db->mallocFailed );
|
assert( pExpr!=0 || db->mallocFailed );
|
||||||
if( pExpr==0 ) continue;
|
if( pExpr==0 ) continue;
|
||||||
assert( pExpr->pAggInfo==pAggInfo );
|
assert( pExpr->pAggInfo==pAggInfo );
|
||||||
assert( pExpr->iAgg==i );
|
assert( pExpr->iAgg==i );
|
||||||
}
|
}
|
||||||
for(i=0; i<pAggInfo->nFunc; i++){
|
for(i=0; i<pAggInfo->nFunc; i++){
|
||||||
Expr *pExpr = pAggInfo->aFunc[i].pExpr;
|
Expr *pExpr = pAggInfo->aFunc[i].pFExpr;
|
||||||
assert( pExpr!=0 || db->mallocFailed );
|
assert( pExpr!=0 || db->mallocFailed );
|
||||||
if( pExpr==0 ) continue;
|
if( pExpr==0 ) continue;
|
||||||
assert( pExpr->pAggInfo==pAggInfo );
|
assert( pExpr->pAggInfo==pAggInfo );
|
||||||
|
|||||||
@@ -2506,7 +2506,7 @@ struct AggInfo {
|
|||||||
ExprList *pGroupBy; /* The group by clause */
|
ExprList *pGroupBy; /* The group by clause */
|
||||||
struct AggInfo_col { /* For each column used in source tables */
|
struct AggInfo_col { /* For each column used in source tables */
|
||||||
Table *pTab; /* Source table */
|
Table *pTab; /* Source table */
|
||||||
Expr *pExpr; /* The original expression */
|
Expr *pCExpr; /* The original expression */
|
||||||
int iTable; /* Cursor number of the source table */
|
int iTable; /* Cursor number of the source table */
|
||||||
int iMem; /* Memory location that acts as accumulator */
|
int iMem; /* Memory location that acts as accumulator */
|
||||||
i16 iColumn; /* Column number within the source table */
|
i16 iColumn; /* Column number within the source table */
|
||||||
@@ -2517,7 +2517,7 @@ struct AggInfo {
|
|||||||
** Additional columns are used only as parameters to
|
** Additional columns are used only as parameters to
|
||||||
** aggregate functions */
|
** aggregate functions */
|
||||||
struct AggInfo_func { /* For each aggregate function */
|
struct AggInfo_func { /* For each aggregate function */
|
||||||
Expr *pExpr; /* Expression encoding the function */
|
Expr *pFExpr; /* Expression encoding the function */
|
||||||
FuncDef *pFunc; /* The aggregate function implementation */
|
FuncDef *pFunc; /* The aggregate function implementation */
|
||||||
int iMem; /* Memory location that acts as accumulator */
|
int iMem; /* Memory location that acts as accumulator */
|
||||||
int iDistinct; /* Ephemeral table used to enforce DISTINCT */
|
int iDistinct; /* Ephemeral table used to enforce DISTINCT */
|
||||||
|
|||||||
Reference in New Issue
Block a user