-C More\sstructure\srearrangements\sfor\sadditional\ssize\sreductions.\s\sTicket\s#1253.\s(CVS\s2468)
-D 2005-05-21T02:48:09
+C Speed\simprovements\sas\sdescribed\sby\stickets\s#1257\sand\s#1258.\s\sThese\schanges\nhelp\ssome\sbut\sare\snowhere\snear\sthe\s23%\sclaimed\sin\sthe\stickets.\s(CVS\s2469)
+D 2005-05-21T18:32:19
F Makefile.in 5c00d0037104de2a50ac7647a5f12769795957a3
F Makefile.linux-gcc 06be33b2a9ad4f005a5f42b22c4a19dab3cbb5c7
F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
F src/vdbe.h 75e466d84d362b0c4498978a9d6b1e6bd32ecf3b
F src/vdbeInt.h 4afaae2f4adcab54ad2a40dabb2e689fba7b1561
F src/vdbeapi.c c66b88fce58f72eee44ec8c348a2561e031d2417
-F src/vdbeaux.c 77dc2e0f8e846269c51342134f3c9720f51707e6
+F src/vdbeaux.c 78704946502cac6ebf6805ccc9239e4ff0e56fe7
F src/vdbemem.c 4e853ce3151eaf7906150da85a1b3ce1fe5e8da8
F src/where.c f02baff03e2a9ed7bdc36b363b8e4024a94de919
F tclinstaller.tcl 046e3624671962dc50f0481d7c25b38ef803eb42
F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
F www/version3.tcl a99cf5f6d8bd4d5537584a2b342f0fb9fa601d8b
F www/whentouse.tcl 528299b8316726dbcc5548e9aa0648c8b1bd055b
-P 27025613bc2970b0c23e08fbe5251103794ab6cb
-R 117e33923c7b5da1df58206a9a2755b5
+P 6b6e525b294a5bbf8a5e56a2f60aa096865aedbd
+R 042677df90186a621c94e43c5acba4cf
U drh
-Z e67191b0113ddab8b656fe220932b386
+Z 324f7899fb27d4525e3b990fa6bc19dc
u32 serial_type, /* Serial type to deserialize */
Mem *pMem /* Memory cell to write value into */
){
- int len;
-
- if( serial_type==0 ){
- /* NULL */
- pMem->flags = MEM_Null;
- return 0;
- }
- len = sqlite3VdbeSerialTypeLen(serial_type);
- if( serial_type<=7 ){
- /* Integer and Real */
- if( serial_type<=4 ){
- /* 32-bit integer type. This is handled by a special case for
- ** performance reasons. */
- int v = buf[0];
- int n;
- if( v&0x80 ){
- v |= -256;
- }
- for(n=1; n<len; n++){
- v = (v<<8) | buf[n];
- }
+ switch( serial_type ){
+ case 8: /* Reserved for future use */
+ case 9: /* Reserved for future use */
+ case 10: /* Reserved for future use */
+ case 11: /* Reserved for future use */
+ case 0: { /* NULL */
+ pMem->flags = MEM_Null;
+ break;
+ }
+ case 1: { /* 1-byte signed integer */
+ pMem->i = (signed char)buf[0];
pMem->flags = MEM_Int;
- pMem->i = v;
- return n;
- }else{
- u64 v = 0;
- int n;
-
- if( buf[0]&0x80 ){
- v = -1;
- }
- for(n=0; n<len; n++){
- v = (v<<8) | buf[n];
- }
- if( serial_type==7 ){
- pMem->flags = MEM_Real;
- pMem->r = *(double*)&v;
- }else{
+ return 1;
+ }
+ case 2: { /* 2-byte signed integer */
+ pMem->i = (((signed char)buf[0])<<8) | buf[1];
+ pMem->flags = MEM_Int;
+ return 2;
+ }
+ case 3: { /* 3-byte signed integer */
+ pMem->i = (((signed char)buf[0])<<16) | (buf[1]<<8) | buf[2];
+ pMem->flags = MEM_Int;
+ return 3;
+ }
+ case 4: { /* 4-byte signed integer */
+ pMem->i = (buf[0]<<24) | (buf[1]<<16) | (buf[2]<<8) | buf[3];
+ pMem->flags = MEM_Int;
+ return 4;
+ }
+ case 5: { /* 6-byte signed integer */
+ u64 x = (((signed char)buf[0])<<8) | buf[1];
+ u32 y = (buf[2]<<24) | (buf[3]<<16) | (buf[4]<<8) | buf[5];
+ x = (x<<32) | y;
+ pMem->i = *(i64*)&x;
+ pMem->flags = MEM_Int;
+ return 6;
+ }
+ case 6: /* 6-byte signed integer */
+ case 7: { /* IEEE floating point */
+ u64 x = (buf[0]<<24) | (buf[1]<<16) | (buf[2]<<8) | buf[3];
+ u32 y = (buf[4]<<24) | (buf[5]<<16) | (buf[6]<<8) | buf[7];
+ x = (x<<32) | y;
+ if( serial_type==6 ){
+ pMem->i = *(i64*)&x;
pMem->flags = MEM_Int;
- pMem->i = *(i64*)&v;
+ }else{
+ pMem->r = *(double*)&x;
+ pMem->flags = MEM_Real;
}
+ return 8;
}
- }else{
- /* String or blob */
- assert( serial_type>=12 );
- pMem->z = (char *)buf;
- pMem->n = len;
- pMem->xDel = 0;
- if( serial_type&0x01 ){
- pMem->flags = MEM_Str | MEM_Ephem;
- }else{
- pMem->flags = MEM_Blob | MEM_Ephem;
+ default: {
+ int len = (serial_type-12)/2;
+ pMem->z = (char *)buf;
+ pMem->n = len;
+ pMem->xDel = 0;
+ if( serial_type&0x01 ){
+ pMem->flags = MEM_Str | MEM_Ephem;
+ }else{
+ pMem->flags = MEM_Blob | MEM_Ephem;
+ }
+ return len;
}
}
- return len;
+ return 0;
}
/*
d2 += sqlite3VdbeSerialGet(&aKey2[d2], serial_type2, &mem2);
rc = sqlite3MemCompare(&mem1, &mem2, i<nField ? pKeyInfo->aColl[i] : 0);
- sqlite3VdbeMemRelease(&mem1);
- sqlite3VdbeMemRelease(&mem2);
+ if( mem1.flags & MEM_Dyn ) sqlite3VdbeMemRelease(&mem1);
+ if( mem2.flags & MEM_Dyn ) sqlite3VdbeMemRelease(&mem2);
if( rc!=0 ){
break;
}