@@ -159,8 +159,11 @@ class DistributedPlanner {
159159 agg_child = agg_child->left ;
160160 }
161161 if (agg_child && agg_child->type == PlanNodeType::AGGREGATE ) {
162- push_agg_exprs_from_project (node, agg_child);
163- PlanNode* dist_agg = distribute_aggregate (agg_child);
162+ PlanNode* agg_copy = make_plan_node (arena_, PlanNodeType::AGGREGATE );
163+ agg_copy->aggregate = agg_child->aggregate ;
164+ agg_copy->left = agg_child->left ;
165+ push_agg_exprs_from_project (node, agg_copy);
166+ PlanNode* dist_agg = distribute_aggregate (agg_copy);
164167 if (dist_agg && (dist_agg->type == PlanNodeType::MERGE_AGGREGATE ||
165168 dist_agg->type == PlanNodeType::AGGREGATE )) {
166169 PlanNode* top = dist_agg;
@@ -1193,7 +1196,8 @@ class DistributedPlanner {
11931196 PlanNode* current = nullptr ;
11941197 for (const auto & shard : shard_list) {
11951198 sql_parser::StringRef sql = qb_.build_select_join (
1196- left_table, right_table, join_node->join .condition , where_expr);
1199+ left_table, right_table, join_node->join .condition , where_expr,
1200+ join_node->join .join_type );
11971201 PlanNode* rs = make_remote_scan (shard.backend_name .c_str (), sql, left_table);
11981202 if (!current) {
11991203 current = rs;
@@ -1310,6 +1314,7 @@ class DistributedPlanner {
13101314 const TableInfo* right_table) {
13111315 if (!join_node || !remote_executor_ || !join_node->join .condition )
13121316 return nullptr ;
1317+ if (join_node->join .join_type != JOIN_INNER ) return nullptr ;
13131318 if (!left_table || !right_table) return nullptr ;
13141319
13151320 bool ls = shards_.is_sharded (left_table->table_name );
@@ -1659,7 +1664,7 @@ class DistributedPlanner {
16591664 sql_parser::StringRef shard_key) const {
16601665 if (!set_columns || !shard_key.ptr ) return false ;
16611666 for (uint16_t i = 0 ; i < set_count; ++i) {
1662- if (is_column_ref (set_columns[i], shard_key)) return true ;
1667+ if (is_shard_key_ref (set_columns[i], shard_key)) return true ;
16631668 }
16641669 return false ;
16651670 }
@@ -1844,7 +1849,7 @@ class DistributedPlanner {
18441849 auto resolve = make_resolver (catalog_, table, src.values );
18451850 for (uint16_t i = 0 ; i < set_count; ++i) {
18461851 if (!set_cols[i]) continue ;
1847- const ColumnInfo* col = catalog_.get_column (table, set_cols[i]-> value ( ));
1852+ const ColumnInfo* col = catalog_.get_column (table, set_col_name ( set_cols[i]));
18481853 if (!col) continue ;
18491854 Value nv = value_null ();
18501855 if (functions_) {
@@ -1950,9 +1955,7 @@ class DistributedPlanner {
19501955 }
19511956
19521957 if (moves.empty ()) {
1953- sql_parser::StringRef sql = qb_.build_update (
1954- table, up.set_columns , up.set_exprs , up.set_count , where_expr);
1955- return make_remote_scan (pruned[0 ].backend_name .c_str (), sql, table);
1958+ return make_noop_update (table, pruned[0 ].backend_name .c_str ());
19561959 }
19571960
19581961 bool any_move = false ;
@@ -1999,6 +2002,31 @@ class DistributedPlanner {
19992002 return current ? current : plan;
20002003 }
20012004
2005+ static sql_parser::StringRef set_col_name (const sql_parser::AstNode* node) {
2006+ if (!node) return sql_parser::StringRef{nullptr , 0 };
2007+ if (node->type == sql_parser::NodeType::NODE_QUALIFIED_NAME ) {
2008+ const sql_parser::AstNode* c = node->first_child ;
2009+ if (c && c->next_sibling ) return c->next_sibling ->value ();
2010+ }
2011+ return node->value ();
2012+ }
2013+
2014+ PlanNode* make_noop_update (const TableInfo* table, const char * backend) {
2015+ sql_parser::StringBuilder sb (arena_, 64 );
2016+ sb.append (" UPDATE " );
2017+ if (table) sb.append (table->table_name .ptr , table->table_name .len );
2018+ sb.append (" SET " );
2019+ if (table && table->column_count > 0 ) {
2020+ sb.append (table->columns [0 ].name .ptr , table->columns [0 ].name .len );
2021+ sb.append (" = " );
2022+ sb.append (table->columns [0 ].name .ptr , table->columns [0 ].name .len );
2023+ } else {
2024+ sb.append (" id = id" );
2025+ }
2026+ sb.append (" WHERE 1 = 0" );
2027+ return make_remote_scan (backend, sb.finish (), table);
2028+ }
2029+
20022030 bool is_column_ref (const sql_parser::AstNode* node, sql_parser::StringRef col_name) const {
20032031 if (!node) return false ;
20042032 if (node->type == sql_parser::NodeType::NODE_COLUMN_REF ||
@@ -2175,7 +2203,7 @@ class DistributedPlanner {
21752203
21762204 for (const auto & row : rs.rows ) {
21772205 if (row.column_count > 0 ) {
2178- result.push_back (row.get (0 ));
2206+ result.push_back (copy_value_arena ( row.get (0 ) ));
21792207 }
21802208 }
21812209 return result;
@@ -2249,8 +2277,9 @@ class DistributedPlanner {
22492277 lit = sql_parser::make_node (arena_, sql_parser::NodeType::NODE_LITERAL_INT ,
22502278 sql_parser::StringRef{s, static_cast <uint32_t >(n)});
22512279 } else if (v.tag == Value::TAG_STRING && v.str_val .ptr ) {
2280+ Value owned = copy_value_arena (v);
22522281 lit = sql_parser::make_node (arena_, sql_parser::NodeType::NODE_LITERAL_STRING ,
2253- v .str_val );
2282+ owned .str_val );
22542283 } else if (v.tag == Value::TAG_DOUBLE ) {
22552284 char buf[64 ];
22562285 int n = snprintf (buf, sizeof (buf), " %g" , v.double_val );
@@ -2269,6 +2298,19 @@ class DistributedPlanner {
22692298 return new_in;
22702299 }
22712300
2301+ sql_parser::AstNode* make_false_pred () {
2302+ sql_parser::AstNode* eq = sql_parser::make_node (
2303+ arena_, sql_parser::NodeType::NODE_BINARY_OP ,
2304+ sql_parser::StringRef{" =" , 1 });
2305+ eq->add_child (sql_parser::make_node (
2306+ arena_, sql_parser::NodeType::NODE_LITERAL_INT ,
2307+ sql_parser::StringRef{" 0" , 1 }));
2308+ eq->add_child (sql_parser::make_node (
2309+ arena_, sql_parser::NodeType::NODE_LITERAL_INT ,
2310+ sql_parser::StringRef{" 1" , 1 }));
2311+ return eq;
2312+ }
2313+
22722314 // Rewrite a WHERE expression by replacing the first IN (subquery) with IN (literals).
22732315 // Returns the rewritten expression, or the original if no rewrite needed.
22742316 const sql_parser::AstNode* rewrite_where_subquery (
@@ -2286,7 +2328,7 @@ class DistributedPlanner {
22862328 if (!values.empty ()) {
22872329 return build_in_list_from_values (where_expr, values);
22882330 }
2289- return where_expr ;
2331+ return make_false_pred () ;
22902332 }
22912333 }
22922334 }
0 commit comments