@@ -126,8 +126,8 @@ bool shouldIgnoreQuotaAndLimits(const TableNode & table_node)
126126 return false ;
127127 if (storage_id.database_name == DatabaseCatalog::SYSTEM_DATABASE)
128128 {
129- static const boost::container::flat_set<String > tables_ignoring_quota{" quotas" , " quota_limits" , " quota_usage" , " quotas_usage" , " one" };
130- if (tables_ignoring_quota.count (storage_id.table_name ))
129+ static const boost::container::flat_set<std::string_view > tables_ignoring_quota{" quotas" , " quota_limits" , " quota_usage" , " quotas_usage" , " one" };
130+ if (tables_ignoring_quota.contains (storage_id.table_name ))
131131 return true ;
132132 }
133133 return false ;
@@ -441,7 +441,8 @@ void updatePrewhereOutputsIfNeeded(SelectQueryInfo & table_expression_query_info
441441
442442FilterDAGInfo buildRowPolicyFilterIfNeeded (const StoragePtr & storage,
443443 SelectQueryInfo & table_expression_query_info,
444- PlannerContextPtr & planner_context)
444+ PlannerContextPtr & planner_context,
445+ std::set<std::string> & used_row_policies)
445446{
446447 auto storage_id = storage->getStorageID ();
447448 const auto & query_context = planner_context->getQueryContext ();
@@ -450,6 +451,12 @@ FilterDAGInfo buildRowPolicyFilterIfNeeded(const StoragePtr & storage,
450451 if (!row_policy_filter || row_policy_filter->empty ())
451452 return {};
452453
454+ for (const auto & row_policy : row_policy_filter->policies )
455+ {
456+ auto name = row_policy->getFullName ().toString ();
457+ used_row_policies.emplace (std::move (name));
458+ }
459+
453460 return buildFilterInfo (row_policy_filter->expression , table_expression_query_info.table_expression , planner_context);
454461}
455462
@@ -586,6 +593,7 @@ JoinTreeQueryPlan buildQueryPlanForTableExpression(QueryTreeNodePtr table_expres
586593 auto * union_node = table_expression->as <UnionNode>();
587594
588595 QueryPlan query_plan;
596+ std::set<std::string> used_row_policies;
589597
590598 if (table_node || table_function_node)
591599 {
@@ -781,7 +789,7 @@ JoinTreeQueryPlan buildQueryPlanForTableExpression(QueryTreeNodePtr table_expres
781789 }
782790 };
783791
784- auto row_policy_filter_info = buildRowPolicyFilterIfNeeded (storage, table_expression_query_info, planner_context);
792+ auto row_policy_filter_info = buildRowPolicyFilterIfNeeded (storage, table_expression_query_info, planner_context, used_row_policies );
785793 add_filter (row_policy_filter_info, " Row-level security filter" );
786794 if (row_policy_filter_info.actions )
787795 table_expression_data.setRowLevelFilterActions (row_policy_filter_info.actions );
@@ -940,7 +948,7 @@ JoinTreeQueryPlan buildQueryPlanForTableExpression(QueryTreeNodePtr table_expres
940948 }
941949 }
942950
943- return {std::move (query_plan), from_stage};
951+ return {std::move (query_plan), from_stage, std::move (used_row_policies) };
944952}
945953
946954JoinTreeQueryPlan buildQueryPlanForJoinNode (const QueryTreeNodePtr & join_table_expression,
@@ -1399,7 +1407,10 @@ JoinTreeQueryPlan buildQueryPlanForJoinNode(const QueryTreeNodePtr & join_table_
13991407 drop_unused_columns_after_join_transform_step->setStepDescription (" DROP unused columns after JOIN" );
14001408 result_plan.addStep (std::move (drop_unused_columns_after_join_transform_step));
14011409
1402- return {std::move (result_plan), QueryProcessingStage::FetchColumns};
1410+ for (const auto & right_join_tree_query_plan_row_policy : right_join_tree_query_plan.used_row_policies )
1411+ left_join_tree_query_plan.used_row_policies .insert (right_join_tree_query_plan_row_policy);
1412+
1413+ return {std::move (result_plan), QueryProcessingStage::FetchColumns, std::move (left_join_tree_query_plan.used_row_policies )};
14031414}
14041415
14051416JoinTreeQueryPlan buildQueryPlanForArrayJoinNode (const QueryTreeNodePtr & array_join_table_expression,
@@ -1477,7 +1488,7 @@ JoinTreeQueryPlan buildQueryPlanForArrayJoinNode(const QueryTreeNodePtr & array_
14771488 array_join_step->setStepDescription (" ARRAY JOIN" );
14781489 plan.addStep (std::move (array_join_step));
14791490
1480- return {std::move (plan), QueryProcessingStage::FetchColumns};
1491+ return {std::move (plan), QueryProcessingStage::FetchColumns, std::move (join_tree_query_plan. used_row_policies ) };
14811492}
14821493
14831494}
0 commit comments