adding datetime_value_expression + breaking common_value_expression circle
This commit is contained in:
parent
a7a422abfc
commit
58b13cdd52
@ -11,18 +11,19 @@ open Ast
|
||||
%token CROSS NATURAL UNION JOIN
|
||||
%token GREATER_THAN_OPERATOR LESS_THAN_OPERATOR EQUALS_OPERATOR
|
||||
%token MAX MIN SUM COUNT AVG
|
||||
%token SUBSTRING
|
||||
%token ASYMMETRIC SYMMETRIC
|
||||
%token <string> IDENT
|
||||
%token COMMA DOT PIPE
|
||||
%token COMMA PIPE
|
||||
%token LEFT_PAREN RIGHT_PAREN
|
||||
%token ASTERISK
|
||||
%token ASTERISK SOLIDUS
|
||||
%token AS ON GROUP BY FILTER
|
||||
%token OR AND NOT
|
||||
%token TRUE FALSE UNKNOWN
|
||||
%token PLUS_SIGN MINUS_SIGN
|
||||
%token DATE TIME TIMESTAMP
|
||||
%token <int> INTEGER
|
||||
%token FLOAT
|
||||
%token <float> FLOAT
|
||||
%token UNDERSCORE QUOTE COLON
|
||||
%token EOF
|
||||
%start main
|
||||
@ -36,6 +37,7 @@ main:
|
||||
| table_definition EOF { $1 }
|
||||
| drop_schema_statement EOF { $1 }
|
||||
| drop_table_statement EOF { $1 }
|
||||
| drop_column_definition EOF { $1 }
|
||||
|
||||
(* 5.2 TOKEN / SEPARATOR *)
|
||||
|
||||
@ -59,7 +61,7 @@ literal :
|
||||
| general_literal { $1 }
|
||||
|
||||
unsigned_literal:
|
||||
(* | unsigned_numeric_literal {}*)
|
||||
(* | unsigned_numeric_literal { $1 }*)
|
||||
| general_literal { $1 }
|
||||
|
||||
general_literal:
|
||||
@ -77,14 +79,15 @@ signed_numeric_literal:
|
||||
| unsigned_numeric_literal {}
|
||||
|
||||
unsigned_numeric_literal :
|
||||
| exact_numeric_literal {}
|
||||
| exact_numeric_literal { $1 }
|
||||
|
||||
exact_numeric_literal:
|
||||
| FLOAT { }
|
||||
| INTEGER {}
|
||||
|
||||
sign:
|
||||
| PLUS_SIGN {}
|
||||
| MINUS_SIGN {}
|
||||
| PLUS_SIGN { Plus }
|
||||
| MINUS_SIGN { Minus }
|
||||
|
||||
unsigned_integer:
|
||||
| INTEGER { $1 }
|
||||
@ -92,7 +95,7 @@ unsigned_integer:
|
||||
datetime_literal:
|
||||
| date_literal { $1 }
|
||||
| time_literal { $1 }
|
||||
(*| timestamp_literal {}*)
|
||||
| timestamp_literal { $1 }
|
||||
|
||||
date_literal:
|
||||
| DATE date_string { DateLiteral($2) }
|
||||
@ -100,12 +103,18 @@ date_literal:
|
||||
time_literal:
|
||||
| TIME time_string { TimeLiteral($2) }
|
||||
|
||||
timestamp_literal:
|
||||
| TIMESTAMP timestamp_string { TimestampLiteral($2) }
|
||||
|
||||
date_string:
|
||||
| QUOTE unquoted_date_string QUOTE { $2 }
|
||||
|
||||
time_string:
|
||||
| QUOTE unquoted_time_string QUOTE { $2 }
|
||||
|
||||
timestamp_string:
|
||||
| QUOTE unquoted_timestamp_string QUOTE { $2 }
|
||||
|
||||
date_value:
|
||||
| years_value MINUS_SIGN months_value MINUS_SIGN days_value { String.concat "-" [$1;$3;$5] }
|
||||
|
||||
@ -118,6 +127,9 @@ unquoted_date_string:
|
||||
unquoted_time_string:
|
||||
| time_value { $1 }
|
||||
|
||||
unquoted_timestamp_string:
|
||||
| unquoted_date_string unquoted_time_string { $1 ^ " " ^$2 }
|
||||
|
||||
years_value :
|
||||
| datetime_value { $1 }
|
||||
|
||||
@ -154,10 +166,6 @@ schema_name:
|
||||
|
||||
(****************************)
|
||||
|
||||
character_value_expression:
|
||||
(* | concatenation {} *)
|
||||
| character_factor { $1 }
|
||||
|
||||
|
||||
(* 6. SCALAR EXPRESSION *)
|
||||
|
||||
@ -171,6 +179,7 @@ parenthesized_value_expression:
|
||||
| LEFT_PAREN value_expression RIGHT_PAREN { $2 }
|
||||
|
||||
nonparenthesized_value_expression_primary:
|
||||
(* Return StringLiteral, TimeLiteral, DateLiteral, TimestampLiteral *)
|
||||
| unsigned_value_specification { $1 }
|
||||
| column_reference { Ref($1) }
|
||||
| set_function_specification { Ref("function") }
|
||||
@ -218,29 +227,70 @@ set_function_specification:
|
||||
|
||||
value_expression:
|
||||
| common_value_expression { $1 }
|
||||
(*| boolean_value_expression { $1 }*)
|
||||
|
||||
(* To avoid cycles and therefore reduce/reduce conflicts
|
||||
instead of having all *_value_expression below,
|
||||
they are cascaded :
|
||||
numeric_value_expression -> string_value_expression
|
||||
-> datetime_value_expression -> reference_value_expression
|
||||
in the last step of the *_value_expression preceding
|
||||
instead of value_expression_primary
|
||||
|
||||
This way the parser covers all of them every time, and
|
||||
prevent reduce/reduce conflicts *)
|
||||
common_value_expression:
|
||||
(*| numeric_value_expression {}*)
|
||||
(*| string_value_expression {} *)
|
||||
| reference_value_expression { $1 }
|
||||
| numeric_value_expression { $1 }
|
||||
(* | string_value_expression { $1 } *)
|
||||
(* | datetime_value_expression { $1 } *)
|
||||
(* | reference_value_expression { $1 }*)
|
||||
|
||||
reference_value_expression:
|
||||
| value_expression_primary { $1 }
|
||||
|
||||
(*************************)
|
||||
|
||||
(* 6.26 NUMERIC VALUE EXPRESSION *)
|
||||
|
||||
numeric_value_expression:
|
||||
| term { $1 }
|
||||
| numeric_value_expression PLUS_SIGN term { Numeric($1, Plus, $3) }
|
||||
| numeric_value_expression MINUS_SIGN term { Numeric($1, Minus, $3) }
|
||||
|
||||
term:
|
||||
| factor { $1 }
|
||||
| term ASTERISK factor { Numeric($1, Times, $3) }
|
||||
| term SOLIDUS factor { Numeric($1, Divide, $3) }
|
||||
|
||||
factor:
|
||||
| numeric_primary { $1 }
|
||||
| sign numeric_primary { Signed($1, $2) }
|
||||
|
||||
numeric_primary:
|
||||
| string_value_expression { $1 }
|
||||
(* | value_expression_primary { $1 }*)
|
||||
|
||||
(*********************************)
|
||||
|
||||
(* 6.28 STRING VALUE EXPRESSION *)
|
||||
|
||||
string_value_expression :
|
||||
| character_value_expression { $1 }
|
||||
(* | blob_value_expression {} *)
|
||||
|
||||
character_value_expression:
|
||||
(* Return Concatenation of char_expression * expression_primary *)
|
||||
| concatenation { $1 }
|
||||
(* Return Char of string *)
|
||||
| character_factor { $1 }
|
||||
|
||||
character_primary:
|
||||
| value_expression_primary { $1 }
|
||||
(* | string_value_function {} *)
|
||||
| datetime_value_expression { $1 }
|
||||
(* | value_expression_primary { $1 }*)
|
||||
| string_value_function { $1 }
|
||||
|
||||
concatenation:
|
||||
| character_value_expression concatenation_operator character_factor {}
|
||||
| character_value_expression concatenation_operator character_factor { Concatenation($1, $3) }
|
||||
|
||||
character_factor :
|
||||
| character_primary { $1 }
|
||||
@ -250,13 +300,39 @@ character_factor :
|
||||
(* 6.29 STRING VALUE FUNCTION *)
|
||||
|
||||
string_value_function:
|
||||
| character_value_function {}
|
||||
| character_value_function { $1 }
|
||||
|
||||
character_value_function :
|
||||
| {}
|
||||
| character_substring_function { $1 }
|
||||
|
||||
character_substring_function :
|
||||
| SUBSTRING LEFT_PAREN character_value_expression FROM start_position RIGHT_PAREN { Substring($3, $5) }
|
||||
|
||||
start_position:
|
||||
| numeric_value_expression { $1 }
|
||||
(*************************)
|
||||
|
||||
(* 6.30 DATETIME VALUE EXPRESSION *)
|
||||
|
||||
datetime_value_expression:
|
||||
| datetime_term { $1 }
|
||||
|
||||
datetime_term :
|
||||
| datetime_factor { $1 }
|
||||
|
||||
datetime_factor:
|
||||
| datetime_primary { $1 }
|
||||
|
||||
datetime_primary:
|
||||
| reference_value_expression { $1 }
|
||||
(* | datetime_value_function { $1 }*)
|
||||
|
||||
(**********************************)
|
||||
|
||||
(* 6.31 DATETIME VALUE FUCTION *)
|
||||
|
||||
(*******************************)
|
||||
|
||||
(* 6.34 BOOLEAN VALUE EXPRESSION *)
|
||||
|
||||
boolean_value_expression:
|
||||
@ -330,11 +406,11 @@ table_expression:
|
||||
| from_clause { TableExpression(Some($1), None, None) }
|
||||
| from_clause where_clause { TableExpression(Some($1), Some($2), None) }
|
||||
| from_clause where_clause group_by_clause { TableExpression(Some($1), Some($2), Some($3)) }
|
||||
(* | from_clause where_clause group_by_clause having_clause { Some($1) }
|
||||
| from_clause group_by_clause { Some($1) }
|
||||
| from_clause group_by_clause having_clause { Some($1) }
|
||||
| from_clause having_clause { Some($1) }
|
||||
*)
|
||||
| from_clause where_clause group_by_clause having_clause { TableExpression(Some($1), Some($2), Some($3)) }
|
||||
| from_clause where_clause having_clause { TableExpression(Some($1), Some($2), None) }
|
||||
| from_clause group_by_clause { TableExpression(Some($1), None, Some($2)) }
|
||||
| from_clause group_by_clause having_clause { TableExpression(Some($1), None, Some($2)) }
|
||||
| from_clause having_clause { TableExpression(Some($1), None, None) }
|
||||
|
||||
(************************)
|
||||
|
||||
@ -484,15 +560,17 @@ select_sublist_element :
|
||||
| derived_column { $1 }
|
||||
(* | qualified_asterisk {} *)
|
||||
|
||||
(*
|
||||
qualified_asterisk:
|
||||
| asterisked_identifier_chain {}
|
||||
| asterisked_identifier_chain DOT ASTERISK {}
|
||||
|
||||
asterisked_identifier_chain:
|
||||
| asterisked_identifier {}
|
||||
| asterisked_identifier_chain DOT asterisked_identifier {}
|
||||
|
||||
asterisked_identifier :
|
||||
| IDENT {}
|
||||
| ASTERISK {}
|
||||
*)
|
||||
|
||||
derived_column:
|
||||
| value_expression { Column($1, None) }
|
||||
@ -666,22 +744,23 @@ drop_schema_statement:
|
||||
(* 11.3 TABLE DEFINITION *)
|
||||
|
||||
table_definition :
|
||||
| CREATE TABLE table_name { CreateTable($3) }
|
||||
| CREATE TABLE table_name { CreateTable(None, $3) }
|
||||
| CREATE table_scope TABLE table_name { CreateTable(Some($2), $4) }
|
||||
|
||||
table_scope :
|
||||
| global_or_local TEMPORARY {}
|
||||
| global_or_local TEMPORARY { $1 }
|
||||
|
||||
global_or_local :
|
||||
| GLOBAL {}
|
||||
| LOCAL {}
|
||||
| GLOBAL { Global }
|
||||
| LOCAL { Local }
|
||||
|
||||
(*************************)
|
||||
|
||||
(* 11.18 DROP COLUMN DEFINITION *)
|
||||
|
||||
drop_column_definition:
|
||||
| DROP column_name {}
|
||||
| DROP COLUMN column_name {}
|
||||
| DROP column_name { DropColumn($2) }
|
||||
| DROP COLUMN column_name { DropColumn($3) }
|
||||
|
||||
(********************************)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user