mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-05 15:55:57 +03:00
Protect all accesses to the Expr.x union using nearby assert()s and branches.
FossilOrigin-Name: 8eaa1d4a98b24adf245bbd2fe9212aa6a924a0f09c445906d7f87574f36a7423
This commit is contained in:
19
src/window.c
19
src/window.c
@@ -1030,7 +1030,9 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){
|
||||
** window function - one for the accumulator, another for interim
|
||||
** results. */
|
||||
for(pWin=pMWin; pWin; pWin=pWin->pNextWin){
|
||||
ExprList *pArgs = pWin->pOwner->x.pList;
|
||||
ExprList *pArgs;
|
||||
assert( ExprUseXList(pWin->pOwner) );
|
||||
pArgs = pWin->pOwner->x.pList;
|
||||
if( pWin->pFunc->funcFlags & SQLITE_FUNC_SUBTYPE ){
|
||||
selectWindowRewriteEList(pParse, pMWin, pSrc, pArgs, pTab, &pSublist);
|
||||
pWin->iArgCol = (pSublist ? pSublist->nExpr : 0);
|
||||
@@ -1423,8 +1425,11 @@ void sqlite3WindowCodeInit(Parse *pParse, Select *pSelect){
|
||||
** regApp+1: integer value used to ensure keys are unique
|
||||
** regApp+2: output of MakeRecord
|
||||
*/
|
||||
ExprList *pList = pWin->pOwner->x.pList;
|
||||
KeyInfo *pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pList, 0, 0);
|
||||
ExprList *pList;
|
||||
KeyInfo *pKeyInfo;
|
||||
assert( ExprUseXList(pWin->pOwner) );
|
||||
pList = pWin->pOwner->x.pList;
|
||||
pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pList, 0, 0);
|
||||
pWin->csrApp = pParse->nTab++;
|
||||
pWin->regApp = pParse->nMem+1;
|
||||
pParse->nMem += 3;
|
||||
@@ -1512,7 +1517,9 @@ static void windowCheckValue(Parse *pParse, int reg, int eCond){
|
||||
** with the object passed as the only argument to this function.
|
||||
*/
|
||||
static int windowArgCount(Window *pWin){
|
||||
ExprList *pList = pWin->pOwner->x.pList;
|
||||
const ExprList *pList;
|
||||
assert( ExprUseXList(pWin->pOwner) );
|
||||
pList = pWin->pOwner->x.pList;
|
||||
return (pList ? pList->nExpr : 0);
|
||||
}
|
||||
|
||||
@@ -1697,6 +1704,7 @@ static void windowAggStep(
|
||||
int addrIf = 0;
|
||||
if( pWin->pFilter ){
|
||||
int regTmp;
|
||||
assert( ExprUseXList(pWin->pOwner) );
|
||||
assert( pWin->bExprArgs || !nArg ||nArg==pWin->pOwner->x.pList->nExpr );
|
||||
assert( pWin->bExprArgs || nArg ||pWin->pOwner->x.pList==0 );
|
||||
regTmp = sqlite3GetTempReg(pParse);
|
||||
@@ -1710,6 +1718,7 @@ static void windowAggStep(
|
||||
int iOp = sqlite3VdbeCurrentAddr(v);
|
||||
int iEnd;
|
||||
|
||||
assert( ExprUseXList(pWin->pOwner) );
|
||||
nArg = pWin->pOwner->x.pList->nExpr;
|
||||
regArg = sqlite3GetTempRange(pParse, nArg);
|
||||
sqlite3ExprCodeExprList(pParse, pWin->pOwner->x.pList, regArg, 0, 0);
|
||||
@@ -1724,6 +1733,7 @@ static void windowAggStep(
|
||||
if( pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){
|
||||
CollSeq *pColl;
|
||||
assert( nArg>0 );
|
||||
assert( ExprUseXList(pWin->pOwner) );
|
||||
pColl = sqlite3ExprNNCollSeq(pParse, pWin->pOwner->x.pList->a[0].pExpr);
|
||||
sqlite3VdbeAddOp4(v, OP_CollSeq, 0,0,0, (const char*)pColl, P4_COLLSEQ);
|
||||
}
|
||||
@@ -1909,6 +1919,7 @@ static void windowReturnOneRow(WindowCodeArg *p){
|
||||
|
||||
for(pWin=pMWin; pWin; pWin=pWin->pNextWin){
|
||||
FuncDef *pFunc = pWin->pFunc;
|
||||
assert( ExprUseXList(pWin->pOwner) );
|
||||
if( pFunc->zName==nth_valueName
|
||||
|| pFunc->zName==first_valueName
|
||||
){
|
||||
|
Reference in New Issue
Block a user