Use a new typedef "tSerial" to determine the datatype for serial-type

value.  It is 32 bits for reasonable SQLITE_MAX_LENGTH but can be
64 bits if necessary.

FossilOrigin-Name: 8435c6f0b1ac3025f5af5da2a0f03898142c506e5981d55a2b633e611dcecb8f
This commit is contained in:
drh committed 2026-10-25 17:38:36 +00:00
1 parent cc3cf98eec
commit 42c9401de2
6 files changed
+32 -22

No files matched your search

+10 -10
View File
@@ -1,5 +1,5 @@
C Reorder\sa\ssequence\spoint\sviolation.\s[bugs:d82d144d71|Bug\sreport\s2026-10-25T16:05:55Z].
D 2026-10-25T16:57:25.443
C Use\sa\snew\stypedef\s"tSerial"\sto\sdetermine\sthe\sdatatype\sfor\sserial-type\nvalue.\s\sIt\sis\s32\sbits\sfor\sreasonable\sSQLITE_MAX_LENGTH\sbut\scan\sbe\n64\sbits\sif\snecessary.
D 2026-10-25T17:38:36.844
F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -807,7 +807,7 @@ F src/shell.c.in 2bb03b9ae703df8672a48a8dfe5d0aeadd9ce40fde018b99ff6b843dc49adf5
F src/sqlite.h.in 648fdc66f52433fc0f6cf9564ac924cde544eca9605bbac36aa22d8c944f11ed
F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479
F src/sqlite3ext.h 5e113c4c0442f2f1b3345d44cbe4b82fad45f2fc0c35f0ed4eef27fb8f1cb394
F src/sqliteInt.h 24452d1042f40a018ce8b52bab6d52802c023e434db0d45ac0d8ff09b151e231
F src/sqliteInt.h a2c1206fd29fa4333feaa74164d6f28544fe33013e74e454d75a1e2ea76d01a5
F src/sqliteLimit.h c433b3fdb5e52f4226bf78d7e8081dff8fd8fbb0ce0cb1a5fee282aaa8976813
F src/status.c 7565d63a79aa2f326339a24a0461a60096d0bd2bce711fefb50b5c89335f3592
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
@@ -869,11 +869,11 @@ F src/upsert.c dd9f0fcccbfb4f20e1026a21a7254ba3f2c08e9cfa92affaff5b5ec3b00ea549
F src/utf.c c5bec56770b71fe75e12f1f7b0a512032e1fd3d1f83c50c4ab4474ced20347a4
F src/util.c 4437408e09cef6dbb63a8b8ba28be53bdc098ec890e5e64ad7ae1fc83448962e
F src/vacuum.c d3d35d8ae893d419ade5fa196d761a83bddcbb62137a1a157ae751ef38b26e82
F src/vdbe.c e8f89a20f1f4511cbe4bfd73e20017ae872cd2444b3c10e05b7d9676c120231a
F src/vdbe.c eee2623edef7280c5808846974d8b041f6e55c2f0e19ad6dadc581fcbe656cc0
F src/vdbe.h b6ffb28da04363fd5d439b8204118fd3f2e751abe4f8e3edb089155fb90d4607
F src/vdbeInt.h 68e5ab63f184f2871780c83ce78b425d0360869611baea4c65575f91f76ac1d3
F src/vdbeInt.h 7cf23f9d265821a715e92d8681c4c3e983643187ced896e8709cb09362f540b1
F src/vdbeapi.c 7faa8eda3d9278ee27c8f2f14dd8d5fda6a0e90a5b91d740812a37455652b498
F src/vdbeaux.c 7e3975222531284ff14cb1be93b5751f6a3392a56d86d6329fcaa120471f56f3
F src/vdbeaux.c c5489043d33a689fe9016b3f99c07b27113ac68e2e1f3ef32c3612a1e96647ef
F src/vdbeblob.c b3f0640db9642fbdc88bd6ebcc83d6009514cafc98f062f675f2c8d505d82692
F src/vdbemem.c 272c5b317fe0a166f28f9bdc46dbd00a9df7e3e8e5e2430e42b8b58815a4d008
F src/vdbesort.c a72ad2a629df2901fde4aa588e38590d0aa27b7d5bc3b2a416e5f295de839cc1
@@ -2289,8 +2289,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
P 033b603cedb4ea246373d4015b4873b8ea1eb523c8f60d9f842cdea25dc97210
R 37f193478fac431e4aa83199e8bc175a
U stephan
Z 28c8d1db215f935d5444e1220ef30761
P 78ad029d8fdcc1f52bb7c761ee7b7b5c02d3dd616b441a76421aed3fa7a91e01
R 281b113f9ae2fd0a09a516e526864638
U drh
Z ec45080b4dbb1c9896dd9d0a1d928d52
# Remove this line to create a well-formed Fossil manifest.
+1 -1
View File
@@ -1 +1 @@
78ad029d8fdcc1f52bb7c761ee7b7b5c02d3dd616b441a76421aed3fa7a91e01
8435c6f0b1ac3025f5af5da2a0f03898142c506e5981d55a2b633e611dcecb8f
+10
View File
@@ -908,6 +908,16 @@ typedef unsigned bft; /* Bit Field Type */
*/
typedef u64 tRowcnt;
/*
** The datatype used to store serial-types. The size depends on the
** maximum length of a string or blob.
*/
#if SQLITE_MAX_LENGTH>=1073741817
typedef u64 tSerial;
#else
typedef u32 tSerial;
#endif
/*
** Estimated quantities used for query planning are stored as 16-bit
** logarithms. For quantity X, the value stored is 10*log2(X). This
+2 -2
View File
@@ -3593,7 +3593,7 @@ case OP_MakeRecord: {
i64 nByte; /* Data space required for this record */
i64 nZero; /* Number of zero bytes at the end of the record */
int nVarint; /* Number of bytes in a varint */
u32 serial_type; /* Type field */
tSerial serial_type; /* Type field */
Mem *pData0; /* First field to be combined into the record */
Mem *pLast; /* Last field of the record */
int nField; /* Number of fields in the record */
@@ -3769,13 +3769,13 @@ case OP_MakeRecord: {
len = (u32)pRec->n;
serial_type = (len*2) + 12 + ((pRec->flags & MEM_Str)!=0);
if( pRec->flags & MEM_Zero ){
serial_type += (u32)pRec->u.nZero*2;
if( nData ){
if( sqlite3VdbeMemExpandBlob(pRec) ) goto no_mem;
len += pRec->u.nZero;
}else{
nZero += pRec->u.nZero;
}
serial_type += (u32)pRec->u.nZero*2;
}
nData += len;
nHdr += sqlite3VarintLen(serial_type);
+3 -3
View File
@@ -245,7 +245,7 @@ struct sqlite3_value {
/* ShallowCopy only needs to copy the information above */
sqlite3 *db; /* The associated database connection */
int szMalloc; /* Size of the zMalloc allocation */
u32 uTemp; /* Transient storage for serial_type in OP_MakeRecord */
tSerial uTemp; /* Transient storage for serial_type in OP_MakeRecord */
char *zMalloc; /* Space to hold MEM_Str or MEM_Blob if szMalloc>0 */
void (*xDel)(void*);/* Destructor for Mem.z - only valid if MEM_Dyn */
#ifdef SQLITE_DEBUG
@@ -610,7 +610,7 @@ void sqliteVdbePopStack(Vdbe*,int);
int SQLITE_NOINLINE sqlite3VdbeHandleMovedCursor(VdbeCursor *p);
int SQLITE_NOINLINE sqlite3VdbeFinishMoveto(VdbeCursor*);
int sqlite3VdbeCursorRestore(VdbeCursor*);
u32 sqlite3VdbeSerialTypeLen(u32);
u32 sqlite3VdbeSerialTypeLen(tSerial);
u8 sqlite3VdbeOneByteSerialTypeLen(u8);
#ifdef SQLITE_MIXED_ENDIAN_64BIT_FLOAT
u64 sqlite3FloatSwap(u64 in);
@@ -618,7 +618,7 @@ u8 sqlite3VdbeOneByteSerialTypeLen(u8);
#else
# define swapMixedEndianFloat(X)
#endif
void sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*);
void sqlite3VdbeSerialGet(const unsigned char*, tSerial, Mem*);
void sqlite3VdbeDeleteAuxData(sqlite3*, AuxData**, int, int);
int sqlite2BtreeKeyCompare(BtCursor *, const void *, int, int, int *);
+6 -6
View File
@@ -4000,7 +4000,7 @@ const u8 sqlite3SmallTypeSizes[128] = {
/*
** Return the length of the data corresponding to the supplied serial-type.
*/
u32 sqlite3VdbeSerialTypeLen(u32 serial_type){
u32 sqlite3VdbeSerialTypeLen(tSerial serial_type){
if( serial_type>=128 ){
return (serial_type-12)/2;
}else{
@@ -4093,7 +4093,7 @@ static int sqlite3VdbeSerialGet7(
*/
void sqlite3VdbeSerialGet(
const unsigned char *buf, /* Buffer to deserialize from */
u32 serial_type, /* Serial type to deserialize */
tSerial serial_type, /* Serial type to deserialize */
Mem *pMem /* Memory cell to write value into */
){
switch( serial_type ){
@@ -4234,7 +4234,7 @@ void sqlite3VdbeRecordUnpack(
d = szHdr;
u = 0;
while( idx<szHdr && d<=(u32)nKey ){
u32 serial_type;
tSerial serial_type;
idx += getVarint32(&aKey[idx], serial_type);
pMem->enc = pKeyInfo->enc;
@@ -4310,7 +4310,7 @@ static int vdbeRecordCompareDebug(
assert( pKeyInfo->nKeyField>0 );
assert( idx1<=szHdr1 || CORRUPT_DB );
do{
u32 serial_type1;
tSerial serial_type1;
/* Read the serial types for the next element in each key. */
idx1 += getVarint32( aKey1+idx1, serial_type1 );
@@ -4651,7 +4651,7 @@ int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const CollSeq *pColl){
** serialized according to serial_type. This function deserializes
** and returns the value.
*/
static i64 vdbeRecordDecodeInt(u32 serial_type, const u8 *aKey){
static i64 vdbeRecordDecodeInt(tSerial serial_type, const u8 *aKey){
u32 y;
assert( CORRUPT_DB || (serial_type>=1 && serial_type<=9 && serial_type!=7) );
switch( serial_type ){
@@ -4756,7 +4756,7 @@ int sqlite3VdbeRecordCompareWithSkip(
assert( pPKey2->pKeyInfo->nKeyField>0 );
assert( idx1<=szHdr1 || CORRUPT_DB );
while( 1 /*exit-by-break*/ ){
u32 serial_type;
tSerial serial_type;
/* RHS is an integer */
if( pRhs->flags & (MEM_Int|MEM_IntReal) ){