From 42c9401de2a2aadce07679dc75d7116632ced132 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 25 Oct 2026 17:38:36 +0000 Subject: [PATCH] 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 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/sqliteInt.h | 10 ++++++++++ src/vdbe.c | 4 ++-- src/vdbeInt.h | 6 +++--- src/vdbeaux.c | 12 ++++++------ 6 files changed, 32 insertions(+), 22 deletions(-) diff --git a/manifest b/manifest index eb90be02a2..fa4f2692d6 100644 --- a/manifest +++ b/manifest @@ -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. diff --git a/manifest.uuid b/manifest.uuid index 47c5f27aa4..e09455a5a5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -78ad029d8fdcc1f52bb7c761ee7b7b5c02d3dd616b441a76421aed3fa7a91e01 +8435c6f0b1ac3025f5af5da2a0f03898142c506e5981d55a2b633e611dcecb8f diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 141ac1088a..7ece45b451 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -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 diff --git a/src/vdbe.c b/src/vdbe.c index 8cdbe572c5..c814a50c66 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -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); diff --git a/src/vdbeInt.h b/src/vdbeInt.h index 569d599e4d..22d5db2028 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -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 *); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 8b9b02dd2b..24145a03eb 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -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( idxenc = 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) ){