Skip to content

Commit fbc1d96

Browse files
Support parentheses in DISTINCT clause, CURRENT_TIMESTAMP, CURRENT_TIME, and CURRENT_DATE (#391)
* Inital support in current_timestamp * Support time functions * Add Test * Fix PR * Fix tests * Add Support for distinct with parentheses * Fix nightly
1 parent ea0eb1b commit fbc1d96

File tree

2 files changed

+92
-0
lines changed

2 files changed

+92
-0
lines changed

src/parser.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,9 @@ impl<'a> Parser<'a> {
408408
self.prev_token();
409409
Ok(Expr::Value(self.parse_value()?))
410410
}
411+
Keyword::CURRENT_TIMESTAMP | Keyword::CURRENT_TIME | Keyword::CURRENT_DATE => {
412+
self.parse_time_functions(ObjectName(vec![w.to_ident()]))
413+
}
411414
Keyword::CASE => self.parse_case_expr(),
412415
Keyword::CAST => self.parse_cast_expr(),
413416
Keyword::TRY_CAST => self.parse_try_cast_expr(),
@@ -552,6 +555,20 @@ impl<'a> Parser<'a> {
552555
}))
553556
}
554557

558+
pub fn parse_time_functions(&mut self, name: ObjectName) -> Result<Expr, ParserError> {
559+
let args = if self.consume_token(&Token::LParen) {
560+
self.parse_optional_args()?
561+
} else {
562+
vec![]
563+
};
564+
Ok(Expr::Function(Function {
565+
name,
566+
args,
567+
over: None,
568+
distinct: false,
569+
}))
570+
}
571+
555572
pub fn parse_window_frame_units(&mut self) -> Result<WindowFrameUnits, ParserError> {
556573
match self.next_token() {
557574
Token::Word(w) => match w.keyword {
@@ -2631,8 +2648,19 @@ impl<'a> Parser<'a> {
26312648
None
26322649
};
26332650

2651+
// Not Sure if Top should be cheked here as well. Trino doesn't support TOP.
2652+
let is_l_parent = if distinct {
2653+
self.consume_token(&Token::LParen)
2654+
} else {
2655+
false
2656+
};
2657+
26342658
let projection = self.parse_comma_separated(Parser::parse_select_item)?;
26352659

2660+
if is_l_parent {
2661+
self.consume_token(&Token::RParen);
2662+
}
2663+
26362664
// Note that for keywords to be properly handled here, they need to be
26372665
// added to `RESERVED_FOR_COLUMN_ALIAS` / `RESERVED_FOR_TABLE_ALIAS`,
26382666
// otherwise they may be parsed as an alias as part of the `projection`

tests/sqlparser_common.rs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,22 @@ fn parse_select_distinct() {
327327
);
328328
}
329329

330+
#[test]
331+
fn parse_select_distinct_two_fields() {
332+
let sql = "SELECT DISTINCT name, id FROM customer";
333+
let select = verified_only_select(sql);
334+
assert!(select.distinct);
335+
one_statement_parses_to("SELECT DISTINCT (name, id) FROM customer", sql);
336+
assert_eq!(
337+
&SelectItem::UnnamedExpr(Expr::Identifier(Ident::new("name"))),
338+
&select.projection[0]
339+
);
340+
assert_eq!(
341+
&SelectItem::UnnamedExpr(Expr::Identifier(Ident::new("id"))),
342+
&select.projection[1]
343+
);
344+
}
345+
330346
#[test]
331347
fn parse_select_all() {
332348
one_statement_parses_to("SELECT ALL name FROM customer", "SELECT name FROM customer");
@@ -4050,3 +4066,51 @@ fn verified_only_select(query: &str) -> Select {
40504066
fn verified_expr(query: &str) -> Expr {
40514067
all_dialects().verified_expr(query)
40524068
}
4069+
4070+
#[test]
4071+
fn parse_time_functions() {
4072+
let sql = "SELECT CURRENT_TIMESTAMP()";
4073+
let select = verified_only_select(sql);
4074+
assert_eq!(
4075+
&Expr::Function(Function {
4076+
name: ObjectName(vec![Ident::new("CURRENT_TIMESTAMP")]),
4077+
args: vec![],
4078+
over: None,
4079+
distinct: false,
4080+
}),
4081+
expr_from_projection(&select.projection[0])
4082+
);
4083+
4084+
// Validating Parenthesis
4085+
one_statement_parses_to("SELECT CURRENT_TIMESTAMP", sql);
4086+
4087+
let sql = "SELECT CURRENT_TIME()";
4088+
let select = verified_only_select(sql);
4089+
assert_eq!(
4090+
&Expr::Function(Function {
4091+
name: ObjectName(vec![Ident::new("CURRENT_TIME")]),
4092+
args: vec![],
4093+
over: None,
4094+
distinct: false,
4095+
}),
4096+
expr_from_projection(&select.projection[0])
4097+
);
4098+
4099+
// Validating Parenthesis
4100+
one_statement_parses_to("SELECT CURRENT_TIME", sql);
4101+
4102+
let sql = "SELECT CURRENT_DATE()";
4103+
let select = verified_only_select(sql);
4104+
assert_eq!(
4105+
&Expr::Function(Function {
4106+
name: ObjectName(vec![Ident::new("CURRENT_DATE")]),
4107+
args: vec![],
4108+
over: None,
4109+
distinct: false,
4110+
}),
4111+
expr_from_projection(&select.projection[0])
4112+
);
4113+
4114+
// Validating Parenthesis
4115+
one_statement_parses_to("SELECT CURRENT_DATE", sql);
4116+
}

0 commit comments

Comments
 (0)