]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Have the sqlite3VdbeSerialType() function go ahead and compute the serial
authordrh <drh@noemail.net>
Fri, 16 Oct 2015 14:54:17 +0000 (14:54 +0000)
committerdrh <drh@noemail.net>
Fri, 16 Oct 2015 14:54:17 +0000 (14:54 +0000)
length as well, since it is always needed.  This avoids unnecessary calls
to sqlite3VdbeSerialTypeLen().

FossilOrigin-Name: 2ad72be12477b0e8e33e56a9a17e29abbd283ec1

manifest
manifest.uuid
src/vdbe.c
src/vdbeInt.h
src/vdbeaux.c
src/vdbemem.c

index 983c0f925029e1838b8fb14a116e048832842227..66b57bc4d938de0a4fff0d7f4e080e4fc828fa26 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Use\sa\slookup\stable\sto\scompute\sthe\scontent\slength\sfor\sserial\stypes\sless\nthan\s128,\sfor\sa\s1.2%\sperformance\simprovement.
-D 2015-10-16T14:23:42.654
+C Have\sthe\ssqlite3VdbeSerialType()\sfunction\sgo\sahead\sand\scompute\sthe\sserial\nlength\sas\swell,\ssince\sit\sis\salways\sneeded.\s\sThis\savoids\sunnecessary\scalls\nto\ssqlite3VdbeSerialTypeLen().
+D 2015-10-16T14:54:17.927
 F Makefile.in 2ea961bc09e441874eb3d1bf7398e04feb24f3ee
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc 8e42cb55739cd8c12e1fd25401956e2019448f6a
@@ -401,13 +401,13 @@ F src/update.c aa10336a2719bd1b9f89004f3d7ba6d566623a49
 F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c
 F src/util.c fc612367108b74573c5fd13a85d0a23027f438bd
 F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701
-F src/vdbe.c f84d2241bfe4f3a8f1a335055f2591552df7c0e0
+F src/vdbe.c e9315575bed64f9aa559151283c873be34143914
 F src/vdbe.h 4bc88bd0e06f8046ee6ab7487c0015e85ad949ad
-F src/vdbeInt.h 5f813a198e825a219c192a624c92f8e7920a6367
+F src/vdbeInt.h 777dd76d513347acb1a71d94df2be00516add637
 F src/vdbeapi.c 020681b943e77766b32ae1cddf86d7831b7374ca
-F src/vdbeaux.c 0ba112687ba2f18cbf35c48133995754a49d0cba
+F src/vdbeaux.c 906bc74ea90707b57a23e4264727fff7b48d0cb5
 F src/vdbeblob.c 565fabd302f5fca3bdf3d56cac330483616a39b6
-F src/vdbemem.c 19b3036aa4d676e7103b0fb5efd6327da455f915
+F src/vdbemem.c fdd1578e47bea61390d472de53c565781d81e045
 F src/vdbesort.c 8b23930a1289526f6d2a3a9f2e965bcc963e4a68
 F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0
 F src/vtab.c 2a8b44aa372c33f6154208e7a7f6c44254549806
@@ -1391,7 +1391,7 @@ F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 0114b45dc286c13db0d640f0486d8a5bef9ff078
-R 12cf1fe7ed1387197e4a847f05d985b3
+P 3395724814099d28829ef6875ca1ba77d6fe7ffa
+R 767d7196e367cc10f7f9af30c014d525
 U drh
-Z b6119956bfc0b990e5772b0f41137f49
+Z 020679225d045a894f4da1312f5e1b2a
index 7bf4a17e7566ea9442a2eae19a0a6da5211be024..0f716e2e0ccfe7a640438d8477cc54d517482cdf 100644 (file)
@@ -1 +1 @@
-3395724814099d28829ef6875ca1ba77d6fe7ffa
\ No newline at end of file
+2ad72be12477b0e8e33e56a9a17e29abbd283ec1
\ No newline at end of file
index 35a152c72a8702d693eafb97ce9e5ca826005d31..b93ab160f6556d1edd0195eb7eccad68b48be6a3 100644 (file)
@@ -2660,7 +2660,7 @@ case OP_MakeRecord: {
   int file_format;       /* File format to use for encoding */
   int i;                 /* Space used in zNewRecord[] header */
   int j;                 /* Space used in zNewRecord[] content */
-  int len;               /* Length of a field */
+  u32 len;               /* Length of a field */
 
   /* Assuming the record contains N fields, the record format looks
   ** like this:
@@ -2710,8 +2710,7 @@ case OP_MakeRecord: {
   pRec = pLast;
   do{
     assert( memIsValid(pRec) );
-    pRec->uTemp = serial_type = sqlite3VdbeSerialType(pRec, file_format);
-    len = sqlite3VdbeSerialTypeLen(serial_type);
+    pRec->uTemp = serial_type = sqlite3VdbeSerialType(pRec, file_format, &len);
     if( pRec->flags & MEM_Zero ){
       if( nData ){
         if( sqlite3VdbeMemExpandBlob(pRec) ) goto no_mem;
index fe1ea5ced355e6d632c92a6ee483b1a91cfca8ef..e92239f5121ae473f3f0e3a0175025d03c541f56 100644 (file)
@@ -413,7 +413,7 @@ void sqlite3VdbePrintOp(FILE*, int, Op*);
 #endif
 u32 sqlite3VdbeSerialTypeLen(u32);
 u8 sqlite3VdbeOneByteSerialTypeLen(u8);
-u32 sqlite3VdbeSerialType(Mem*, int);
+u32 sqlite3VdbeSerialType(Mem*, int, u32*);
 u32 sqlite3VdbeSerialPut(unsigned char*, Mem*, u32);
 u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*);
 void sqlite3VdbeDeleteAuxData(Vdbe*, int, int);
index 1223d82742dc09e94dabe919d9d22953baa31434..3208fb6cf154d43c4e114043b26896b9cdbc6abc 100644 (file)
@@ -2940,11 +2940,13 @@ int sqlite3VdbeCursorMoveto(VdbeCursor *p){
 /*
 ** Return the serial-type for the value stored in pMem.
 */
-u32 sqlite3VdbeSerialType(Mem *pMem, int file_format){
+u32 sqlite3VdbeSerialType(Mem *pMem, int file_format, u32 *pLen){
   int flags = pMem->flags;
   u32 n;
 
+  assert( pLen!=0 );
   if( flags&MEM_Null ){
+    *pLen = 0;
     return 0;
   }
   if( flags&MEM_Int ){
@@ -2958,15 +2960,23 @@ u32 sqlite3VdbeSerialType(Mem *pMem, int file_format){
       u = i;
     }
     if( u<=127 ){
-      return ((i&1)==i && file_format>=4) ? 8+(u32)u : 1;
+      if( (i&1)==i && file_format>=4 ){
+        *pLen = 0;
+        return 8+(u32)u;
+      }else{
+        *pLen = 1;
+        return 1;
+      }
     }
-    if( u<=32767 ) return 2;
-    if( u<=8388607 ) return 3;
-    if( u<=2147483647 ) return 4;
-    if( u<=MAX_6BYTE ) return 5;
+    if( u<=32767 ){ *pLen = 2; return 2; }
+    if( u<=8388607 ){ *pLen = 3; return 3; }
+    if( u<=2147483647 ){ *pLen = 4; return 4; }
+    if( u<=MAX_6BYTE ){ *pLen = 6; return 5; }
+    *pLen = 8;
     return 6;
   }
   if( flags&MEM_Real ){
+    *pLen = 8;
     return 7;
   }
   assert( pMem->db->mallocFailed || flags&(MEM_Str|MEM_Blob) );
@@ -2975,6 +2985,7 @@ u32 sqlite3VdbeSerialType(Mem *pMem, int file_format){
   if( flags & MEM_Zero ){
     n += pMem->u.nZero;
   }
+  *pLen = n;
   return ((n*2) + 12 + ((flags&MEM_Str)!=0));
 }
 
index 28dd5d957210044dfe5d0286530ad128710e8abd..fae69b18a4f1810092a436c44fa19b8b31ad3e6a 100644 (file)
@@ -1427,17 +1427,16 @@ static void recordFunc(
   sqlite3_value **argv
 ){
   const int file_format = 1;
-  int iSerial;                    /* Serial type */
+  u32 iSerial;                    /* Serial type */
   int nSerial;                    /* Bytes of space for iSerial as varint */
-  int nVal;                       /* Bytes of space required for argv[0] */
+  u32 nVal;                       /* Bytes of space required for argv[0] */
   int nRet;
   sqlite3 *db;
   u8 *aRet;
 
   UNUSED_PARAMETER( argc );
-  iSerial = sqlite3VdbeSerialType(argv[0], file_format);
+  iSerial = sqlite3VdbeSerialType(argv[0], file_format, &nVal);
   nSerial = sqlite3VarintLen(iSerial);
-  nVal = sqlite3VdbeSerialTypeLen(iSerial);
   db = sqlite3_context_db_handle(context);
 
   nRet = 1 + nSerial + nVal;