diff options
author | drh <drh@noemail.net> | 2009-10-29 13:48:10 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2009-10-29 13:48:10 +0000 |
commit | e05c929b78dad21c2e1dbc64a264dd53609221c9 (patch) | |
tree | cfcf7879fc2d3d4f412fcdae9bd7bad4b7cd3fbf /src/expr.c | |
parent | 5bbe5481950febbea0a348d0e5bee9faa3228319 (diff) | |
download | sqlite-e05c929b78dad21c2e1dbc64a264dd53609221c9.tar.gz sqlite-e05c929b78dad21c2e1dbc64a264dd53609221c9.zip |
Reduce the memory required by prepared statements that use the IN operator
with a list on the right and an INTEGER PRIMARY KEY on the left.
FossilOrigin-Name: e7984ad2f7e4be30e7198ebd6609a7f6177513e2
Diffstat (limited to 'src/expr.c')
-rw-r--r-- | src/expr.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/src/expr.c b/src/expr.c index f592fc75a..1ac37e0b7 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1602,6 +1602,7 @@ void sqlite3CodeSubselect( sqlite3VdbeAddOp2(v, OP_Null, 0, r2); for(i=pList->nExpr, pItem=pList->a; i>0; i--, pItem++){ Expr *pE2 = pItem->pExpr; + int iValToIns; /* If the expression is not constant then we will need to ** disable the test that was generated above that makes sure @@ -1614,14 +1615,19 @@ void sqlite3CodeSubselect( } /* Evaluate the expression and insert it into the temp table */ - r3 = sqlite3ExprCodeTarget(pParse, pE2, r1); - if( isRowid ){ - sqlite3VdbeAddOp2(v, OP_MustBeInt, r3, sqlite3VdbeCurrentAddr(v)+2); - sqlite3VdbeAddOp3(v, OP_Insert, pExpr->iTable, r2, r3); + if( isRowid && sqlite3ExprIsInteger(pE2, &iValToIns) ){ + sqlite3VdbeAddOp3(v, OP_InsertInt, pExpr->iTable, r2, iValToIns); }else{ - sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1); - sqlite3ExprCacheAffinityChange(pParse, r3, 1); - sqlite3VdbeAddOp2(v, OP_IdxInsert, pExpr->iTable, r2); + r3 = sqlite3ExprCodeTarget(pParse, pE2, r1); + if( isRowid ){ + sqlite3VdbeAddOp2(v, OP_MustBeInt, r3, + sqlite3VdbeCurrentAddr(v)+2); + sqlite3VdbeAddOp3(v, OP_Insert, pExpr->iTable, r2, r3); + }else{ + sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1); + sqlite3ExprCacheAffinityChange(pParse, r3, 1); + sqlite3VdbeAddOp2(v, OP_IdxInsert, pExpr->iTable, r2); + } } } sqlite3ReleaseTempReg(pParse, r1); @@ -2875,6 +2881,7 @@ static int isAppropriateForFactoring(Expr *p){ static int evalConstExpr(Walker *pWalker, Expr *pExpr){ Parse *pParse = pWalker->pParse; switch( pExpr->op ){ + case TK_IN: case TK_REGISTER: { return WRC_Prune; } |