mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 10:14:19 +01:00
Manual merge of the fix for bug #54190 and the addendum patch
to 5.5 (removed one test case as it is no longer valid). mysql-test/r/select.result: Removed a part of the test case for bug#48291 since it is not valid anymore. The comments for the removed part were actually describing a side-effect from the problem addressed by the addendum patch for bug #54190. mysql-test/t/select.test: Removed a part of the test case for bug#48291 since it is not valid anymore. The comments for the removed part were actually describing a side-effect from the problem addressed by the addendum patch for bug #54190.
This commit is contained in:
commit
56d2940186
8 changed files with 59 additions and 14 deletions
|
@ -466,3 +466,26 @@ SELECT 1 FROM t1 WHERE ROW(a, b) >=
|
|||
ROW('1', (SELECT 1 FROM t1 WHERE a > 1234));
|
||||
1
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug #54190: Comparison to row subquery produces incorrect result
|
||||
#
|
||||
SELECT ROW(1,2) = (SELECT 1,2 FROM DUAL WHERE 1 = 0);
|
||||
ROW(1,2) = (SELECT 1,2 FROM DUAL WHERE 1 = 0)
|
||||
NULL
|
||||
SELECT ROW(1,2) = (SELECT 1,3 FROM DUAL WHERE 1 = 0);
|
||||
ROW(1,2) = (SELECT 1,3 FROM DUAL WHERE 1 = 0)
|
||||
NULL
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 () VALUES (1), (2), (3);
|
||||
SELECT ROW(1,2) = (SELECT 1,2 FROM t1 WHERE 1 = 0);
|
||||
ROW(1,2) = (SELECT 1,2 FROM t1 WHERE 1 = 0)
|
||||
NULL
|
||||
SELECT ROW(1,2) = (SELECT 1,3 FROM t1 WHERE 1 = 0);
|
||||
ROW(1,2) = (SELECT 1,3 FROM t1 WHERE 1 = 0)
|
||||
NULL
|
||||
SELECT i FROM t1 WHERE ROW(1,2) = (SELECT 1,2 FROM DUAL WHERE 1 = 0);
|
||||
i
|
||||
SELECT i FROM t1 WHERE ROW(1,2) = (SELECT 1,3 FROM DUAL WHERE 1 = 0);
|
||||
i
|
||||
DROP TABLE t1;
|
||||
End of 5.1 tests
|
||||
|
|
|
@ -4430,11 +4430,6 @@ SELECT 1 FROM t1 WHERE a <> 1 AND NOT
|
|||
ROW(1,a) <=> ROW(1,(SELECT 1 FROM t1))
|
||||
INTO @var0;
|
||||
ERROR 21000: Subquery returns more than 1 row
|
||||
SELECT 1 FROM t1 WHERE a <> 1 AND NOT
|
||||
ROW(a,a) <=> ROW((SELECT 1 FROM t1 WHERE 1=2),(SELECT 1 FROM t1));
|
||||
1
|
||||
1
|
||||
1
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug #48458: simple query tries to allocate enormous amount of
|
||||
|
|
|
@ -922,7 +922,7 @@ select a, (select a,b,c from t1 where t1.a=t2.a) = ROW(a,2,'a'),(select c from t
|
|||
a (select a,b,c from t1 where t1.a=t2.a) = ROW(a,2,'a') (select c from t1 where a=t2.a)
|
||||
1 1 a
|
||||
2 0 b
|
||||
NULL 0 NULL
|
||||
NULL NULL NULL
|
||||
select a, (select a,b,c from t1 where t1.a=t2.a) = ROW(a,3,'b'),(select c from t1 where a=t2.a) from t2;
|
||||
a (select a,b,c from t1 where t1.a=t2.a) = ROW(a,3,'b') (select c from t1 where a=t2.a)
|
||||
1 0 a
|
||||
|
@ -932,7 +932,7 @@ select a, (select a,b,c from t1 where t1.a=t2.a) = ROW(a,4,'c'),(select c from t
|
|||
a (select a,b,c from t1 where t1.a=t2.a) = ROW(a,4,'c') (select c from t1 where a=t2.a)
|
||||
1 0 a
|
||||
2 0 b
|
||||
NULL 0 NULL
|
||||
NULL NULL NULL
|
||||
drop table t1,t2;
|
||||
create table t1 (a int, b real, c varchar(10));
|
||||
insert into t1 values (1, 1, 'a'), (2,2,'b'), (NULL, 2, 'b');
|
||||
|
|
|
@ -266,3 +266,22 @@ SELECT 1 FROM t1 WHERE ROW(a, b) >=
|
|||
ROW('1', (SELECT 1 FROM t1 WHERE a > 1234));
|
||||
--enable_warnings
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug #54190: Comparison to row subquery produces incorrect result
|
||||
--echo #
|
||||
|
||||
SELECT ROW(1,2) = (SELECT 1,2 FROM DUAL WHERE 1 = 0);
|
||||
SELECT ROW(1,2) = (SELECT 1,3 FROM DUAL WHERE 1 = 0);
|
||||
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 () VALUES (1), (2), (3);
|
||||
|
||||
SELECT ROW(1,2) = (SELECT 1,2 FROM t1 WHERE 1 = 0);
|
||||
SELECT ROW(1,2) = (SELECT 1,3 FROM t1 WHERE 1 = 0);
|
||||
SELECT i FROM t1 WHERE ROW(1,2) = (SELECT 1,2 FROM DUAL WHERE 1 = 0);
|
||||
SELECT i FROM t1 WHERE ROW(1,2) = (SELECT 1,3 FROM DUAL WHERE 1 = 0);
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
|
|
@ -3772,11 +3772,6 @@ SELECT 1 FROM t1 WHERE a <> 1 AND NOT
|
|||
ROW(1,a) <=> ROW(1,(SELECT 1 FROM t1))
|
||||
INTO @var0;
|
||||
|
||||
# Query correctly return 2 rows since comparison a <=> fisrt_subquery is
|
||||
# always false, thus the second query is never executed.
|
||||
SELECT 1 FROM t1 WHERE a <> 1 AND NOT
|
||||
ROW(a,a) <=> ROW((SELECT 1 FROM t1 WHERE 1=2),(SELECT 1 FROM t1));
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
|
|
|
@ -7850,9 +7850,12 @@ bool Item_cache_row::null_inside()
|
|||
|
||||
void Item_cache_row::bring_value()
|
||||
{
|
||||
if (!example)
|
||||
return;
|
||||
example->bring_value();
|
||||
null_value= example->null_value;
|
||||
for (uint i= 0; i < item_count; i++)
|
||||
values[i]->bring_value();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1595,6 +1595,13 @@ int Arg_comparator::compare_row()
|
|||
bool was_null= 0;
|
||||
(*a)->bring_value();
|
||||
(*b)->bring_value();
|
||||
|
||||
if ((*a)->null_value || (*b)->null_value)
|
||||
{
|
||||
owner->null_value= 1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
uint n= (*a)->cols();
|
||||
for (uint i= 0; i<n; i++)
|
||||
{
|
||||
|
|
|
@ -574,7 +574,10 @@ bool Item_singlerow_subselect::null_inside()
|
|||
|
||||
void Item_singlerow_subselect::bring_value()
|
||||
{
|
||||
exec();
|
||||
if (!exec() && assigned())
|
||||
null_value= 0;
|
||||
else
|
||||
reset();
|
||||
}
|
||||
|
||||
double Item_singlerow_subselect::val_real()
|
||||
|
|
Loading…
Add table
Reference in a new issue