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
This commit is contained in:
parent
faf3727904
commit
be37c12423
18
manifest
18
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
|
||||
|
@ -1 +1 @@
|
||||
3395724814099d28829ef6875ca1ba77d6fe7ffa
|
||||
2ad72be12477b0e8e33e56a9a17e29abbd283ec1
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user