diff options
author | drh <drh@noemail.net> | 2013-11-21 04:18:31 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2013-11-21 04:18:31 +0000 |
commit | e09f43f8b78369852773661c52df015b21ef3932 (patch) | |
tree | 8e389398c9a391aca52005502505c258b8c98545 /src | |
parent | 76694c3ae5dc7f7a0b92e1e8e45d477936057537 (diff) | |
download | sqlite-e09f43f8b78369852773661c52df015b21ef3932.tar.gz sqlite-e09f43f8b78369852773661c52df015b21ef3932.zip |
Another improvement to OP_Function and an improvement to OP_Move.
FossilOrigin-Name: 70b056fb6f60cdfbe24e4b77a1770eef064a73c6
Diffstat (limited to 'src')
-rw-r--r-- | src/vdbe.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/vdbe.c b/src/vdbe.c index e94c88504..f30810dd8 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -1081,15 +1081,15 @@ case OP_Move: { int p1; /* Register to copy from */ int p2; /* Register to copy to */ - n = pOp->p3 + 1; + n = pOp->p3; p1 = pOp->p1; p2 = pOp->p2; - assert( n>0 && p1>0 && p2>0 ); + assert( n>=0 && p1>0 && p2>0 ); assert( p1+n<=p2 || p2+n<=p1 ); pIn1 = &aMem[p1]; pOut = &aMem[p2]; - while( n-- ){ + do{ assert( pOut<=&aMem[(p->nMem-p->nCursor)] ); assert( pIn1<=&aMem[(p->nMem-p->nCursor)] ); assert( memIsValid(pIn1) ); @@ -1106,7 +1106,7 @@ case OP_Move: { REGISTER_TRACE(p2++, pOut); pIn1++; pOut++; - } + }while( n-- ); break; } @@ -1532,7 +1532,8 @@ case OP_Function: { /* Copy the result of the function into register P3 */ sqlite3VdbeChangeEncoding(&ctx.s, encoding); - sqlite3VdbeMemMove(pOut, &ctx.s); + assert( pOut->flags==MEM_Null ); + memcpy(pOut, &ctx.s, sizeof(Mem)); if( sqlite3VdbeMemTooBig(pOut) ){ goto too_big; } |