Prevent the flattening or where-term push-down optimizations from obscuring

misuses of SQL row values that can lead to crashes or assert() failures.

FossilOrigin-Name: 433d16ff3adfede3be53d5b0e0512f37e225591b
This commit is contained in:
dan
2016-12-07 15:38:37 +00:00
parent 9314bd5fe2
commit 44c5604ced
6 changed files with 96 additions and 46 deletions
+25
View File
@@ -291,6 +291,31 @@ do_execsql_test 14.6 {
SELECT 1 FROM t12 WHERE (1,x) BETWEEN (1,1) AND (3,3)
} {1 1}
#-------------------------------------------------------------------------
# Test that errors are not concealed by the SELECT flattening or
# WHERE-clause push-down optimizations.
do_execsql_test 14.1 {
CREATE TABLE x1(a PRIMARY KEY, b);
CREATE TABLE x2(a INTEGER PRIMARY KEY, b);
}
foreach {tn n sql} {
1 0 "SELECT * FROM (SELECT (1, 1) AS c FROM x1) WHERE c=1"
2 2 "SELECT * FROM (SELECT 1 AS x, (SELECT 8,9) AS y) WHERE y<1"
3 3 "SELECT * FROM (SELECT 1 AS x, (SELECT 8,9,10) AS y) WHERE y<1"
4 0 "SELECT * FROM (SELECT (a, b) AS c FROM x1), x2 WHERE c=a"
5 0 "SELECT * FROM (SELECT a AS c, (1, 2, 3) FROM x1), x2 WHERE c=a"
6 0 "SELECT * FROM (SELECT 1 AS c, (1, 2, 3) FROM x1) WHERE c=1"
} {
if {$n==0} {
set err "row value misused"
} else {
set err "sub-select returns $n columns - expected 1"
}
do_catchsql_test 14.2.$tn $sql [list 1 $err]
}
finish_test