adding literals + aggregate + functions

This commit is contained in:
Simon Petit 2024-12-10 18:01:22 +01:00
parent 319f2f9b43
commit 55a81cfe8a

View File

@ -19,8 +19,11 @@ open Ast
%token AS ON GROUP BY FILTER %token AS ON GROUP BY FILTER
%token OR AND NOT %token OR AND NOT
%token TRUE FALSE UNKNOWN %token TRUE FALSE UNKNOWN
%token PLUS_SIGN MINUS_SIGN INTEGER FLOAT %token PLUS_SIGN MINUS_SIGN
%token UNDERSCORE QUOTE %token DATE TIME TIMESTAMP
%token <int> INTEGER
%token FLOAT
%token UNDERSCORE QUOTE COLON
%token EOF %token EOF
%start main %start main
%type <query> main %type <query> main
@ -48,18 +51,19 @@ greater_than_or_equals_operator:
(* 5.3 LITERAL *) (* 5.3 LITERAL *)
literal : literal :
| signed_numeric_literal {} | signed_numeric_literal { $1 }
| general_literal {} | general_literal { $1 }
unsigned_literal: unsigned_literal:
(* | unsigned_numeric_literal {}*) (* | unsigned_numeric_literal {}*)
| general_literal {} | general_literal { $1 }
general_literal: general_literal:
| character_string_literal {} | character_string_literal { $1 }
| datetime_literal { $1 }
character_string_literal: character_string_literal:
| QUOTE IDENT QUOTE {} | QUOTE IDENT QUOTE { StringLiteral($2) }
introducer: introducer:
| UNDERSCORE { } | UNDERSCORE { }
@ -78,12 +82,65 @@ sign:
| PLUS_SIGN {} | PLUS_SIGN {}
| MINUS_SIGN {} | MINUS_SIGN {}
unsigned_integer:
| INTEGER { $1 }
datetime_literal:
| date_literal { $1 }
| time_literal { $1 }
(*| timestamp_literal {}*)
date_literal:
| DATE date_string { DateLiteral($2) }
time_literal:
| TIME time_string { TimeLiteral($2) }
date_string:
| QUOTE unquoted_date_string QUOTE { $2 }
time_string:
| QUOTE unquoted_time_string QUOTE { $2 }
date_value:
| years_value MINUS_SIGN months_value MINUS_SIGN days_value { String.concat "-" [$1;$3;$5] }
time_value:
| hours_value COLON minutes_value COLON seconds_value { String.concat ":" [$1;$3;$5] }
unquoted_date_string:
| date_value { $1 }
unquoted_time_string:
| time_value { $1 }
years_value :
| datetime_value { $1 }
months_value :
| datetime_value { $1 }
days_value :
| datetime_value { $1 }
hours_value :
| datetime_value { $1 }
minutes_value :
| datetime_value { $1 }
seconds_value:
| datetime_value { $1 }
datetime_value :
| unsigned_integer { string_of_int $1 }
(***********) (***********)
(* 5.4 NAMES AND IDENTIFIER *) (* 5.4 NAMES AND IDENTIFIER *)
column_name : column_name :
| IDENT {} | IDENT { $1 }
table_name : table_name :
| IDENT { Table($1) } | IDENT { Table($1) }
@ -110,6 +167,7 @@ parenthesized_value_expression:
| LEFT_PAREN value_expression RIGHT_PAREN { $2 } | LEFT_PAREN value_expression RIGHT_PAREN { $2 }
nonparenthesized_value_expression_primary: nonparenthesized_value_expression_primary:
| unsigned_value_specification { $1 }
| column_reference { Ref($1) } | column_reference { Ref($1) }
(*| set_function_specification { Ref("function") } *) (*| set_function_specification { Ref("function") } *)
@ -118,8 +176,8 @@ nonparenthesized_value_expression_primary:
(* 6.4 VALUE SPECIFCATION / TARGET SPECIFICATION *) (* 6.4 VALUE SPECIFCATION / TARGET SPECIFICATION *)
unsigned_value_specification: unsigned_value_specification:
| unsigned_literal {} | unsigned_literal { $1 }
| general_value_specification {} (*| general_value_specification {}*)
general_value_specification: general_value_specification:
| {} | {}
@ -155,7 +213,7 @@ set_function_specification:
(* 6.25 VALUE EXPRESSION *) (* 6.25 VALUE EXPRESSION *)
value_expression: value_expression:
| common_value_expression {} | common_value_expression { $1 }
common_value_expression: common_value_expression:
(*| numeric_value_expression {}*) (*| numeric_value_expression {}*)
@ -170,7 +228,7 @@ reference_value_expression:
(* 6.28 STRING VALUE EXPRESSION *) (* 6.28 STRING VALUE EXPRESSION *)
string_value_expression : string_value_expression :
| character_value_expression {} | character_value_expression { $1 }
(* | blob_value_expression {} *) (* | blob_value_expression {} *)
character_primary: character_primary:
@ -264,8 +322,9 @@ row_value_special_case :
(* 7.4 TABLE EXPRESSION *) (* 7.4 TABLE EXPRESSION *)
table_expression: table_expression:
| from_clause { $1 } | { None }
| from_clause where_clause { $1 } | from_clause { Some($1) }
| from_clause where_clause { Some($1) }
(************************) (************************)
@ -395,15 +454,21 @@ query_specification :
select_list : select_list :
| ASTERISK { [Asterisk] } | ASTERISK { [Asterisk] }
| select_sublist {$1} | select_sublist { $1 }
(*
select_sublist : select_sublist :
| IDENT { [Column($1)] } | IDENT { [Column($1)] }
| select_sublist COMMA IDENT { Column($3)::$1 } | select_sublist COMMA IDENT { Column($3)::$1 }
*)
select_sublist :
| select_sublist_element { [$1] }
| select_sublist COMMA select_sublist_element { $3::$1 }
select_sublist_element : select_sublist_element :
| derived_column {} | derived_column { $1 }
| qualified_asterisk {} (* | qualified_asterisk {} *)
qualified_asterisk: qualified_asterisk:
| asterisked_identifier_chain {} | asterisked_identifier_chain {}
@ -416,12 +481,12 @@ asterisked_identifier :
| IDENT {} | IDENT {}
derived_column: derived_column:
| value_expression {} | value_expression { Column($1, None) }
| value_expression as_clause {} | value_expression as_clause { Column($1, Some($2)) }
as_clause : as_clause :
| AS column_name {} | AS column_name { As($2) }
| column_name {} (*| column_name { As($1) }*)
(****************************) (****************************)
@ -537,31 +602,31 @@ search_condition:
(* 10.9 AGGREGATE FUNCTION *) (* 10.9 AGGREGATE FUNCTION *)
aggregate_function: aggregate_function:
| COUNT LEFT_PAREN ASTERISK RIGHT_PAREN { } | COUNT LEFT_PAREN ASTERISK RIGHT_PAREN { Count }
| COUNT LEFT_PAREN ASTERISK RIGHT_PAREN filter_clause { } | COUNT LEFT_PAREN ASTERISK RIGHT_PAREN filter_clause { Count }
| general_set_function { } | general_set_function { Aggregate($1) }
| general_set_function filter_clause { } | general_set_function filter_clause { Aggregate($1, $2) }
general_set_function: general_set_function:
| set_function_type LEFT_PAREN value_expression RIGHT_PAREN { } | set_function_type LEFT_PAREN value_expression RIGHT_PAREN { Function($1, None, $3) }
| set_function_type LEFT_PAREN set_quantifier value_expression RIGHT_PAREN { } | set_function_type LEFT_PAREN set_quantifier value_expression RIGHT_PAREN { Function($1, $3, $4) }
set_function_type: set_function_type:
| computationnal_operation {} | computationnal_operation { $1 }
set_quantifier : set_quantifier :
| ALL {} | ALL { All }
| DISTINCT {} | DISTINCT { Distinct }
filter_clause : filter_clause :
| FILTER LEFT_PAREN WHERE search_condition RIGHT_PAREN {} | FILTER LEFT_PAREN WHERE search_condition RIGHT_PAREN { Filter($4) }
computationnal_operation: computationnal_operation:
| AVG {} | AVG { Avg }
| MAX {} | MAX { Max }
| MIN {} | MIN { Min }
| SUM {} | SUM { Sum }
| COUNT {} | COUNT { Count }
(***************************) (***************************)