Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,31 @@ static ReadFromMergeTree * findReadingStep(QueryPlan::Node & node, StepStack & b
return nullptr;
}

bool allExpressionsSuitableForLazyMaterialization(const QueryPlan::Node * node)
{
while (!node->children.empty())
{
if (const auto * expr_step = typeid_cast<ExpressionStep *>(node->step.get()))
{
if (expr_step->getExpression().hasArrayJoin())
return false;
}
else if (const auto * filter_step = typeid_cast<FilterStep *>(node->step.get()))
{
if (filter_step->getExpression().hasArrayJoin())
return false;
}
else
{
return false;
}

node = node->children.front();
}

return true;
}

bool optimizeLazyMaterialization2(QueryPlan::Node & root, QueryPlan & query_plan, QueryPlan::Nodes & nodes, const QueryPlanOptimizationSettings & settings, size_t max_limit_for_lazy_materialization)
{
if (root.children.size() != 1)
Expand Down Expand Up @@ -318,6 +343,9 @@ bool optimizeLazyMaterialization2(QueryPlan::Node & root, QueryPlan & query_plan
if (!canUseLazyMaterializationForReadingStep(reading_step))
return false;

if (!allExpressionsSuitableForLazyMaterialization(sorting_node->children.front()))
return false;

const auto & sorting_header = *sorting_step->getOutputHeader();
std::vector<bool> required_columns(sorting_header.columns(), false);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
[('2',2),('2',2)]
[('3',3),('3',3),('3',3)]
----------------------
[('2',2),('2',2)]
[('3',3),('3',3),('3',3)]
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
SET query_plan_optimize_lazy_materialization = 1;
SET flatten_nested = 0;

DROP TABLE IF EXISTS t0;
CREATE TABLE t0
(
id UInt32,
col1 Nested(a UInt32, n Nested(s String, b UInt32))
)
ENGINE = MergeTree
ORDER BY id;

INSERT INTO t0 SELECT number, arrayMap(x -> (x, arrayMap(y -> (toString(number), number), range(number))), range(number)) FROM numbers(10);

SELECT arrayJoin(col1.n) as e FROM t0 ORDER BY id LIMIT 2 OFFSET 2;

SELECT '----------------------';

SELECT arrayJoin(col1.n) as e FROM t0 ORDER BY id LIMIT 2 OFFSET 2 SETTINGS optimize_read_in_order=0, query_plan_execute_functions_after_sorting=0;
Loading