-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
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
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
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
-871e091df651b2275a672c35ff938bd4b6db0d7f
\ No newline at end of file
+39ae92f5c63de4b95502f438dc7e9f2669efdf91
\ No newline at end of file
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; i<nSortData; i++){
- sqlite3VdbeAddOp3(v, OP_Column, iSortTab, nKey+bSeq+i, regRow+i);
- VdbeComment((v, "%s", aOutEx[i].zName ? aOutEx[i].zName : aOutEx[i].zSpan));
+ for(i=0; i<nSortData; i++){
+ sqlite3VdbeAddOp3(v, OP_Column, iSortTab, nKey+bSeq+i, regRow+i);
+ VdbeComment((v, "%s", aOutEx[i].zName ? aOutEx[i].zName : aOutEx[i].zSpan));
+ }
}
switch( eDest ){
case SRT_EphemTab: {
if( groupBySort ){
sqlite3VdbeAddOp3(v, OP_SorterData, sAggInfo.sortingIdx,
sortOut, sortPTab);
- }
- for(j=0; j<pGroupBy->nExpr; 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; j<pGroupBy->nExpr; j++){
sAggInfo.directMode = 1;
sqlite3ExprCode(pParse, pGroupBy->a[j].pExpr, iBMem+j);
}
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( idx<szHdr && d<=pIn1->n ){
+ 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])
**