aboutsummaryrefslogtreecommitdiff
path: root/src/expr.c
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2013-12-20 15:59:20 +0000
committerdrh <drh@noemail.net>2013-12-20 15:59:20 +0000
commit4eded604ea64ac459f46887de90cf3586589da5a (patch)
tree22b9546a541643c908baba930debc302e1e51af5 /src/expr.c
parentaed1819875bbb39fe4c75f329e103183f03c3124 (diff)
downloadsqlite-4eded604ea64ac459f46887de90cf3586589da5a.tar.gz
sqlite-4eded604ea64ac459f46887de90cf3586589da5a.zip
Combine adjacent single-register OP_Copy instructions into a single
multi-register OP_Copy, where possible. Fix the Synopsis comment for multi-register OP_Copy instructions to show the correct register ranges. FossilOrigin-Name: 2ae22dc0cbed2feca4baf89d02aaace0331971d6
Diffstat (limited to 'src/expr.c')
-rw-r--r--src/expr.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/expr.c b/src/expr.c
index 81eb00c96..8ee73acb7 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -3428,7 +3428,17 @@ int sqlite3ExprCodeExprList(
}else{
int inReg = sqlite3ExprCodeTarget(pParse, pExpr, target+i);
if( inReg!=target+i ){
- sqlite3VdbeAddOp2(pParse->pVdbe, copyOp, inReg, target+i);
+ VdbeOp *pOp;
+ Vdbe *v = pParse->pVdbe;
+ if( copyOp==OP_Copy
+ && (pOp=sqlite3VdbeGetOp(v, -1))->opcode==OP_Copy
+ && pOp->p1+pOp->p3+1==inReg
+ && pOp->p2+pOp->p3+1==target+i
+ ){
+ pOp->p3++;
+ }else{
+ sqlite3VdbeAddOp2(v, copyOp, inReg, target+i);
+ }
}
}
}