diff options
author | drh <drh@noemail.net> | 2016-09-05 12:02:34 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2016-09-05 12:02:34 +0000 |
commit | b29e60c4487b6abc55acd8e0fe1694c590f18412 (patch) | |
tree | d3e367b64969b186e9002445d5f38cf432ba9811 /src/resolve.c | |
parent | 80aa545337b65289a0db4e73c97d763c357aad53 (diff) | |
download | sqlite-b29e60c4487b6abc55acd8e0fe1694c590f18412.tar.gz sqlite-b29e60c4487b6abc55acd8e0fe1694c590f18412.zip |
Catch vector size mismatch problems during name resolution to avoid later
problems.
FossilOrigin-Name: 56562a0346170cf7b72445976864b058437a8ac3
Diffstat (limited to 'src/resolve.c')
-rw-r--r-- | src/resolve.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/resolve.c b/src/resolve.c index 206015fcf..a5cc06b91 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -776,6 +776,33 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ notValid(pParse, pNC, "parameters", NC_IsCheck|NC_PartIdx|NC_IdxExpr); break; } + case TK_EQ: + case TK_NE: + case TK_LT: + case TK_LE: + case TK_GT: + case TK_GE: + case TK_IS: + case TK_ISNOT: { + int nLeft, nRight; + if( pParse->db->mallocFailed ) break; + assert( pExpr->pRight!=0 ); + assert( pExpr->pLeft!=0 ); + nLeft = sqlite3ExprVectorSize(pExpr->pLeft); + nRight = sqlite3ExprVectorSize(pExpr->pRight); + if( nLeft!=nRight ){ + testcase( pExpr->op==TK_EQ ); + testcase( pExpr->op==TK_NE ); + testcase( pExpr->op==TK_LT ); + testcase( pExpr->op==TK_LE ); + testcase( pExpr->op==TK_GT ); + testcase( pExpr->op==TK_GE ); + testcase( pExpr->op==TK_IS ); + testcase( pExpr->op==TK_ISNOT ); + sqlite3ErrorMsg(pParse, "row value misused"); + } + break; + } } return (pParse->nErr || pParse->db->mallocFailed) ? WRC_Abort : WRC_Continue; } |