From: drh Date: Thu, 15 Oct 2015 20:17:15 +0000 (+0000) Subject: Experiments with an OP_Unpack opcode that extracts multiple columns from X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4b973dfd11c89485dc5932b47e7592070ddbeda5;p=thirdparty%2Fsqlite.git Experiments with an OP_Unpack opcode that extracts multiple columns from a record without caching. FossilOrigin-Name: 39ae92f5c63de4b95502f438dc7e9f2669efdf91 --- diff --git a/manifest b/manifest index 292c4843e0..4032a9dd2a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\suse\sof\sthe\scolumn\scache\sfor\sUPDATE\sstatements,\smaking\sthem\nmore\sefficient\sfor\sthe\scase\swhere\sa\scolumn\sis\smodified\sto\sbe\san\sexpression\nof\sother\sunmodified\scolumns. -D 2015-10-15T19:21:51.254 +C Experiments\swith\san\sOP_Unpack\sopcode\sthat\sextracts\smultiple\scolumns\sfrom\na\srecord\swithout\scaching. +D 2015-10-15T20:17:15.103 F Makefile.in 2ea961bc09e441874eb3d1bf7398e04feb24f3ee F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 8e42cb55739cd8c12e1fd25401956e2019448f6a @@ -338,7 +338,7 @@ F src/printf.c 0c4bcdd1c2e2521024f0a69cb5eb334f86b3652a F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 1954a0f01bf65d78d7d559aea3d5c67f33376d91 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e -F src/select.c dbf1fb82317043304da334a33206add211487f96 +F src/select.c a4478981ce53cb7e28d0252417deece6ad5fe693 F src/shell.c d25df04168d6ba5a4fa05bdbf859df667f9eb621 F src/sqlite.h.in 839c818e16ea68703d90d17bd2bb3607191debce F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad @@ -401,7 +401,7 @@ F src/update.c aa10336a2719bd1b9f89004f3d7ba6d566623a49 F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c F src/util.c fc612367108b74573c5fd13a85d0a23027f438bd F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701 -F src/vdbe.c 61bd96c72f103d2e96de6ab7852dc009dc9bb6b3 +F src/vdbe.c a0a2aea6a146e2479bdb7dba584f3e625ceccc30 F src/vdbe.h 4bc88bd0e06f8046ee6ab7487c0015e85ad949ad F src/vdbeInt.h 8b867eac234e28627ffcace3cd4b4b79bbec664b F src/vdbeapi.c 020681b943e77766b32ae1cddf86d7831b7374ca @@ -1391,7 +1391,10 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 3a2f73a4924860fde8ee41ad646e7a02d29ad9d5 -R 16722b48de28ae59c1a22e712b62a0b0 +P 871e091df651b2275a672c35ff938bd4b6db0d7f +R 12f17dff849f2a06a10012eebf93b957 +T *branch * unpack-opcode +T *sym-unpack-opcode * +T -sym-trunk * U drh -Z fcd4e595e3a40ac192e62fadc88a95a3 +Z 51853eb094abb609c64d30de1af24213 diff --git a/manifest.uuid b/manifest.uuid index fce1857f4d..62bb69c686 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -871e091df651b2275a672c35ff938bd4b6db0d7f \ No newline at end of file +39ae92f5c63de4b95502f438dc7e9f2669efdf91 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 67e25f0b29..cf483e793f 100644 --- a/src/select.c +++ b/src/select.c @@ -1230,15 +1230,16 @@ static void generateSortTail( codeOffset(v, p->iOffset, addrContinue); sqlite3VdbeAddOp3(v, OP_SorterData, iTab, regSortOut, iSortTab); bSeq = 0; + sqlite3VdbeAddOp4Int(v, OP_Unpack, regSortOut, regRow, nSortData, nKey); }else{ addr = 1 + sqlite3VdbeAddOp2(v, OP_Sort, iTab, addrBreak); VdbeCoverage(v); codeOffset(v, p->iOffset, addrContinue); iSortTab = iTab; bSeq = 1; - } - for(i=0; inExpr; j++){ - if( groupBySort ){ - sqlite3VdbeAddOp3(v, OP_Column, sortPTab, j, iBMem+j); - }else{ + sqlite3VdbeAddOp4Int(v, OP_Unpack, sortOut, iBMem, pGroupBy->nExpr, 0); + }else{ + for(j=0; jnExpr; j++){ sAggInfo.directMode = 1; sqlite3ExprCode(pParse, pGroupBy->a[j].pExpr, iBMem+j); } diff --git a/src/vdbe.c b/src/vdbe.c index 980876c079..f50778a0bd 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2614,6 +2614,51 @@ op_column_error: break; } +/* Opcode: Unpack P1 P2 P3 P4 * +** Synopsis: r[P2@P3] = unpack(P1) +** +** Decode the P3 fields of the record object held in register P1 +** start with the P4-th field and store the values in registers P2 +** and following. +*/ +case OP_Unpack: { + const unsigned char *aKey; + int d; + u32 idx; /* Offset in aKey[] to read from */ + u16 u; /* Unsigned loop counter */ + u32 szHdr; + int nField; + u32 serial_type; + int iOfst; /* Skip this many fields */ + + pIn1 = &aMem[pOp->p1]; + assert( pIn1->flags & MEM_Blob ); + aKey = (const unsigned char*)pIn1->z; + pOut = &aMem[pOp->p2]; + nField = pOp->p3; + assert( pOp->p4type==P4_INT32 ); + iOfst = pOp->p4.i; + idx = getVarint32(aKey, szHdr); + d = szHdr; + u = 0; + while( idxn ){ + idx += getVarint32(&aKey[idx], serial_type); + if( iOfst ){ + iOfst--; + d += sqlite3VdbeSerialTypeLen(serial_type); + }else{ + memAboutToChange(p, pOut); + sqlite3VdbeMemSetNull(pOut); + pOut->enc = encoding; + d += sqlite3VdbeSerialGet(&aKey[d], serial_type, pOut); + REGISTER_TRACE((int)(pOut - aMem), pOut); + pOut++; + if( (++u)>=nField ) break; + } + } + break; +} + /* Opcode: Affinity P1 P2 * P4 * ** Synopsis: affinity(r[P1@P2]) **