mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-14 00:22:38 +03:00
Add serial-types 8 and 9 for integer constants of 0 and 1 that use zero
bytes of storage. Make the default file format 4. Add the SQLITE_DEFAULT_FILE_FORMAT compile-time option to lower the default file format number so that newly created databases can be read and written by older versions of SQLite. (CVS 2845) FossilOrigin-Name: ae301db8a61a74bc72f67f5766811d89a3b3ec72
This commit is contained in:
@@ -782,6 +782,7 @@ void sqlite3VdbeMakeReady(
|
||||
p->explain |= isExplain;
|
||||
p->magic = VDBE_MAGIC_RUN;
|
||||
p->nChange = 0;
|
||||
p->minWriteFileFormat = 255;
|
||||
#ifdef VDBE_PROFILE
|
||||
{
|
||||
int i;
|
||||
@@ -1490,7 +1491,9 @@ int sqlite3VdbeCursorMoveto(Cursor *p){
|
||||
** 5 6 signed integer
|
||||
** 6 8 signed integer
|
||||
** 7 8 IEEE float
|
||||
** 8-11 reserved for expansion
|
||||
** 8 0 Integer constant 0
|
||||
** 9 0 Integer constant 1
|
||||
** 10,11 reserved for expansion
|
||||
** N>=12 and even (N-12)/2 BLOB
|
||||
** N>=13 and odd (N-13)/2 text
|
||||
**
|
||||
@@ -1499,7 +1502,7 @@ int sqlite3VdbeCursorMoveto(Cursor *p){
|
||||
/*
|
||||
** Return the serial-type for the value stored in pMem.
|
||||
*/
|
||||
u32 sqlite3VdbeSerialType(Mem *pMem){
|
||||
u32 sqlite3VdbeSerialType(Mem *pMem, int file_format){
|
||||
int flags = pMem->flags;
|
||||
|
||||
if( flags&MEM_Null ){
|
||||
@@ -1509,7 +1512,11 @@ u32 sqlite3VdbeSerialType(Mem *pMem){
|
||||
/* Figure out whether to use 1, 2, 4, 6 or 8 bytes. */
|
||||
# define MAX_6BYTE ((((i64)0x00001000)<<32)-1)
|
||||
i64 i = pMem->i;
|
||||
u64 u = i<0 ? -i : i;
|
||||
u64 u;
|
||||
if( file_format>=4 && (i&1)==i ){
|
||||
return 8+i;
|
||||
}
|
||||
u = i<0 ? -i : i;
|
||||
if( u<=127 ) return 1;
|
||||
if( u<=32767 ) return 2;
|
||||
if( u<=8388607 ) return 3;
|
||||
@@ -1548,17 +1555,12 @@ int sqlite3VdbeSerialTypeLen(u32 serial_type){
|
||||
** buf. It is assumed that the caller has allocated sufficient space.
|
||||
** Return the number of bytes written.
|
||||
*/
|
||||
int sqlite3VdbeSerialPut(unsigned char *buf, Mem *pMem){
|
||||
u32 serial_type = sqlite3VdbeSerialType(pMem);
|
||||
int sqlite3VdbeSerialPut(unsigned char *buf, Mem *pMem, int file_format){
|
||||
u32 serial_type = sqlite3VdbeSerialType(pMem, file_format);
|
||||
int len;
|
||||
|
||||
/* NULL */
|
||||
if( serial_type==0 ){
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Integer and Real */
|
||||
if( serial_type<=7 ){
|
||||
if( serial_type<=7 && serial_type>0 ){
|
||||
u64 v;
|
||||
int i;
|
||||
if( serial_type==7 ){
|
||||
@@ -1573,12 +1575,16 @@ int sqlite3VdbeSerialPut(unsigned char *buf, Mem *pMem){
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
|
||||
/* String or blob */
|
||||
assert( serial_type>=12 );
|
||||
len = sqlite3VdbeSerialTypeLen(serial_type);
|
||||
memcpy(buf, pMem->z, len);
|
||||
return len;
|
||||
if( serial_type>=12 ){
|
||||
len = sqlite3VdbeSerialTypeLen(serial_type);
|
||||
memcpy(buf, pMem->z, len);
|
||||
return len;
|
||||
}
|
||||
|
||||
/* NULL or constants 0 or 1 */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1591,8 +1597,6 @@ int sqlite3VdbeSerialGet(
|
||||
Mem *pMem /* Memory cell to write value into */
|
||||
){
|
||||
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 */
|
||||
@@ -1651,6 +1655,12 @@ int sqlite3VdbeSerialGet(
|
||||
}
|
||||
return 8;
|
||||
}
|
||||
case 8: /* Integer 0 */
|
||||
case 9: { /* Integer 1 */
|
||||
pMem->i = serial_type-8;
|
||||
pMem->flags = MEM_Int;
|
||||
return 0;
|
||||
}
|
||||
default: {
|
||||
int len = (serial_type-12)/2;
|
||||
pMem->z = (char *)buf;
|
||||
|
||||
Reference in New Issue
Block a user