You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-12-24 14:20:59 +03:00
Merge pull request #2057 from dhall-MariaDB/MCOL-4719
MCOL-4719 iterate into subquery looking for windowfunctions
This commit is contained in:
@@ -471,22 +471,25 @@ bool SimpleColumn::sameColumn(const ReturnedColumn* rc) const
|
||||
|
||||
void SimpleColumn::setDerivedTable()
|
||||
{
|
||||
if (hasAggregate())
|
||||
if (hasAggregate() || hasWindowFunc())
|
||||
{
|
||||
fDerivedTable = "";
|
||||
return;
|
||||
}
|
||||
ReturnedColumn* rc = dynamic_cast<ReturnedColumn*>(fDerivedRefCol);
|
||||
// @todo make aggregate filter to having clause. not optimize it for now
|
||||
if (rc)
|
||||
{
|
||||
if (rc->hasAggregate() || rc->hasWindowFunc())
|
||||
{
|
||||
fDerivedTable = "";
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// fDerivedTable is set at the parsing phase
|
||||
if (!fSchemaName.empty())
|
||||
fDerivedTable = "";
|
||||
|
||||
// @todo make aggregate filter to having clause. not optimize it for now
|
||||
if (fDerivedRefCol &&
|
||||
// TODO replace with typeid()
|
||||
(dynamic_cast<AggregateColumn*>(fDerivedRefCol) ||
|
||||
dynamic_cast<WindowFunctionColumn*>(fDerivedRefCol)))
|
||||
fDerivedTable = "";
|
||||
}
|
||||
|
||||
bool SimpleColumn::singleTable(CalpontSystemCatalog::TableAliasName& tan)
|
||||
|
||||
@@ -71,11 +71,19 @@ void getWindowFunctionCols(execplan::ParseTree* n, void* obj)
|
||||
if (afc)
|
||||
list->push_back(afc);
|
||||
else if (ac)
|
||||
list->insert(list->end(), ac->windowfunctionColumnList().begin(), ac->windowfunctionColumnList().end());
|
||||
{
|
||||
if (ac->hasWindowFunc()) // adds window functions to list
|
||||
list->insert(list->end(), ac->windowfunctionColumnList().begin(), ac->windowfunctionColumnList().end());
|
||||
}
|
||||
else if (fc)
|
||||
list->insert(list->end(), fc->windowfunctionColumnList().begin(), fc->windowfunctionColumnList().end());
|
||||
{
|
||||
if (fc->hasWindowFunc())
|
||||
list->insert(list->end(), fc->windowfunctionColumnList().begin(), fc->windowfunctionColumnList().end());
|
||||
}
|
||||
else if (sf)
|
||||
{
|
||||
list->insert(list->end(), sf->windowfunctionColumnList().begin(), sf->windowfunctionColumnList().end());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
17
mysql-test/columnstore/bugfixes/mcol_4719.result
Normal file
17
mysql-test/columnstore/bugfixes/mcol_4719.result
Normal file
@@ -0,0 +1,17 @@
|
||||
DROP DATABASE IF EXISTS mcol_4719;
|
||||
CREATE DATABASE mcol_4719;
|
||||
USE mcol_4719;
|
||||
CREATE TABLE test_table (category CHAR(1), count INTEGER(1))ENGINE=COLUMNSTORE;
|
||||
INSERT INTO test_table (category, count) VALUES ('A', 1);
|
||||
INSERT INTO test_table (category, count) VALUES ('A', 2);
|
||||
INSERT INTO test_table (category, count) VALUES ('B', 3);
|
||||
INSERT INTO test_table (category, count) VALUES ('B', 4);
|
||||
select * FROM (SELECT count / SUM(count) OVER (PARTITION BY category) AS ratio FROM test_table) a where ratio > .5;
|
||||
ratio
|
||||
0.6667
|
||||
0.5714
|
||||
select * FROM (SELECT round(0+SUM(count) OVER (PARTITION BY category),3) AS x FROM test_table ) a where x>3;
|
||||
x
|
||||
7.000
|
||||
7.000
|
||||
DROP DATABASE mcol_4719;
|
||||
17
mysql-test/columnstore/bugfixes/mcol_4719.test
Normal file
17
mysql-test/columnstore/bugfixes/mcol_4719.test
Normal file
@@ -0,0 +1,17 @@
|
||||
--source ../include/have_columnstore.inc
|
||||
--disable_warnings
|
||||
DROP DATABASE IF EXISTS mcol_4719;
|
||||
--enable_warnings
|
||||
CREATE DATABASE mcol_4719;
|
||||
USE mcol_4719;
|
||||
CREATE TABLE test_table (category CHAR(1), count INTEGER(1))ENGINE=COLUMNSTORE;
|
||||
INSERT INTO test_table (category, count) VALUES ('A', 1);
|
||||
INSERT INTO test_table (category, count) VALUES ('A', 2);
|
||||
INSERT INTO test_table (category, count) VALUES ('B', 3);
|
||||
INSERT INTO test_table (category, count) VALUES ('B', 4);
|
||||
|
||||
# a subselect with an arithmetic operator on a window function
|
||||
select * FROM (SELECT count / SUM(count) OVER (PARTITION BY category) AS ratio FROM test_table) a where ratio > .5;
|
||||
# a subselect with a function containing an arithmetic operator on a window function
|
||||
select * FROM (SELECT round(0+SUM(count) OVER (PARTITION BY category),3) AS x FROM test_table ) a where x>3;
|
||||
DROP DATABASE mcol_4719;
|
||||
Reference in New Issue
Block a user