From: drh Date: Fri, 16 Oct 2015 14:54:17 +0000 (+0000) Subject: Have the sqlite3VdbeSerialType() function go ahead and compute the serial X-Git-Tag: version-3.10.0~220 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=be37c12423417ea69bcf507908554667e9f750a0;p=thirdparty%2Fsqlite.git Have the sqlite3VdbeSerialType() function go ahead and compute the serial length as well, since it is always needed. This avoids unnecessary calls to sqlite3VdbeSerialTypeLen(). FossilOrigin-Name: 2ad72be12477b0e8e33e56a9a17e29abbd283ec1 --- diff --git a/manifest b/manifest index 983c0f9250..66b57bc4d9 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index 7bf4a17e75..0f716e2e0c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3395724814099d28829ef6875ca1ba77d6fe7ffa \ No newline at end of file +2ad72be12477b0e8e33e56a9a17e29abbd283ec1 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 35a152c72a..b93ab160f6 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -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; diff --git a/src/vdbeInt.h b/src/vdbeInt.h index fe1ea5ced3..e92239f512 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -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); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 1223d82742..3208fb6cf1 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -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)); } diff --git a/src/vdbemem.c b/src/vdbemem.c index 28dd5d9572..fae69b18a4 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -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;