1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-08 14:02:16 +03:00

In the KeyInfo object, refactor the nField and nXField elements into

nKeyField and nAllField, which are more useful and run a little faster.

FossilOrigin-Name: aea5990eab5e85f92df966aa641db2271c81052010ad2d80982475c4275a1284
This commit is contained in:
drh
2017-08-02 22:43:14 +00:00
parent 754ee285fa
commit a485ad191f
10 changed files with 51 additions and 52 deletions

View File

@@ -1,5 +1,5 @@
C Avoid\sredundant\scalls\sto\ssqlite3ApiExit()\sin\ssqlite3_step(). C In\sthe\sKeyInfo\sobject,\srefactor\sthe\snField\sand\snXField\selements\sinto\nnKeyField\sand\snAllField,\swhich\sare\smore\suseful\sand\srun\sa\slittle\sfaster.
D 2017-08-02T19:04:37.188 D 2017-08-02T22:43:14.243
F Makefile.in d9873c9925917cca9990ee24be17eb9613a668012c85a343aef7e5536ae266e8 F Makefile.in d9873c9925917cca9990ee24be17eb9613a668012c85a343aef7e5536ae266e8
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
F Makefile.msc 02b469e9dcd5b7ee63fc1fb05babc174260ee4cfa4e0ef2e48c3c6801567a016 F Makefile.msc 02b469e9dcd5b7ee63fc1fb05babc174260ee4cfa4e0ef2e48c3c6801567a016
@@ -398,7 +398,7 @@ F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca
F src/btree.c 1a17ba1a765d80c3ca39ce33ff55f92e1f51eb84bbbdab5377f11d36b1515fa1 F src/btree.c 1a17ba1a765d80c3ca39ce33ff55f92e1f51eb84bbbdab5377f11d36b1515fa1
F src/btree.h 3edc5329bc59534d2d15b4f069a9f54b779a7e51289e98fa481ae3c0e526a5ca F src/btree.h 3edc5329bc59534d2d15b4f069a9f54b779a7e51289e98fa481ae3c0e526a5ca
F src/btreeInt.h 97700795edf8a43245720414798b7b29d8e465aef46bf301ffacd431910c0da1 F src/btreeInt.h 97700795edf8a43245720414798b7b29d8e465aef46bf301ffacd431910c0da1
F src/build.c 1285d6b7da72d699db6aec36d04794629c8e0fb89bb1d8e3ba838fa56948643a F src/build.c 33b0f6055bd990ed052b96e71368acefcd98daa21ccf21f91aa90e8b769c2219
F src/callback.c 930648a084a3adc741c6471adfbdc50ba47ba3542421cb80a26f259f467de65e F src/callback.c 930648a084a3adc741c6471adfbdc50ba47ba3542421cb80a26f259f467de65e
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
F src/ctime.c ff1be3eed7bdd75aaca61ca8dc848f7c9f850ef2fb9cb56f2734e922a098f9c0 F src/ctime.c ff1be3eed7bdd75aaca61ca8dc848f7c9f850ef2fb9cb56f2734e922a098f9c0
@@ -452,13 +452,13 @@ F src/printf.c 8757834f1b54dae512fb25eb1acc8e94a0d15dd2290b58f2563f65973265adb2
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
F src/resolve.c 4324a94573b1e29286f8121e4881db59eaedc014afeb274c8d3e07ed282e0e20 F src/resolve.c 4324a94573b1e29286f8121e4881db59eaedc014afeb274c8d3e07ed282e0e20
F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac
F src/select.c 31b35ddf55f1021f7148a01306984b057c11ebb6e3463d94677225e0a1e301a3 F src/select.c 3fd19c98c5223d411b883502d1ac928ddb762a1ea8f031d910210316545fc67c
F src/shell.c bd6a37cbe8bf64ef6a6a74fdc50f067d3148149b4ce2b4d03154663e66ded55f F src/shell.c bd6a37cbe8bf64ef6a6a74fdc50f067d3148149b4ce2b4d03154663e66ded55f
F src/shell.c.in b5725acacba95ccefa57b6d068f710e29ba8239c3aa704628a1902a1f729c175 F src/shell.c.in b5725acacba95ccefa57b6d068f710e29ba8239c3aa704628a1902a1f729c175
F src/sqlite.h.in 72f1775c7a134f9e358eedafe1ebc703c28b0d705d976464ddbf6a9219448952 F src/sqlite.h.in 72f1775c7a134f9e358eedafe1ebc703c28b0d705d976464ddbf6a9219448952
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
F src/sqlite3ext.h 0f9f72b86a3792314f5db7a1dfbc2c82376bcd8d0919ceb80637bca126ec3c68 F src/sqlite3ext.h 0f9f72b86a3792314f5db7a1dfbc2c82376bcd8d0919ceb80637bca126ec3c68
F src/sqliteInt.h fe648fe59c71f7f44b5e89cf7cff0b96d81bd718263517c6895014632357df7b F src/sqliteInt.h 07e4d3c8021aea80e3bbafab4dd52833cfcfa4f000210af0d15c7fdaed2f09fc
F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
F src/status.c a9e66593dfb28a9e746cba7153f84d49c1ddc4b1 F src/status.c a9e66593dfb28a9e746cba7153f84d49c1ddc4b1
F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
@@ -520,14 +520,14 @@ F src/update.c c443935c652af9365e033f756550b5032d02e1b06eb2cb890ed7511ae0c051dc
F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5
F src/util.c fc081ec6f63448dcd80d3dfad35baecfa104823254a815b081a4d9fe76e1db23 F src/util.c fc081ec6f63448dcd80d3dfad35baecfa104823254a815b081a4d9fe76e1db23
F src/vacuum.c 90839322fd5f00df9617eb21b68beda9b6e2a2937576b0d65985e4aeb1c53739 F src/vacuum.c 90839322fd5f00df9617eb21b68beda9b6e2a2937576b0d65985e4aeb1c53739
F src/vdbe.c 5752a157cfb2898d154ecdd4a805135d2e9b1708084a3205dbc379af3ae8ef07 F src/vdbe.c 54dfa970e37a3d60886041a62412d975cbcbd1cb4731555f53a8af15ee8f5d0f
F src/vdbe.h d50cadf12bcf9fb99117ef392ce1ea283aa429270481426b6e8b0280c101fd97 F src/vdbe.h d50cadf12bcf9fb99117ef392ce1ea283aa429270481426b6e8b0280c101fd97
F src/vdbeInt.h ff2b7db0968d20e6184aee256d2e535d565f5a172e3588a78adb166a41fc4911 F src/vdbeInt.h ff2b7db0968d20e6184aee256d2e535d565f5a172e3588a78adb166a41fc4911
F src/vdbeapi.c dc282e27bf3d3c148f95aded4098894494c17d3d39c887c5ed97b9561dcd9bdd F src/vdbeapi.c 05d6b14ab73952db0d73f6452d6960216997bd966a710266b2fe051f25326abc
F src/vdbeaux.c 5feca7a5f38a0bd154d8f68710e3afffdb9a83d7b56350497fdd316eb1dd6775 F src/vdbeaux.c 1bef372f59f9e1dba5ead70cc5c24bf978bab0b9fdc2f69692afaa3a2d4dd8f3
F src/vdbeblob.c db3cf91060f6f4b2f1358a4200e844697990752177784c7c95da00b7ac9f1c7b F src/vdbeblob.c db3cf91060f6f4b2f1358a4200e844697990752177784c7c95da00b7ac9f1c7b
F src/vdbemem.c 9ca2854976f35db40341977e688a08204c96427505f5b90215dc7970f6ea42c4 F src/vdbemem.c b7fac20534c79b7554dab2e8a180c585a8bc1b9c85149d1b2d9746cf314d06ed
F src/vdbesort.c f512c68d0bf7e0105316a5594c4329358c8ee9cae3b25138df041d97516c0372 F src/vdbesort.c fea2bea25f5e9ccd91e0760d7359f0365f9fba1aaeac7216c71cad78765f58e3
F src/vdbetrace.c 41963d5376f0349842b5fc4aaaaacd7d9cdc0834 F src/vdbetrace.c 41963d5376f0349842b5fc4aaaaacd7d9cdc0834
F src/vtab.c a305582d3a6c7090982ac1610b8e5724fa954d8b28899fa6c633cb4de9c2f8ee F src/vtab.c a305582d3a6c7090982ac1610b8e5724fa954d8b28899fa6c633cb4de9c2f8ee
F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
@@ -1640,7 +1640,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 bcc6dacb9114df709ef1bde24264c2193d9e39fc7fab024d5ebfc6056033274c P 527974d4caba8bce7c89a28ea04a573b14c558657c14d9ad3c64bf1e0884caf8
R c2ce69750ff40b8566324e65e78319fb R cfede6bff76ed4054c454e02ed222e2a
U drh U drh
Z 4c16d972871bc4f6fb8b1229cdad47da Z 1b6d760eabb2623531ca0b0d06e46919

View File

@@ -1 +1 @@
527974d4caba8bce7c89a28ea04a573b14c558657c14d9ad3c64bf1e0884caf8 aea5990eab5e85f92df966aa641db2271c81052010ad2d80982475c4275a1284

View File

@@ -1681,7 +1681,7 @@ static int hasColumn(const i16 *aiCol, int nCol, int x){
** schema to the rootpage from the main table. ** schema to the rootpage from the main table.
** (5) Add all table columns to the PRIMARY KEY Index object ** (5) Add all table columns to the PRIMARY KEY Index object
** so that the PRIMARY KEY is a covering index. The surplus ** so that the PRIMARY KEY is a covering index. The surplus
** columns are part of KeyInfo.nXField and are not used for ** columns are part of KeyInfo.nAllField and are not used for
** sorting or lookup or uniqueness checks. ** sorting or lookup or uniqueness checks.
** (6) Replace the rowid tail on all automatically generated UNIQUE ** (6) Replace the rowid tail on all automatically generated UNIQUE
** indices with the PRIMARY KEY columns. ** indices with the PRIMARY KEY columns.

View File

@@ -562,11 +562,11 @@ static void pushOntoSorter(
if( pParse->db->mallocFailed ) return; if( pParse->db->mallocFailed ) return;
pOp->p2 = nKey + nData; pOp->p2 = nKey + nData;
pKI = pOp->p4.pKeyInfo; pKI = pOp->p4.pKeyInfo;
memset(pKI->aSortOrder, 0, pKI->nField); /* Makes OP_Jump below testable */ memset(pKI->aSortOrder, 0, pKI->nKeyField); /* Makes OP_Jump testable */
sqlite3VdbeChangeP4(v, -1, (char*)pKI, P4_KEYINFO); sqlite3VdbeChangeP4(v, -1, (char*)pKI, P4_KEYINFO);
testcase( pKI->nXField>2 ); testcase( pKI->nAllField > pKI->nKeyField+2 );
pOp->p4.pKeyInfo = keyInfoFromExprList(pParse, pSort->pOrderBy, nOBSat, pOp->p4.pKeyInfo = keyInfoFromExprList(pParse, pSort->pOrderBy, nOBSat,
pKI->nXField-1); pKI->nAllField-pKI->nKeyField-1);
addrJmp = sqlite3VdbeCurrentAddr(v); addrJmp = sqlite3VdbeCurrentAddr(v);
sqlite3VdbeAddOp3(v, OP_Jump, addrJmp+1, 0, addrJmp+1); VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_Jump, addrJmp+1, 0, addrJmp+1); VdbeCoverage(v);
pSort->labelBkOut = sqlite3VdbeMakeLabel(v); pSort->labelBkOut = sqlite3VdbeMakeLabel(v);
@@ -1035,8 +1035,8 @@ KeyInfo *sqlite3KeyInfoAlloc(sqlite3 *db, int N, int X){
KeyInfo *p = sqlite3DbMallocRawNN(db, sizeof(KeyInfo) + nExtra); KeyInfo *p = sqlite3DbMallocRawNN(db, sizeof(KeyInfo) + nExtra);
if( p ){ if( p ){
p->aSortOrder = (u8*)&p->aColl[N+X]; p->aSortOrder = (u8*)&p->aColl[N+X];
p->nField = (u16)N; p->nKeyField = (u16)N;
p->nXField = (u16)X; p->nAllField = (u16)(N+X);
p->enc = ENC(db); p->enc = ENC(db);
p->db = db; p->db = db;
p->nRef = 1; p->nRef = 1;

View File

@@ -2052,8 +2052,8 @@ struct FKey {
struct KeyInfo { struct KeyInfo {
u32 nRef; /* Number of references to this KeyInfo object */ u32 nRef; /* Number of references to this KeyInfo object */
u8 enc; /* Text encoding - one of the SQLITE_UTF* values */ u8 enc; /* Text encoding - one of the SQLITE_UTF* values */
u16 nField; /* Number of key columns in the index */ u16 nKeyField; /* Number of key columns in the index */
u16 nXField; /* Number of columns beyond the key columns */ u16 nAllField; /* Total columns, including key plus others */
sqlite3 *db; /* The database connection */ sqlite3 *db; /* The database connection */
u8 *aSortOrder; /* Sort order for each column. */ u8 *aSortOrder; /* Sort order for each column. */
CollSeq *aColl[1]; /* Collating sequence for each term of the key */ CollSeq *aColl[1]; /* Collating sequence for each term of the key */

View File

@@ -2104,7 +2104,7 @@ case OP_Compare: {
assert( memIsValid(&aMem[p2+idx]) ); assert( memIsValid(&aMem[p2+idx]) );
REGISTER_TRACE(p1+idx, &aMem[p1+idx]); REGISTER_TRACE(p1+idx, &aMem[p1+idx]);
REGISTER_TRACE(p2+idx, &aMem[p2+idx]); REGISTER_TRACE(p2+idx, &aMem[p2+idx]);
assert( i<pKeyInfo->nField ); assert( i<pKeyInfo->nKeyField );
pColl = pKeyInfo->aColl[i]; pColl = pKeyInfo->aColl[i];
bRev = pKeyInfo->aSortOrder[i]; bRev = pKeyInfo->aSortOrder[i];
iCompare = sqlite3MemCompare(&aMem[p1+idx], &aMem[p2+idx], pColl); iCompare = sqlite3MemCompare(&aMem[p1+idx], &aMem[p2+idx], pColl);
@@ -3398,7 +3398,7 @@ case OP_OpenWrite:
pKeyInfo = pOp->p4.pKeyInfo; pKeyInfo = pOp->p4.pKeyInfo;
assert( pKeyInfo->enc==ENC(db) ); assert( pKeyInfo->enc==ENC(db) );
assert( pKeyInfo->db==db ); assert( pKeyInfo->db==db );
nField = pKeyInfo->nField+pKeyInfo->nXField; nField = pKeyInfo->nAllField;
}else if( pOp->p4type==P4_INT32 ){ }else if( pOp->p4type==P4_INT32 ){
nField = pOp->p4.i; nField = pOp->p4.i;
} }

View File

@@ -1720,7 +1720,7 @@ static UnpackedRecord *vdbeUnpackRecord(
pRet = sqlite3VdbeAllocUnpackedRecord(pKeyInfo); pRet = sqlite3VdbeAllocUnpackedRecord(pKeyInfo);
if( pRet ){ if( pRet ){
memset(pRet->aMem, 0, sizeof(Mem)*(pKeyInfo->nField+1)); memset(pRet->aMem, 0, sizeof(Mem)*(pKeyInfo->nKeyField+1));
sqlite3VdbeRecordUnpack(pKeyInfo, nKey, pKey, pRet); sqlite3VdbeRecordUnpack(pKeyInfo, nKey, pKey, pRet);
} }
return pRet; return pRet;
@@ -1793,7 +1793,7 @@ int sqlite3_preupdate_old(sqlite3 *db, int iIdx, sqlite3_value **ppValue){
*/ */
int sqlite3_preupdate_count(sqlite3 *db){ int sqlite3_preupdate_count(sqlite3 *db){
PreUpdate *p = db->pPreUpdate; PreUpdate *p = db->pPreUpdate;
return (p ? p->keyinfo.nField : 0); return (p ? p->keyinfo.nKeyField : 0);
} }
#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ #endif /* SQLITE_ENABLE_PREUPDATE_HOOK */

View File

@@ -1320,8 +1320,8 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){
int j; int j;
KeyInfo *pKeyInfo = pOp->p4.pKeyInfo; KeyInfo *pKeyInfo = pOp->p4.pKeyInfo;
assert( pKeyInfo->aSortOrder!=0 ); assert( pKeyInfo->aSortOrder!=0 );
sqlite3XPrintf(&x, "k(%d", pKeyInfo->nField); sqlite3XPrintf(&x, "k(%d", pKeyInfo->nKeyField);
for(j=0; j<pKeyInfo->nField; j++){ for(j=0; j<pKeyInfo->nKeyField; j++){
CollSeq *pColl = pKeyInfo->aColl[j]; CollSeq *pColl = pKeyInfo->aColl[j];
const char *zColl = pColl ? pColl->zName : ""; const char *zColl = pColl ? pColl->zName : "";
if( strcmp(zColl, "BINARY")==0 ) zColl = "B"; if( strcmp(zColl, "BINARY")==0 ) zColl = "B";
@@ -3547,13 +3547,13 @@ UnpackedRecord *sqlite3VdbeAllocUnpackedRecord(
){ ){
UnpackedRecord *p; /* Unpacked record to return */ UnpackedRecord *p; /* Unpacked record to return */
int nByte; /* Number of bytes required for *p */ int nByte; /* Number of bytes required for *p */
nByte = ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*(pKeyInfo->nField+1); nByte = ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*(pKeyInfo->nKeyField+1);
p = (UnpackedRecord *)sqlite3DbMallocRaw(pKeyInfo->db, nByte); p = (UnpackedRecord *)sqlite3DbMallocRaw(pKeyInfo->db, nByte);
if( !p ) return 0; if( !p ) return 0;
p->aMem = (Mem*)&((char*)p)[ROUND8(sizeof(UnpackedRecord))]; p->aMem = (Mem*)&((char*)p)[ROUND8(sizeof(UnpackedRecord))];
assert( pKeyInfo->aSortOrder!=0 ); assert( pKeyInfo->aSortOrder!=0 );
p->pKeyInfo = pKeyInfo; p->pKeyInfo = pKeyInfo;
p->nField = pKeyInfo->nField + 1; p->nField = pKeyInfo->nKeyField + 1;
return p; return p;
} }
@@ -3593,7 +3593,7 @@ void sqlite3VdbeRecordUnpack(
pMem++; pMem++;
if( (++u)>=p->nField ) break; if( (++u)>=p->nField ) break;
} }
assert( u<=pKeyInfo->nField + 1 ); assert( u<=pKeyInfo->nKeyField + 1 );
p->nField = u; p->nField = u;
} }
@@ -3642,9 +3642,9 @@ static int vdbeRecordCompareDebug(
idx1 = getVarint32(aKey1, szHdr1); idx1 = getVarint32(aKey1, szHdr1);
if( szHdr1>98307 ) return SQLITE_CORRUPT; if( szHdr1>98307 ) return SQLITE_CORRUPT;
d1 = szHdr1; d1 = szHdr1;
assert( pKeyInfo->nField+pKeyInfo->nXField>=pPKey2->nField || CORRUPT_DB ); assert( pKeyInfo->nAllField>=pPKey2->nField || CORRUPT_DB );
assert( pKeyInfo->aSortOrder!=0 ); assert( pKeyInfo->aSortOrder!=0 );
assert( pKeyInfo->nField>0 ); assert( pKeyInfo->nKeyField>0 );
assert( idx1<=szHdr1 || CORRUPT_DB ); assert( idx1<=szHdr1 || CORRUPT_DB );
do{ do{
u32 serial_type1; u32 serial_type1;
@@ -3706,12 +3706,12 @@ debugCompareEnd:
/* /*
** Count the number of fields (a.k.a. columns) in the record given by ** Count the number of fields (a.k.a. columns) in the record given by
** pKey,nKey. The verify that this count is less than or equal to the ** pKey,nKey. The verify that this count is less than or equal to the
** limit given by pKeyInfo->nField + pKeyInfo->nXField. ** limit given by pKeyInfo->nAllField.
** **
** If this constraint is not satisfied, it means that the high-speed ** If this constraint is not satisfied, it means that the high-speed
** vdbeRecordCompareInt() and vdbeRecordCompareString() routines will ** vdbeRecordCompareInt() and vdbeRecordCompareString() routines will
** not work correctly. If this assert() ever fires, it probably means ** not work correctly. If this assert() ever fires, it probably means
** that the KeyInfo.nField or KeyInfo.nXField values were computed ** that the KeyInfo.nKeyField or KeyInfo.nAllField values were computed
** incorrectly. ** incorrectly.
*/ */
static void vdbeAssertFieldCountWithinLimits( static void vdbeAssertFieldCountWithinLimits(
@@ -3732,7 +3732,7 @@ static void vdbeAssertFieldCountWithinLimits(
idx += getVarint32(aKey+idx, notUsed); idx += getVarint32(aKey+idx, notUsed);
nField++; nField++;
} }
assert( nField <= pKeyInfo->nField+pKeyInfo->nXField ); assert( nField <= pKeyInfo->nAllField );
} }
#else #else
# define vdbeAssertFieldCountWithinLimits(A,B,C) # define vdbeAssertFieldCountWithinLimits(A,B,C)
@@ -4037,10 +4037,10 @@ int sqlite3VdbeRecordCompareWithSkip(
} }
VVA_ONLY( mem1.szMalloc = 0; ) /* Only needed by assert() statements */ VVA_ONLY( mem1.szMalloc = 0; ) /* Only needed by assert() statements */
assert( pPKey2->pKeyInfo->nField+pPKey2->pKeyInfo->nXField>=pPKey2->nField assert( pPKey2->pKeyInfo->nAllField>=pPKey2->nField
|| CORRUPT_DB ); || CORRUPT_DB );
assert( pPKey2->pKeyInfo->aSortOrder!=0 ); assert( pPKey2->pKeyInfo->aSortOrder!=0 );
assert( pPKey2->pKeyInfo->nField>0 ); assert( pPKey2->pKeyInfo->nKeyField>0 );
assert( idx1<=szHdr1 || CORRUPT_DB ); assert( idx1<=szHdr1 || CORRUPT_DB );
do{ do{
u32 serial_type; u32 serial_type;
@@ -4373,7 +4373,7 @@ RecordCompare sqlite3VdbeFindCompare(UnpackedRecord *p){
** The easiest way to enforce this limit is to consider only records with ** The easiest way to enforce this limit is to consider only records with
** 13 fields or less. If the first field is an integer, the maximum legal ** 13 fields or less. If the first field is an integer, the maximum legal
** header size is (12*5 + 1 + 1) bytes. */ ** header size is (12*5 + 1 + 1) bytes. */
if( (p->pKeyInfo->nField + p->pKeyInfo->nXField)<=13 ){ if( p->pKeyInfo->nAllField<=13 ){
int flags = p->aMem[0].flags; int flags = p->aMem[0].flags;
if( p->pKeyInfo->aSortOrder[0] ){ if( p->pKeyInfo->aSortOrder[0] ){
p->r1 = 1; p->r1 = 1;
@@ -4708,7 +4708,7 @@ void sqlite3VdbePreUpdateHook(
preupdate.iNewReg = iReg; preupdate.iNewReg = iReg;
preupdate.keyinfo.db = db; preupdate.keyinfo.db = db;
preupdate.keyinfo.enc = ENC(db); preupdate.keyinfo.enc = ENC(db);
preupdate.keyinfo.nField = pTab->nCol; preupdate.keyinfo.nKeyField = pTab->nCol;
preupdate.keyinfo.aSortOrder = (u8*)&fakeSortOrder; preupdate.keyinfo.aSortOrder = (u8*)&fakeSortOrder;
preupdate.iKey1 = iKey1; preupdate.iKey1 = iKey1;
preupdate.iKey2 = iKey2; preupdate.iKey2 = iKey2;
@@ -4718,8 +4718,8 @@ void sqlite3VdbePreUpdateHook(
db->xPreUpdateCallback(db->pPreUpdateArg, db, op, zDb, zTbl, iKey1, iKey2); db->xPreUpdateCallback(db->pPreUpdateArg, db, op, zDb, zTbl, iKey1, iKey2);
db->pPreUpdate = 0; db->pPreUpdate = 0;
sqlite3DbFree(db, preupdate.aRecord); sqlite3DbFree(db, preupdate.aRecord);
vdbeFreeUnpacked(db, preupdate.keyinfo.nField+1, preupdate.pUnpacked); vdbeFreeUnpacked(db, preupdate.keyinfo.nKeyField+1, preupdate.pUnpacked);
vdbeFreeUnpacked(db, preupdate.keyinfo.nField+1, preupdate.pNewUnpacked); vdbeFreeUnpacked(db, preupdate.keyinfo.nKeyField+1, preupdate.pNewUnpacked);
if( preupdate.aNew ){ if( preupdate.aNew ){
int i; int i;
for(i=0; i<pCsr->nField; i++){ for(i=0; i<pCsr->nField; i++){

View File

@@ -1163,7 +1163,7 @@ static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){
if( pRec ){ if( pRec ){
pRec->pKeyInfo = sqlite3KeyInfoOfIndex(p->pParse, pIdx); pRec->pKeyInfo = sqlite3KeyInfoOfIndex(p->pParse, pIdx);
if( pRec->pKeyInfo ){ if( pRec->pKeyInfo ){
assert( pRec->pKeyInfo->nField+pRec->pKeyInfo->nXField==nCol ); assert( pRec->pKeyInfo->nAllField==nCol );
assert( pRec->pKeyInfo->enc==ENC(db) ); assert( pRec->pKeyInfo->enc==ENC(db) );
pRec->aMem = (Mem *)((u8*)pRec + ROUND8(sizeof(UnpackedRecord))); pRec->aMem = (Mem *)((u8*)pRec + ROUND8(sizeof(UnpackedRecord)));
for(i=0; i<nCol; i++){ for(i=0; i<nCol; i++){
@@ -1699,7 +1699,7 @@ int sqlite3Stat4Column(
void sqlite3Stat4ProbeFree(UnpackedRecord *pRec){ void sqlite3Stat4ProbeFree(UnpackedRecord *pRec){
if( pRec ){ if( pRec ){
int i; int i;
int nCol = pRec->pKeyInfo->nField+pRec->pKeyInfo->nXField; int nCol = pRec->pKeyInfo->nAllField;
Mem *aMem = pRec->aMem; Mem *aMem = pRec->aMem;
sqlite3 *db = aMem[0].db; sqlite3 *db = aMem[0].db;
for(i=0; i<nCol; i++){ for(i=0; i<nCol; i++){

View File

@@ -823,7 +823,7 @@ static int vdbeSorterCompareText(
} }
if( res==0 ){ if( res==0 ){
if( pTask->pSorter->pKeyInfo->nField>1 ){ if( pTask->pSorter->pKeyInfo->nKeyField>1 ){
res = vdbeSorterCompareTail( res = vdbeSorterCompareTail(
pTask, pbKey2Cached, pKey1, nKey1, pKey2, nKey2 pTask, pbKey2Cached, pKey1, nKey1, pKey2, nKey2
); );
@@ -892,7 +892,7 @@ static int vdbeSorterCompareInt(
} }
if( res==0 ){ if( res==0 ){
if( pTask->pSorter->pKeyInfo->nField>1 ){ if( pTask->pSorter->pKeyInfo->nKeyField>1 ){
res = vdbeSorterCompareTail( res = vdbeSorterCompareTail(
pTask, pbKey2Cached, pKey1, nKey1, pKey2, nKey2 pTask, pbKey2Cached, pKey1, nKey1, pKey2, nKey2
); );
@@ -907,7 +907,7 @@ static int vdbeSorterCompareInt(
/* /*
** Initialize the temporary index cursor just opened as a sorter cursor. ** Initialize the temporary index cursor just opened as a sorter cursor.
** **
** Usually, the sorter module uses the value of (pCsr->pKeyInfo->nField) ** Usually, the sorter module uses the value of (pCsr->pKeyInfo->nKeyField)
** to determine the number of fields that should be compared from the ** to determine the number of fields that should be compared from the
** records being sorted. However, if the value passed as argument nField ** records being sorted. However, if the value passed as argument nField
** is non-zero and the sorter is able to guarantee a stable sort, nField ** is non-zero and the sorter is able to guarantee a stable sort, nField
@@ -960,7 +960,7 @@ int sqlite3VdbeSorterInit(
assert( pCsr->pKeyInfo && pCsr->pBtx==0 ); assert( pCsr->pKeyInfo && pCsr->pBtx==0 );
assert( pCsr->eCurType==CURTYPE_SORTER ); assert( pCsr->eCurType==CURTYPE_SORTER );
szKeyInfo = sizeof(KeyInfo) + (pCsr->pKeyInfo->nField-1)*sizeof(CollSeq*); szKeyInfo = sizeof(KeyInfo) + (pCsr->pKeyInfo->nKeyField-1)*sizeof(CollSeq*);
sz = sizeof(VdbeSorter) + nWorker * sizeof(SortSubtask); sz = sizeof(VdbeSorter) + nWorker * sizeof(SortSubtask);
pSorter = (VdbeSorter*)sqlite3DbMallocZero(db, sz + szKeyInfo); pSorter = (VdbeSorter*)sqlite3DbMallocZero(db, sz + szKeyInfo);
@@ -972,8 +972,7 @@ int sqlite3VdbeSorterInit(
memcpy(pKeyInfo, pCsr->pKeyInfo, szKeyInfo); memcpy(pKeyInfo, pCsr->pKeyInfo, szKeyInfo);
pKeyInfo->db = 0; pKeyInfo->db = 0;
if( nField && nWorker==0 ){ if( nField && nWorker==0 ){
pKeyInfo->nXField += (pKeyInfo->nField - nField); pKeyInfo->nKeyField = nField;
pKeyInfo->nField = nField;
} }
pSorter->pgsz = pgsz = sqlite3BtreeGetPageSize(db->aDb[0].pBt); pSorter->pgsz = pgsz = sqlite3BtreeGetPageSize(db->aDb[0].pBt);
pSorter->nTask = nWorker + 1; pSorter->nTask = nWorker + 1;
@@ -1013,7 +1012,7 @@ int sqlite3VdbeSorterInit(
} }
} }
if( (pKeyInfo->nField+pKeyInfo->nXField)<13 if( pKeyInfo->nAllField<13
&& (pKeyInfo->aColl[0]==0 || pKeyInfo->aColl[0]==db->pDfltColl) && (pKeyInfo->aColl[0]==0 || pKeyInfo->aColl[0]==db->pDfltColl)
){ ){
pSorter->typeMask = SORTER_TYPE_INTEGER | SORTER_TYPE_TEXT; pSorter->typeMask = SORTER_TYPE_INTEGER | SORTER_TYPE_TEXT;
@@ -1328,7 +1327,7 @@ static int vdbeSortAllocUnpacked(SortSubtask *pTask){
if( pTask->pUnpacked==0 ){ if( pTask->pUnpacked==0 ){
pTask->pUnpacked = sqlite3VdbeAllocUnpackedRecord(pTask->pSorter->pKeyInfo); pTask->pUnpacked = sqlite3VdbeAllocUnpackedRecord(pTask->pSorter->pKeyInfo);
if( pTask->pUnpacked==0 ) return SQLITE_NOMEM_BKPT; if( pTask->pUnpacked==0 ) return SQLITE_NOMEM_BKPT;
pTask->pUnpacked->nField = pTask->pSorter->pKeyInfo->nField; pTask->pUnpacked->nField = pTask->pSorter->pKeyInfo->nKeyField;
pTask->pUnpacked->errCode = 0; pTask->pUnpacked->errCode = 0;
} }
return SQLITE_OK; return SQLITE_OK;