mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-19 16:20:50 +00:00
Merge pull request #68951 from CurtizJ/fix-subcolumns-mv
Fix materialized views with `optimize_functions_to_subcolumns`
This commit is contained in:
commit
b3dae16fd4
@ -209,7 +209,7 @@ std::map<std::pair<TypeIndex, String>, NodeToSubcolumnTransformer> node_transfor
|
||||
},
|
||||
};
|
||||
|
||||
std::tuple<FunctionNode *, ColumnNode *, TableNode *> getTypedNodesForOptimization(const QueryTreeNodePtr & node)
|
||||
std::tuple<FunctionNode *, ColumnNode *, TableNode *> getTypedNodesForOptimization(const QueryTreeNodePtr & node, const ContextPtr & context)
|
||||
{
|
||||
auto * function_node = node->as<FunctionNode>();
|
||||
if (!function_node)
|
||||
@ -232,6 +232,12 @@ std::tuple<FunctionNode *, ColumnNode *, TableNode *> getTypedNodesForOptimizati
|
||||
const auto & storage_snapshot = table_node->getStorageSnapshot();
|
||||
auto column = first_argument_column_node->getColumn();
|
||||
|
||||
/// If view source is set we cannot optimize because it doesn't support moving functions to subcolumns.
|
||||
/// The storage is replaced to the view source but it happens only after building a query tree and applying passes.
|
||||
auto view_source = context->getViewSource();
|
||||
if (view_source && view_source->getStorageID().getFullNameNotQuoted() == storage->getStorageID().getFullNameNotQuoted())
|
||||
return {};
|
||||
|
||||
if (!storage->supportsOptimizationToSubcolumns() || storage->isVirtualColumn(column.name, storage_snapshot->metadata))
|
||||
return {};
|
||||
|
||||
@ -266,7 +272,7 @@ public:
|
||||
return;
|
||||
}
|
||||
|
||||
auto [function_node, first_argument_node, table_node] = getTypedNodesForOptimization(node);
|
||||
auto [function_node, first_argument_node, table_node] = getTypedNodesForOptimization(node, getContext());
|
||||
if (function_node && first_argument_node && table_node)
|
||||
{
|
||||
enterImpl(*function_node, *first_argument_node, *table_node);
|
||||
@ -416,7 +422,7 @@ public:
|
||||
if (!getSettings().optimize_functions_to_subcolumns)
|
||||
return;
|
||||
|
||||
auto [function_node, first_argument_column_node, table_node] = getTypedNodesForOptimization(node);
|
||||
auto [function_node, first_argument_column_node, table_node] = getTypedNodesForOptimization(node, getContext());
|
||||
if (!function_node || !first_argument_column_node || !table_node)
|
||||
return;
|
||||
|
||||
|
1
tests/queries/0_stateless/03230_subcolumns_mv.reference
Normal file
1
tests/queries/0_stateless/03230_subcolumns_mv.reference
Normal file
@ -0,0 +1 @@
|
||||
['key1','key2'] ['value1','value2']
|
37
tests/queries/0_stateless/03230_subcolumns_mv.sql
Normal file
37
tests/queries/0_stateless/03230_subcolumns_mv.sql
Normal file
@ -0,0 +1,37 @@
|
||||
DROP TABLE IF EXISTS rawtable;
|
||||
DROP TABLE IF EXISTS raw_to_attributes_mv;
|
||||
DROP TABLE IF EXISTS attributes;
|
||||
|
||||
SET optimize_functions_to_subcolumns = 1;
|
||||
|
||||
CREATE TABLE rawtable
|
||||
(
|
||||
`Attributes` Map(String, String),
|
||||
)
|
||||
ENGINE = MergeTree
|
||||
ORDER BY tuple();
|
||||
|
||||
CREATE MATERIALIZED VIEW raw_to_attributes_mv TO attributes
|
||||
(
|
||||
`AttributeKeys` Array(String),
|
||||
`AttributeValues` Array(String)
|
||||
)
|
||||
AS SELECT
|
||||
mapKeys(Attributes) AS AttributeKeys,
|
||||
mapValues(Attributes) AS AttributeValues
|
||||
FROM rawtable;
|
||||
|
||||
CREATE TABLE attributes
|
||||
(
|
||||
`AttributeKeys` Array(String),
|
||||
`AttributeValues` Array(String)
|
||||
)
|
||||
ENGINE = ReplacingMergeTree
|
||||
ORDER BY tuple();
|
||||
|
||||
INSERT INTO rawtable VALUES ({'key1': 'value1', 'key2': 'value2'});
|
||||
SELECT * FROM raw_to_attributes_mv ORDER BY AttributeKeys;
|
||||
|
||||
DROP TABLE IF EXISTS rawtable;
|
||||
DROP TABLE IF EXISTS raw_to_attributes_mv;
|
||||
DROP TABLE IF EXISTS attributes;
|
Loading…
Reference in New Issue
Block a user