Skip to content

Commit c11fb64

Browse files
authored
fix(optimizer): ban scalar subquery for project set (risingwavelabs#8519)
1 parent 428354d commit c11fb64

File tree

2 files changed

+11
-4
lines changed

2 files changed

+11
-4
lines changed

src/frontend/planner_test/tests/testdata/subquery.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,3 +353,6 @@
353353
Not supported: streaming nested-loop join
354354
HINT: The non-equal join in the query requires a nested-loop join executor, which could be very expensive to run. Consider rewriting the query to use dynamic filter as a substitute if possible.
355355
See also: https://github.com/risingwavelabs/rfcs/blob/main/rfcs/0033-dynamic-filter.md
356+
- sql: |
357+
SELECT 1, (SELECT regexp_matches('barbeque barbeque', '(bar)(beque)', 'g'))
358+
batch_error: 'internal error: Scalar subquery might produce more than one row.'

src/frontend/src/optimizer/plan_visitor/max_one_row_visitor.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ use std::collections::HashSet;
1616

1717
use crate::optimizer::plan_node::{
1818
LogicalAgg, LogicalApply, LogicalExpand, LogicalFilter, LogicalHopWindow, LogicalLimit,
19-
LogicalNow, LogicalProject, LogicalProjectSet, LogicalTopN, LogicalUnion, LogicalValues,
20-
PlanTreeNodeBinary, PlanTreeNodeUnary,
19+
LogicalNow, LogicalProject, LogicalProjectSet, LogicalScan, LogicalTopN, LogicalUnion,
20+
LogicalValues, PlanTreeNodeBinary, PlanTreeNodeUnary,
2121
};
2222
use crate::optimizer::plan_visitor::PlanVisitor;
2323
use crate::optimizer::PlanTreeNode;
@@ -77,8 +77,12 @@ impl PlanVisitor<bool> for MaxOneRowVisitor {
7777
plan.column_subsets().len() == 1 && self.visit(plan.input())
7878
}
7979

80-
fn visit_logical_project_set(&mut self, plan: &LogicalProjectSet) -> bool {
81-
plan.select_list().len() == 1 && self.visit(plan.input())
80+
fn visit_logical_project_set(&mut self, _plan: &LogicalProjectSet) -> bool {
81+
false
82+
}
83+
84+
fn visit_logical_scan(&mut self, _plan: &LogicalScan) -> bool {
85+
false
8286
}
8387

8488
fn visit_logical_hop_window(&mut self, _plan: &LogicalHopWindow) -> bool {

0 commit comments

Comments
 (0)