diff --git a/src/Storages/MergeTree/RPNBuilder.cpp b/src/Storages/MergeTree/RPNBuilder.cpp index 3ffef1de718..8c5606e9b8a 100644 --- a/src/Storages/MergeTree/RPNBuilder.cpp +++ b/src/Storages/MergeTree/RPNBuilder.cpp @@ -14,7 +14,9 @@ #include #include +#include #include +#include #include @@ -390,6 +392,13 @@ size_t RPNBuilderFunctionTreeNode::getArgumentsSize() const } else { + if (dag_node->function_base->getName() == "indexHint") + { + const auto * adaptor = typeid_cast(dag_node->function_base.get()); + const auto * index_hint = typeid_cast(adaptor->getFunction().get()); + return index_hint->getActions()->getOutputs().size(); + } + return dag_node->children.size(); } } @@ -409,6 +418,13 @@ RPNBuilderTreeNode RPNBuilderFunctionTreeNode::getArgumentAt(size_t index) const } else { + if (dag_node->function_base->getName() == "indexHint") + { + const auto * adaptor = typeid_cast(dag_node->function_base.get()); + const auto * index_hint = typeid_cast(adaptor->getFunction().get()); + return RPNBuilderTreeNode(index_hint->getActions()->getOutputs()[index], tree_context); + } + return RPNBuilderTreeNode(dag_node->children[index], tree_context); } } diff --git a/tests/queries/0_stateless/02962_indexHint_rpn_construction.reference b/tests/queries/0_stateless/02962_indexHint_rpn_construction.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/queries/0_stateless/02962_indexHint_rpn_construction.sql b/tests/queries/0_stateless/02962_indexHint_rpn_construction.sql new file mode 100644 index 00000000000..3532bea57fa --- /dev/null +++ b/tests/queries/0_stateless/02962_indexHint_rpn_construction.sql @@ -0,0 +1,20 @@ +CREATE TABLE tab +( + `foo` Array(LowCardinality(String)), + INDEX idx foo TYPE bloom_filter GRANULARITY 1 +) +ENGINE = MergeTree +PRIMARY KEY tuple(); + +INSERT INTO tab SELECT if(number % 2, ['value'], []) +FROM system.numbers +LIMIT 10000; + +SELECT * +FROM tab +PREWHERE indexHint(indexHint(-1, 0.)) +WHERE has(foo, 'b'); + +SELECT * +FROM tab +PREWHERE indexHint(0);