1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-07-30 19:23:07 +03:00

Merge pull request #2670 from denis0x0D/MCOL-5195

MCOL-5195 Correlated subquery with equi/non-equi scalar filter and join condition
This commit is contained in:
Roman Nozdrin
2023-01-19 13:35:08 +03:00
committed by GitHub
3 changed files with 86 additions and 28 deletions

View File

@ -275,34 +275,6 @@ execplan::ParseTree* ScalarSub::buildParseTree(PredicateOperator* op)
fGwip.subselectList.push_back(csep);
// error out non-support case for now: comparison out of semi join tables.
// only check for simplecolumn
if (!gwi.correlatedTbNameVec.empty())
{
for (uint32_t i = 0; i < cols.size(); i++)
{
SimpleColumn* sc = dynamic_cast<SimpleColumn*>(cols[i].get());
if (sc)
{
CalpontSystemCatalog::TableAliasName tan =
make_aliastable(sc->schemaName(), sc->tableName(), sc->tableAlias());
uint32_t j = 0;
for (; j < gwi.correlatedTbNameVec.size(); j++)
if (tan == gwi.correlatedTbNameVec[j])
break;
if (j == gwi.correlatedTbNameVec.size())
{
fGwip.fatalParseError = true;
fGwip.parseErrorText = IDBErrorInfo::instance()->errorMsg(ERR_NON_SUPPORT_SCALAR);
return NULL;
}
}
}
}
// remove outer query tables
CalpontSelectExecutionPlan::TableList tblist;

View File

@ -0,0 +1,58 @@
DROP DATABASE IF EXISTS mcol5195;
CREATE DATABASE mcol5195;
USE mcol5195;
create table t1 (a int, b int) engine=columnstore;
create table t2 (a int, b int) engine=columnstore;
insert into t1 values (1, 2), (1, 3), (1, 4), (2, 5), (2, 6), (2, 7);
insert into t2 values (1, 2), (1, 2), (1, 4), (2, 5), (2, 6), (2, 8);
select * from t1, t2 where t1.a = t2.a and t2.b = (select max(b) from t2 where t1.a = t2.a) order by t2.b;
a b a b
1 4 1 4
1 2 1 4
1 3 1 4
2 7 2 8
2 5 2 8
2 6 2 8
select * from t1, t2 where t1.a = t2.a and t2.b < (select max(b) from t2 where t1.a = t2.a) order by t2.b;
a b a b
1 3 1 2
1 4 1 2
1 2 1 2
1 4 1 2
1 2 1 2
1 3 1 2
2 6 2 5
2 5 2 5
2 7 2 5
2 5 2 6
2 6 2 6
2 7 2 6
select * from t1, t2 where t1.a = t2.a and t2.b > (select max(b) from t2 where t1.a = t2.a) order by t2.b;
a b a b
select * from t1, t2 where t1.a = t2.a and t1.b = (select avg(t2.b) from t2 where t1.a = t2.a group by t2.a) order by t2.b;
a b a b
select * from t1, t2 where t1.a = t2.a and t2.b < (select avg(t2.b) from t2 where t1.a = t2.a group by t2.a) order by t2.b;
a b a b
1 3 1 2
1 4 1 2
1 2 1 2
1 4 1 2
1 2 1 2
1 3 1 2
2 6 2 5
2 5 2 5
2 7 2 5
2 5 2 6
2 6 2 6
2 7 2 6
select * from t1, t2 where t1.a = t2.a and t2.b > (select avg(t2.b) from t2 where t1.a = t2.a group by t2.a) order by t2.b;
a b a b
1 4 1 4
1 2 1 4
1 3 1 4
2 7 2 8
2 5 2 8
2 6 2 8
drop table t1;
drop table t2;
DROP DATABASE mcol5195;

View File

@ -0,0 +1,28 @@
#-- source ../include/have_innodb.inc
--disable_warnings
DROP DATABASE IF EXISTS mcol5195;
--enable_warnings
CREATE DATABASE mcol5195;
USE mcol5195;
create table t1 (a int, b int) engine=columnstore;
create table t2 (a int, b int) engine=columnstore;
insert into t1 values (1, 2), (1, 3), (1, 4), (2, 5), (2, 6), (2, 7);
insert into t2 values (1, 2), (1, 2), (1, 4), (2, 5), (2, 6), (2, 8);
select * from t1, t2 where t1.a = t2.a and t2.b = (select max(b) from t2 where t1.a = t2.a) order by t2.b;
select * from t1, t2 where t1.a = t2.a and t2.b < (select max(b) from t2 where t1.a = t2.a) order by t2.b;
select * from t1, t2 where t1.a = t2.a and t2.b > (select max(b) from t2 where t1.a = t2.a) order by t2.b;
select * from t1, t2 where t1.a = t2.a and t1.b = (select avg(t2.b) from t2 where t1.a = t2.a group by t2.a) order by t2.b;
select * from t1, t2 where t1.a = t2.a and t2.b < (select avg(t2.b) from t2 where t1.a = t2.a group by t2.a) order by t2.b;
select * from t1, t2 where t1.a = t2.a and t2.b > (select avg(t2.b) from t2 where t1.a = t2.a group by t2.a) order by t2.b;
drop table t1;
drop table t2;
DROP DATABASE mcol5195;