1use crate::{
2 ast::{DateTimeField, Function},
3 ast_builder::{DataTypeNode, ExprList, ExprNode},
4 result::{Error, Result},
5};
6
7#[derive(Clone, Debug)]
8pub enum FunctionNode<'a> {
9 Abs(ExprNode<'a>),
10 Upper(ExprNode<'a>),
11 IfNull {
12 expr: ExprNode<'a>,
13 then: ExprNode<'a>,
14 },
15 NullIf {
16 expr1: ExprNode<'a>,
17 expr2: ExprNode<'a>,
18 },
19 Ceil(ExprNode<'a>),
20 Rand(Option<ExprNode<'a>>),
21 Round(ExprNode<'a>),
22 Trunc(ExprNode<'a>),
23 Floor(ExprNode<'a>),
24 Asin(ExprNode<'a>),
25 Acos(ExprNode<'a>),
26 Atan(ExprNode<'a>),
27 Sin(ExprNode<'a>),
28 Cos(ExprNode<'a>),
29 Tan(ExprNode<'a>),
30 Pi,
31 Now,
32 CurrentDate,
33 CurrentTime,
34 CurrentTimestamp,
35 Left {
36 expr: ExprNode<'a>,
37 size: ExprNode<'a>,
38 },
39 Log {
40 antilog: ExprNode<'a>,
41 base: ExprNode<'a>,
42 },
43 Log2(ExprNode<'a>),
44 Log10(ExprNode<'a>),
45 Ln(ExprNode<'a>),
46 Right {
47 expr: ExprNode<'a>,
48 size: ExprNode<'a>,
49 },
50 Reverse(ExprNode<'a>),
51 Sign(ExprNode<'a>),
52 Power {
53 expr: ExprNode<'a>,
54 power: ExprNode<'a>,
55 },
56 Sqrt(ExprNode<'a>),
57 Skip {
58 expr: ExprNode<'a>,
59 size: ExprNode<'a>,
60 },
61 Gcd {
62 left: ExprNode<'a>,
63 right: ExprNode<'a>,
64 },
65 Lcm {
66 left: ExprNode<'a>,
67 right: ExprNode<'a>,
68 },
69 GenerateUuid,
70 Repeat {
71 expr: ExprNode<'a>,
72 num: ExprNode<'a>,
73 },
74 Replace {
75 expr: ExprNode<'a>,
76 old: ExprNode<'a>,
77 new: ExprNode<'a>,
78 },
79 Exp(ExprNode<'a>),
80 Lpad {
81 expr: ExprNode<'a>,
82 size: ExprNode<'a>,
83 fill: Option<ExprNode<'a>>,
84 },
85 Rpad {
86 expr: ExprNode<'a>,
87 size: ExprNode<'a>,
88 fill: Option<ExprNode<'a>>,
89 },
90 Degrees(ExprNode<'a>),
91 Radians(ExprNode<'a>),
92 Coalesce(ExprList<'a>),
93 Concat(ExprList<'a>),
94 ConcatWs {
95 separator: ExprNode<'a>,
96 exprs: ExprList<'a>,
97 },
98 Take {
99 expr: ExprNode<'a>,
100 size: ExprNode<'a>,
101 },
102 Substr {
103 expr: ExprNode<'a>,
104 start: ExprNode<'a>,
105 count: Option<ExprNode<'a>>,
106 },
107 Ltrim {
108 expr: ExprNode<'a>,
109 chars: Option<ExprNode<'a>>,
110 },
111 Rtrim {
112 expr: ExprNode<'a>,
113 chars: Option<ExprNode<'a>>,
114 },
115 Div {
116 dividend: ExprNode<'a>,
117 divisor: ExprNode<'a>,
118 },
119 Mod {
120 dividend: ExprNode<'a>,
121 divisor: ExprNode<'a>,
122 },
123 Format {
124 expr: ExprNode<'a>,
125 format: ExprNode<'a>,
126 },
127 ToDate {
128 expr: ExprNode<'a>,
129 format: ExprNode<'a>,
130 },
131 ToTimestamp {
132 expr: ExprNode<'a>,
133 format: ExprNode<'a>,
134 },
135 ToTime {
136 expr: ExprNode<'a>,
137 format: ExprNode<'a>,
138 },
139 Lower(ExprNode<'a>),
140 Initcap(ExprNode<'a>),
141 Position {
142 from_expr: ExprNode<'a>,
143 sub_expr: ExprNode<'a>,
144 },
145 FindIdx {
146 from_expr: ExprNode<'a>,
147 sub_expr: ExprNode<'a>,
148 start: Option<ExprNode<'a>>,
149 },
150 Cast {
151 expr: ExprNode<'a>,
152 data_type: DataTypeNode,
153 },
154 Extract {
155 field: DateTimeField,
156 expr: ExprNode<'a>,
157 },
158 Ascii(ExprNode<'a>),
159 Chr(ExprNode<'a>),
160 Md5(ExprNode<'a>),
161 Hex(ExprNode<'a>),
162 Point {
163 x: ExprNode<'a>,
164 y: ExprNode<'a>,
165 },
166 GetX(ExprNode<'a>),
167 GetY(ExprNode<'a>),
168 Greatest(ExprList<'a>),
169 CalcDistance {
170 geometry1: ExprNode<'a>,
171 geometry2: ExprNode<'a>,
172 },
173 Length(ExprNode<'a>),
174 IsEmpty(ExprNode<'a>),
175 LastDay(ExprNode<'a>),
176 Entries(ExprNode<'a>),
177 Keys(ExprNode<'a>),
178 Values(ExprNode<'a>),
179}
180
181impl<'a> TryFrom<FunctionNode<'a>> for Function {
182 type Error = Error;
183
184 fn try_from(func_node: FunctionNode<'a>) -> Result<Self> {
185 match func_node {
186 FunctionNode::Abs(expr_node) => expr_node.try_into().map(Function::Abs),
187 FunctionNode::Upper(expr_node) => expr_node.try_into().map(Function::Upper),
188 FunctionNode::Lower(expr_node) => expr_node.try_into().map(Function::Lower),
189 FunctionNode::Initcap(expr_node) => expr_node.try_into().map(Function::Initcap),
190 FunctionNode::IfNull { expr, then } => {
191 let expr = expr.try_into()?;
192 let then = then.try_into()?;
193 Ok(Function::IfNull { expr, then })
194 }
195 FunctionNode::NullIf { expr1, expr2 } => {
196 let expr1 = expr1.try_into()?;
197 let expr2 = expr2.try_into()?;
198 Ok(Function::NullIf { expr1, expr2 })
199 }
200 FunctionNode::Ceil(expr_node) => expr_node.try_into().map(Function::Ceil),
201 FunctionNode::Rand(expr_node) => Ok(Function::Rand(
202 expr_node.map(TryInto::try_into).transpose()?,
203 )),
204 FunctionNode::Round(expr_node) => expr_node.try_into().map(Function::Round),
205 FunctionNode::Trunc(expr_node) => expr_node.try_into().map(Function::Trunc),
206 FunctionNode::Floor(expr_node) => expr_node.try_into().map(Function::Floor),
207 FunctionNode::Asin(expr_node) => expr_node.try_into().map(Function::Asin),
208 FunctionNode::Acos(expr_node) => expr_node.try_into().map(Function::Acos),
209 FunctionNode::Atan(expr_node) => expr_node.try_into().map(Function::Atan),
210 FunctionNode::Sin(expr_node) => expr_node.try_into().map(Function::Sin),
211 FunctionNode::Cos(expr_node) => expr_node.try_into().map(Function::Cos),
212 FunctionNode::Tan(expr_node) => expr_node.try_into().map(Function::Tan),
213 FunctionNode::Pi => Ok(Function::Pi()),
214 FunctionNode::Now => Ok(Function::Now()),
215 FunctionNode::CurrentDate => Ok(Function::CurrentDate()),
216 FunctionNode::CurrentTime => Ok(Function::CurrentTime()),
217 FunctionNode::CurrentTimestamp => Ok(Function::CurrentTimestamp()),
218 FunctionNode::Left { expr, size } => {
219 let expr = expr.try_into()?;
220 let size = size.try_into()?;
221 Ok(Function::Left { expr, size })
222 }
223 FunctionNode::Log { antilog, base } => {
224 let antilog = antilog.try_into()?;
225 let base = base.try_into()?;
226 Ok(Function::Log { antilog, base })
227 }
228 FunctionNode::Log2(expr_node) => expr_node.try_into().map(Function::Log2),
229 FunctionNode::Log10(expr_node) => expr_node.try_into().map(Function::Log10),
230 FunctionNode::Ln(expr_node) => expr_node.try_into().map(Function::Ln),
231 FunctionNode::Right { expr, size } => {
232 let expr = expr.try_into()?;
233 let size = size.try_into()?;
234 Ok(Function::Right { expr, size })
235 }
236 FunctionNode::Reverse(expr_node) => expr_node.try_into().map(Function::Reverse),
237 FunctionNode::Sign(expr_node) => expr_node.try_into().map(Function::Sign),
238 FunctionNode::Power { expr, power } => {
239 let expr = expr.try_into()?;
240 let power = power.try_into()?;
241 Ok(Function::Power { expr, power })
242 }
243 FunctionNode::Sqrt(expr_node) => expr_node.try_into().map(Function::Sqrt),
244 FunctionNode::Skip { expr, size } => {
245 let expr = expr.try_into()?;
246 let size = size.try_into()?;
247 Ok(Function::Skip { expr, size })
248 }
249 FunctionNode::Gcd { left, right } => {
250 let left = left.try_into()?;
251 let right = right.try_into()?;
252 Ok(Function::Gcd { left, right })
253 }
254 FunctionNode::Lcm { left, right } => {
255 let left = left.try_into()?;
256 let right = right.try_into()?;
257 Ok(Function::Lcm { left, right })
258 }
259 FunctionNode::GenerateUuid => Ok(Function::GenerateUuid()),
260 FunctionNode::Repeat { expr, num } => {
261 let expr = expr.try_into()?;
262 let num = num.try_into()?;
263 Ok(Function::Repeat { expr, num })
264 }
265 FunctionNode::Replace { expr, old, new } => {
266 let expr = expr.try_into()?;
267 let old = old.try_into()?;
268 let new = new.try_into()?;
269 Ok(Function::Replace { expr, old, new })
270 }
271 FunctionNode::Lpad { expr, size, fill } => {
272 let fill = fill.map(TryInto::try_into).transpose()?;
273 let expr = expr.try_into()?;
274 let size = size.try_into()?;
275 Ok(Function::Lpad { expr, size, fill })
276 }
277 FunctionNode::Rpad { expr, size, fill } => {
278 let fill = fill.map(TryInto::try_into).transpose()?;
279 let expr = expr.try_into()?;
280 let size = size.try_into()?;
281 Ok(Function::Rpad { expr, size, fill })
282 }
283 FunctionNode::Coalesce(expr_list) => expr_list.try_into().map(Function::Coalesce),
284 FunctionNode::Concat(expr_list) => expr_list.try_into().map(Function::Concat),
285 FunctionNode::ConcatWs { separator, exprs } => {
286 let separator = separator.try_into()?;
287 let exprs = exprs.try_into()?;
288 Ok(Function::ConcatWs { separator, exprs })
289 }
290 FunctionNode::Take { expr, size } => {
291 let expr = expr.try_into()?;
292 let size = size.try_into()?;
293 Ok(Function::Take { expr, size })
294 }
295 FunctionNode::Degrees(expr) => expr.try_into().map(Function::Degrees),
296 FunctionNode::Radians(expr) => expr.try_into().map(Function::Radians),
297 FunctionNode::Exp(expr) => expr.try_into().map(Function::Exp),
298 FunctionNode::Substr { expr, start, count } => {
299 let count = count.map(TryInto::try_into).transpose()?;
300 let expr = expr.try_into()?;
301 let start = start.try_into()?;
302 Ok(Function::Substr { expr, start, count })
303 }
304 FunctionNode::Ltrim { expr, chars } => {
305 let chars = chars.map(TryInto::try_into).transpose()?;
306 let expr = expr.try_into()?;
307 Ok(Function::Ltrim { expr, chars })
308 }
309 FunctionNode::Rtrim { expr, chars } => {
310 let chars = chars.map(TryInto::try_into).transpose()?;
311 let expr = expr.try_into()?;
312 Ok(Function::Rtrim { expr, chars })
313 }
314 FunctionNode::Div { dividend, divisor } => {
315 let dividend = dividend.try_into()?;
316 let divisor = divisor.try_into()?;
317 Ok(Function::Div { dividend, divisor })
318 }
319 FunctionNode::Mod { dividend, divisor } => {
320 let dividend = dividend.try_into()?;
321 let divisor = divisor.try_into()?;
322 Ok(Function::Mod { dividend, divisor })
323 }
324 FunctionNode::Format { expr, format } => {
325 let expr = expr.try_into()?;
326 let format = format.try_into()?;
327 Ok(Function::Format { expr, format })
328 }
329 FunctionNode::ToDate { expr, format } => {
330 let expr = expr.try_into()?;
331 let format = format.try_into()?;
332 Ok(Function::ToDate { expr, format })
333 }
334 FunctionNode::ToTimestamp { expr, format } => {
335 let expr = expr.try_into()?;
336 let format = format.try_into()?;
337 Ok(Function::ToTimestamp { expr, format })
338 }
339 FunctionNode::ToTime { expr, format } => {
340 let expr = expr.try_into()?;
341 let format = format.try_into()?;
342 Ok(Function::ToTime { expr, format })
343 }
344 FunctionNode::Position {
345 from_expr,
346 sub_expr,
347 } => {
348 let from_expr = from_expr.try_into()?;
349 let sub_expr = sub_expr.try_into()?;
350 Ok(Function::Position {
351 from_expr,
352 sub_expr,
353 })
354 }
355 FunctionNode::FindIdx {
356 from_expr,
357 sub_expr,
358 start,
359 } => {
360 let from_expr = from_expr.try_into()?;
361 let sub_expr = sub_expr.try_into()?;
362 let start = start.map(TryInto::try_into).transpose()?;
363 Ok(Function::FindIdx {
364 from_expr,
365 sub_expr,
366 start,
367 })
368 }
369 FunctionNode::Cast { expr, data_type } => {
370 let expr = expr.try_into()?;
371 let data_type = data_type.try_into()?;
372 Ok(Function::Cast { expr, data_type })
373 }
374 FunctionNode::Extract { field, expr } => {
375 let expr = expr.try_into()?;
376 Ok(Function::Extract { field, expr })
377 }
378 FunctionNode::Ascii(expr) => expr.try_into().map(Function::Ascii),
379 FunctionNode::Chr(expr) => expr.try_into().map(Function::Chr),
380 FunctionNode::Md5(expr) => expr.try_into().map(Function::Md5),
381 FunctionNode::Hex(expr) => expr.try_into().map(Function::Hex),
382 FunctionNode::Point { x, y } => {
383 let x = x.try_into()?;
384 let y = y.try_into()?;
385 Ok(Function::Point { x, y })
386 }
387 FunctionNode::GetX(expr) => expr.try_into().map(Function::GetX),
388 FunctionNode::GetY(expr) => expr.try_into().map(Function::GetY),
389 FunctionNode::Greatest(expr_list) => expr_list.try_into().map(Function::Greatest),
390 FunctionNode::CalcDistance {
391 geometry1,
392 geometry2,
393 } => {
394 let geometry1 = geometry1.try_into()?;
395 let geometry2 = geometry2.try_into()?;
396 Ok(Function::CalcDistance {
397 geometry1,
398 geometry2,
399 })
400 }
401 FunctionNode::Length(expr) => expr.try_into().map(Function::Length),
402 FunctionNode::IsEmpty(expr) => expr.try_into().map(Function::IsEmpty),
403 FunctionNode::LastDay(expr) => expr.try_into().map(Function::LastDay),
404 FunctionNode::Entries(expr) => expr.try_into().map(Function::Entries),
405 FunctionNode::Keys(expr) => expr.try_into().map(Function::Keys),
406 FunctionNode::Values(expr) => expr.try_into().map(Function::Values),
407 }
408 }
409}
410
411impl<'a> ExprNode<'a> {
412 #[must_use]
413 pub fn abs(self) -> ExprNode<'a> {
414 abs(self)
415 }
416 #[must_use]
417 pub fn upper(self) -> ExprNode<'a> {
418 upper(self)
419 }
420 #[must_use]
421 pub fn lower(self) -> ExprNode<'a> {
422 lower(self)
423 }
424 #[must_use]
425 pub fn initcap(self) -> ExprNode<'a> {
426 initcap(self)
427 }
428 #[must_use]
429 pub fn ifnull<T: Into<ExprNode<'a>>>(self, another: T) -> ExprNode<'a> {
430 ifnull(self, another)
431 }
432 #[must_use]
433 pub fn nullif<T: Into<ExprNode<'a>>>(self, another: T) -> ExprNode<'a> {
434 nullif(self, another)
435 }
436 #[must_use]
437 pub fn ceil(self) -> ExprNode<'a> {
438 ceil(self)
439 }
440 #[must_use]
441 pub fn rand(self) -> ExprNode<'a> {
442 rand(Some(self))
443 }
444 #[must_use]
445 pub fn round(self) -> ExprNode<'a> {
446 round(self)
447 }
448 #[must_use]
449 pub fn trunc(self) -> ExprNode<'a> {
450 trunc(self)
451 }
452 #[must_use]
453 pub fn floor(self) -> ExprNode<'a> {
454 floor(self)
455 }
456 #[must_use]
457 pub fn asin(self) -> ExprNode<'a> {
458 asin(self)
459 }
460 #[must_use]
461 pub fn acos(self) -> ExprNode<'a> {
462 acos(self)
463 }
464 #[must_use]
465 pub fn atan(self) -> ExprNode<'a> {
466 atan(self)
467 }
468 #[must_use]
469 pub fn sin(self) -> ExprNode<'a> {
470 sin(self)
471 }
472 #[must_use]
473 pub fn cos(self) -> ExprNode<'a> {
474 cos(self)
475 }
476 #[must_use]
477 pub fn tan(self) -> ExprNode<'a> {
478 tan(self)
479 }
480 #[must_use]
481 pub fn left<T: Into<ExprNode<'a>>>(self, size: T) -> Self {
482 left(self, size)
483 }
484 #[must_use]
485 pub fn log<T: Into<ExprNode<'a>>>(self, base: T) -> ExprNode<'a> {
486 log(self, base)
487 }
488 #[must_use]
489 pub fn log2(self) -> ExprNode<'a> {
490 log2(self)
491 }
492 #[must_use]
493 pub fn log10(self) -> ExprNode<'a> {
494 log10(self)
495 }
496 #[must_use]
497 pub fn ln(self) -> ExprNode<'a> {
498 ln(self)
499 }
500 #[must_use]
501 pub fn right<T: Into<ExprNode<'a>>>(self, size: T) -> Self {
502 right(self, size)
503 }
504
505 #[must_use]
506 pub fn reverse(self) -> ExprNode<'a> {
507 reverse(self)
508 }
509
510 #[must_use]
511 pub fn sign(self) -> ExprNode<'a> {
512 sign(self)
513 }
514
515 #[must_use]
516 pub fn skip<T: Into<ExprNode<'a>>>(self, size: T) -> ExprNode<'a> {
517 skip(self, size)
518 }
519
520 #[must_use]
521 pub fn power<T: Into<ExprNode<'a>>>(self, pwr: T) -> ExprNode<'a> {
522 power(self, pwr)
523 }
524
525 #[must_use]
526 pub fn sqrt(self) -> ExprNode<'a> {
527 sqrt(self)
528 }
529 #[must_use]
530 pub fn gcd<T: Into<ExprNode<'a>>>(self, right: T) -> ExprNode<'a> {
531 gcd(self, right)
532 }
533 #[must_use]
534 pub fn lcm<T: Into<ExprNode<'a>>>(self, right: T) -> ExprNode<'a> {
535 lcm(self, right)
536 }
537 #[must_use]
538 pub fn repeat<T: Into<ExprNode<'a>>>(self, num: T) -> ExprNode<'a> {
539 repeat(self, num)
540 }
541 #[must_use]
542 pub fn replace<T: Into<ExprNode<'a>>, U: Into<ExprNode<'a>>>(
543 self,
544 old: T,
545 new: U,
546 ) -> ExprNode<'a> {
547 replace(self, old, new)
548 }
549 #[must_use]
550 pub fn degrees(self) -> ExprNode<'a> {
551 degrees(self)
552 }
553 #[must_use]
554 pub fn radians(self) -> ExprNode<'a> {
555 radians(self)
556 }
557 #[must_use]
558 pub fn lpad<T: Into<ExprNode<'a>>>(self, size: T, fill: Option<ExprNode<'a>>) -> ExprNode<'a> {
559 lpad(self, size, fill)
560 }
561 #[must_use]
562 pub fn rpad<T: Into<ExprNode<'a>>>(self, size: T, fill: Option<ExprNode<'a>>) -> ExprNode<'a> {
563 rpad(self, size, fill)
564 }
565 #[must_use]
566 pub fn take<T: Into<ExprNode<'a>>>(self, size: T) -> ExprNode<'a> {
567 take(self, size)
568 }
569 #[must_use]
570 pub fn exp(self) -> ExprNode<'a> {
571 exp(self)
572 }
573 #[must_use]
574 pub fn substr<T: Into<ExprNode<'a>>>(
575 self,
576 start: T,
577 count: Option<ExprNode<'a>>,
578 ) -> ExprNode<'a> {
579 substr(self, start, count)
580 }
581 #[must_use]
582 pub fn rtrim(self, chars: Option<ExprNode<'a>>) -> ExprNode<'a> {
583 rtrim(self, chars)
584 }
585 #[must_use]
586 pub fn ltrim(self, chars: Option<ExprNode<'a>>) -> ExprNode<'a> {
587 ltrim(self, chars)
588 }
589 #[must_use]
590 pub fn format<T: Into<ExprNode<'a>>>(self, fmt: T) -> ExprNode<'a> {
591 format(self, fmt)
592 }
593 #[must_use]
594 pub fn to_date<T: Into<ExprNode<'a>>>(self, format: T) -> ExprNode<'a> {
595 to_date(self, format)
596 }
597 #[must_use]
598 pub fn to_timestamp<T: Into<ExprNode<'a>>>(self, format: T) -> ExprNode<'a> {
599 to_timestamp(self, format)
600 }
601 #[must_use]
602 pub fn to_time<T: Into<ExprNode<'a>>>(self, format: T) -> ExprNode<'a> {
603 to_time(self, format)
604 }
605 #[must_use]
606 pub fn position<T: Into<ExprNode<'a>>>(self, format: T) -> ExprNode<'a> {
607 position(self, format)
608 }
609 #[must_use]
610 pub fn find_idx<T: Into<ExprNode<'a>>>(
611 self,
612 sub: T,
613 start: Option<ExprNode<'a>>,
614 ) -> ExprNode<'a> {
615 find_idx(self, sub, start)
616 }
617 #[must_use]
618 pub fn cast<T: Into<DataTypeNode>>(self, data_type: T) -> ExprNode<'a> {
619 cast(self, data_type)
620 }
621 #[must_use]
622 pub fn extract(self, field: DateTimeField) -> ExprNode<'a> {
623 extract(field, self)
624 }
625 #[must_use]
626 pub fn is_empty(self) -> ExprNode<'a> {
627 is_empty(self)
628 }
629 #[must_use]
630 pub fn last_day(self) -> ExprNode<'a> {
631 last_day(self)
632 }
633 #[must_use]
634 pub fn entries(self) -> ExprNode<'a> {
635 entries(self)
636 }
637 #[must_use]
638 pub fn keys(self) -> ExprNode<'a> {
639 keys(self)
640 }
641 #[must_use]
642 pub fn values(self) -> ExprNode<'a> {
643 values(self)
644 }
645}
646
647pub fn abs<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
648 ExprNode::Function(Box::new(FunctionNode::Abs(expr.into())))
649}
650pub fn upper<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
651 ExprNode::Function(Box::new(FunctionNode::Upper(expr.into())))
652}
653pub fn lower<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
654 ExprNode::Function(Box::new(FunctionNode::Lower(expr.into())))
655}
656pub fn initcap<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
657 ExprNode::Function(Box::new(FunctionNode::Initcap(expr.into())))
658}
659pub fn ifnull<'a, T: Into<ExprNode<'a>>, U: Into<ExprNode<'a>>>(expr: T, then: U) -> ExprNode<'a> {
660 ExprNode::Function(Box::new(FunctionNode::IfNull {
661 expr: expr.into(),
662 then: then.into(),
663 }))
664}
665pub fn nullif<'a, T: Into<ExprNode<'a>>, U: Into<ExprNode<'a>>>(
666 expr1: T,
667 expr2: U,
668) -> ExprNode<'a> {
669 ExprNode::Function(Box::new(FunctionNode::NullIf {
670 expr1: expr1.into(),
671 expr2: expr2.into(),
672 }))
673}
674pub fn ceil<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
675 ExprNode::Function(Box::new(FunctionNode::Ceil(expr.into())))
676}
677pub fn rand(expr: Option<ExprNode>) -> ExprNode {
678 ExprNode::Function(Box::new(FunctionNode::Rand(expr)))
679}
680pub fn round<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
681 ExprNode::Function(Box::new(FunctionNode::Round(expr.into())))
682}
683pub fn trunc<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
684 ExprNode::Function(Box::new(FunctionNode::Trunc(expr.into())))
685}
686pub fn coalesce<'a, T: Into<ExprList<'a>>>(expr: T) -> ExprNode<'a> {
687 ExprNode::Function(Box::new(FunctionNode::Coalesce(expr.into())))
688}
689pub fn concat<'a, T: Into<ExprList<'a>>>(expr: T) -> ExprNode<'a> {
690 ExprNode::Function(Box::new(FunctionNode::Concat(expr.into())))
691}
692
693pub fn concat_ws<'a, T: Into<ExprNode<'a>>, U: Into<ExprList<'a>>>(
694 separator: T,
695 exprs: U,
696) -> ExprNode<'a> {
697 ExprNode::Function(Box::new(FunctionNode::ConcatWs {
698 separator: separator.into(),
699 exprs: exprs.into(),
700 }))
701}
702
703pub fn floor<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
704 ExprNode::Function(Box::new(FunctionNode::Floor(expr.into())))
705}
706pub fn asin<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
707 ExprNode::Function(Box::new(FunctionNode::Asin(expr.into())))
708}
709pub fn acos<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
710 ExprNode::Function(Box::new(FunctionNode::Acos(expr.into())))
711}
712pub fn atan<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
713 ExprNode::Function(Box::new(FunctionNode::Atan(expr.into())))
714}
715pub fn sin<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
716 ExprNode::Function(Box::new(FunctionNode::Sin(expr.into())))
717}
718pub fn cos<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
719 ExprNode::Function(Box::new(FunctionNode::Cos(expr.into())))
720}
721pub fn tan<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
722 ExprNode::Function(Box::new(FunctionNode::Tan(expr.into())))
723}
724pub fn pi<'a>() -> ExprNode<'a> {
725 ExprNode::Function(Box::new(FunctionNode::Pi))
726}
727pub fn generate_uuid<'a>() -> ExprNode<'a> {
728 ExprNode::Function(Box::new(FunctionNode::GenerateUuid))
729}
730pub fn now<'a>() -> ExprNode<'a> {
731 ExprNode::Function(Box::new(FunctionNode::Now))
732}
733pub fn current_date<'a>() -> ExprNode<'a> {
734 ExprNode::Function(Box::new(FunctionNode::CurrentDate))
735}
736pub fn current_time<'a>() -> ExprNode<'a> {
737 ExprNode::Function(Box::new(FunctionNode::CurrentTime))
738}
739pub fn current_timestamp<'a>() -> ExprNode<'a> {
740 ExprNode::Function(Box::new(FunctionNode::CurrentTimestamp))
741}
742pub fn left<'a, T: Into<ExprNode<'a>>, U: Into<ExprNode<'a>>>(expr: T, size: U) -> ExprNode<'a> {
743 ExprNode::Function(Box::new(FunctionNode::Left {
744 expr: expr.into(),
745 size: size.into(),
746 }))
747}
748pub fn log<'a, T: Into<ExprNode<'a>>, U: Into<ExprNode<'a>>>(antilog: T, base: U) -> ExprNode<'a> {
749 ExprNode::Function(Box::new(FunctionNode::Log {
750 antilog: antilog.into(),
751 base: base.into(),
752 }))
753}
754pub fn log2<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
755 ExprNode::Function(Box::new(FunctionNode::Log2(expr.into())))
756}
757pub fn log10<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
758 ExprNode::Function(Box::new(FunctionNode::Log10(expr.into())))
759}
760pub fn ln<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
761 ExprNode::Function(Box::new(FunctionNode::Ln(expr.into())))
762}
763pub fn right<'a, T: Into<ExprNode<'a>>, U: Into<ExprNode<'a>>>(expr: T, size: U) -> ExprNode<'a> {
764 ExprNode::Function(Box::new(FunctionNode::Right {
765 expr: expr.into(),
766 size: size.into(),
767 }))
768}
769
770pub fn reverse<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
771 ExprNode::Function(Box::new(FunctionNode::Reverse(expr.into())))
772}
773
774pub fn sign<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
775 ExprNode::Function(Box::new(FunctionNode::Sign(expr.into())))
776}
777
778pub fn skip<'a, T: Into<ExprNode<'a>>, V: Into<ExprNode<'a>>>(expr: T, size: V) -> ExprNode<'a> {
779 ExprNode::Function(Box::new(FunctionNode::Skip {
780 expr: expr.into(),
781 size: size.into(),
782 }))
783}
784
785pub fn power<'a, T: Into<ExprNode<'a>>, U: Into<ExprNode<'a>>>(expr: T, power: U) -> ExprNode<'a> {
786 ExprNode::Function(Box::new(FunctionNode::Power {
787 expr: expr.into(),
788 power: power.into(),
789 }))
790}
791
792pub fn sqrt<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
793 ExprNode::Function(Box::new(FunctionNode::Sqrt(expr.into())))
794}
795
796pub fn gcd<'a, T: Into<ExprNode<'a>>, U: Into<ExprNode<'a>>>(left: T, right: U) -> ExprNode<'a> {
797 ExprNode::Function(Box::new(FunctionNode::Gcd {
798 left: left.into(),
799 right: right.into(),
800 }))
801}
802
803pub fn lcm<'a, T: Into<ExprNode<'a>>, U: Into<ExprNode<'a>>>(left: T, right: U) -> ExprNode<'a> {
804 ExprNode::Function(Box::new(FunctionNode::Lcm {
805 left: left.into(),
806 right: right.into(),
807 }))
808}
809
810pub fn repeat<'a, T: Into<ExprNode<'a>>, V: Into<ExprNode<'a>>>(expr: T, num: V) -> ExprNode<'a> {
811 ExprNode::Function(Box::new(FunctionNode::Repeat {
812 expr: expr.into(),
813 num: num.into(),
814 }))
815}
816
817pub fn replace<'a, T: Into<ExprNode<'a>>, U: Into<ExprNode<'a>>, V: Into<ExprNode<'a>>>(
818 expr: T,
819 old: U,
820 new: V,
821) -> ExprNode<'a> {
822 ExprNode::Function(Box::new(FunctionNode::Replace {
823 expr: expr.into(),
824 old: old.into(),
825 new: new.into(),
826 }))
827}
828
829pub fn lpad<'a, T: Into<ExprNode<'a>>, U: Into<ExprNode<'a>>>(
830 expr: T,
831 size: U,
832 fill: Option<ExprNode<'a>>,
833) -> ExprNode<'a> {
834 ExprNode::Function(Box::new(FunctionNode::Lpad {
835 expr: expr.into(),
836 size: size.into(),
837 fill,
838 }))
839}
840
841pub fn rpad<'a, T: Into<ExprNode<'a>>, U: Into<ExprNode<'a>>>(
842 expr: T,
843 size: U,
844 fill: Option<ExprNode<'a>>,
845) -> ExprNode<'a> {
846 ExprNode::Function(Box::new(FunctionNode::Rpad {
847 expr: expr.into(),
848 size: size.into(),
849 fill,
850 }))
851}
852
853pub fn degrees<'a, V: Into<ExprNode<'a>>>(expr: V) -> ExprNode<'a> {
854 ExprNode::Function(Box::new(FunctionNode::Degrees(expr.into())))
855}
856
857pub fn radians<'a, V: Into<ExprNode<'a>>>(expr: V) -> ExprNode<'a> {
858 ExprNode::Function(Box::new(FunctionNode::Radians(expr.into())))
859}
860
861pub fn take<'a, T: Into<ExprNode<'a>>, U: Into<ExprNode<'a>>>(expr: T, size: U) -> ExprNode<'a> {
862 ExprNode::Function(Box::new(FunctionNode::Take {
863 expr: expr.into(),
864 size: size.into(),
865 }))
866}
867
868pub fn exp<'a, V: Into<ExprNode<'a>>>(expr: V) -> ExprNode<'a> {
869 ExprNode::Function(Box::new(FunctionNode::Exp(expr.into())))
870}
871pub fn substr<'a, T: Into<ExprNode<'a>>, U: Into<ExprNode<'a>>>(
872 expr: T,
873 start: U,
874 count: Option<ExprNode<'a>>,
875) -> ExprNode<'a> {
876 ExprNode::Function(Box::new(FunctionNode::Substr {
877 expr: expr.into(),
878 start: start.into(),
879 count,
880 }))
881}
882
883pub fn ltrim<'a, T: Into<ExprNode<'a>>>(expr: T, chars: Option<ExprNode<'a>>) -> ExprNode<'a> {
884 ExprNode::Function(Box::new(FunctionNode::Ltrim {
885 expr: expr.into(),
886 chars,
887 }))
888}
889
890pub fn rtrim<'a, T: Into<ExprNode<'a>>>(expr: T, chars: Option<ExprNode<'a>>) -> ExprNode<'a> {
891 ExprNode::Function(Box::new(FunctionNode::Rtrim {
892 expr: expr.into(),
893 chars,
894 }))
895}
896
897pub fn divide<'a, T: Into<ExprNode<'a>>, U: Into<ExprNode<'a>>>(
898 dividend: T,
899 divisor: U,
900) -> ExprNode<'a> {
901 ExprNode::Function(Box::new(FunctionNode::Div {
902 dividend: dividend.into(),
903 divisor: divisor.into(),
904 }))
905}
906
907pub fn modulo<'a, T: Into<ExprNode<'a>>, U: Into<ExprNode<'a>>>(
908 dividend: T,
909 divisor: U,
910) -> ExprNode<'a> {
911 ExprNode::Function(Box::new(FunctionNode::Mod {
912 dividend: dividend.into(),
913 divisor: divisor.into(),
914 }))
915}
916
917pub fn format<'a, D: Into<ExprNode<'a>>, T: Into<ExprNode<'a>>>(
918 expr: D,
919 format: T,
920) -> ExprNode<'a> {
921 ExprNode::Function(Box::new(FunctionNode::Format {
922 expr: expr.into(),
923 format: format.into(),
924 }))
925}
926
927pub fn to_date<'a, T: Into<ExprNode<'a>>, U: Into<ExprNode<'a>>>(
928 expr: T,
929 format: U,
930) -> ExprNode<'a> {
931 ExprNode::Function(Box::new(FunctionNode::ToDate {
932 expr: expr.into(),
933 format: format.into(),
934 }))
935}
936
937pub fn to_timestamp<'a, T: Into<ExprNode<'a>>, U: Into<ExprNode<'a>>>(
938 expr: T,
939 format: U,
940) -> ExprNode<'a> {
941 ExprNode::Function(Box::new(FunctionNode::ToTimestamp {
942 expr: expr.into(),
943 format: format.into(),
944 }))
945}
946
947pub fn to_time<'a, T: Into<ExprNode<'a>>, U: Into<ExprNode<'a>>>(
948 expr: T,
949 format: U,
950) -> ExprNode<'a> {
951 ExprNode::Function(Box::new(FunctionNode::ToTime {
952 expr: expr.into(),
953 format: format.into(),
954 }))
955}
956
957pub fn position<'a, T: Into<ExprNode<'a>>, U: Into<ExprNode<'a>>>(
958 from_expr: T,
959 sub_expr: U,
960) -> ExprNode<'a> {
961 ExprNode::Function(Box::new(FunctionNode::Position {
962 from_expr: from_expr.into(),
963 sub_expr: sub_expr.into(),
964 }))
965}
966
967pub fn find_idx<'a, T: Into<ExprNode<'a>>, U: Into<ExprNode<'a>>>(
968 from_expr: T,
969 sub_expr: U,
970 start: Option<ExprNode<'a>>,
971) -> ExprNode<'a> {
972 ExprNode::Function(Box::new(FunctionNode::FindIdx {
973 from_expr: from_expr.into(),
974 sub_expr: sub_expr.into(),
975 start,
976 }))
977}
978
979pub fn cast<'a, T: Into<ExprNode<'a>>, U: Into<DataTypeNode>>(
980 expr: T,
981 data_type: U,
982) -> ExprNode<'a> {
983 ExprNode::Function(Box::new(FunctionNode::Cast {
984 expr: expr.into(),
985 data_type: data_type.into(),
986 }))
987}
988
989pub fn extract<'a, T: Into<ExprNode<'a>>>(field: DateTimeField, expr: T) -> ExprNode<'a> {
990 ExprNode::Function(Box::new(FunctionNode::Extract {
991 field,
992 expr: expr.into(),
993 }))
994}
995
996pub fn ascii<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
997 ExprNode::Function(Box::new(FunctionNode::Ascii(expr.into())))
998}
999
1000pub fn chr<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
1001 ExprNode::Function(Box::new(FunctionNode::Chr(expr.into())))
1002}
1003
1004pub fn md5<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
1005 ExprNode::Function(Box::new(FunctionNode::Md5(expr.into())))
1006}
1007
1008pub fn hex<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
1009 ExprNode::Function(Box::new(FunctionNode::Hex(expr.into())))
1010}
1011
1012pub fn point<'a, T: Into<ExprNode<'a>>, U: Into<ExprNode<'a>>>(x: T, y: U) -> ExprNode<'a> {
1013 ExprNode::Function(Box::new(FunctionNode::Point {
1014 x: x.into(),
1015 y: y.into(),
1016 }))
1017}
1018
1019pub fn get_x<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
1020 ExprNode::Function(Box::new(FunctionNode::GetX(expr.into())))
1021}
1022
1023pub fn get_y<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
1024 ExprNode::Function(Box::new(FunctionNode::GetY(expr.into())))
1025}
1026
1027pub fn greatest<'a, T: Into<ExprList<'a>>>(exprs: T) -> ExprNode<'a> {
1028 ExprNode::Function(Box::new(FunctionNode::Greatest(exprs.into())))
1029}
1030
1031pub fn calc_distance<'a, T: Into<ExprNode<'a>>, U: Into<ExprNode<'a>>>(
1032 geometry1: T,
1033 geometry2: U,
1034) -> ExprNode<'a> {
1035 ExprNode::Function(Box::new(FunctionNode::CalcDistance {
1036 geometry1: geometry1.into(),
1037 geometry2: geometry2.into(),
1038 }))
1039}
1040
1041pub fn length<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
1042 ExprNode::Function(Box::new(FunctionNode::Length(expr.into())))
1043}
1044
1045pub fn is_empty<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
1046 ExprNode::Function(Box::new(FunctionNode::IsEmpty(expr.into())))
1047}
1048
1049pub fn last_day<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
1050 ExprNode::Function(Box::new(FunctionNode::LastDay(expr.into())))
1051}
1052
1053pub fn entries<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
1054 ExprNode::Function(Box::new(FunctionNode::Entries(expr.into())))
1055}
1056
1057pub fn keys<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
1058 ExprNode::Function(Box::new(FunctionNode::Keys(expr.into())))
1059}
1060
1061pub fn values<'a, T: Into<ExprNode<'a>>>(expr: T) -> ExprNode<'a> {
1062 ExprNode::Function(Box::new(FunctionNode::Values(expr.into())))
1063}
1064
1065#[cfg(test)]
1066mod tests {
1067 use crate::{
1068 ast::DateTimeField,
1069 ast_builder::function as f,
1070 ast_builder::{col, date, expr, null, num, test_expr, text, time, timestamp},
1071 prelude::DataType,
1072 };
1073
1074 #[test]
1075 fn function_abs() {
1076 let actual = f::abs(col("num"));
1077 let expected = "ABS(num)";
1078 test_expr(actual, expected);
1079
1080 let actual = expr("base - 10").abs();
1081 let expected = "ABS(base - 10)";
1082 test_expr(actual, expected);
1083 }
1084
1085 #[test]
1086 fn function_upper() {
1087 let actual = f::upper(text("ABC"));
1088 let expected = "UPPER('ABC')";
1089 test_expr(actual, expected);
1090
1091 let actual = expr("HoHo").upper();
1092 let expected = "UPPER(HoHo)";
1093 test_expr(actual, expected);
1094 }
1095 #[test]
1096 fn function_ifnull() {
1097 let actual = f::ifnull(text("HELLO"), text("WORLD"));
1098 let expected = "IFNULL('HELLO', 'WORLD')";
1099 test_expr(actual, expected);
1100
1101 let actual = col("updated_at").ifnull(col("created_at"));
1102 let expected = "IFNULL(updated_at, created_at)";
1103 test_expr(actual, expected);
1104 }
1105
1106 #[test]
1107 fn function_nullif() {
1108 let actual = f::nullif(text("hello"), text("world"));
1109 let expected = "NULLIF('hello', 'world')";
1110 test_expr(actual, expected);
1111
1112 let actual = col("updated_at").nullif(col("created_at"));
1113 let expected = "NULLIF(updated_at, created_at)";
1114 test_expr(actual, expected);
1115 }
1116
1117 #[test]
1118 fn function_ceil() {
1119 let actual = f::ceil(col("num"));
1120 let expected = "CEIL(num)";
1121 test_expr(actual, expected);
1122
1123 let actual = expr("base - 10").ceil();
1124 let expected = "CEIL(base - 10)";
1125 test_expr(actual, expected);
1126 }
1127
1128 #[test]
1129 fn function_rand() {
1130 let actual = f::rand(None);
1131 let expected = "RAND()";
1132 test_expr(actual, expected);
1133
1134 let actual = f::rand(Some(col("num")));
1135 let expected = "RAND(num)";
1136 test_expr(actual, expected);
1137
1138 let actual = expr("base - 10").rand();
1139 let expected = "RAND(base - 10)";
1140 test_expr(actual, expected);
1141 }
1142
1143 #[test]
1144 fn function_round() {
1145 let actual = f::round(col("num"));
1146 let expected = "ROUND(num)";
1147 test_expr(actual, expected);
1148
1149 let actual = expr("base - 10").round();
1150 let expected = "ROUND(base - 10)";
1151 test_expr(actual, expected);
1152 }
1153
1154 #[test]
1155 fn function_trunc() {
1156 let actual = f::trunc(col("num"));
1157 let expected = "trunc(num)";
1158 test_expr(actual, expected);
1159
1160 let actual = expr("base - 10").trunc();
1161 let expected = "TRUNC(base - 10)";
1162 test_expr(actual, expected);
1163 }
1164
1165 #[test]
1166 fn function_floor() {
1167 let actual = f::floor(col("num"));
1168 let expected = "FLOOR(num)";
1169 test_expr(actual, expected);
1170
1171 let actual = expr("base - 10").floor();
1172 let expected = "FLOOR(base - 10)";
1173 test_expr(actual, expected);
1174 }
1175
1176 #[test]
1177 fn function_trigonometrics() {
1178 let actual = f::asin(col("num"));
1180 let expected = "ASIN(num)";
1181 test_expr(actual, expected);
1182
1183 let actual = col("num").asin();
1184 let expected = "ASIN(num)";
1185 test_expr(actual, expected);
1186
1187 let actual = f::acos(col("num"));
1189 let expected = "ACOS(num)";
1190 test_expr(actual, expected);
1191
1192 let actual = col("num").acos();
1193 let expected = "ACOS(num)";
1194 test_expr(actual, expected);
1195
1196 let actual = f::atan(col("num"));
1198 let expected = "ATAN(num)";
1199 test_expr(actual, expected);
1200
1201 let actual = col("num").atan();
1202 let expected = "ATAN(num)";
1203 test_expr(actual, expected);
1204
1205 let actual = f::sin(col("num"));
1207 let expected = "SIN(num)";
1208 test_expr(actual, expected);
1209
1210 let actual = col("num").sin();
1211 let expected = "SIN(num)";
1212 test_expr(actual, expected);
1213
1214 let actual = f::cos(col("num"));
1216 let expected = "COS(num)";
1217 test_expr(actual, expected);
1218
1219 let actual = col("num").cos();
1220 let expected = "COS(num)";
1221 test_expr(actual, expected);
1222
1223 let actual = f::tan(col("num"));
1225 let expected = "TAN(num)";
1226 test_expr(actual, expected);
1227
1228 let actual = col("num").tan();
1229 let expected = "TAN(num)";
1230 test_expr(actual, expected);
1231
1232 let actual = f::pi();
1234 let expected = "PI()";
1235 test_expr(actual, expected);
1236 }
1237
1238 #[test]
1239 fn function_now() {
1240 let actual = f::now();
1241 let expected = "NOW()";
1242 test_expr(actual, expected);
1243 }
1244
1245 #[test]
1246 fn function_current_date() {
1247 let actual = f::current_date();
1248 let expected = "CURRENT_DATE()";
1249 test_expr(actual, expected);
1250 }
1251
1252 #[test]
1253 fn function_current_time() {
1254 let actual = f::current_time();
1255 let expected = "CURRENT_TIME()";
1256 test_expr(actual, expected);
1257 }
1258
1259 #[test]
1260 fn function_current_timestamp() {
1261 let actual = f::current_timestamp();
1262 let expected = "CURRENT_TIMESTAMP()";
1263 test_expr(actual, expected);
1264 }
1265
1266 #[test]
1267 fn function_generate_uuid() {
1268 let actual = f::generate_uuid();
1269 let expected = "GENERATE_UUID()";
1270 test_expr(actual, expected);
1271 }
1272
1273 #[test]
1274 fn function_left() {
1275 let actual = f::left(text("GlueSQL"), num(2));
1276 let expected = "LEFT('GlueSQL', 2)";
1277 test_expr(actual, expected);
1278
1279 let actual = expr("GlueSQL").left(num(2));
1280 let expected = "LEFT(GlueSQL, 2)";
1281 test_expr(actual, expected);
1282 }
1283
1284 #[test]
1285 fn function_log() {
1286 let actual = f::log(num(64), num(8));
1287 let expected = "log(64,8)";
1288 test_expr(actual, expected);
1289
1290 let actual = num(64).log(num(8));
1291 let expected = "LOG(64,8)";
1292 test_expr(actual, expected);
1293 }
1294
1295 #[test]
1296 fn function_log2() {
1297 let actual = f::log2(col("num"));
1298 let expected = "LOG2(num)";
1299 test_expr(actual, expected);
1300
1301 let actual = col("num").log2();
1302 let expected = "LOG2(num)";
1303 test_expr(actual, expected);
1304 }
1305
1306 #[test]
1307 fn function_log10() {
1308 let actual = f::log10(col("num"));
1309 let expected = "LOG10(num)";
1310 test_expr(actual, expected);
1311
1312 let actual = col("num").log10();
1313 let expected = "LOG10(num)";
1314 test_expr(actual, expected);
1315 }
1316
1317 #[test]
1318 fn function_ln() {
1319 let actual = f::ln(num(2));
1320 let expected = "LN(2)";
1321 test_expr(actual, expected);
1322
1323 let actual = num(2).ln();
1324 let expected = "LN(2)";
1325 test_expr(actual, expected);
1326 }
1327
1328 #[test]
1329 fn function_right() {
1330 let actual = f::right(text("GlueSQL"), num(2));
1331 let expected = "RIGHT('GlueSQL', 2)";
1332 test_expr(actual, expected);
1333
1334 let actual = expr("GlueSQL").right(num(2));
1335 let expected = "RIGHT(GlueSQL, 2)";
1336 test_expr(actual, expected);
1337 }
1338
1339 #[test]
1340 fn function_reverse() {
1341 let actual = f::reverse(text("GlueSQL"));
1342 let expected = "REVERSE('GlueSQL')";
1343 test_expr(actual, expected);
1344
1345 let actual = expr("GlueSQL").reverse();
1346 let expected = "REVERSE(GlueSQL)";
1347 test_expr(actual, expected);
1348 }
1349
1350 #[test]
1351 fn function_sign() {
1352 let actual = f::sign(col("id"));
1353 let expected = "SIGN(id)";
1354 test_expr(actual, expected);
1355
1356 let actual = expr("id").sign();
1357 let expected = "SIGN(id)";
1358 test_expr(actual, expected);
1359 }
1360
1361 #[test]
1362 fn function_skip() {
1363 let actual = f::skip(col("list"), num(2));
1364 let expected = "SKIP(list,2)";
1365 test_expr(actual, expected);
1366
1367 let actual = expr("list").skip(num(2));
1368 let expected = "SKIP(list,2)";
1369 test_expr(actual, expected);
1370 }
1371
1372 #[test]
1373 fn function_power() {
1374 let actual = f::power(num(2), num(4));
1375 let expected = "POWER(2,4)";
1376 test_expr(actual, expected);
1377
1378 let actual = num(2).power(num(4));
1379 let expected = "POWER(2,4)";
1380 test_expr(actual, expected);
1381 }
1382
1383 #[test]
1384 fn function_sqrt() {
1385 let actual = f::sqrt(num(9));
1386 let expected = "SQRT(9)";
1387 test_expr(actual, expected);
1388
1389 let actual = num(9).sqrt();
1390 let expected = "SQRT(9)";
1391 test_expr(actual, expected);
1392 }
1393
1394 #[test]
1395 fn function_gcd() {
1396 let actual = f::gcd(num(64), num(8));
1397 let expected = "gcd(64,8)";
1398 test_expr(actual, expected);
1399
1400 let actual = num(64).gcd(num(8));
1401 let expected = "GCD(64,8)";
1402 test_expr(actual, expected);
1403 }
1404
1405 #[test]
1406 fn function_lcm() {
1407 let actual = f::lcm(num(64), num(8));
1408 let expected = "lcm(64,8)";
1409 test_expr(actual, expected);
1410
1411 let actual = num(64).lcm(num(8));
1412 let expected = "LCM(64,8)";
1413 test_expr(actual, expected);
1414 }
1415
1416 #[test]
1417 fn function_repeat() {
1418 let actual = f::repeat(text("GlueSQL"), num(2));
1419 let expected = "REPEAT('GlueSQL', 2)";
1420 test_expr(actual, expected);
1421
1422 let actual = text("GlueSQL").repeat(num(2));
1423 let expected = "REPEAT('GlueSQL', 2)";
1424 test_expr(actual, expected);
1425 }
1426
1427 #[test]
1428 fn function_degrees() {
1429 let actual = f::degrees(num(1));
1430 let expected = "DEGREES(1)";
1431 test_expr(actual, expected);
1432
1433 let actual = num(1).degrees();
1434 let expected = "DEGREES(1)";
1435 test_expr(actual, expected);
1436 }
1437
1438 #[test]
1439 fn function_radians() {
1440 let actual = f::radians(num(1));
1441 let expected = "RADIANS(1)";
1442 test_expr(actual, expected);
1443
1444 let actual = num(1).radians();
1445 let expected = "RADIANS(1)";
1446 test_expr(actual, expected);
1447 }
1448
1449 #[test]
1450 fn function_coalesce() {
1451 let actual = f::coalesce(vec![null(), text("Glue")]);
1452 let expected = "COALESCE(NULL, 'Glue')";
1453 test_expr(actual, expected);
1454 }
1455
1456 #[test]
1457 fn function_concat() {
1458 let actual = f::concat(vec![text("Glue"), text("SQL"), text("Go")]);
1459 let expected = "CONCAT('Glue','SQL','Go')";
1460 test_expr(actual, expected);
1461
1462 let actual = f::concat(vec!["Glue", "SQL", "Go"]);
1463 let expected = "CONCAT(Glue, SQL, Go)";
1464 test_expr(actual, expected);
1465 }
1466
1467 #[test]
1468 fn function_concat_ws() {
1469 let actual = f::concat_ws(text(","), vec![text("Glue"), text("SQL"), text("Go")]);
1470 let expected = "CONCAT_WS(',', 'Glue', 'SQL', 'Go')";
1471 test_expr(actual, expected);
1472
1473 let actual = f::concat_ws(text(","), vec!["Glue", "SQL", "Go"]);
1474 let expected = "CONCAT_WS(',', Glue, SQL, Go)";
1475 test_expr(actual, expected);
1476 }
1477
1478 #[test]
1479 fn function_lpad() {
1480 let actual = f::lpad(text("GlueSQL"), num(10), Some(text("Go")));
1481 let expected = "LPAD('GlueSQL', 10, 'Go')";
1482 test_expr(actual, expected);
1483
1484 let actual = f::lpad(text("GlueSQL"), num(10), None);
1485 let expected = "LPAD('GlueSQL', 10)";
1486 test_expr(actual, expected);
1487
1488 let actual = text("GlueSQL").lpad(num(10), Some(text("Go")));
1489 let expected = "LPAD('GlueSQL', 10, 'Go')";
1490 test_expr(actual, expected);
1491
1492 let actual = text("GlueSQL").lpad(num(10), None);
1493 let expected = "LPAD('GlueSQL', 10)";
1494 test_expr(actual, expected);
1495 }
1496
1497 #[test]
1498 fn function_rpad() {
1499 let actual = f::rpad(text("GlueSQL"), num(10), Some(text("Go")));
1500 let expected = "RPAD('GlueSQL', 10, 'Go')";
1501 test_expr(actual, expected);
1502
1503 let actual = f::rpad(text("GlueSQL"), num(10), None);
1504 let expected = "RPAD('GlueSQL', 10)";
1505 test_expr(actual, expected);
1506
1507 let actual = text("GlueSQL").rpad(num(10), Some(text("Go")));
1508 let expected = "RPAD('GlueSQL', 10, 'Go')";
1509 test_expr(actual, expected);
1510
1511 let actual = text("GlueSQL").rpad(num(10), None);
1512 let expected = "RPAD('GlueSQL', 10)";
1513 test_expr(actual, expected);
1514 }
1515
1516 #[test]
1517 fn function_take() {
1518 let actual = f::take(col("list"), num(3));
1519 let expected = "TAKE(list,3)";
1520 test_expr(actual, expected);
1521
1522 let actual = expr("list").take(num(3));
1523 let expected = "TAKE(list,3)";
1524 test_expr(actual, expected);
1525 }
1526
1527 #[test]
1528 fn function_exp() {
1529 let actual = f::exp(num(2));
1530 let expected = "EXP(2)";
1531 test_expr(actual, expected);
1532
1533 let actual = num(2).exp();
1534 let expected = "EXP(2)";
1535 test_expr(actual, expected);
1536 }
1537
1538 #[test]
1539 fn function_substr() {
1540 let actual = f::substr(text("GlueSQL"), num(2), Some(num(4)));
1541 let expected = "SUBSTR('GlueSQL', 2, 4)";
1542 test_expr(actual, expected);
1543
1544 let actual = f::substr(text("GlueSQL"), num(2), None);
1545 let expected = "SUBSTR('GlueSQL', 2)";
1546 test_expr(actual, expected);
1547
1548 let actual = text("GlueSQL").substr(num(2), Some(num(4)));
1549 let expected = "SUBSTR('GlueSQL', 2, 4)";
1550 test_expr(actual, expected);
1551
1552 let actual = text("GlueSQL").substr(num(2), None);
1553 let expected = "SUBSTR('GlueSQL', 2)";
1554 test_expr(actual, expected);
1555
1556 let actual = text("GlueSQL").substr(num(2), None);
1557 let expected = "SUBSTR('GlueSQL', 2)";
1558 test_expr(actual, expected);
1559
1560 let actual = f::substr(text("GlueSQL ").rtrim(None), num(2), None);
1561 let expected = "SUBSTR(RTRIM('GlueSQL '), 2)";
1562 test_expr(actual, expected);
1563
1564 let actual = text("GlueSQL ").rtrim(None).substr(num(2), None);
1565 let expected = "SUBSTR(RTRIM('GlueSQL '), 2)";
1566 test_expr(actual, expected);
1567
1568 let actual = f::substr(text(" GlueSQL").ltrim(None), num(2), None);
1569 let expected = "SUBSTR(LTRIM(' GlueSQL'), 2)";
1570 test_expr(actual, expected);
1571
1572 let actual = text(" GlueSQL").ltrim(None).substr(num(2), None);
1573 let expected = "SUBSTR(LTRIM(' GlueSQL'), 2)";
1574 test_expr(actual, expected);
1575 }
1576
1577 #[test]
1578 fn function_rtrim() {
1579 let actual = f::rtrim(text("GlueSQL "), None);
1580 let expected = "RTRIM('GlueSQL ')";
1581 test_expr(actual, expected);
1582
1583 let actual = text("GlueSQL ").rtrim(None);
1584 let expected = "RTRIM('GlueSQL ')";
1585 test_expr(actual, expected);
1586
1587 let actual = f::rtrim(text("GlueSQLABC"), Some(text("ABC")));
1588 let expected = "RTRIM('GlueSQLABC','ABC')";
1589 test_expr(actual, expected);
1590
1591 let actual = text("GlueSQLABC").rtrim(Some(text("ABC")));
1592 let expected = "RTRIM('GlueSQLABC','ABC')";
1593 test_expr(actual, expected);
1594
1595 let actual = text("chicken").ltrim(None).rtrim(Some(text("en")));
1596 let expected = "RTRIM(LTRIM('chicken'),'en')";
1597 test_expr(actual, expected);
1598
1599 let actual = f::rtrim(text("chicken").ltrim(Some(text("chick"))), None);
1600 let expected = "RTRIM(LTRIM('chicken','chick'))";
1601 test_expr(actual, expected);
1602 }
1603
1604 #[test]
1605 fn function_ltrim() {
1606 let actual = f::ltrim(text(" GlueSQL"), None);
1607 let expected = "LTRIM(' GlueSQL')";
1608 test_expr(actual, expected);
1609
1610 let actual = text(" GlueSQL").ltrim(None);
1611 let expected = "LTRIM(' GlueSQL')";
1612 test_expr(actual, expected);
1613
1614 let actual = f::ltrim(text("ABCGlueSQL"), Some(text("ABC")));
1615 let expected = "LTRIM('ABCGlueSQL','ABC')";
1616 test_expr(actual, expected);
1617
1618 let actual = text("ABCGlueSQL").ltrim(Some(text("ABC")));
1619 let expected = "LTRIM('ABCGlueSQL','ABC')";
1620 test_expr(actual, expected);
1621
1622 let actual = text("chicken").rtrim(Some(text("en"))).ltrim(None);
1623 let expected = "LTRIM(RTRIM('chicken','en'))";
1624 test_expr(actual, expected);
1625
1626 let actual = text("chicken").rtrim(None).ltrim(Some(text("chick")));
1627 let expected = "LTRIM(RTRIM('chicken'),'chick')";
1628 test_expr(actual, expected);
1629 }
1630
1631 #[test]
1632 fn function_mod() {
1633 let actual = f::modulo(num(64), num(8));
1634 let expected = "mod(64,8)";
1635 test_expr(actual, expected);
1636 }
1637
1638 #[test]
1639 fn function_div() {
1640 let actual = f::divide(num(64), num(8));
1641 let expected = "div(64,8)";
1642 test_expr(actual, expected);
1643 }
1644
1645 #[test]
1646 fn function_format() {
1647 let actual = f::format(date("2017-06-15"), text("%Y-%m"));
1648 let expected = "FORMAT(DATE'2017-06-15','%Y-%m')";
1649 test_expr(actual, expected);
1650
1651 let actual = date("2017-06-15").format(text("%Y-%m"));
1652 let expected = "FORMAT(DATE '2017-06-15','%Y-%m')";
1653 test_expr(actual, expected);
1654
1655 let actual = f::format(timestamp("2015-09-05 23:56:04"), text("%Y-%m-%d %H:%M:%S"));
1656 let expected = "FORMAT(TIMESTAMP '2015-09-05 23:56:04', '%Y-%m-%d %H:%M:%S')";
1657 test_expr(actual, expected);
1658
1659 let actual = timestamp("2015-09-05 23:56:04").format(text("%Y-%m-%d %H:%M:%S"));
1660 let expected = "FORMAT(TIMESTAMP '2015-09-05 23:56:04', '%Y-%m-%d %H:%M:%S')";
1661 test_expr(actual, expected);
1662
1663 let actual = f::format(time("23:56:04"), text("%H:%M:%S"));
1664 let expected = "FORMAT(TIME '23:56:04', '%H:%M:%S')";
1665 test_expr(actual, expected);
1666
1667 let actual = time("23:56:04").format(text("%H:%M:%S"));
1668 let expected = "FORMAT(TIME '23:56:04', '%H:%M:%S')";
1669 test_expr(actual, expected);
1670 }
1671
1672 #[test]
1673 fn function_to_date() {
1674 let actual = f::to_date(text("2017-06-15"), text("%Y-%m-%d"));
1675 let expected = "TO_DATE('2017-06-15','%Y-%m-%d')";
1676 test_expr(actual, expected);
1677
1678 let actual = text("2017-06-15").to_date(text("%Y-%m-%d"));
1679 let expected = "TO_DATE('2017-06-15','%Y-%m-%d')";
1680 test_expr(actual, expected);
1681 }
1682
1683 #[test]
1684 fn function_to_timestamp() {
1685 let actual = f::to_timestamp(text("2015-09-05 23:56:04"), text("%Y-%m-%d %H:%M:%S"));
1686 let expected = "TO_TIMESTAMP('2015-09-05 23:56:04','%Y-%m-%d %H:%M:%S')";
1687 test_expr(actual, expected);
1688
1689 let actual = text("2015-09-05 23:56:04").to_timestamp(text("%Y-%m-%d %H:%M:%S"));
1690 let expected = "TO_TIMESTAMP('2015-09-05 23:56:04','%Y-%m-%d %H:%M:%S')";
1691 test_expr(actual, expected);
1692 }
1693
1694 #[test]
1695 fn function_to_time() {
1696 let actual = f::to_time(text("23:56:04"), text("%H:%M:%S"));
1697 let expected = "TO_TIME('23:56:04','%H:%M:%S')";
1698 test_expr(actual, expected);
1699
1700 let actual = text("23:56:04").to_time(text("%H:%M:%S"));
1701 let expected = "TO_TIME('23:56:04','%H:%M:%S')";
1702 test_expr(actual, expected);
1703 }
1704
1705 #[test]
1706 fn function_lower() {
1707 let actual = f::lower(text("ABC"));
1709 let expected = "LOWER('ABC')";
1710 test_expr(actual, expected);
1711
1712 let actual = expr("HoHo").lower();
1713 let expected = "LOWER(HoHo)";
1714 test_expr(actual, expected);
1715 }
1716
1717 #[test]
1718 fn function_initcap() {
1719 let actual = f::initcap(text("ABC"));
1721 let expected = "INITCAP('ABC')";
1722 test_expr(actual, expected);
1723
1724 let actual = expr("HoHo").initcap();
1725 let expected = "INITCAP(HoHo)";
1726 test_expr(actual, expected);
1727 }
1728
1729 #[test]
1730 fn function_position() {
1731 let actual = f::position(expr("cake"), text("ke"));
1732 let expected = "POSITION('ke' IN cake)";
1733 test_expr(actual, expected);
1734
1735 let actual = text("rice").position(text("cake"));
1736 let expected = "POSITION('cake' IN 'rice')";
1737 test_expr(actual, expected);
1738 }
1739
1740 #[test]
1741 fn function_find_idx() {
1742 let actual = f::find_idx(expr("oatmeal"), text("meal"), Some(num(2)));
1743 let expected = "FIND_IDX(oatmeal, 'meal', 2)";
1744 test_expr(actual, expected);
1745
1746 let actual = f::find_idx(expr("strawberry"), text("berry"), None);
1747 let expected = "FIND_IDX(strawberry, 'berry')";
1748 test_expr(actual, expected);
1749
1750 let actual = expr("blackberry").find_idx(text("black"), Some(num(1)));
1751 let expected = "FIND_IDX(blackberry, 'black', 1)";
1752 test_expr(actual, expected);
1753
1754 let actual = text("blue cheese").find_idx(text("blue"), None);
1755 let expected = "FIND_IDX('blue cheese', 'blue')";
1756 test_expr(actual, expected);
1757 }
1758
1759 #[test]
1760 fn function_cast() {
1761 let actual = col("date").cast(DataType::Int);
1762 let expected = "CAST(date AS INTEGER)";
1763 test_expr(actual, expected);
1764
1765 let actual = f::cast(expr("date"), "INTEGER");
1766 let expected = "CAST(date AS INTEGER)";
1767 test_expr(actual, expected);
1768 }
1769
1770 #[test]
1771 fn function_extract() {
1772 let actual = col("date").extract(DateTimeField::Year);
1773 let expected = "EXTRACT(YEAR FROM date)";
1774 test_expr(actual, expected);
1775
1776 let actual = f::extract(DateTimeField::Year, expr("date"));
1777 let expected = "EXTRACT(YEAR FROM date)";
1778 test_expr(actual, expected);
1779 }
1780
1781 #[test]
1782 fn function_ascii() {
1783 let actual = f::ascii(text("A"));
1784 let expected = "ASCII('A')";
1785 test_expr(actual, expected);
1786 }
1787
1788 #[test]
1789 fn function_chr() {
1790 let actual = f::chr(num(65));
1791 let expected = "CHR(65)";
1792 test_expr(actual, expected);
1793 }
1794
1795 #[test]
1796 fn function_md5() {
1797 let actual = f::md5(text("abc"));
1798 let expected = "MD5('abc')";
1799 test_expr(actual, expected);
1800 }
1801
1802 #[test]
1803 fn function_hex() {
1804 let actual = f::hex(num(10));
1805 let expected = "HEX(10)";
1806 test_expr(actual, expected);
1807
1808 let actual = f::hex(text("10"));
1809 let expected = "HEX('10')";
1810 test_expr(actual, expected);
1811
1812 let actual = f::hex(text("GlueSQL"));
1813 let expected = "HEX('GlueSQL')";
1814 test_expr(actual, expected);
1815 }
1816
1817 #[test]
1818 fn function_point() {
1819 let actual = f::point(num(1), num(2));
1820 let expected = "POINT(1, 2)";
1821 test_expr(actual, expected);
1822 }
1823
1824 #[test]
1825 fn function_get_x() {
1826 let actual = f::get_x(f::point(num(1), num(2)));
1827 let expected = "GET_X(POINT(1, 2))";
1828 test_expr(actual, expected);
1829 }
1830
1831 #[test]
1832 fn function_get_y() {
1833 let actual = f::get_y(f::point(num(1), num(2)));
1834 let expected = "GET_Y(POINT(1, 2))";
1835 test_expr(actual, expected);
1836 }
1837
1838 #[test]
1839 fn function_greatest() {
1840 let actual = f::greatest(vec![num(1), num(2), num(3)]);
1841 let expected = "GREATEST(1, 2, 3)";
1842 test_expr(actual, expected);
1843
1844 let actual = f::greatest(vec![text("Glue"), text("SQL"), text("Go")]);
1845 let expected = "GREATEST('Glue','SQL','Go')";
1846 test_expr(actual, expected);
1847 }
1848
1849 #[test]
1850 fn function_calc_distance() {
1851 let actual = f::calc_distance(f::point(num(1), num(2)), f::point(num(3), num(4)));
1852 let expected = "CALC_DISTANCE(POINT(1, 2), POINT(3, 4))";
1853 test_expr(actual, expected);
1854 }
1855
1856 #[test]
1857 fn function_replace() {
1858 let actual = f::replace(text("Mticky GlueMQL"), text("M"), text("S"));
1859 let expected = "REPLACE('Mticky GlueMQL','M','S')";
1860 test_expr(actual, expected);
1861
1862 let actual = text("Mticky GlueMQL").replace(text("M"), text("S"));
1863 let expected = "REPLACE('Mticky GlueMQL','M','S')";
1864 test_expr(actual, expected);
1865 }
1866
1867 #[test]
1868 fn function_length() {
1869 let actual = f::length(text("GlueSQL"));
1870 let expected = "LENGTH('GlueSQL')";
1871 test_expr(actual, expected);
1872 }
1873
1874 #[test]
1875 fn function_is_empty() {
1876 let actual = col("list").is_empty();
1877 let expected = "IS_EMPTY(list)";
1878 test_expr(actual, expected);
1879
1880 let actual = f::is_empty(col("list"));
1881 let expected = "IS_EMPTY(list)";
1882 test_expr(actual, expected);
1883 }
1884
1885 #[test]
1886 fn function_last_day_date() {
1887 let actual = f::last_day(date("2023-07-29"));
1888 let expected = "LAST_DAY(DATE'2023-07-29')";
1889 test_expr(actual, expected);
1890
1891 let actual = date("2023-07-29").last_day();
1892 let expected = "LAST_DAY(DATE'2023-07-29')";
1893 test_expr(actual, expected);
1894 }
1895
1896 #[test]
1897 fn function_last_day_timestamp() {
1898 let actual = f::last_day(timestamp("2023-07-29 11:00:00"));
1899 let expected = "LAST_DAY(TIMESTAMP '2023-07-29 11:00:00')";
1900 test_expr(actual, expected);
1901
1902 let actual = timestamp("2023-07-29 11:00:00").last_day();
1903 let expected = "LAST_DAY(TIMESTAMP '2023-07-29 11:00:00')";
1904 test_expr(actual, expected);
1905 }
1906
1907 #[test]
1908 fn function_entries() {
1909 let actual = f::entries(col("map"));
1910 let expected = "ENTRIES(map)";
1911 test_expr(actual, expected);
1912
1913 let actual = col("map").entries();
1914 let expected = "ENTRIES(map)";
1915 test_expr(actual, expected);
1916 }
1917
1918 #[test]
1919 fn function_fn_values() {
1920 let actual = col("map").values();
1921 let expected = "VALUES(map)";
1922 test_expr(actual, expected);
1923
1924 let actual = f::values(col("map"));
1925 let expected = "VALUES(map)";
1926 test_expr(actual, expected);
1927 }
1928
1929 #[test]
1930 fn function_keys() {
1931 let actual = f::keys(col("map"));
1932 let expected = "KEYS(map)";
1933 test_expr(actual, expected);
1934
1935 let actual = col("map").keys();
1936 let expected = "KEYS(map)";
1937 test_expr(actual, expected);
1938 }
1939}