Fix some issues with vector range constraints and the column cache. Also vector range constraints and rowid columns.
FossilOrigin-Name: 42607366bfc2dceb1013797a973b3b8df75dcb4d
This commit is contained in:
parent
145b4ea519
commit
19ff12dd76
18
manifest
18
manifest
@ -1,5 +1,5 @@
|
||||
C Change\sthe\sway\s"(a,\sb)\s=\s(SELECT\s*)"\sexpressions\sare\shandled\sin\swhere.c\sif\sthere\sis\san\sindex\son\sone\sof\sthe\scolumns\sonly.
|
||||
D 2016-07-29T18:12:12.900
|
||||
C Fix\ssome\sissues\swith\svector\srange\sconstraints\sand\sthe\scolumn\scache.\sAlso\svector\srange\sconstraints\sand\srowid\scolumns.
|
||||
D 2016-07-29T20:58:19.781
|
||||
F Makefile.in 6c20d44f72d4564f11652b26291a214c8367e5db
|
||||
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
|
||||
F Makefile.msc d66d0395c38571aab3804f8db0fa20707ae4609a
|
||||
@ -337,7 +337,7 @@ F src/ctime.c 61949e83c4c36e37195a8398ebc752780b534d95
|
||||
F src/date.c 1cc9fb516ec9932c6fd4d2a0d2f8bc4480145c39
|
||||
F src/dbstat.c 4f6f7f52b49beb9636ffbd517cfe44a402ba4ad0
|
||||
F src/delete.c 4aba4214a377ce8ddde2d2e609777bcc8235200f
|
||||
F src/expr.c d21255d0b778cf819d74092463df7630bbcd9fe7
|
||||
F src/expr.c d904598a807ec20500a987566b453307cf2552cd
|
||||
F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
|
||||
F src/fkey.c bc4145347595b7770f9a598cff1c848302cf5413
|
||||
F src/func.c 61a4114cf7004f10c542cfabbab9f2bcb9033045
|
||||
@ -465,8 +465,8 @@ F src/wal.h 6dd221ed384afdc204bc61e25c23ef7fd5a511f2
|
||||
F src/walker.c 0f142b5bd3ed2041fc52d773880748b212e63354
|
||||
F src/where.c df58d6ad7878a08aa96c652ccbc6d0949f8fa472
|
||||
F src/whereInt.h 14dd243e13b81cbb0a66063d38b70f93a7d6e613
|
||||
F src/wherecode.c e259a0b9b0eed28a9b4f5085fa1dfef4c3145361
|
||||
F src/whereexpr.c a58e878dad5cad54c100792eb8bafb9840d699f5
|
||||
F src/wherecode.c e3159b1d6ecd2d39f99f3ec7926d02c1f04f3053
|
||||
F src/whereexpr.c c63e0e48fe32eeb99c0d32e4130ae56af80fcbf5
|
||||
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
|
||||
F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd
|
||||
F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
|
||||
@ -1018,7 +1018,7 @@ F test/rollbackfault.test 0e646aeab8840c399cfbfa43daab46fd609cf04a
|
||||
F test/rowallock.test 3f88ec6819489d0b2341c7a7528ae17c053ab7cc
|
||||
F test/rowhash.test 0bc1d31415e4575d10cacf31e1a66b5cc0f8be81
|
||||
F test/rowid.test 5b7509f384f4f6fae1af3c8c104c8ca299fea18d
|
||||
F test/rowvalue.test 979738b3d49f1d93e3fee56a71d4446217917abc
|
||||
F test/rowvalue.test 8656a46fac138f2a964aebbc37fc256d0a956b9c
|
||||
F test/rowvalue2.test 8d5dfe75b8f4d1868a2f91f0356f20d36cba64ff
|
||||
F test/rowvalue3.test 5127afb4414bf62546161497c04840c46e371770
|
||||
F test/rowvalue4.test 4480898d62d6813e3e38d9d38c02b9a0be5f94be
|
||||
@ -1512,7 +1512,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||
P cc3f6542bec99b00d2698889bcea2aa0b587efa0
|
||||
R 02d8106109a69b80c3fcb6354dcce9eb
|
||||
P 4dfebff2924f46284d5b9cda69175f79b29d6028
|
||||
R 6db81bb19ebb4412c650189f8ab65d8e
|
||||
U dan
|
||||
Z 1ebe0c81a88c1eb2162a3b6fe26c472e
|
||||
Z 49cec86004a136f8782fa45723e38de1
|
||||
|
@ -1 +1 @@
|
||||
4dfebff2924f46284d5b9cda69175f79b29d6028
|
||||
42607366bfc2dceb1013797a973b3b8df75dcb4d
|
@ -411,6 +411,7 @@ static void codeVectorCompare(Parse *pParse, Expr *pExpr, int dest){
|
||||
Expr *pL, *pR;
|
||||
int r1, r2;
|
||||
|
||||
if( i ) sqlite3ExprCachePush(pParse);
|
||||
if( regLeft ){
|
||||
pL = pLeft->x.pSelect->pEList->a[i].pExpr;
|
||||
r1 = regLeft+i;
|
||||
@ -431,6 +432,7 @@ static void codeVectorCompare(Parse *pParse, Expr *pExpr, int dest){
|
||||
sqlite3VdbeAddOp3(v, opTest, dest, addr, p3);
|
||||
sqlite3ReleaseTempReg(pParse, regFree1);
|
||||
sqlite3ReleaseTempReg(pParse, regFree2);
|
||||
if( i ) sqlite3ExprCachePop(pParse);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -964,9 +964,6 @@ static void codeExprOrVector(Parse *pParse, Expr *p, int iReg, int nReg){
|
||||
Vdbe *v = pParse->pVdbe;
|
||||
int iSelect = sqlite3CodeSubselect(pParse, p, 0, 0);
|
||||
sqlite3VdbeAddOp3(v, OP_Copy, iSelect, iReg, nReg-1);
|
||||
p->op2 = p->op;
|
||||
p->op = TK_REGISTER;
|
||||
p->iTable = iSelect;
|
||||
}
|
||||
}else{
|
||||
assert( nReg==1 );
|
||||
@ -1183,6 +1180,7 @@ Bitmask sqlite3WhereCodeOneLoopStart(
|
||||
if( pStart ){
|
||||
Expr *pX; /* The expression that defines the start bound */
|
||||
int r1, rTemp; /* Registers for holding the start boundary */
|
||||
int op; /* Cursor seek operation */
|
||||
|
||||
/* The following constant maps TK_xx codes into corresponding
|
||||
** seek opcodes. It depends on a particular ordering of TK_xx
|
||||
@ -1202,8 +1200,16 @@ Bitmask sqlite3WhereCodeOneLoopStart(
|
||||
pX = pStart->pExpr;
|
||||
assert( pX!=0 );
|
||||
testcase( pStart->leftCursor!=iCur ); /* transitive constraints */
|
||||
r1 = sqlite3ExprCodeTemp(pParse, pX->pRight, &rTemp);
|
||||
sqlite3VdbeAddOp3(v, aMoveOp[pX->op-TK_GT], iCur, addrBrk, r1);
|
||||
if( pX->pRight->flags & EP_Vector ){
|
||||
r1 = rTemp = sqlite3GetTempReg(pParse);
|
||||
codeExprOrVector(pParse, pX->pRight, r1, 1);
|
||||
op = aMoveOp[(pX->op - TK_GT) | 0x0001];
|
||||
}else{
|
||||
r1 = sqlite3ExprCodeTemp(pParse, pX->pRight, &rTemp);
|
||||
disableTerm(pLevel, pStart);
|
||||
op = aMoveOp[(pX->op - TK_GT)];
|
||||
}
|
||||
sqlite3VdbeAddOp3(v, op, iCur, addrBrk, r1);
|
||||
VdbeComment((v, "pk"));
|
||||
VdbeCoverageIf(v, pX->op==TK_GT);
|
||||
VdbeCoverageIf(v, pX->op==TK_LE);
|
||||
@ -1211,7 +1217,6 @@ Bitmask sqlite3WhereCodeOneLoopStart(
|
||||
VdbeCoverageIf(v, pX->op==TK_GE);
|
||||
sqlite3ExprCacheAffinityChange(pParse, r1, 1);
|
||||
sqlite3ReleaseTempReg(pParse, rTemp);
|
||||
disableTerm(pLevel, pStart);
|
||||
}else{
|
||||
sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iCur, addrBrk);
|
||||
VdbeCoverageIf(v, bRev==0);
|
||||
@ -1225,8 +1230,8 @@ Bitmask sqlite3WhereCodeOneLoopStart(
|
||||
testcase( pEnd->leftCursor!=iCur ); /* Transitive constraints */
|
||||
testcase( pEnd->wtFlags & TERM_VIRTUAL );
|
||||
memEndValue = ++pParse->nMem;
|
||||
sqlite3ExprCode(pParse, pX->pRight, memEndValue);
|
||||
if( pX->op==TK_LT || pX->op==TK_GT ){
|
||||
codeExprOrVector(pParse, pX->pRight, memEndValue, 1);
|
||||
if( !(pX->pRight->flags&EP_Vector) && (pX->op==TK_LT || pX->op==TK_GT) ){
|
||||
testOp = bRev ? OP_Le : OP_Ge;
|
||||
}else{
|
||||
testOp = bRev ? OP_Lt : OP_Gt;
|
||||
|
@ -1190,17 +1190,20 @@ static void exprAnalyze(
|
||||
&& ( (pExpr->pLeft->flags & EP_xIsSelect)==0
|
||||
|| (pExpr->pRight->flags & EP_xIsSelect)==0
|
||||
)){
|
||||
int i;
|
||||
for(i=0; i<sqlite3ExprVectorSize(pExpr->pLeft); i++){
|
||||
int idxNew;
|
||||
Expr *pNew;
|
||||
Expr *pLeft = exprVectorExpr(pParse, pExpr->pLeft, i);
|
||||
Expr *pRight = exprVectorExpr(pParse, pExpr->pRight, i);
|
||||
int nLeft = sqlite3ExprVectorSize(pExpr->pLeft);
|
||||
if( nLeft==sqlite3ExprVectorSize(pExpr->pRight) ){
|
||||
int i;
|
||||
for(i=0; i<sqlite3ExprVectorSize(pExpr->pLeft); i++){
|
||||
int idxNew;
|
||||
Expr *pNew;
|
||||
Expr *pLeft = exprVectorExpr(pParse, pExpr->pLeft, i);
|
||||
Expr *pRight = exprVectorExpr(pParse, pExpr->pRight, i);
|
||||
|
||||
pNew = sqlite3PExpr(pParse, pExpr->op, pLeft, pRight, 0);
|
||||
idxNew = whereClauseInsert(pWC, pNew, TERM_VIRTUAL|TERM_DYNAMIC);
|
||||
exprAnalyze(pSrc, pWC, idxNew);
|
||||
markTermAsChild(pWC, idxNew, idxTerm);
|
||||
pNew = sqlite3PExpr(pParse, pExpr->op, pLeft, pRight, 0);
|
||||
idxNew = whereClauseInsert(pWC, pNew, TERM_VIRTUAL|TERM_DYNAMIC);
|
||||
exprAnalyze(pSrc, pWC, idxNew);
|
||||
markTermAsChild(pWC, idxNew, idxTerm);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -118,6 +118,80 @@ foreach {tn expr res} {
|
||||
do_execsql_test 5.$tn "SELECT $expr" [list $res]
|
||||
}
|
||||
|
||||
do_execsql_test 6.0 {
|
||||
CREATE TABLE hh(a, b, c);
|
||||
INSERT INTO hh VALUES('abc', 1, 'i');
|
||||
INSERT INTO hh VALUES('ABC', 1, 'ii');
|
||||
INSERT INTO hh VALUES('def', 2, 'iii');
|
||||
INSERT INTO hh VALUES('DEF', 2, 'iv');
|
||||
INSERT INTO hh VALUES('GHI', 3, 'v');
|
||||
INSERT INTO hh VALUES('ghi', 3, 'vi');
|
||||
|
||||
CREATE INDEX hh_ab ON hh(a, b);
|
||||
}
|
||||
|
||||
do_execsql_test 6.1 {
|
||||
SELECT c FROM hh WHERE (a, b) = (SELECT 'abc', 1);
|
||||
} {i}
|
||||
do_execsql_test 6.2 {
|
||||
SELECT c FROM hh WHERE (a, b) = (SELECT 'abc' COLLATE nocase, 1);
|
||||
} {i}
|
||||
do_execsql_test 6.3 {
|
||||
SELECT c FROM hh WHERE a = (SELECT 'abc' COLLATE nocase) AND b = (SELECT 1);
|
||||
} {i}
|
||||
do_execsql_test 6.4 {
|
||||
SELECT c FROM hh WHERE +a = (SELECT 'abc' COLLATE nocase) AND b = (SELECT 1);
|
||||
} {i}
|
||||
do_execsql_test 6.5 {
|
||||
SELECT c FROM hh WHERE a = (SELECT 'abc') COLLATE nocase AND b = (SELECT 1);
|
||||
} {i ii}
|
||||
do_catchsql_test 6.6 {
|
||||
SELECT c FROM hh WHERE (a, b) = (SELECT 'abc', 1) COLLATE nocase;
|
||||
} {1 {invalid use of row value}}
|
||||
do_catchsql_test 6.7 {
|
||||
SELECT c FROM hh WHERE (a, b) = 1;
|
||||
} {1 {invalid use of row value}}
|
||||
do_execsql_test 6.8 {
|
||||
SELECT c FROM hh WHERE (a COLLATE nocase, b) = (SELECT 'def', 2);
|
||||
} {iii iv}
|
||||
do_execsql_test 6.9 {
|
||||
SELECT c FROM hh WHERE (a COLLATE nocase, b) IS NOT (SELECT 'def', 2);
|
||||
} {i ii v vi}
|
||||
do_execsql_test 6.10 {
|
||||
SELECT c FROM hh WHERE (b, a) = (SELECT 2, 'def');
|
||||
} {iii}
|
||||
|
||||
do_execsql_test 7.0 {
|
||||
CREATE TABLE xy(i INTEGER PRIMARY KEY, j, k);
|
||||
INSERT INTO xy VALUES(1, 1, 1);
|
||||
INSERT INTO xy VALUES(2, 2, 2);
|
||||
INSERT INTO xy VALUES(3, 3, 3);
|
||||
INSERT INTO xy VALUES(4, 4, 4);
|
||||
}
|
||||
|
||||
|
||||
foreach {tn sql res eqp} {
|
||||
1 "SELECT * FROM xy WHERE (i, j) IS (2, 2)" {2 2 2}
|
||||
"0 0 0 {SEARCH TABLE xy USING INTEGER PRIMARY KEY (rowid=?)}"
|
||||
|
||||
2 "SELECT * FROM xy WHERE (k, j) < (2, 3)" {1 1 1 2 2 2}
|
||||
"0 0 0 {SCAN TABLE xy}"
|
||||
|
||||
3 "SELECT * FROM xy WHERE (i, j) < (2, 3)" {1 1 1 2 2 2}
|
||||
"0 0 0 {SEARCH TABLE xy USING INTEGER PRIMARY KEY (rowid<?)}"
|
||||
|
||||
4 "SELECT * FROM xy WHERE (i, j) > (2, 1)" {2 2 2 3 3 3 4 4 4}
|
||||
"0 0 0 {SEARCH TABLE xy USING INTEGER PRIMARY KEY (rowid>?)}"
|
||||
|
||||
5 "SELECT * FROM xy WHERE (i, j) > ('2', 1)" {2 2 2 3 3 3 4 4 4}
|
||||
"0 0 0 {SEARCH TABLE xy USING INTEGER PRIMARY KEY (rowid>?)}"
|
||||
|
||||
} {
|
||||
do_eqp_test 7.$tn.1 $sql $eqp
|
||||
do_execsql_test 7.$tn.2 $sql $res
|
||||
}
|
||||
|
||||
|
||||
|
||||
finish_test
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user