1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-12 13:01:09 +03:00

Omit the return value from sqlite3VdbeSerialGet() for a size reduction

and performance improvement.

FossilOrigin-Name: 788e79f881d443fc1b3a213a7ba4f19bfd245e96c15bb21fcb6bffd92c4320b8
This commit is contained in:
drh
2021-12-14 00:36:09 +00:00
parent 7f8f659260
commit 06164b2340
5 changed files with 33 additions and 29 deletions

View File

@@ -1,5 +1,5 @@
C Small\sperformance\soptimization\sand\scode\ssize\sreduction\sin\smoveToRoot(). C Omit\sthe\sreturn\svalue\sfrom\ssqlite3VdbeSerialGet()\sfor\sa\ssize\sreduction\nand\sperformance\simprovement.
D 2021-12-13T19:59:55.504 D 2021-12-14T00:36:09.965
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -581,7 +581,7 @@ F src/test_delete.c e2fe07646dff6300b48d49b2fee2fe192ed389e834dd635e3b3bac0ce0bf
F src/test_demovfs.c 86142ba864d4297d54c5b2e972e74f3141ae4b30f05b3a95824184ed2d3d7f91 F src/test_demovfs.c 86142ba864d4297d54c5b2e972e74f3141ae4b30f05b3a95824184ed2d3d7f91
F src/test_devsym.c aff2255ea290d7718da08af30cdf18e470ff7325a5eff63e0057b1496ed66593 F src/test_devsym.c aff2255ea290d7718da08af30cdf18e470ff7325a5eff63e0057b1496ed66593
F src/test_fs.c ba1e1dc18fd3159fdba0b9c4256f14032159785320dfbd6776eb9973cb75d480 F src/test_fs.c ba1e1dc18fd3159fdba0b9c4256f14032159785320dfbd6776eb9973cb75d480
F src/test_func.c 181f992e5495644434c4f0e3cc72362a78c295eb2cf3ff4d02498b8bde7aa276 F src/test_func.c 24df3a346c012b1fc9e1001d346db6054deb426db0a7437e92490630e71c9b0a
F src/test_hexio.c 9478e56a0f08e07841a014a93b20e4ba2709ab56d039d1ca8020e26846aa19bd F src/test_hexio.c 9478e56a0f08e07841a014a93b20e4ba2709ab56d039d1ca8020e26846aa19bd
F src/test_init.c 4413c211a94b62157ca4c145b3f27c497f03c664 F src/test_init.c 4413c211a94b62157ca4c145b3f27c497f03c664
F src/test_intarray.c 39b4181662a0f33a427748d87218e7578d913e683dc27eab7098bb41617cac71 F src/test_intarray.c 39b4181662a0f33a427748d87218e7578d913e683dc27eab7098bb41617cac71
@@ -625,9 +625,9 @@ F src/util.c 569349b0bddcbfbc661856f446adb92e1b0a47b3cbef548da9fc5aa639d7964c
F src/vacuum.c 6c38ddc52f0619865c91dae9c441d4d48bf3040d7dc1bc5b22da1e45547ed0b3 F src/vacuum.c 6c38ddc52f0619865c91dae9c441d4d48bf3040d7dc1bc5b22da1e45547ed0b3
F src/vdbe.c b63594839cbf770a29e2b3b81570971a3d2c1c995c0586aade09bb548142113a F src/vdbe.c b63594839cbf770a29e2b3b81570971a3d2c1c995c0586aade09bb548142113a
F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe
F src/vdbeInt.h 910985ac2783fe0938b314d811759d53fd25caf215810f62ca1ff068d6d60d7b F src/vdbeInt.h a7f01b0cd0dcb496343eacd37b0839250f9a718199ab6096e3995db42dec3ec8
F src/vdbeapi.c 22c79072ae7d8a01e9bcae8ba16e918d60d202eaa9553b5fda38f99f7464d99a F src/vdbeapi.c 22c79072ae7d8a01e9bcae8ba16e918d60d202eaa9553b5fda38f99f7464d99a
F src/vdbeaux.c 21db442d159fd745a7693d157b5f998260b6af4ca60de559fa3b7b68c7405af2 F src/vdbeaux.c 175f2dad949150abdf0d91d19b2b6db30ff3776af5a84008db4bfe5e12a60180
F src/vdbeblob.c 29c4118f7ee615cdee829e8401f6ead1b96b95d545b4de0042f6de39c962c652 F src/vdbeblob.c 29c4118f7ee615cdee829e8401f6ead1b96b95d545b4de0042f6de39c962c652
F src/vdbemem.c da4d594084d581be6436582bb44bb128feeb138a3e6c313eda6749ebdc3a65ec F src/vdbemem.c da4d594084d581be6436582bb44bb128feeb138a3e6c313eda6749ebdc3a65ec
F src/vdbesort.c 513b481c8bab4a6578c92194a60cf3bc3b48736e4a53f8d2d7918121c5b594e7 F src/vdbesort.c 513b481c8bab4a6578c92194a60cf3bc3b48736e4a53f8d2d7918121c5b594e7
@@ -1934,7 +1934,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P 471070462593faba865d8d05ee89161b340145351e2fa0bfbaa766d974e932d6 P cdcde00b2d68eeb35c472fdfd4c4508551f6722054394b43cc97eaf01ad7181d
R 31496f1551d29819dc300c6e9471d345 R 74fcb3641325f5444e7c25132e4edd61
U drh U drh
Z 3da685334c6fbdb2df60cd96248cd338 Z 1db5e6a6595e0e17160e9f47eedbec36

View File

@@ -1 +1 @@
cdcde00b2d68eeb35c472fdfd4c4508551f6722054394b43cc97eaf01ad7181d 788e79f881d443fc1b3a213a7ba4f19bfd245e96c15bb21fcb6bffd92c4320b8

View File

@@ -499,7 +499,8 @@ static void test_extract(
mem.db = db; mem.db = db;
mem.enc = ENC(db); mem.enc = ENC(db);
pHdr += sqlite3GetVarint(pHdr, &iSerialType); pHdr += sqlite3GetVarint(pHdr, &iSerialType);
pBody += sqlite3VdbeSerialGet(pBody, (u32)iSerialType, &mem); sqlite3VdbeSerialGet(pBody, (u32)iSerialType, &mem);
pBody += sqlite3VdbeSerialTypeLen((u32)iSerialType);
if( iCurrent==iIdx ){ if( iCurrent==iIdx ){
sqlite3_result_value(context, &mem); sqlite3_result_value(context, &mem);
@@ -547,7 +548,8 @@ static void test_decode(
mem.db = db; mem.db = db;
mem.enc = ENC(db); mem.enc = ENC(db);
pHdr += sqlite3GetVarint(pHdr, &iSerialType); pHdr += sqlite3GetVarint(pHdr, &iSerialType);
pBody += sqlite3VdbeSerialGet(pBody, (u32)iSerialType, &mem); sqlite3VdbeSerialGet(pBody, (u32)iSerialType, &mem);
pBody += sqlite3VdbeSerialTypeLen((u32)iSerialType);
switch( sqlite3_value_type(&mem) ){ switch( sqlite3_value_type(&mem) ){
case SQLITE_TEXT: case SQLITE_TEXT:

View File

@@ -492,7 +492,7 @@ int sqlite3VdbeCursorRestore(VdbeCursor*);
u32 sqlite3VdbeSerialTypeLen(u32); u32 sqlite3VdbeSerialTypeLen(u32);
u8 sqlite3VdbeOneByteSerialTypeLen(u8); u8 sqlite3VdbeOneByteSerialTypeLen(u8);
u32 sqlite3VdbeSerialPut(unsigned char*, Mem*, u32); u32 sqlite3VdbeSerialPut(unsigned char*, Mem*, u32);
u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*); void sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*);
void sqlite3VdbeDeleteAuxData(sqlite3*, AuxData**, int, int); void sqlite3VdbeDeleteAuxData(sqlite3*, AuxData**, int, int);
int sqlite2BtreeKeyCompare(BtCursor *, const void *, int, int, int *); int sqlite2BtreeKeyCompare(BtCursor *, const void *, int, int, int *);

View File

@@ -3851,14 +3851,14 @@ u32 sqlite3VdbeSerialPut(u8 *buf, Mem *pMem, u32 serial_type){
/* /*
** Deserialize the data blob pointed to by buf as serial type serial_type ** Deserialize the data blob pointed to by buf as serial type serial_type
** and store the result in pMem. Return the number of bytes read. ** and store the result in pMem.
** **
** This function is implemented as two separate routines for performance. ** This function is implemented as two separate routines for performance.
** The few cases that require local variables are broken out into a separate ** The few cases that require local variables are broken out into a separate
** routine so that in most cases the overhead of moving the stack pointer ** routine so that in most cases the overhead of moving the stack pointer
** is avoided. ** is avoided.
*/ */
static u32 serialGet( static void serialGet(
const unsigned char *buf, /* Buffer to deserialize from */ const unsigned char *buf, /* Buffer to deserialize from */
u32 serial_type, /* Serial type to deserialize */ u32 serial_type, /* Serial type to deserialize */
Mem *pMem /* Memory cell to write value into */ Mem *pMem /* Memory cell to write value into */
@@ -3892,9 +3892,8 @@ static u32 serialGet(
memcpy(&pMem->u.r, &x, sizeof(x)); memcpy(&pMem->u.r, &x, sizeof(x));
pMem->flags = IsNaN(x) ? MEM_Null : MEM_Real; pMem->flags = IsNaN(x) ? MEM_Null : MEM_Real;
} }
return 8;
} }
u32 sqlite3VdbeSerialGet( void sqlite3VdbeSerialGet(
const unsigned char *buf, /* Buffer to deserialize from */ const unsigned char *buf, /* Buffer to deserialize from */
u32 serial_type, /* Serial type to deserialize */ u32 serial_type, /* Serial type to deserialize */
Mem *pMem /* Memory cell to write value into */ Mem *pMem /* Memory cell to write value into */
@@ -3905,13 +3904,13 @@ u32 sqlite3VdbeSerialGet(
pMem->flags = MEM_Null|MEM_Zero; pMem->flags = MEM_Null|MEM_Zero;
pMem->n = 0; pMem->n = 0;
pMem->u.nZero = 0; pMem->u.nZero = 0;
break; return;
} }
case 11: /* Reserved for future use */ case 11: /* Reserved for future use */
case 0: { /* Null */ case 0: { /* Null */
/* EVIDENCE-OF: R-24078-09375 Value is a NULL. */ /* EVIDENCE-OF: R-24078-09375 Value is a NULL. */
pMem->flags = MEM_Null; pMem->flags = MEM_Null;
break; return;
} }
case 1: { case 1: {
/* EVIDENCE-OF: R-44885-25196 Value is an 8-bit twos-complement /* EVIDENCE-OF: R-44885-25196 Value is an 8-bit twos-complement
@@ -3919,7 +3918,7 @@ u32 sqlite3VdbeSerialGet(
pMem->u.i = ONE_BYTE_INT(buf); pMem->u.i = ONE_BYTE_INT(buf);
pMem->flags = MEM_Int; pMem->flags = MEM_Int;
testcase( pMem->u.i<0 ); testcase( pMem->u.i<0 );
return 1; return;
} }
case 2: { /* 2-byte signed integer */ case 2: { /* 2-byte signed integer */
/* EVIDENCE-OF: R-49794-35026 Value is a big-endian 16-bit /* EVIDENCE-OF: R-49794-35026 Value is a big-endian 16-bit
@@ -3927,7 +3926,7 @@ u32 sqlite3VdbeSerialGet(
pMem->u.i = TWO_BYTE_INT(buf); pMem->u.i = TWO_BYTE_INT(buf);
pMem->flags = MEM_Int; pMem->flags = MEM_Int;
testcase( pMem->u.i<0 ); testcase( pMem->u.i<0 );
return 2; return;
} }
case 3: { /* 3-byte signed integer */ case 3: { /* 3-byte signed integer */
/* EVIDENCE-OF: R-37839-54301 Value is a big-endian 24-bit /* EVIDENCE-OF: R-37839-54301 Value is a big-endian 24-bit
@@ -3935,7 +3934,7 @@ u32 sqlite3VdbeSerialGet(
pMem->u.i = THREE_BYTE_INT(buf); pMem->u.i = THREE_BYTE_INT(buf);
pMem->flags = MEM_Int; pMem->flags = MEM_Int;
testcase( pMem->u.i<0 ); testcase( pMem->u.i<0 );
return 3; return;
} }
case 4: { /* 4-byte signed integer */ case 4: { /* 4-byte signed integer */
/* EVIDENCE-OF: R-01849-26079 Value is a big-endian 32-bit /* EVIDENCE-OF: R-01849-26079 Value is a big-endian 32-bit
@@ -3947,7 +3946,7 @@ u32 sqlite3VdbeSerialGet(
#endif #endif
pMem->flags = MEM_Int; pMem->flags = MEM_Int;
testcase( pMem->u.i<0 ); testcase( pMem->u.i<0 );
return 4; return;
} }
case 5: { /* 6-byte signed integer */ case 5: { /* 6-byte signed integer */
/* EVIDENCE-OF: R-50385-09674 Value is a big-endian 48-bit /* EVIDENCE-OF: R-50385-09674 Value is a big-endian 48-bit
@@ -3955,13 +3954,14 @@ u32 sqlite3VdbeSerialGet(
pMem->u.i = FOUR_BYTE_UINT(buf+2) + (((i64)1)<<32)*TWO_BYTE_INT(buf); pMem->u.i = FOUR_BYTE_UINT(buf+2) + (((i64)1)<<32)*TWO_BYTE_INT(buf);
pMem->flags = MEM_Int; pMem->flags = MEM_Int;
testcase( pMem->u.i<0 ); testcase( pMem->u.i<0 );
return 6; return;
} }
case 6: /* 8-byte signed integer */ case 6: /* 8-byte signed integer */
case 7: { /* IEEE floating point */ case 7: { /* IEEE floating point */
/* These use local variables, so do them in a separate routine /* These use local variables, so do them in a separate routine
** to avoid having to move the frame pointer in the common case */ ** to avoid having to move the frame pointer in the common case */
return serialGet(buf,serial_type,pMem); serialGet(buf,serial_type,pMem);
return;
} }
case 8: /* Integer 0 */ case 8: /* Integer 0 */
case 9: { /* Integer 1 */ case 9: { /* Integer 1 */
@@ -3969,7 +3969,7 @@ u32 sqlite3VdbeSerialGet(
/* EVIDENCE-OF: R-18143-12121 Value is the integer 1. */ /* EVIDENCE-OF: R-18143-12121 Value is the integer 1. */
pMem->u.i = serial_type-8; pMem->u.i = serial_type-8;
pMem->flags = MEM_Int; pMem->flags = MEM_Int;
return 0; return;
} }
default: { default: {
/* EVIDENCE-OF: R-14606-31564 Value is a BLOB that is (N-12)/2 bytes in /* EVIDENCE-OF: R-14606-31564 Value is a BLOB that is (N-12)/2 bytes in
@@ -3980,10 +3980,10 @@ u32 sqlite3VdbeSerialGet(
pMem->z = (char *)buf; pMem->z = (char *)buf;
pMem->n = (serial_type-12)/2; pMem->n = (serial_type-12)/2;
pMem->flags = aFlag[serial_type&1]; pMem->flags = aFlag[serial_type&1];
return pMem->n; return;
} }
} }
return 0; return;
} }
/* /*
** This routine is used to allocate sufficient space for an UnpackedRecord ** This routine is used to allocate sufficient space for an UnpackedRecord
@@ -4046,7 +4046,8 @@ void sqlite3VdbeRecordUnpack(
/* pMem->flags = 0; // sqlite3VdbeSerialGet() will set this for us */ /* pMem->flags = 0; // sqlite3VdbeSerialGet() will set this for us */
pMem->szMalloc = 0; pMem->szMalloc = 0;
pMem->z = 0; pMem->z = 0;
d += sqlite3VdbeSerialGet(&aKey[d], serial_type, pMem); sqlite3VdbeSerialGet(&aKey[d], serial_type, pMem);
d += sqlite3VdbeSerialTypeLen(serial_type);
pMem++; pMem++;
if( (++u)>=p->nField ) break; if( (++u)>=p->nField ) break;
} }
@@ -4130,7 +4131,8 @@ static int vdbeRecordCompareDebug(
/* Extract the values to be compared. /* Extract the values to be compared.
*/ */
d1 += sqlite3VdbeSerialGet(&aKey1[d1], serial_type1, &mem1); sqlite3VdbeSerialGet(&aKey1[d1], serial_type1, &mem1);
d1 += sqlite3VdbeSerialTypeLen(serial_type1);
/* Do the comparison /* Do the comparison
*/ */