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:
26
manifest
26
manifest
@@ -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
|
||||||
|
@@ -1 +1 @@
|
|||||||
527974d4caba8bce7c89a28ea04a573b14c558657c14d9ad3c64bf1e0884caf8
|
aea5990eab5e85f92df966aa641db2271c81052010ad2d80982475c4275a1284
|
@@ -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.
|
||||||
|
10
src/select.c
10
src/select.c
@@ -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;
|
||||||
|
@@ -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 */
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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 */
|
||||||
|
|
||||||
|
@@ -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++){
|
||||||
|
@@ -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++){
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user