@@ -129,3 +129,150 @@ fn test_create_table_macro() {
129
129
} ;
130
130
assert_eq ! ( expected, macro_) ;
131
131
}
132
+
133
+ #[ test]
134
+ fn test_select_union_by_name ( ) {
135
+ let ast = duckdb ( ) . verified_query ( "SELECT * FROM capitals UNION BY NAME SELECT * FROM weather" ) ;
136
+ let expected = Box :: < SetExpr > :: new ( SetExpr :: SetOperation {
137
+ op : SetOperator :: Union ,
138
+ set_quantifier : SetQuantifier :: ByName ,
139
+ left : Box :: < SetExpr > :: new ( SetExpr :: Select ( Box :: new ( Select {
140
+ distinct : None ,
141
+ top : None ,
142
+ projection : vec ! [ SelectItem :: Wildcard ( WildcardAdditionalOptions {
143
+ opt_exclude: None ,
144
+ opt_except: None ,
145
+ opt_rename: None ,
146
+ opt_replace: None ,
147
+ } ) ] ,
148
+ into : None ,
149
+ from : vec ! [ TableWithJoins {
150
+ relation: TableFactor :: Table {
151
+ name: ObjectName ( vec![ Ident {
152
+ value: "capitals" . to_string( ) ,
153
+ quote_style: None ,
154
+ } ] ) ,
155
+ alias: None ,
156
+ args: None ,
157
+ with_hints: vec![ ] ,
158
+ } ,
159
+ joins: vec![ ] ,
160
+ } ] ,
161
+ lateral_views : vec ! [ ] ,
162
+ selection : None ,
163
+ group_by : vec ! [ ] ,
164
+ cluster_by : vec ! [ ] ,
165
+ distribute_by : vec ! [ ] ,
166
+ sort_by : vec ! [ ] ,
167
+ having : None ,
168
+ named_window : vec ! [ ] ,
169
+ qualify : None ,
170
+ } ) ) ) ,
171
+ right : Box :: < SetExpr > :: new ( SetExpr :: Select ( Box :: new ( Select {
172
+ distinct : None ,
173
+ top : None ,
174
+ projection : vec ! [ SelectItem :: Wildcard ( WildcardAdditionalOptions {
175
+ opt_exclude: None ,
176
+ opt_except: None ,
177
+ opt_rename: None ,
178
+ opt_replace: None ,
179
+ } ) ] ,
180
+ into : None ,
181
+ from : vec ! [ TableWithJoins {
182
+ relation: TableFactor :: Table {
183
+ name: ObjectName ( vec![ Ident {
184
+ value: "weather" . to_string( ) ,
185
+ quote_style: None ,
186
+ } ] ) ,
187
+ alias: None ,
188
+ args: None ,
189
+ with_hints: vec![ ] ,
190
+ } ,
191
+ joins: vec![ ] ,
192
+ } ] ,
193
+ lateral_views : vec ! [ ] ,
194
+ selection : None ,
195
+ group_by : vec ! [ ] ,
196
+ cluster_by : vec ! [ ] ,
197
+ distribute_by : vec ! [ ] ,
198
+ sort_by : vec ! [ ] ,
199
+ having : None ,
200
+ named_window : vec ! [ ] ,
201
+ qualify : None ,
202
+ } ) ) ) ,
203
+ } ) ;
204
+
205
+ assert_eq ! ( ast. body, expected) ;
206
+
207
+ let ast =
208
+ duckdb ( ) . verified_query ( "SELECT * FROM capitals UNION ALL BY NAME SELECT * FROM weather" ) ;
209
+ let expected = Box :: < SetExpr > :: new ( SetExpr :: SetOperation {
210
+ op : SetOperator :: Union ,
211
+ set_quantifier : SetQuantifier :: AllByName ,
212
+ left : Box :: < SetExpr > :: new ( SetExpr :: Select ( Box :: new ( Select {
213
+ distinct : None ,
214
+ top : None ,
215
+ projection : vec ! [ SelectItem :: Wildcard ( WildcardAdditionalOptions {
216
+ opt_exclude: None ,
217
+ opt_except: None ,
218
+ opt_rename: None ,
219
+ opt_replace: None ,
220
+ } ) ] ,
221
+ into : None ,
222
+ from : vec ! [ TableWithJoins {
223
+ relation: TableFactor :: Table {
224
+ name: ObjectName ( vec![ Ident {
225
+ value: "capitals" . to_string( ) ,
226
+ quote_style: None ,
227
+ } ] ) ,
228
+ alias: None ,
229
+ args: None ,
230
+ with_hints: vec![ ] ,
231
+ } ,
232
+ joins: vec![ ] ,
233
+ } ] ,
234
+ lateral_views : vec ! [ ] ,
235
+ selection : None ,
236
+ group_by : vec ! [ ] ,
237
+ cluster_by : vec ! [ ] ,
238
+ distribute_by : vec ! [ ] ,
239
+ sort_by : vec ! [ ] ,
240
+ having : None ,
241
+ named_window : vec ! [ ] ,
242
+ qualify : None ,
243
+ } ) ) ) ,
244
+ right : Box :: < SetExpr > :: new ( SetExpr :: Select ( Box :: new ( Select {
245
+ distinct : None ,
246
+ top : None ,
247
+ projection : vec ! [ SelectItem :: Wildcard ( WildcardAdditionalOptions {
248
+ opt_exclude: None ,
249
+ opt_except: None ,
250
+ opt_rename: None ,
251
+ opt_replace: None ,
252
+ } ) ] ,
253
+ into : None ,
254
+ from : vec ! [ TableWithJoins {
255
+ relation: TableFactor :: Table {
256
+ name: ObjectName ( vec![ Ident {
257
+ value: "weather" . to_string( ) ,
258
+ quote_style: None ,
259
+ } ] ) ,
260
+ alias: None ,
261
+ args: None ,
262
+ with_hints: vec![ ] ,
263
+ } ,
264
+ joins: vec![ ] ,
265
+ } ] ,
266
+ lateral_views : vec ! [ ] ,
267
+ selection : None ,
268
+ group_by : vec ! [ ] ,
269
+ cluster_by : vec ! [ ] ,
270
+ distribute_by : vec ! [ ] ,
271
+ sort_by : vec ! [ ] ,
272
+ having : None ,
273
+ named_window : vec ! [ ] ,
274
+ qualify : None ,
275
+ } ) ) ) ,
276
+ } ) ;
277
+ assert_eq ! ( ast. body, expected) ;
278
+ }
0 commit comments