11use pgt_query:: protobuf:: { AExpr , AExprKind } ;
22
3- use crate :: emitter:: { EventEmitter , GroupKind } ;
3+ use crate :: {
4+ TokenKind ,
5+ emitter:: { EventEmitter , GroupKind } ,
6+ } ;
47
58pub ( super ) fn emit_a_expr ( e : & mut EventEmitter , n : & AExpr ) {
69 e. group_start ( GroupKind :: AExpr ) ;
710
8- assert_eq ! ( n. kind( ) , AExprKind :: AexprOp ) ;
11+ match n. kind ( ) {
12+ AExprKind :: AexprOp => emit_aexpr_op ( e, n) ,
13+ AExprKind :: AexprOpAny => emit_aexpr_op_any ( e, n) ,
14+ AExprKind :: AexprOpAll => emit_aexpr_op_all ( e, n) ,
15+ AExprKind :: AexprDistinct => emit_aexpr_distinct ( e, n) ,
16+ AExprKind :: AexprNotDistinct => emit_aexpr_not_distinct ( e, n) ,
17+ AExprKind :: AexprNullif => emit_aexpr_nullif ( e, n) ,
18+ AExprKind :: AexprIn => emit_aexpr_in ( e, n) ,
19+ AExprKind :: AexprLike => emit_aexpr_like ( e, n) ,
20+ AExprKind :: AexprIlike => emit_aexpr_ilike ( e, n) ,
21+ AExprKind :: AexprSimilar => emit_aexpr_similar ( e, n) ,
22+ AExprKind :: AexprBetween => emit_aexpr_between ( e, n) ,
23+ AExprKind :: AexprNotBetween => emit_aexpr_not_between ( e, n) ,
24+ AExprKind :: AexprBetweenSym => emit_aexpr_between_sym ( e, n) ,
25+ AExprKind :: AexprNotBetweenSym => emit_aexpr_not_between_sym ( e, n) ,
26+ AExprKind :: Undefined => { }
27+ }
28+
29+ e. group_end ( ) ;
30+ }
931
32+ // Basic binary operator: left op right
33+ fn emit_aexpr_op ( e : & mut EventEmitter , n : & AExpr ) {
1034 if let Some ( ref lexpr) = n. lexpr {
1135 super :: emit_node ( lexpr, e) ;
1236 }
@@ -22,6 +46,293 @@ pub(super) fn emit_a_expr(e: &mut EventEmitter, n: &AExpr) {
2246 if let Some ( ref rexpr) = n. rexpr {
2347 super :: emit_node ( rexpr, e) ;
2448 }
49+ }
2550
26- e. group_end ( ) ;
51+ // expr op ANY (subquery)
52+ fn emit_aexpr_op_any ( e : & mut EventEmitter , n : & AExpr ) {
53+ if let Some ( ref lexpr) = n. lexpr {
54+ super :: emit_node ( lexpr, e) ;
55+ e. space ( ) ;
56+ }
57+
58+ if !n. name . is_empty ( ) {
59+ for name in & n. name {
60+ super :: emit_node ( name, e) ;
61+ }
62+ e. space ( ) ;
63+ }
64+
65+ e. token ( TokenKind :: ANY_KW ) ;
66+ e. space ( ) ;
67+
68+ if let Some ( ref rexpr) = n. rexpr {
69+ super :: emit_node ( rexpr, e) ;
70+ }
71+ }
72+
73+ // expr op ALL (subquery)
74+ fn emit_aexpr_op_all ( e : & mut EventEmitter , n : & AExpr ) {
75+ if let Some ( ref lexpr) = n. lexpr {
76+ super :: emit_node ( lexpr, e) ;
77+ e. space ( ) ;
78+ }
79+
80+ if !n. name . is_empty ( ) {
81+ for name in & n. name {
82+ super :: emit_node ( name, e) ;
83+ }
84+ e. space ( ) ;
85+ }
86+
87+ e. token ( TokenKind :: ALL_KW ) ;
88+ e. space ( ) ;
89+
90+ if let Some ( ref rexpr) = n. rexpr {
91+ super :: emit_node ( rexpr, e) ;
92+ }
93+ }
94+
95+ // expr IS DISTINCT FROM expr2
96+ fn emit_aexpr_distinct ( e : & mut EventEmitter , n : & AExpr ) {
97+ if let Some ( ref lexpr) = n. lexpr {
98+ super :: emit_node ( lexpr, e) ;
99+ e. space ( ) ;
100+ }
101+
102+ e. token ( TokenKind :: IS_KW ) ;
103+ e. space ( ) ;
104+ e. token ( TokenKind :: DISTINCT_KW ) ;
105+ e. space ( ) ;
106+ e. token ( TokenKind :: FROM_KW ) ;
107+ e. space ( ) ;
108+
109+ if let Some ( ref rexpr) = n. rexpr {
110+ super :: emit_node ( rexpr, e) ;
111+ }
112+ }
113+
114+ // expr IS NOT DISTINCT FROM expr2
115+ fn emit_aexpr_not_distinct ( e : & mut EventEmitter , n : & AExpr ) {
116+ if let Some ( ref lexpr) = n. lexpr {
117+ super :: emit_node ( lexpr, e) ;
118+ e. space ( ) ;
119+ }
120+
121+ e. token ( TokenKind :: IS_KW ) ;
122+ e. space ( ) ;
123+ e. token ( TokenKind :: NOT_KW ) ;
124+ e. space ( ) ;
125+ e. token ( TokenKind :: DISTINCT_KW ) ;
126+ e. space ( ) ;
127+ e. token ( TokenKind :: FROM_KW ) ;
128+ e. space ( ) ;
129+
130+ if let Some ( ref rexpr) = n. rexpr {
131+ super :: emit_node ( rexpr, e) ;
132+ }
133+ }
134+
135+ // NULLIF(expr, expr2)
136+ fn emit_aexpr_nullif ( e : & mut EventEmitter , n : & AExpr ) {
137+ e. token ( TokenKind :: NULLIF_KW ) ;
138+ e. token ( TokenKind :: L_PAREN ) ;
139+
140+ if let Some ( ref lexpr) = n. lexpr {
141+ super :: emit_node ( lexpr, e) ;
142+ }
143+
144+ e. token ( TokenKind :: COMMA ) ;
145+ e. space ( ) ;
146+
147+ if let Some ( ref rexpr) = n. rexpr {
148+ super :: emit_node ( rexpr, e) ;
149+ }
150+
151+ e. token ( TokenKind :: R_PAREN ) ;
152+ }
153+
154+ // expr IN (values)
155+ fn emit_aexpr_in ( e : & mut EventEmitter , n : & AExpr ) {
156+ if let Some ( ref lexpr) = n. lexpr {
157+ super :: emit_node ( lexpr, e) ;
158+ e. space ( ) ;
159+ }
160+
161+ e. token ( TokenKind :: IN_KW ) ;
162+ e. space ( ) ;
163+
164+ // The rexpr is typically a List node, which emits comma-separated items
165+ // We need to wrap it in parentheses for IN clause
166+ e. token ( TokenKind :: L_PAREN ) ;
167+ if let Some ( ref rexpr) = n. rexpr {
168+ super :: emit_node ( rexpr, e) ;
169+ }
170+ e. token ( TokenKind :: R_PAREN ) ;
171+ }
172+
173+ // expr LIKE pattern [ESCAPE escape]
174+ fn emit_aexpr_like ( e : & mut EventEmitter , n : & AExpr ) {
175+ if let Some ( ref lexpr) = n. lexpr {
176+ super :: emit_node ( lexpr, e) ;
177+ e. space ( ) ;
178+ }
179+
180+ e. token ( TokenKind :: LIKE_KW ) ;
181+ e. space ( ) ;
182+
183+ if let Some ( ref rexpr) = n. rexpr {
184+ super :: emit_node ( rexpr, e) ;
185+ }
186+ }
187+
188+ // expr ILIKE pattern [ESCAPE escape]
189+ fn emit_aexpr_ilike ( e : & mut EventEmitter , n : & AExpr ) {
190+ if let Some ( ref lexpr) = n. lexpr {
191+ super :: emit_node ( lexpr, e) ;
192+ e. space ( ) ;
193+ }
194+
195+ e. token ( TokenKind :: ILIKE_KW ) ;
196+ e. space ( ) ;
197+
198+ if let Some ( ref rexpr) = n. rexpr {
199+ super :: emit_node ( rexpr, e) ;
200+ }
201+ }
202+
203+ // expr SIMILAR TO pattern [ESCAPE escape]
204+ fn emit_aexpr_similar ( e : & mut EventEmitter , n : & AExpr ) {
205+ if let Some ( ref lexpr) = n. lexpr {
206+ super :: emit_node ( lexpr, e) ;
207+ e. space ( ) ;
208+ }
209+
210+ e. token ( TokenKind :: SIMILAR_KW ) ;
211+ e. space ( ) ;
212+ e. token ( TokenKind :: TO_KW ) ;
213+ e. space ( ) ;
214+
215+ if let Some ( ref rexpr) = n. rexpr {
216+ super :: emit_node ( rexpr, e) ;
217+ }
218+ }
219+
220+ // expr BETWEEN expr2 AND expr3
221+ fn emit_aexpr_between ( e : & mut EventEmitter , n : & AExpr ) {
222+ if let Some ( ref lexpr) = n. lexpr {
223+ super :: emit_node ( lexpr, e) ;
224+ e. space ( ) ;
225+ }
226+
227+ e. token ( TokenKind :: BETWEEN_KW ) ;
228+ e. space ( ) ;
229+
230+ // rexpr is a List node with two elements, but we need "expr AND expr" not "expr, expr"
231+ if let Some ( ref rexpr) = n. rexpr {
232+ if let Some ( pgt_query:: NodeEnum :: List ( list) ) = rexpr. node . as_ref ( ) {
233+ if list. items . len ( ) >= 1 {
234+ super :: emit_node ( & list. items [ 0 ] , e) ;
235+ }
236+ if list. items . len ( ) >= 2 {
237+ e. space ( ) ;
238+ e. token ( TokenKind :: AND_KW ) ;
239+ e. space ( ) ;
240+ super :: emit_node ( & list. items [ 1 ] , e) ;
241+ }
242+ } else {
243+ super :: emit_node ( rexpr, e) ;
244+ }
245+ }
246+ }
247+
248+ // expr NOT BETWEEN expr2 AND expr3
249+ fn emit_aexpr_not_between ( e : & mut EventEmitter , n : & AExpr ) {
250+ if let Some ( ref lexpr) = n. lexpr {
251+ super :: emit_node ( lexpr, e) ;
252+ e. space ( ) ;
253+ }
254+
255+ e. token ( TokenKind :: NOT_KW ) ;
256+ e. space ( ) ;
257+ e. token ( TokenKind :: BETWEEN_KW ) ;
258+ e. space ( ) ;
259+
260+ // rexpr is a List node with two elements, but we need "expr AND expr" not "expr, expr"
261+ if let Some ( ref rexpr) = n. rexpr {
262+ if let Some ( pgt_query:: NodeEnum :: List ( list) ) = rexpr. node . as_ref ( ) {
263+ if list. items . len ( ) >= 1 {
264+ super :: emit_node ( & list. items [ 0 ] , e) ;
265+ }
266+ if list. items . len ( ) >= 2 {
267+ e. space ( ) ;
268+ e. token ( TokenKind :: AND_KW ) ;
269+ e. space ( ) ;
270+ super :: emit_node ( & list. items [ 1 ] , e) ;
271+ }
272+ } else {
273+ super :: emit_node ( rexpr, e) ;
274+ }
275+ }
276+ }
277+
278+ // expr BETWEEN SYMMETRIC expr2 AND expr3
279+ fn emit_aexpr_between_sym ( e : & mut EventEmitter , n : & AExpr ) {
280+ if let Some ( ref lexpr) = n. lexpr {
281+ super :: emit_node ( lexpr, e) ;
282+ e. space ( ) ;
283+ }
284+
285+ e. token ( TokenKind :: BETWEEN_KW ) ;
286+ e. space ( ) ;
287+ e. token ( TokenKind :: SYMMETRIC_KW ) ;
288+ e. space ( ) ;
289+
290+ // rexpr is a List node with two elements, but we need "expr AND expr" not "expr, expr"
291+ if let Some ( ref rexpr) = n. rexpr {
292+ if let Some ( pgt_query:: NodeEnum :: List ( list) ) = rexpr. node . as_ref ( ) {
293+ if list. items . len ( ) >= 1 {
294+ super :: emit_node ( & list. items [ 0 ] , e) ;
295+ }
296+ if list. items . len ( ) >= 2 {
297+ e. space ( ) ;
298+ e. token ( TokenKind :: AND_KW ) ;
299+ e. space ( ) ;
300+ super :: emit_node ( & list. items [ 1 ] , e) ;
301+ }
302+ } else {
303+ super :: emit_node ( rexpr, e) ;
304+ }
305+ }
306+ }
307+
308+ // expr NOT BETWEEN SYMMETRIC expr2 AND expr3
309+ fn emit_aexpr_not_between_sym ( e : & mut EventEmitter , n : & AExpr ) {
310+ if let Some ( ref lexpr) = n. lexpr {
311+ super :: emit_node ( lexpr, e) ;
312+ e. space ( ) ;
313+ }
314+
315+ e. token ( TokenKind :: NOT_KW ) ;
316+ e. space ( ) ;
317+ e. token ( TokenKind :: BETWEEN_KW ) ;
318+ e. space ( ) ;
319+ e. token ( TokenKind :: SYMMETRIC_KW ) ;
320+ e. space ( ) ;
321+
322+ // rexpr is a List node with two elements, but we need "expr AND expr" not "expr, expr"
323+ if let Some ( ref rexpr) = n. rexpr {
324+ if let Some ( pgt_query:: NodeEnum :: List ( list) ) = rexpr. node . as_ref ( ) {
325+ if list. items . len ( ) >= 1 {
326+ super :: emit_node ( & list. items [ 0 ] , e) ;
327+ }
328+ if list. items . len ( ) >= 2 {
329+ e. space ( ) ;
330+ e. token ( TokenKind :: AND_KW ) ;
331+ e. space ( ) ;
332+ super :: emit_node ( & list. items [ 1 ] , e) ;
333+ }
334+ } else {
335+ super :: emit_node ( rexpr, e) ;
336+ }
337+ }
27338}
0 commit comments