mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-03 16:53:36 +03:00
Enhance the sqlite3VdbeMultiLoad() interface to automatically generate the
OP_ResultRow opcode on PRAGMA implementations, for a small reduction in the library footprint. FossilOrigin-Name: c46f0f076c674891e20240bad56693d891aedc43004bcf980a5d199515f23413
This commit is contained in:
14
manifest
14
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Exploit\sthe\sfact\sthat\sExpr.pRight\sand\sExpr.x\sare\snever\sused\sat\sthe\ssame\stime\nfor\sa\ssmall\sperformance\sgain.
|
C Enhance\sthe\ssqlite3VdbeMultiLoad()\sinterface\sto\sautomatically\sgenerate\sthe\nOP_ResultRow\sopcode\son\sPRAGMA\simplementations,\sfor\sa\ssmall\sreduction\sin\sthe\nlibrary\sfootprint.
|
||||||
D 2017-07-07T13:59:34.309
|
D 2017-07-07T16:00:53.019
|
||||||
F Makefile.in 081e48dfe7f995d57ce1a88ddf4d2917b4349158648a6cd45b42beae30de3a12
|
F Makefile.in 081e48dfe7f995d57ce1a88ddf4d2917b4349158648a6cd45b42beae30de3a12
|
||||||
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
|
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
|
||||||
F Makefile.msc 4ebb1d257cac7fb1bcb4ba59278416d410ff1c4bf59447a9c37a415f3516056a
|
F Makefile.msc 4ebb1d257cac7fb1bcb4ba59278416d410ff1c4bf59447a9c37a415f3516056a
|
||||||
@@ -441,7 +441,7 @@ F src/parse.y 71bf06b02f567232deabe258641b03e833e93c4dee61a120765ad74c13e7faec
|
|||||||
F src/pcache.c 62835bed959e2914edd26afadfecce29ece0e870
|
F src/pcache.c 62835bed959e2914edd26afadfecce29ece0e870
|
||||||
F src/pcache.h 521bb9610d38ef17a3cc9b5ddafd4546c2ea67fa3d0e464823d73c2a28d50e11
|
F src/pcache.h 521bb9610d38ef17a3cc9b5ddafd4546c2ea67fa3d0e464823d73c2a28d50e11
|
||||||
F src/pcache1.c 1195a21fe28e223e024f900b2011e80df53793f0356a24caace4188b098540dc
|
F src/pcache1.c 1195a21fe28e223e024f900b2011e80df53793f0356a24caace4188b098540dc
|
||||||
F src/pragma.c 2362670a9d28b71708aecb2b9b10b3f7be71f4c950961c07e81dc400e3ce6371
|
F src/pragma.c 3f9456edac7eaf171041d51510c5cc922c9b3bd56a713fb7ad6d5b85aa72f1f6
|
||||||
F src/pragma.h 99d3df4a3d2f12c5227ad403f767334910e6356325b6d155a9a99b4037093460
|
F src/pragma.h 99d3df4a3d2f12c5227ad403f767334910e6356325b6d155a9a99b4037093460
|
||||||
F src/prepare.c 4b84ae7458febe1df3e04ae62ba56abc851f771340e460d14426e6802c5615f4
|
F src/prepare.c 4b84ae7458febe1df3e04ae62ba56abc851f771340e460d14426e6802c5615f4
|
||||||
F src/printf.c 8757834f1b54dae512fb25eb1acc8e94a0d15dd2290b58f2563f65973265adb2
|
F src/printf.c 8757834f1b54dae512fb25eb1acc8e94a0d15dd2290b58f2563f65973265adb2
|
||||||
@@ -519,7 +519,7 @@ F src/vdbe.c adc8a378710ec2376101483cc8a5f499539ee9bbebfb2a784f3370704d5d44ad
|
|||||||
F src/vdbe.h dde459b1e8a02b8445ecfd5959f38cd5ebb6b0ad392d491d8b159ac8193d231a
|
F src/vdbe.h dde459b1e8a02b8445ecfd5959f38cd5ebb6b0ad392d491d8b159ac8193d231a
|
||||||
F src/vdbeInt.h 8dd7548d86a98b77b6ed910d8014d0e9e0666356b56f3d16ab7063aad4f102f5
|
F src/vdbeInt.h 8dd7548d86a98b77b6ed910d8014d0e9e0666356b56f3d16ab7063aad4f102f5
|
||||||
F src/vdbeapi.c 899d8f021c89ab348708b3a9b00b855f5ecc3c0f949a75359a61a3c621021281
|
F src/vdbeapi.c 899d8f021c89ab348708b3a9b00b855f5ecc3c0f949a75359a61a3c621021281
|
||||||
F src/vdbeaux.c 32ff5e8a7226c0bc6df0f214a5cc1a76fcc5d8863c491a800ef3d6f5236feae7
|
F src/vdbeaux.c 6f01fe8a49b801cc7734ccfc61d1b782131ee3bb7ee28e336f3c73474800f8f9
|
||||||
F src/vdbeblob.c 359891617358deefc85bef7bcf787fa6b77facb9
|
F src/vdbeblob.c 359891617358deefc85bef7bcf787fa6b77facb9
|
||||||
F src/vdbemem.c 8d78df62becfd2dce3c317f64b32a94ecaff8346d814bc8b0b877b38a1ad3718
|
F src/vdbemem.c 8d78df62becfd2dce3c317f64b32a94ecaff8346d814bc8b0b877b38a1ad3718
|
||||||
F src/vdbesort.c f512c68d0bf7e0105316a5594c4329358c8ee9cae3b25138df041d97516c0372
|
F src/vdbesort.c f512c68d0bf7e0105316a5594c4329358c8ee9cae3b25138df041d97516c0372
|
||||||
@@ -1628,7 +1628,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 115d4b83392d346634866dd959bef30fca50db2e526df17eaeb3d94da7fc895e
|
P aacbb9a461fdb34c7f9c8ce348e44c3e96c93334f210d438d92bfac1794dc686
|
||||||
R 582e201382f2bd562c6f1266d901f884
|
R 7baffcdf7a331e746202781d1effd9e4
|
||||||
U drh
|
U drh
|
||||||
Z 92ef67718e1f4940d85eca215e487e0c
|
Z f6a212b381ae2bf356b441292bd9b562
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
aacbb9a461fdb34c7f9c8ce348e44c3e96c93334f210d438d92bfac1794dc686
|
c46f0f076c674891e20240bad56693d891aedc43004bcf980a5d199515f23413
|
||||||
15
src/pragma.c
15
src/pragma.c
@@ -1108,7 +1108,6 @@ void sqlite3Pragma(
|
|||||||
pCol->notNull ? 1 : 0,
|
pCol->notNull ? 1 : 0,
|
||||||
pCol->pDflt ? pCol->pDflt->u.zToken : 0,
|
pCol->pDflt ? pCol->pDflt->u.zToken : 0,
|
||||||
k);
|
k);
|
||||||
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 6);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1128,9 +1127,8 @@ void sqlite3Pragma(
|
|||||||
pTab->szTabRow,
|
pTab->szTabRow,
|
||||||
pTab->nRowLogEst,
|
pTab->nRowLogEst,
|
||||||
pTab->tabFlags);
|
pTab->tabFlags);
|
||||||
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 5);
|
|
||||||
for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
|
for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
|
||||||
sqlite3VdbeMultiLoad(v, 2, "siii",
|
sqlite3VdbeMultiLoad(v, 2, "siiiX",
|
||||||
pIdx->zName,
|
pIdx->zName,
|
||||||
pIdx->szIdxRow,
|
pIdx->szIdxRow,
|
||||||
pIdx->aiRowLogEst[0],
|
pIdx->aiRowLogEst[0],
|
||||||
@@ -1163,10 +1161,10 @@ void sqlite3Pragma(
|
|||||||
assert( pParse->nMem<=pPragma->nPragCName );
|
assert( pParse->nMem<=pPragma->nPragCName );
|
||||||
for(i=0; i<mx; i++){
|
for(i=0; i<mx; i++){
|
||||||
i16 cnum = pIdx->aiColumn[i];
|
i16 cnum = pIdx->aiColumn[i];
|
||||||
sqlite3VdbeMultiLoad(v, 1, "iis", i, cnum,
|
sqlite3VdbeMultiLoad(v, 1, "iisX", i, cnum,
|
||||||
cnum<0 ? 0 : pTab->aCol[cnum].zName);
|
cnum<0 ? 0 : pTab->aCol[cnum].zName);
|
||||||
if( pPragma->iArg ){
|
if( pPragma->iArg ){
|
||||||
sqlite3VdbeMultiLoad(v, 4, "isi",
|
sqlite3VdbeMultiLoad(v, 4, "isiX",
|
||||||
pIdx->aSortOrder[i],
|
pIdx->aSortOrder[i],
|
||||||
pIdx->azColl[i],
|
pIdx->azColl[i],
|
||||||
i<pIdx->nKeyCol);
|
i<pIdx->nKeyCol);
|
||||||
@@ -1193,7 +1191,6 @@ void sqlite3Pragma(
|
|||||||
IsUniqueIndex(pIdx),
|
IsUniqueIndex(pIdx),
|
||||||
azOrigin[pIdx->idxType],
|
azOrigin[pIdx->idxType],
|
||||||
pIdx->pPartIdxWhere!=0);
|
pIdx->pPartIdxWhere!=0);
|
||||||
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 5);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1209,7 +1206,6 @@ void sqlite3Pragma(
|
|||||||
i,
|
i,
|
||||||
db->aDb[i].zDbSName,
|
db->aDb[i].zDbSName,
|
||||||
sqlite3BtreeGetFilename(db->aDb[i].pBt));
|
sqlite3BtreeGetFilename(db->aDb[i].pBt));
|
||||||
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1221,7 +1217,6 @@ void sqlite3Pragma(
|
|||||||
for(p=sqliteHashFirst(&db->aCollSeq); p; p=sqliteHashNext(p)){
|
for(p=sqliteHashFirst(&db->aCollSeq); p; p=sqliteHashNext(p)){
|
||||||
CollSeq *pColl = (CollSeq *)sqliteHashData(p);
|
CollSeq *pColl = (CollSeq *)sqliteHashData(p);
|
||||||
sqlite3VdbeMultiLoad(v, 1, "is", i++, pColl->zName);
|
sqlite3VdbeMultiLoad(v, 1, "is", i++, pColl->zName);
|
||||||
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 2);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1250,7 +1245,6 @@ void sqlite3Pragma(
|
|||||||
actionName(pFK->aAction[1]), /* ON UPDATE */
|
actionName(pFK->aAction[1]), /* ON UPDATE */
|
||||||
actionName(pFK->aAction[0]), /* ON DELETE */
|
actionName(pFK->aAction[0]), /* ON DELETE */
|
||||||
"NONE");
|
"NONE");
|
||||||
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 8);
|
|
||||||
}
|
}
|
||||||
++i;
|
++i;
|
||||||
pFK = pFK->pNextFrom;
|
pFK = pFK->pNextFrom;
|
||||||
@@ -1360,7 +1354,7 @@ void sqlite3Pragma(
|
|||||||
}else{
|
}else{
|
||||||
sqlite3VdbeAddOp2(v, OP_Null, 0, regResult+1);
|
sqlite3VdbeAddOp2(v, OP_Null, 0, regResult+1);
|
||||||
}
|
}
|
||||||
sqlite3VdbeMultiLoad(v, regResult+2, "si", pFK->zTo, i-1);
|
sqlite3VdbeMultiLoad(v, regResult+2, "siX", pFK->zTo, i-1);
|
||||||
sqlite3VdbeAddOp2(v, OP_ResultRow, regResult, 4);
|
sqlite3VdbeAddOp2(v, OP_ResultRow, regResult, 4);
|
||||||
sqlite3VdbeResolveLabel(v, addrOk);
|
sqlite3VdbeResolveLabel(v, addrOk);
|
||||||
sqlite3DbFree(db, aiCols);
|
sqlite3DbFree(db, aiCols);
|
||||||
@@ -2062,7 +2056,6 @@ void sqlite3Pragma(
|
|||||||
zState = azLockName[j];
|
zState = azLockName[j];
|
||||||
}
|
}
|
||||||
sqlite3VdbeMultiLoad(v, 1, "ss", db->aDb[i].zDbSName, zState);
|
sqlite3VdbeMultiLoad(v, 1, "ss", db->aDb[i].zDbSName, zState);
|
||||||
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 2);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -242,6 +242,9 @@ int sqlite3VdbeLoadString(Vdbe *p, int iDest, const char *zStr){
|
|||||||
** "s" character in zTypes[], the register is a string if the argument is
|
** "s" character in zTypes[], the register is a string if the argument is
|
||||||
** not NULL, or OP_Null if the value is a null pointer. For each "i" character
|
** not NULL, or OP_Null if the value is a null pointer. For each "i" character
|
||||||
** in zTypes[], the register is initialized to an integer.
|
** in zTypes[], the register is initialized to an integer.
|
||||||
|
**
|
||||||
|
** If the input string does not end with "X" then an OP_ResultRow instruction
|
||||||
|
** is generated for the values inserted.
|
||||||
*/
|
*/
|
||||||
void sqlite3VdbeMultiLoad(Vdbe *p, int iDest, const char *zTypes, ...){
|
void sqlite3VdbeMultiLoad(Vdbe *p, int iDest, const char *zTypes, ...){
|
||||||
va_list ap;
|
va_list ap;
|
||||||
@@ -251,12 +254,15 @@ void sqlite3VdbeMultiLoad(Vdbe *p, int iDest, const char *zTypes, ...){
|
|||||||
for(i=0; (c = zTypes[i])!=0; i++){
|
for(i=0; (c = zTypes[i])!=0; i++){
|
||||||
if( c=='s' ){
|
if( c=='s' ){
|
||||||
const char *z = va_arg(ap, const char*);
|
const char *z = va_arg(ap, const char*);
|
||||||
sqlite3VdbeAddOp4(p, z==0 ? OP_Null : OP_String8, 0, iDest++, 0, z, 0);
|
sqlite3VdbeAddOp4(p, z==0 ? OP_Null : OP_String8, 0, iDest+i, 0, z, 0);
|
||||||
|
}else if( c=='i' ){
|
||||||
|
sqlite3VdbeAddOp2(p, OP_Integer, va_arg(ap, int), iDest+i);
|
||||||
}else{
|
}else{
|
||||||
assert( c=='i' );
|
goto skip_op_resultrow;
|
||||||
sqlite3VdbeAddOp2(p, OP_Integer, va_arg(ap, int), iDest++);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
sqlite3VdbeAddOp2(p, OP_ResultRow, iDest, i);
|
||||||
|
skip_op_resultrow:
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user