Skip to content

Commit 51289d7

Browse files
authored
fix: refactor source as alias (#13293)
* refactor source as alias * fix test * fix test
1 parent 196e626 commit 51289d7

File tree

5 files changed

+46
-36
lines changed

5 files changed

+46
-36
lines changed

src/query/ast/src/ast/statements/merge_into.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@ pub struct MergeIntoStmt {
9292
pub database: Option<Identifier>,
9393
pub table_ident: Identifier,
9494
pub source: MergeSource,
95-
pub source_alias: Option<TableAlias>,
9695
// target_alias is belong to target
9796
pub target_alias: Option<TableAlias>,
9897
pub join_expr: Expr,
@@ -221,6 +220,7 @@ pub enum MergeSource {
221220

222221
Select {
223222
query: Box<Query>,
223+
source_alias: TableAlias,
224224
},
225225
}
226226

@@ -232,18 +232,21 @@ pub struct StreamingSource {
232232
}
233233

234234
impl MergeSource {
235-
pub fn transform_table_reference(&self, alias: Option<TableAlias>) -> TableReference {
235+
pub fn transform_table_reference(&self) -> TableReference {
236236
match self {
237237
Self::StreamingV2 {
238238
settings: _,
239239
on_error_mode: _,
240240
start: _,
241241
} => unimplemented!(),
242242

243-
Self::Select { query } => TableReference::Subquery {
243+
Self::Select {
244+
query,
245+
source_alias,
246+
} => TableReference::Subquery {
244247
span: None,
245248
subquery: query.clone(),
246-
alias,
249+
alias: Some(source_alias.clone()),
247250
},
248251
}
249252
}
@@ -267,7 +270,10 @@ impl Display for MergeSource {
267270
)
268271
}
269272

270-
MergeSource::Select { query } => write!(f, "{query}"),
273+
MergeSource::Select {
274+
query,
275+
source_alias,
276+
} => write!(f, "{query} as {source_alias}"),
271277
}
272278
}
273279
}

src/query/ast/src/parser/statement.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ pub fn statement(i: Input) -> IResult<StatementMsg> {
156156
let merge = map(
157157
rule! {
158158
MERGE ~ #hint? ~ INTO ~ #dot_separated_idents_1_to_3 ~ #table_alias? ~ USING
159-
~ #merge_source ~ #table_alias? ~ ON ~ #expr ~ (#match_clause | #unmatch_clause)*
159+
~ #merge_source ~ ON ~ #expr ~ (#match_clause | #unmatch_clause)*
160160
},
161161
|(
162162
_,
@@ -166,7 +166,6 @@ pub fn statement(i: Input) -> IResult<StatementMsg> {
166166
target_alias,
167167
_,
168168
source,
169-
source_alias,
170169
_,
171170
join_expr,
172171
merge_options,
@@ -177,7 +176,6 @@ pub fn statement(i: Input) -> IResult<StatementMsg> {
177176
database,
178177
table_ident: table,
179178
source,
180-
source_alias,
181179
target_alias,
182180
join_expr,
183181
merge_options,
@@ -1618,8 +1616,11 @@ pub fn merge_source(i: Input) -> IResult<MergeSource> {
16181616
},
16191617
);
16201618

1621-
let query = map(query, |query| MergeSource::Select {
1622-
query: Box::new(query),
1619+
let query = map(rule! {#query ~ #table_alias}, |(query, source_alias)| {
1620+
MergeSource::Select {
1621+
query: Box::new(query),
1622+
source_alias,
1623+
}
16231624
});
16241625

16251626
rule!(

src/query/sql/src/planner/binder/merge_into.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@ impl Binder {
7777
database,
7878
table_ident,
7979
source,
80-
source_alias,
8180
target_alias,
8281
join_expr,
8382
merge_options,
@@ -121,7 +120,7 @@ impl Binder {
121120
};
122121

123122
// get_source_table_reference
124-
let source_data = source.transform_table_reference(source_alias.clone());
123+
let source_data = source.transform_table_reference();
125124

126125
// bind source data
127126
let (source_expr, mut left_context) =

tests/sqllogictests/suites/base/09_fuse_engine/09_0026_merge_into

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,17 @@ select * from t2 order by a,b,c;
4040
2 b_7 c_7
4141
3 b_6 c_6
4242

43+
## test source alias
44+
statement error 1005
45+
merge into t1 using (select * from t2 ) on t1.a = t2.a when matched then update set t1.c = t2.c,t1.c = t2.c;
46+
4347
# section I: basic test for match and unmatch
4448

4549
statement error 1006
46-
merge into t1 using (select * from t2 as t2) on t1.a = t2.a when matched then update set t1.c = t2.c,t1.c = t2.c;
50+
merge into t1 using (select * from t2 ) as t2 on t1.a = t2.a when matched then update set t1.c = t2.c,t1.c = t2.c;
4751

4852
statement ok
49-
merge into t1 using (select * from t2 as t2) on t1.a = t2.a when matched then update set t1.c = t2.c;
53+
merge into t1 using (select * from t2 ) as t2 on t1.a = t2.a when matched then update set t1.c = t2.c;
5054

5155
query TTT
5256
select * from t1 order by a,b,c;
@@ -68,7 +72,7 @@ select * from t2 order by a,b,c;
6872
4 b_8 c_8
6973

7074
statement ok
71-
merge into t1 using (select * from t2 as t2) on t1.a = t2.a when matched then update set t1.c = t2.c when not matched then insert (a,b,c) values(t2.a,t2.b,t2.c);
75+
merge into t1 using (select * from t2 ) as t2 on t1.a = t2.a when matched then update set t1.c = t2.c when not matched then insert (a,b,c) values(t2.a,t2.b,t2.c);
7276

7377
query TTT
7478
select * from t1 order by a,b,c;
@@ -83,7 +87,7 @@ statement ok
8387
insert into t2 values(1,'b_9','c_9');
8488

8589
statement error 4001
86-
merge into t1 using (select * from t2 as t2) on t1.a = t2.a when matched then update set t1.c = t2.c when not matched then insert (a,b,c) values(t2.a,t2.b,t2.c);
90+
merge into t1 using (select * from t2 ) as t2 on t1.a = t2.a when matched then update set t1.c = t2.c when not matched then insert (a,b,c) values(t2.a,t2.b,t2.c);
8791

8892
query TTT
8993
select * from t1 order by a,b,c;
@@ -116,7 +120,7 @@ select * from t2 order by a,b,c;
116120
5 b_9 c_9
117121

118122
statement ok
119-
merge into t1 using (select * from t2 as t2) on t1.a = t2.a when matched then delete;
123+
merge into t1 using (select * from t2 ) as t2 on t1.a = t2.a when matched then delete;
120124

121125
query ITT
122126
select * from t1 order by a,b,c;
@@ -135,10 +139,10 @@ select * from t1 order by a,b,c;
135139
3 b_2 c_2
136140

137141
statement error 1065
138-
merge into t1 using (select * from t2 as t2) on t1.a = t2.a when matched then delete when matched then update set t1.c = t2.c when not matched and t2.c = 'c_8' then insert (a,b,c) values(t2.a,t2.b,t2.c);
142+
merge into t1 using (select * from t2 ) as t2 on t1.a = t2.a when matched then delete when matched then update set t1.c = t2.c when not matched and t2.c = 'c_8' then insert (a,b,c) values(t2.a,t2.b,t2.c);
139143

140144
statement ok
141-
merge into t1 using (select * from t2 as t2) on t1.a = t2.a when matched and t1.b = 'b_1' then delete when matched then update set t1.c = t2.c when not matched and t2.c = 'c_8' then insert (a,b,c) values(t2.a,t2.b,t2.c);
145+
merge into t1 using (select * from t2 ) as t2 on t1.a = t2.a when matched and t1.b = 'b_1' then delete when matched then update set t1.c = t2.c when not matched and t2.c = 'c_8' then insert (a,b,c) values(t2.a,t2.b,t2.c);
142146

143147
query TTT
144148
select * from t1 order by a,b,c;
@@ -148,7 +152,7 @@ select * from t1 order by a,b,c;
148152
4 b_8 c_8
149153

150154
statement ok
151-
merge into t1 using (select * from t2 as t2) on t1.a = t2.a when matched then delete when not matched and t2.c = 'c_9' then insert (a,b,c) values(t2.a,t2.b,t2.c);
155+
merge into t1 using (select * from t2 ) as t2 on t1.a = t2.a when matched then delete when not matched and t2.c = 'c_9' then insert (a,b,c) values(t2.a,t2.b,t2.c);
152156

153157
query TTT
154158
select * from t1 order by a,b,c;
@@ -157,7 +161,7 @@ select * from t1 order by a,b,c;
157161
5 b_9 c_9
158162

159163
statement ok
160-
merge into t1 using (select * from t2 as t2) on t1.a = t2.a when not matched and t2.c = 'c_8' then insert (a,b) values(t2.a,t2.b) when not matched and t2.c = 'c_7' then insert (a,c) values(t2.a,t2.c);
164+
merge into t1 using (select * from t2 ) as t2 on t1.a = t2.a when not matched and t2.c = 'c_8' then insert (a,b) values(t2.a,t2.b) when not matched and t2.c = 'c_7' then insert (a,c) values(t2.a,t2.c);
161165

162166
query TTT
163167
select * from t1 order by a,b,c;
@@ -180,11 +184,11 @@ select * from t2 order by a,b,c;
180184
5 b_9 c_9
181185

182186
statement error 4001
183-
merge into t1 using (select * from t2 as t2) on t1.a = t2.a when matched and t2.c = 'c_9' then update set t1.b = 'b_11' when matched and t2.c = 'c_10' then delete;
187+
merge into t1 using (select * from t2 ) as t2 on t1.a = t2.a when matched and t2.c = 'c_9' then update set t1.b = 'b_11' when matched and t2.c = 'c_10' then delete;
184188

185189
## idempotent delete test
186190
statement ok
187-
merge into t1 using (select * from t2 as t2) on t1.a = t2.a when matched then delete;
191+
merge into t1 using (select * from t2 ) as t2 on t1.a = t2.a when matched then delete;
188192

189193
query TTT
190194
select * from t1 order by a,b,c;
@@ -228,10 +232,10 @@ select * from t2 order by a,b,c;
228232

229233
## test insert columns mismatch
230234
statement error 1065
231-
merge into t1 using (select * from t2 as t2) on t1.a = t2.a when not matched then insert values(t2.a,t2.c);
235+
merge into t1 using (select * from t2 ) as t2 on t1.a = t2.a when not matched then insert values(t2.a,t2.c);
232236

233237
statement ok
234-
merge into t1 using (select * from t2 as t2) on t1.a = t2.a when matched then update * when not matched then insert *;
238+
merge into t1 using (select * from t2 ) as t2 on t1.a = t2.a when matched then update * when not matched then insert *;
235239

236240
query TTT
237241
select * from t1 order by a,b,c;
@@ -242,10 +246,10 @@ select * from t1 order by a,b,c;
242246

243247
## test multi same name for star
244248
statement error 1065
245-
merge into t1 using (select a,b,c,a from t2 as t2) on t1.a = t2.a when matched then update *;
249+
merge into t1 using (select a,b,c,a from t2 ) as t2 on t1.a = t2.a when matched then update *;
246250

247251
statement error 1065
248-
merge into t1 using (select a,b,c,a,b from t2 as t2) on t1.a = t2.a when not matched then insert *;
252+
merge into t1 using (select a,b,c,a,b from t2 ) as t2 on t1.a = t2.a when not matched then insert *;
249253

250254
## stage file test
251255
statement ok
@@ -389,7 +393,7 @@ select * from t2 order by a,b,c;
389393
NULL b_3 c_3
390394

391395
statement ok
392-
merge into t1 using (select * from t2) on t1.a = t2.a when matched then delete when not matched then insert *;
396+
merge into t1 using (select * from t2) as t2 on t1.a = t2.a when matched then delete when not matched then insert *;
393397

394398
query TTT
395399
select * from t1 order by a,b,c;
@@ -400,7 +404,7 @@ NULL b_1 c_1
400404
NULL b_3 c_3
401405

402406
statement ok
403-
merge into t1 using (select * from t2) on t1.a = t2.a when matched then delete;
407+
merge into t1 using (select * from t2) as t2 on t1.a = t2.a when matched then delete;
404408

405409
query TTT
406410
select * from t1 order by a,b,c;
@@ -429,7 +433,7 @@ statement ok
429433
insert into t2 values(1,'a1','b1');
430434

431435
statement ok
432-
merge into t1 as t3 using (select * from t2 as t2) on t3.a = t2.a when not matched then insert (a,b,c) values(t2.a,t2.b,t2.c);
436+
merge into t1 as t3 using (select * from t2 ) as t2 on t3.a = t2.a when not matched then insert (a,b,c) values(t2.a,t2.b,t2.c);
433437

434438
query TTT
435439
select * from t1 order by a,b,c;
@@ -449,7 +453,7 @@ statement ok
449453
INSERT INTO salaries VALUES(1, 50000.00),(2, 60000.00);
450454

451455
statement ok
452-
MERGE INTO salaries USING (SELECT * FROM employees) ON salaries.employee_id = employees.employee_id WHEN MATCHED AND employees.department = 'HR' THEN UPDATE SET salaries.salary = salaries.salary + 1000.00 WHEN MATCHED THEN UPDATE SET salaries.salary = salaries.salary + 500.00 WHEN NOT MATCHED THEN INSERT (employee_id, salary) VALUES (employees.employee_id, 55000.00);
456+
MERGE INTO salaries USING (SELECT * FROM employees) as employees ON salaries.employee_id = employees.employee_id WHEN MATCHED AND employees.department = 'HR' THEN UPDATE SET salaries.salary = salaries.salary + 1000.00 WHEN MATCHED THEN UPDATE SET salaries.salary = salaries.salary + 500.00 WHEN NOT MATCHED THEN INSERT (employee_id, salary) VALUES (employees.employee_id, 55000.00);
453457

454458
query TTT
455459
select * from salaries order by employee_id;
@@ -473,7 +477,7 @@ statement ok
473477
insert into t2_source values(1),(2);
474478

475479
statement ok
476-
merge into t1_target using (select * from t2_source) on t1_target.a = t2_source.a when matched then update * when not matched then insert *;
480+
merge into t1_target using (select * from t2_source) as t2_source on t1_target.a = t2_source.a when matched then update * when not matched then insert *;
477481

478482
query T
479483
select * from t1_target order by a;

tests/sqllogictests/suites/ee/01_ee_system/01_0001_computed_column

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -211,13 +211,13 @@ statement ok
211211
insert into t_source_merge values('a1','b1','c1'),('a2','b2','c2');
212212

213213
statement error 1006
214-
merge into t_stored_merge as t1 using (select * from t_source_merge as t2) on t1.a = t2.a when not matched then insert (a,b,c) values(t2.a,t2.b,t2.c);
214+
merge into t_stored_merge as t1 using (select * from t_source_merge as t2) as t2 on t1.a = t2.a when not matched then insert (a,b,c) values(t2.a,t2.b,t2.c);
215215

216216
statement error 1006
217-
merge into t_stored_merge as t1 using (select * from t_source_merge as t2) on t1.a = t2.a when matched then update set t1.b = t2.b when not matched then insert (a,c) values(t2.a,t2.c);
217+
merge into t_stored_merge as t1 using (select * from t_source_merge as t2) as t2 on t1.a = t2.a when matched then update set t1.b = t2.b when not matched then insert (a,c) values(t2.a,t2.c);
218218

219219
statement ok
220-
merge into t_stored_merge as t1 using (select * from t_source_merge as t2) on t1.a = t2.a when not matched then insert (a,c) values(t2.a,t2.c);
220+
merge into t_stored_merge as t1 using (select * from t_source_merge as t2) as t2 on t1.a = t2.a when not matched then insert (a,c) values(t2.a,t2.c);
221221

222222
query TTT
223223
select * from t_stored_merge order by a,b,c;
@@ -248,7 +248,7 @@ a1 b1 c1
248248
a2 b2 c2
249249

250250
statement ok
251-
merge into t_stored_merge as t1 using (select * from t_source_merge as t2) on t1.a = t2.a when matched then update set t1.c = t2.c when not matched then insert (a,c) values(t2.a,t2.c);
251+
merge into t_stored_merge as t1 using (select * from t_source_merge as t2) as t2 on t1.a = t2.a when matched then update set t1.c = t2.c when not matched then insert (a,c) values(t2.a,t2.c);
252252

253253
query TTT
254254
select * from t_stored_merge order by a,b,c;

0 commit comments

Comments
 (0)