aboutsummaryrefslogtreecommitdiff
path: root/src/expr.c
diff options
context:
space:
mode:
authordan <dan@noemail.net>2016-07-27 19:33:04 +0000
committerdan <dan@noemail.net>2016-07-27 19:33:04 +0000
commitd49fd4e89a1a9a48a14f79ba6356165b04e6e295 (patch)
treea724cfd25ea507efa71ef9d85762a060f2920de3 /src/expr.c
parentd9ed09d47b37b7dafa98e0456614fbac5cd94e47 (diff)
parentd93ba6271b2d9e592dd27796f78bebdec09875ca (diff)
downloadsqlite-d49fd4e89a1a9a48a14f79ba6356165b04e6e295.tar.gz
sqlite-d49fd4e89a1a9a48a14f79ba6356165b04e6e295.zip
Fix some problems with multi-column IN(SELECT...) processing.
FossilOrigin-Name: 719a3b2035a335ca8b9704646b1d641011e3ea0e
Diffstat (limited to 'src/expr.c')
-rw-r--r--src/expr.c30
1 files changed, 15 insertions, 15 deletions
diff --git a/src/expr.c b/src/expr.c
index f35ac56f8..3c95136c5 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -2480,20 +2480,20 @@ static void sqlite3ExprCodeIN(
}else{
/* If the LHS is NULL, then the result is either false or NULL depending
- ** on whether the RHS is empty or not, respectively.
- */
- if( nVector==1 && sqlite3ExprCanBeNull(pExpr->pLeft) ){
- if( destIfNull==destIfFalse ){
- /* Shortcut for the common case where the false and NULL outcomes are
- ** the same. */
- sqlite3VdbeAddOp2(v, OP_IsNull, r1, destIfNull); VdbeCoverage(v);
- }else{
- int addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, r1); VdbeCoverage(v);
- sqlite3VdbeAddOp2(v, OP_Rewind, pExpr->iTable, destIfFalse);
- VdbeCoverage(v);
- sqlite3VdbeGoto(v, destIfNull);
- sqlite3VdbeJumpHere(v, addr1);
+ ** on whether the RHS is empty or not, respectively. */
+ if( destIfNull==destIfFalse ){
+ for(i=0; i<nVector; i++){
+ Expr *p = exprVectorField(pExpr->pLeft, i);
+ if( sqlite3ExprCanBeNull(p) ){
+ sqlite3VdbeAddOp2(v, OP_IsNull, r1+aiMap[i], destIfNull);
+ }
}
+ }else if( nVector==1 && sqlite3ExprCanBeNull(pExpr->pLeft) ){
+ int addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, r1); VdbeCoverage(v);
+ sqlite3VdbeAddOp2(v, OP_Rewind, pExpr->iTable, destIfFalse);
+ VdbeCoverage(v);
+ sqlite3VdbeGoto(v, destIfNull);
+ sqlite3VdbeJumpHere(v, addr1);
}
if( eType==IN_INDEX_ROWID ){
@@ -2501,7 +2501,7 @@ static void sqlite3ExprCodeIN(
*/
sqlite3VdbeAddOp3(v, OP_SeekRowid, pExpr->iTable, destIfFalse, r1);
VdbeCoverage(v);
- }else if( nVector>1 && eType==IN_INDEX_EPH ){
+ }else if( nVector>1 && eType==IN_INDEX_EPH && destIfNull!=destIfFalse ){
int regNull = sqlite3GetTempReg(pParse);
int r2 = sqlite3GetTempReg(pParse);
int r3 = sqlite3GetTempReg(pParse);
@@ -3494,7 +3494,7 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
}
case TK_VECTOR: {
- sqlite3ErrorMsg(pParse, "invalid use of row value (1)");
+ sqlite3ErrorMsg(pParse, "invalid use of row value");
break;
}