aboutsummaryrefslogtreecommitdiff
path: root/src/expr.c
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2009-10-29 13:48:10 +0000
committerdrh <drh@noemail.net>2009-10-29 13:48:10 +0000
commite05c929b78dad21c2e1dbc64a264dd53609221c9 (patch)
treecfcf7879fc2d3d4f412fcdae9bd7bad4b7cd3fbf /src/expr.c
parent5bbe5481950febbea0a348d0e5bee9faa3228319 (diff)
downloadsqlite-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.c21
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;
}