]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Experiments with an OP_Unpack opcode that extracts multiple columns from unpack-opcode
authordrh <drh@noemail.net>
Thu, 15 Oct 2015 20:17:15 +0000 (20:17 +0000)
committerdrh <drh@noemail.net>
Thu, 15 Oct 2015 20:17:15 +0000 (20:17 +0000)
a record without caching.

FossilOrigin-Name: 39ae92f5c63de4b95502f438dc7e9f2669efdf91

manifest
manifest.uuid
src/select.c
src/vdbe.c

index 292c4843e0aa14fa282bc3bc70efc30cd0d292cd..4032a9dd2a27280c66422e0726e48a41140bee26 100644 (file)
--- 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
index fce1857f4dd3f15ec2ddff486c54582d4b2096f8..62bb69c6868726ffc8d9fea82fec733b034caa76 100644 (file)
@@ -1 +1 @@
-871e091df651b2275a672c35ff938bd4b6db0d7f
\ No newline at end of file
+39ae92f5c63de4b95502f438dc7e9f2669efdf91
\ No newline at end of file
index 67e25f0b2952e6f3ae64e76f0387df716728fb36..cf483e793ff018d1f783572fbc5e078d374ab745 100644 (file)
@@ -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; 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: {
@@ -5340,11 +5341,9 @@ int sqlite3Select(
       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);
         }
index 980876c079d2d392c056856e9c09714a12588f62..f50778a0bdba9a05c48efa673e95feb351531596 100644 (file)
@@ -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( 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])
 **