From: dan Date: Sat, 3 Sep 2016 19:52:12 +0000 (+0000) Subject: Fix a problem causing the affinity of sub-select row-value elements to be ignored... X-Git-Tag: version-3.15.0~110^2~18 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=80aa545337b65289a0db4e73c97d763c357aad53;p=thirdparty%2Fsqlite.git Fix a problem causing the affinity of sub-select row-value elements to be ignored in some contextes. FossilOrigin-Name: 7d9bd22c0715ede2592ee1fa7ebc215aded1ca1b --- diff --git a/manifest b/manifest index 8837f64701..045ff79cbf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sthe\sfuzzershell\senhancement\sfrom\strunk. -D 2016-09-03T16:24:43.721 +C Fix\sa\sproblem\scausing\sthe\saffinity\sof\ssub-select\srow-value\selements\sto\sbe\signored\sin\ssome\scontextes. +D 2016-09-03T19:52:12.432 F Makefile.in cfd8fb987cd7a6af046daa87daa146d5aad0e088 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 5017381e4853b1472e01d5bb926be1268eba429c @@ -338,7 +338,7 @@ F src/ctime.c e77f3dc297b4b65c96da78b4ae4272fdfae863d7 F src/date.c 95c9a8d00767e7221a8e9a31f4e913fc8029bf6b F src/dbstat.c 19ee7a4e89979d4df8e44cfac7a8f905ec89b77d F src/delete.c 76c084f0265f4a3cd1ecf17eee112a94f1ccbc05 -F src/expr.c 7e0470e2b82af8d6544132d81da18990d9b9c09d +F src/expr.c 23b595cc6e2b609d53c72343b3fe16ce8b5e446d F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fkey.c e2be0968c1adc679c87e467aa5b4f167588f38a8 F src/func.c 29cc9acb170ec1387b9f63eb52cd85f8de96c771 @@ -1028,7 +1028,7 @@ F test/rowvalue5.test a440d490c8c0bf606034c09d5c6bbf7840b98f95 F test/rowvalue6.test d19b54feb604d5601f8614b15e214e0774c01087 F test/rowvalue7.test 5d06ff19d9e6969e574a2e662a531dd0c67801a8 F test/rowvalue8.test 5900eddad9e2c3c2e26f1a95f74aafc1232ee5e0 -F test/rowvalue9.test ca4e07da993e455e2c34a11800cd5eecfa25dbea +F test/rowvalue9.test 749a471f237f3fcfdfbd902f850adff2d9963560 F test/rowvaluefault.test 7b16485e3f2b371f3e3d05455b8ded6d0c090244 F test/rtree.test 0c8d9dd458d6824e59683c19ab2ffa9ef946f798 F test/run-wordcount.sh 891e89c4c2d16e629cd45951d4ed899ad12afc09 @@ -1324,7 +1324,7 @@ F test/tt3_lookaside1.c 0377e202c3c2a50d688cb65ba203afeda6fafeb9 F test/tt3_stress.c c57d804716165811d979d4a719e05baccd79277f F test/tt3_vacuum.c 1753f45917699c9c1f66b64c717a717c9379f776 F test/types.test bf816ce73c7dfcfe26b700c19f97ef4050d194ff -F test/types2.test 3555aacf8ed8dc883356e59efc314707e6247a84 +F test/types2.test 1aeb81976841a91eef292723649b5c4fe3bc3cac F test/types3.test 99e009491a54f4dc02c06bdbc0c5eea56ae3e25a F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 F test/unique2.test 3674e9f2a3f1fbbfd4772ac74b7a97090d0f77d2 @@ -1522,7 +1522,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 f5e49855412e389a8a410db5d7ffb2e3634c5fa3 672c21bcf09c5bfb67e061456a56be45409c4f34 -R 66aa92e29e4f871901eff534f575b0fe -U drh -Z af3091527994ed297383eb80433196df +P ed206048484667e4fe6aaeadd65882537d74bd35 +R ebdd3ea482059f46220cc36bb6b2e41e +U dan +Z 13aac770e03afb07d71bee955ff12a59 diff --git a/manifest.uuid b/manifest.uuid index 1b53160d31..7dd209be18 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ed206048484667e4fe6aaeadd65882537d74bd35 \ No newline at end of file +7d9bd22c0715ede2592ee1fa7ebc215aded1ca1b \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 31df95c057..76f0d49081 100644 --- a/src/expr.c +++ b/src/expr.c @@ -61,6 +61,12 @@ char sqlite3ExprAffinity(Expr *pExpr){ if( op==TK_AGG_COLUMN || op==TK_COLUMN ){ return sqlite3TableColumnAffinity(pExpr->pTab, pExpr->iColumn); } + if( op==TK_SELECT_COLUMN ){ + assert( pExpr->pLeft->flags&EP_xIsSelect ); + return sqlite3ExprAffinity( + pExpr->pLeft->x.pSelect->pEList->a[pExpr->iColumn].pExpr + ); + } return pExpr->affinity; } diff --git a/test/rowvalue9.test b/test/rowvalue9.test index 9e01e08932..214eaccb7e 100644 --- a/test/rowvalue9.test +++ b/test/rowvalue9.test @@ -85,33 +85,31 @@ do_execsql_test 1.5.3 { do_execsql_test 1.6.1 { SELECT a1.rowid FROM a1 WHERE (a, b) IN (SELECT x, y FROM a2) } {15 92} - do_execsql_test 1.6.2 { SELECT a1.rowid FROM a1, a2 WHERE EXISTS ( SELECT 1 FROM a1 WHERE a=x AND b=y ) } {3 14 15 92 3 14 15 92} +# Test that [199df416] is fixed. +# do_execsql_test 2.1 { CREATE TABLE b1(a TEXT); CREATE TABLE b2(x BLOB); - INSERT INTO b1 VALUES(1); INSERT INTO b2 VALUES(1); } - do_execsql_test 2.2 { SELECT * FROM b1, b2 WHERE a=x; } {} do_execsql_test 2.3 { SELECT * FROM b1 WHERE a IN (SELECT x FROM b2) } {} - -do_execsql_test 2.4 { - CREATE UNIQUE INDEX b1a ON b1(a); -} +do_execsql_test 2.4 { CREATE UNIQUE INDEX b1a ON b1(a); } do_execsql_test 2.5 { SELECT * FROM b1 WHERE a IN (SELECT x FROM b2) } {} +# Test that a multi-column version of the query that revealed problem +# [199df416] also works. +# do_execsql_test 3.1 { CREATE TABLE c1(a INTEGER, b TEXT); INSERT INTO c1 VALUES(1, 1); - CREATE TABLE c2(x BLOB, y BLOB); INSERT INTO c2 VALUES(1, 1); } @@ -122,23 +120,91 @@ do_execsql_test 3.3 { CREATE UNIQUE INDEX c1ab ON c1(a, b); SELECT * FROM c1 WHERE (a, b) IN (SELECT x, y FROM c2) } {} +do_execsql_test 3.4 { + SELECT * FROM c1 WHERE (a, +b) IN (SELECT x, y FROM c2) +} {} -do_execsql_test 4.0 { - CREATE TABLE d1(a TEXT); - CREATE TABLE d2(x BLOB); - INSERT INTO d1 VALUES(1); - INSERT INTO d2 VALUES(1); -} -do_execsql_test 4.1 { - SELECT * FROM d1 WHERE a IN (SELECT x FROM b2) +do_execsql_test 3.5 { + SELECT c1.rowid FROM c1 WHERE b = (SELECT y FROM c2); } {} -do_execsql_test 4.2 { - CREATE UNIQUE INDEX d1a ON d1(a); -} -do_execsql_test 4.3 { - SELECT * FROM d1 WHERE a IN (SELECT x FROM d2) +do_execsql_test 3.6 { + SELECT c1.rowid FROM c1 WHERE (a, b) = (SELECT x, y FROM c2); } {} +#------------------------------------------------------------------------- +# +do_execsql_test 4.0 { + CREATE TABLE d1(a TEXT, b INTEGER, c NUMERIC); + CREATE TABLE d2(x BLOB, y BLOB); + + INSERT INTO d1 VALUES(1, 1, 1); + INSERT INTO d1 VALUES(2, 2, 2); + INSERT INTO d1 VALUES(3, 3, 3); + INSERT INTO d1 VALUES(4, 4, 4); + + INSERT INTO d2 VALUES (1, 1); + INSERT INTO d2 VALUES (2, '2'); + INSERT INTO d2 VALUES ('3', 3); + INSERT INTO d2 VALUES ('4', '4'); +} + +foreach {tn idx} { + 1 {} + 2 { CREATE INDEX idx ON d1(a) } + 3 { CREATE INDEX idx ON d1(a, c) } + 4 { CREATE INDEX idx ON d1(c) } + 5 { CREATE INDEX idx ON d1(c, a) } + + 6 { + CREATE INDEX idx ON d1(c, a) ; + CREATE INDEX idx1 ON d2(x, y); + } + + 7 { + CREATE INDEX idx ON d1(c, a) ; + CREATE UNIQUE INDEX idx2 ON d2(x, y) ; + } + + 8 { + CREATE INDEX idx ON d1(c) ; + CREATE UNIQUE INDEX idx2 ON d2(x); + } + +} { + execsql { DROP INDEX IF EXISTS idx } + execsql { DROP INDEX IF EXISTS idx2 } + execsql { DROP INDEX IF EXISTS idx3 } + execsql $idx + + do_execsql_test 4.$tn.1 { + SELECT rowid FROM d1 WHERE (a, c) IN (SELECT x, y FROM d2); + } {3 4} + + do_execsql_test 4.$tn.2 { + SELECT rowid FROM d1 WHERE (c, a) IN (SELECT x, y FROM d2); + } {2 4} + + do_execsql_test 4.$tn.3 { + SELECT rowid FROM d1 WHERE (+c, a) IN (SELECT x, y FROM d2); + } {2} + + do_execsql_test 4.$tn.4 { + SELECT rowid FROM d1 WHERE (c, a) = ( + SELECT x, y FROM d2 WHERE d2.rowid=d1.rowid + ); + } {2 4} + + do_execsql_test 4.$tn.5 { + SELECT d1.rowid FROM d1, d2 WHERE a = y; + } {2 4} + + do_execsql_test 4.$tn.6 { + SELECT d1.rowid FROM d1 WHERE a = ( + SELECT y FROM d2 where d2.rowid=d1.rowid + ); + } {2 4} +} + finish_test diff --git a/test/types2.test b/test/types2.test index 4a70aa5fe2..d6d84e65b5 100644 --- a/test/types2.test +++ b/test/types2.test @@ -333,7 +333,7 @@ ifcapable subquery { test_boolset types2-8.8 {o IN (SELECT t FROM t4)} {7} test_boolset types2-8.9 {i IN (SELECT o FROM t4)} {9 10 11 12} test_boolset types2-8.6 {n IN (SELECT o FROM t4)} {9 10 11 12} - test_boolset types2-8.7 {t IN (SELECT o FROM t4)} {9 11} + test_boolset types2-8.7 {t IN (SELECT o FROM t4)} {} test_boolset types2-8.8 {o IN (SELECT o FROM t4)} {9 10} }