From 1a0f17cb2c3e8b67ff6cf8b6281ef8a9afacacf2 Mon Sep 17 00:00:00 2001 From: Nikolai Kochetov Date: Mon, 25 Nov 2019 17:33:54 +0300 Subject: [PATCH] Fix reading empty set with prewhere dependent on alias column. --- .../Interpreters/InterpreterSelectQuery.cpp | 11 ++++++ .../01035_prewhere_with_alias.reference | 0 .../0_stateless/01035_prewhere_with_alias.sql | 36 +++++++++++++++++++ .../queries/bugs/prewhere_with_alias.sql | 6 ---- 4 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 dbms/tests/queries/0_stateless/01035_prewhere_with_alias.reference create mode 100644 dbms/tests/queries/0_stateless/01035_prewhere_with_alias.sql delete mode 100644 dbms/tests/queries/bugs/prewhere_with_alias.sql diff --git a/dbms/src/Interpreters/InterpreterSelectQuery.cpp b/dbms/src/Interpreters/InterpreterSelectQuery.cpp index f925a120b9..172965433e 100644 --- a/dbms/src/Interpreters/InterpreterSelectQuery.cpp +++ b/dbms/src/Interpreters/InterpreterSelectQuery.cpp @@ -1694,6 +1694,13 @@ void InterpreterSelectQuery::executeFetchColumns( if (query_info.prewhere_info) { + if (query_info.prewhere_info->alias_actions) + { + streams.back() = std::make_shared( + streams.back(), + query_info.prewhere_info->alias_actions); + } + streams.back() = std::make_shared( streams.back(), prewhere_info->prewhere_actions, @@ -1718,6 +1725,10 @@ void InterpreterSelectQuery::executeFetchColumns( if (query_info.prewhere_info) { + if (query_info.prewhere_info->alias_actions) + pipe.addSimpleTransform(std::make_shared( + pipe.getHeader(), query_info.prewhere_info->alias_actions)); + pipe.addSimpleTransform(std::make_shared( pipe.getHeader(), prewhere_info->prewhere_actions, diff --git a/dbms/tests/queries/0_stateless/01035_prewhere_with_alias.reference b/dbms/tests/queries/0_stateless/01035_prewhere_with_alias.reference new file mode 100644 index 0000000000..e69de29bb2 diff --git a/dbms/tests/queries/0_stateless/01035_prewhere_with_alias.sql b/dbms/tests/queries/0_stateless/01035_prewhere_with_alias.sql new file mode 100644 index 0000000000..6ce5350d18 --- /dev/null +++ b/dbms/tests/queries/0_stateless/01035_prewhere_with_alias.sql @@ -0,0 +1,36 @@ +DROP TABLE IF EXISTS test; +CREATE TABLE test (a UInt8, b UInt8, c UInt16 ALIAS a + b) ENGINE = MergeTree ORDER BY a; + +SELECT b FROM test PREWHERE c = 1; + +DROP TABLE test; + +drop table if exists audience_local; +create table audience_local +( + Date Date, + AudienceType Enum8('other' = 0, 'client' = 1, 'group' = 2), + UMA UInt64, + APIKey String, + TrialNameID UInt32, + TrialGroupID UInt32, + AppVersion String, + Arch Enum8('other' = 0, 'x32' = 1, 'x64' = 2), + UserID UInt32, + GroupID UInt8, + OSName Enum8('other' = 0, 'Android' = 1, 'iOS' = 2, 'macOS' = 3, 'Windows' = 4, 'Linux' = 5), + Channel Enum8('other' = 0, 'Canary' = 1, 'Dev' = 2, 'Beta' = 3, 'Stable' = 4), + Hits UInt64, + Sum Int64, + Release String alias splitByChar('-', AppVersion)[1] +) +engine = SummingMergeTree +PARTITION BY (toISOYear(Date), toISOWeek(Date)) +ORDER BY (AudienceType, UMA, APIKey, Date, TrialNameID, TrialGroupID, AppVersion, Arch, UserID, GroupID, OSName, Channel) +SETTINGS index_granularity = 8192; + +SELECT DISTINCT UserID +FROM audience_local +PREWHERE Date = toDate('2019-07-25') AND Release = '17.11.0.542'; + +drop table if exists audience_local; diff --git a/dbms/tests/queries/bugs/prewhere_with_alias.sql b/dbms/tests/queries/bugs/prewhere_with_alias.sql deleted file mode 100644 index 55a5e61ade..0000000000 --- a/dbms/tests/queries/bugs/prewhere_with_alias.sql +++ /dev/null @@ -1,6 +0,0 @@ -DROP TABLE IF EXISTS test.test; -CREATE TABLE test.test (a UInt8, b UInt8, c UInt16 ALIAS a + b) ENGINE = MergeTree ORDER BY a; - -SELECT b FROM test.test PREWHERE c = 1; - -DROP TABLE test; -- GitLab