@@ -193,6 +193,7 @@ impl Parser {
193
193
"CASE" => self . parse_case_expression ( ) ,
194
194
"CAST" => self . parse_cast_expression ( ) ,
195
195
"EXISTS" => self . parse_exists_expression ( ) ,
196
+ "EXTRACT" => self . parse_extract_expression ( ) ,
196
197
"NOT" => Ok ( ASTNode :: SQLUnary {
197
198
operator : SQLOperator :: Not ,
198
199
expr : Box :: new ( self . parse_subexpr ( Self :: UNARY_NOT_PREC ) ?) ,
@@ -417,6 +418,31 @@ impl Parser {
417
418
Ok ( exists_node)
418
419
}
419
420
421
+ pub fn parse_extract_expression ( & mut self ) -> Result < ASTNode , ParserError > {
422
+ self . expect_token ( & Token :: LParen ) ?;
423
+ let tok = self . next_token ( ) ;
424
+ let field = if let Some ( Token :: SQLWord ( ref k) ) = tok {
425
+ match k. keyword . as_ref ( ) {
426
+ "YEAR" => SQLDateTimeField :: Year ,
427
+ "MONTH" => SQLDateTimeField :: Month ,
428
+ "DAY" => SQLDateTimeField :: Day ,
429
+ "HOUR" => SQLDateTimeField :: Hour ,
430
+ "MINUTE" => SQLDateTimeField :: Minute ,
431
+ "SECOND" => SQLDateTimeField :: Second ,
432
+ _ => self . expected ( "Date/time field inside of EXTRACT function" , tok) ?,
433
+ }
434
+ } else {
435
+ self . expected ( "Date/time field inside of EXTRACT function" , tok) ?
436
+ } ;
437
+ self . expect_keyword ( "FROM" ) ?;
438
+ let expr = self . parse_expr ( ) ?;
439
+ self . expect_token ( & Token :: RParen ) ?;
440
+ Ok ( ASTNode :: SQLExtract {
441
+ field,
442
+ expr : Box :: new ( expr) ,
443
+ } )
444
+ }
445
+
420
446
/// Parse an operator following an expression
421
447
pub fn parse_infix ( & mut self , expr : ASTNode , precedence : u8 ) -> Result < ASTNode , ParserError > {
422
448
debug ! ( "parsing infix" ) ;
0 commit comments