aboutsummaryrefslogtreecommitdiff
path: root/src/expr.c
diff options
context:
space:
mode:
authordan <dan@noemail.net>2016-12-07 15:38:37 +0000
committerdan <dan@noemail.net>2016-12-07 15:38:37 +0000
commit44c5604cedbee85135eff5957af4e3843f25afa9 (patch)
tree3b74f7fe28289a77a16f74dc89aa3928c8b3b528 /src/expr.c
parent9314bd5fe2916f7034dbc197d9fcac06dc9c41d0 (diff)
downloadsqlite-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.c28
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;