]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Performance optimization for the OP_Column opcode.
authordrh <drh@noemail.net>
Thu, 15 Oct 2015 21:30:24 +0000 (21:30 +0000)
committerdrh <drh@noemail.net>
Thu, 15 Oct 2015 21:30:24 +0000 (21:30 +0000)
FossilOrigin-Name: 076be5474df628bbbfd2b645adba30e1e093acd0

manifest
manifest.uuid
src/vdbe.c

index 292c4843e0aa14fa282bc3bc70efc30cd0d292cd..5cd21de928024c68a1f932862584ec0a79d639bd 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 Performance\soptimization\sfor\sthe\sOP_Column\sopcode.
+D 2015-10-15T21:30:24.579
 F Makefile.in 2ea961bc09e441874eb3d1bf7398e04feb24f3ee
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc 8e42cb55739cd8c12e1fd25401956e2019448f6a
@@ -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 c33faa487c474d41a082979206896988448c9df9
 F src/vdbe.h 4bc88bd0e06f8046ee6ab7487c0015e85ad949ad
 F src/vdbeInt.h 8b867eac234e28627ffcace3cd4b4b79bbec664b
 F src/vdbeapi.c 020681b943e77766b32ae1cddf86d7831b7374ca
@@ -1391,7 +1391,7 @@ 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 2a9ee0eee7d0527a150149dc10bab0fb
 U drh
-Z fcd4e595e3a40ac192e62fadc88a95a3
+Z 586c37c7b737d31273c8670597b9862e
index fce1857f4dd3f15ec2ddff486c54582d4b2096f8..5e41d31178bd81a8f1dd99573437619dfd570076 100644 (file)
@@ -1 +1 @@
-871e091df651b2275a672c35ff938bd4b6db0d7f
\ No newline at end of file
+076be5474df628bbbfd2b645adba30e1e093acd0
\ No newline at end of file
index 980876c079d2d392c056856e9c09714a12588f62..526d5c24edcaa351606115db51e9872ce9fbbfde 100644 (file)
@@ -2368,6 +2368,7 @@ case OP_Column: {
   const u8 *zHdr;    /* Next unparsed byte of the header */
   const u8 *zEndHdr; /* Pointer to first byte after the header */
   u32 offset;        /* Offset into the data */
+  u64 offset64;      /* 64-bit offset */
   u32 szField;       /* Number of bytes in the content of a field */
   u32 avail;         /* Number of bytes of available data */
   u32 t;             /* A type code from the record header */
@@ -2494,7 +2495,7 @@ case OP_Column: {
   
       /* Fill in pC->aType[i] and aOffset[i] values through the p2-th field. */
       i = pC->nHdrParsed;
-      offset = aOffset[i];
+      offset64 = aOffset[i];
       zHdr = zData + pC->iHdrOffset;
       zEndHdr = zData + aOffset[0];
       assert( i<=p2 && zHdr<zEndHdr );
@@ -2507,13 +2508,9 @@ case OP_Column: {
         }
         pC->aType[i] = t;
         szField = sqlite3VdbeSerialTypeLen(t);
-        offset += szField;
-        if( offset<szField ){  /* True if offset overflows */
-          zHdr = &zEndHdr[1];  /* Forces SQLITE_CORRUPT return below */
-          break;
-        }
+        offset64 += szField;
         i++;
-        aOffset[i] = offset;
+        aOffset[i] = (u32)(offset64 & 0xffffffff);
       }while( i<=p2 && zHdr<zEndHdr );
       pC->nHdrParsed = i;
       pC->iHdrOffset = (u32)(zHdr - zData);
@@ -2526,12 +2523,12 @@ case OP_Column: {
       ** (1) the bytes of the header extend past the declared header size
       **          (zHdr>zEndHdr)
       ** (2) the entire header was used but not all data was used
-      **          (zHdr==zEndHdr && offset!=pC->payloadSize)
+      **          (zHdr==zEndHdr && offset64!=pC->payloadSize)
       ** (3) the end of the data extends beyond the end of the record.
-      **          (offset > pC->payloadSize)
+      **          (offset64 > pC->payloadSize)
       */
-      if( (zHdr>=zEndHdr && (zHdr>zEndHdr || offset!=pC->payloadSize))
-       || (offset > pC->payloadSize)
+      if( (zHdr>=zEndHdr && (zHdr>zEndHdr || offset64!=pC->payloadSize))
+       || (offset64 > pC->payloadSize)
       ){
         rc = SQLITE_CORRUPT_BKPT;
         goto op_column_error;