mirror of
https://github.com/sqlite/sqlite.git
synced 2025-12-03 08:01:19 +03:00
Add the OP_ColumnsUsed opcode (when compiled with
SQLITE_ENABLE_COLUMN_USED_MASK) as a hint to the b-tree layer as to which columns of a btree cursor will be used. FossilOrigin-Name: 711a176cbfad5dde6defa9648fba6d0d663af134
This commit is contained in:
24
manifest
24
manifest
@@ -1,5 +1,5 @@
|
||||
C Remove\sstray\soutputs\sfrom\sthe\stest\ssuite.
|
||||
D 2015-06-11T14:19:05.376
|
||||
C Add\sthe\sOP_ColumnsUsed\sopcode\s(when\scompiled\swith\nSQLITE_ENABLE_COLUMN_USED_MASK)\sas\sa\shint\sto\sthe\sb-tree\slayer\sas\sto\swhich\ncolumns\sof\sa\sbtree\scursor\swill\sbe\sused.
|
||||
D 2015-06-12T12:54:15.456
|
||||
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
||||
F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025
|
||||
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
||||
@@ -202,7 +202,7 @@ F src/ctime.c 5a0b735dc95604766f5dac73973658eef782ee8b
|
||||
F src/date.c e4d50b3283696836ec1036b695ead9a19e37a5ac
|
||||
F src/dbstat.c f402e77e25089c6003d0c60b3233b9b3947d599a
|
||||
F src/delete.c 8857a6f27560718f65d43bdbec86c967ae1f8dfa
|
||||
F src/expr.c 710c764c1974b15a0e56b004ff9f5e6ceab3a854
|
||||
F src/expr.c fbde754df3fa10bbd3a1dcea08e77b0f1684d188
|
||||
F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
|
||||
F src/fkey.c c9b63a217d86582c22121699a47f22f524608869
|
||||
F src/func.c 5b8b8e77a0fb644eaf8947d413804622e32692b6
|
||||
@@ -313,11 +313,11 @@ F src/update.c 487747b328b7216bb7f6af0695d6937d5c9e605f
|
||||
F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c
|
||||
F src/util.c a6431c92803b975b7322724a7b433e538d243539
|
||||
F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701
|
||||
F src/vdbe.c 0a6a1df5c31415a0e974e74e7bd412616889453d
|
||||
F src/vdbe.h 7e538ecf47dccb307ea2d087c3ddc2dd8d70e79d
|
||||
F src/vdbeInt.h f0ccddac48583d5f762dc554a9f79e85ea8807e0
|
||||
F src/vdbe.c c9b8985dfc5df9bd512342ea2e56af4be30cb31a
|
||||
F src/vdbe.h 90048aea1910f9df93e6044592bd4a466dc9c5e7
|
||||
F src/vdbeInt.h 20295e482121d13437f69985f77db211cdc8bac1
|
||||
F src/vdbeapi.c 6a0d7757987018ff6b1b81bc5293219cd26bb299
|
||||
F src/vdbeaux.c 46f9bc4b32866082eb87a36b461e487a0bbdbe8e
|
||||
F src/vdbeaux.c 89c85926ce346988d275132e05ddb0c9681807c2
|
||||
F src/vdbeblob.c 4f2e8e075d238392df98c5e03a64342465b03f90
|
||||
F src/vdbemem.c 67b302dc6df64b4d6785881c5d22bd4f9b17739d
|
||||
F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b
|
||||
@@ -327,7 +327,7 @@ F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb
|
||||
F src/wal.c ce2cb2d06faab54d1bce3e739bec79e063dd9113
|
||||
F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
|
||||
F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804
|
||||
F src/where.c 95c0fbfff7aef890b5da7293f6d85cd9a5f99af8
|
||||
F src/where.c 909eba3b6db984eb2adfbca9de2c237ee7056adb
|
||||
F src/whereInt.h 5f87e3c4b0551747d119730dfebddd3c54f04047
|
||||
F src/wherecode.c 0669481cabaf5caf934b6bb825df15bc57f60d40
|
||||
F src/whereexpr.c 9ce1c9cfedbf80c93c7d899497025ec8256ce652
|
||||
@@ -1286,8 +1286,8 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
|
||||
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
||||
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
|
||||
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
||||
P e63d01c69c3e50f49ee3022a519c4f3e91f00520 e64a5681793238fa04fe3636f48d34b2dd36cdfa
|
||||
R 169aa55aecdac74f95270959f0b49156
|
||||
T +closed e64a5681793238fa04fe3636f48d34b2dd36cdfa
|
||||
P afc6db9b105f32110112b877f06091757888a5f2 f167bba446b78dd7538d0b2bae3e6678f3b1ba28
|
||||
R a835938c5e3feca63734c05b1d351c1c
|
||||
T +closed f167bba446b78dd7538d0b2bae3e6678f3b1ba28
|
||||
U drh
|
||||
Z 8e453d8625c4e71ab15cead2df245827
|
||||
Z a8bcbc55ca8439f9fa1efdec8155d95f
|
||||
|
||||
@@ -1 +1 @@
|
||||
afc6db9b105f32110112b877f06091757888a5f2
|
||||
711a176cbfad5dde6defa9648fba6d0d663af134
|
||||
19
src/expr.c
19
src/expr.c
@@ -2208,17 +2208,6 @@ static void sqlite3ExprCodeIN(
|
||||
}
|
||||
#endif /* SQLITE_OMIT_SUBQUERY */
|
||||
|
||||
/*
|
||||
** Duplicate an 8-byte value
|
||||
*/
|
||||
static char *dup8bytes(Vdbe *v, const char *in){
|
||||
char *out = sqlite3DbMallocRaw(sqlite3VdbeDb(v), 8);
|
||||
if( out ){
|
||||
memcpy(out, in, 8);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
#ifndef SQLITE_OMIT_FLOATING_POINT
|
||||
/*
|
||||
** Generate an instruction that will put the floating point
|
||||
@@ -2231,12 +2220,10 @@ static char *dup8bytes(Vdbe *v, const char *in){
|
||||
static void codeReal(Vdbe *v, const char *z, int negateFlag, int iMem){
|
||||
if( ALWAYS(z!=0) ){
|
||||
double value;
|
||||
char *zV;
|
||||
sqlite3AtoF(z, &value, sqlite3Strlen30(z), SQLITE_UTF8);
|
||||
assert( !sqlite3IsNaN(value) ); /* The new AtoF never returns NaN */
|
||||
if( negateFlag ) value = -value;
|
||||
zV = dup8bytes(v, (char*)&value);
|
||||
sqlite3VdbeAddOp4(v, OP_Real, 0, iMem, 0, zV, P4_REAL);
|
||||
sqlite3VdbeAddOp4Dup8(v, OP_Real, 0, iMem, 0, (u8*)&value, P4_REAL);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -2262,10 +2249,8 @@ static void codeInteger(Parse *pParse, Expr *pExpr, int negFlag, int iMem){
|
||||
assert( z!=0 );
|
||||
c = sqlite3DecOrHexToI64(z, &value);
|
||||
if( c==0 || (c==2 && negFlag) ){
|
||||
char *zV;
|
||||
if( negFlag ){ value = c==2 ? SMALLEST_INT64 : -value; }
|
||||
zV = dup8bytes(v, (char*)&value);
|
||||
sqlite3VdbeAddOp4(v, OP_Int64, 0, iMem, 0, zV, P4_INT64);
|
||||
sqlite3VdbeAddOp4Dup8(v, OP_Int64, 0, iMem, 0, (u8*)&value, P4_INT64);
|
||||
}else{
|
||||
#ifdef SQLITE_OMIT_FLOATING_POINT
|
||||
sqlite3ErrorMsg(pParse, "oversized integer: %s%s", negFlag ? "-" : "", z);
|
||||
|
||||
20
src/vdbe.c
20
src/vdbe.c
@@ -3511,6 +3511,26 @@ case OP_Close: {
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef SQLITE_ENABLE_COLUMN_USED_MASK
|
||||
/* Opcode: ColumnsUsed P1 * * P4 *
|
||||
**
|
||||
** This opcode (which only exists if SQLite was compiled with
|
||||
** SQLITE_ENABLE_COLUMN_USED_MASK) identifies which columns of the
|
||||
** table or index for cursor P1 are used. P4 is a 64-bit integer
|
||||
** (P4_INT64) in which the first 63 bits are one for each of the
|
||||
** first 63 columns of the table or index that are actually used
|
||||
** by the cursor. The high-order bit is set if any column after
|
||||
** the 64th is used.
|
||||
*/
|
||||
case OP_ColumnsUsed: {
|
||||
VdbeCursor *pC;
|
||||
pC = p->apCsr[pOp->p1];
|
||||
assert( pC->pCursor );
|
||||
pC->maskUsed = *(u64*)pOp->p4.pI64;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Opcode: SeekGE P1 P2 P3 P4 *
|
||||
** Synopsis: key=r[P3@P4]
|
||||
**
|
||||
|
||||
@@ -169,6 +169,7 @@ int sqlite3VdbeAddOp1(Vdbe*,int,int);
|
||||
int sqlite3VdbeAddOp2(Vdbe*,int,int,int);
|
||||
int sqlite3VdbeAddOp3(Vdbe*,int,int,int,int);
|
||||
int sqlite3VdbeAddOp4(Vdbe*,int,int,int,int,const char *zP4,int);
|
||||
int sqlite3VdbeAddOp4Dup8(Vdbe*,int,int,int,int,const u8*,int);
|
||||
int sqlite3VdbeAddOp4Int(Vdbe*,int,int,int,int,int);
|
||||
int sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp, int iLineno);
|
||||
void sqlite3VdbeAddParseSchemaOp(Vdbe*,int,char*);
|
||||
|
||||
@@ -83,6 +83,9 @@ struct VdbeCursor {
|
||||
i64 seqCount; /* Sequence counter */
|
||||
i64 movetoTarget; /* Argument to the deferred sqlite3BtreeMoveto() */
|
||||
VdbeSorter *pSorter; /* Sorter object for OP_SorterOpen cursors */
|
||||
#ifdef SQLITE_ENABLE_COLUMN_USED_MASK
|
||||
u64 maskUsed; /* Mask of columns used by this cursor */
|
||||
#endif
|
||||
|
||||
/* Cached information about the header for the data record that the
|
||||
** cursor is currently pointing to. Only valid if cacheStatus matches
|
||||
|
||||
@@ -233,6 +233,23 @@ int sqlite3VdbeAddOp4(
|
||||
return addr;
|
||||
}
|
||||
|
||||
/*
|
||||
** Add an opcode that includes the p4 value with a P4_INT64 type.
|
||||
*/
|
||||
int sqlite3VdbeAddOp4Dup8(
|
||||
Vdbe *p, /* Add the opcode to this VM */
|
||||
int op, /* The new opcode */
|
||||
int p1, /* The P1 operand */
|
||||
int p2, /* The P2 operand */
|
||||
int p3, /* The P3 operand */
|
||||
const u8 *zP4, /* The P4 operand */
|
||||
int p4type /* P4 operand type */
|
||||
){
|
||||
char *p4copy = sqlite3DbMallocRaw(sqlite3VdbeDb(p), 8);
|
||||
if( p4copy ) memcpy(p4copy, zP4, 8);
|
||||
return sqlite3VdbeAddOp4(p, op, p1, p2, p3, p4copy, p4type);
|
||||
}
|
||||
|
||||
/*
|
||||
** Add an OP_ParseSchema opcode. This routine is broken out from
|
||||
** sqlite3VdbeAddOp4() since it needs to also needs to mark all btrees
|
||||
|
||||
19
src/where.c
19
src/where.c
@@ -4213,6 +4213,10 @@ WhereInfo *sqlite3WhereBegin(
|
||||
SQLITE_INT_TO_PTR(n), P4_INT32);
|
||||
assert( n<=pTab->nCol );
|
||||
}
|
||||
#ifdef SQLITE_ENABLE_COLUMN_USED_MASK
|
||||
sqlite3VdbeAddOp4Dup8(v, OP_ColumnsUsed, pTabItem->iCursor, 0, 0,
|
||||
(const u8*)&pTabItem->colUsed, P4_INT64);
|
||||
#endif
|
||||
}else{
|
||||
sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName);
|
||||
}
|
||||
@@ -4258,6 +4262,21 @@ WhereInfo *sqlite3WhereBegin(
|
||||
sqlite3VdbeChangeP5(v, OPFLAG_SEEKEQ); /* Hint to COMDB2 */
|
||||
}
|
||||
VdbeComment((v, "%s", pIx->zName));
|
||||
#ifdef SQLITE_ENABLE_COLUMN_USED_MASK
|
||||
{
|
||||
u64 colUsed = 0;
|
||||
int ii, jj;
|
||||
for(ii=0; ii<pIx->nColumn; ii++){
|
||||
jj = pIx->aiColumn[ii];
|
||||
if( jj<0 ) continue;
|
||||
if( jj>63 ) jj = 63;
|
||||
if( (pTabItem->colUsed & MASKBIT(jj))==0 ) continue;
|
||||
colUsed |= ((u64)1)<<(ii<63 ? ii : 63);
|
||||
}
|
||||
sqlite3VdbeAddOp4Dup8(v, OP_ColumnsUsed, iIndexCur, 0, 0,
|
||||
(u8*)&colUsed, P4_INT64);
|
||||
}
|
||||
#endif /* SQLITE_ENABLE_COLUMN_USED_MASK */
|
||||
}
|
||||
}
|
||||
if( iDb>=0 ) sqlite3CodeVerifySchema(pParse, iDb);
|
||||
|
||||
Reference in New Issue
Block a user