diff options
author | dan <dan@noemail.net> | 2016-12-07 15:38:37 +0000 |
---|---|---|
committer | dan <dan@noemail.net> | 2016-12-07 15:38:37 +0000 |
commit | 44c5604cedbee85135eff5957af4e3843f25afa9 (patch) | |
tree | 3b74f7fe28289a77a16f74dc89aa3928c8b3b528 /src/expr.c | |
parent | 9314bd5fe2916f7034dbc197d9fcac06dc9c41d0 (diff) | |
download | sqlite-44c5604cedbee85135eff5957af4e3843f25afa9.tar.gz sqlite-44c5604cedbee85135eff5957af4e3843f25afa9.zip |
Prevent the flattening or where-term push-down optimizations from obscuring
misuses of SQL row values that can lead to crashes or assert() failures.
FossilOrigin-Name: 433d16ff3adfede3be53d5b0e0512f37e225591b
Diffstat (limited to 'src/expr.c')
-rw-r--r-- | src/expr.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/src/expr.c b/src/expr.c index 881123e31..a5833a657 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2356,6 +2356,28 @@ void sqlite3SubselectError(Parse *pParse, int nActual, int nExpect){ #endif /* +** Expression pExpr is a vector that has been used in a context where +** it is not permitted. If pExpr is a sub-select vector, this routine +** loads the Parse object with a message of the form: +** +** "sub-select returns N columns - expected 1" +** +** Or, if it is a regular scalar vector: +** +** "row value misused" +*/ +void sqlite3VectorErrorMsg(Parse *pParse, Expr *pExpr){ +#ifndef SQLITE_OMIT_SUBQUERY + if( pExpr->flags & EP_xIsSelect ){ + sqlite3SubselectError(pParse, pExpr->x.pSelect->pEList->nExpr, 1); + }else +#endif + { + sqlite3ErrorMsg(pParse, "row value misused"); + } +} + +/* ** Generate code for scalar subqueries used as a subquery expression, EXISTS, ** or IN operators. Examples: ** @@ -2637,11 +2659,7 @@ int sqlite3ExprCheckIN(Parse *pParse, Expr *pIn){ return 1; } }else if( nVector!=1 ){ - if( (pIn->pLeft->flags & EP_xIsSelect) ){ - sqlite3SubselectError(pParse, nVector, 1); - }else{ - sqlite3ErrorMsg(pParse, "row value misused"); - } + sqlite3VectorErrorMsg(pParse, pIn->pLeft); return 1; } return 0; |