-
Notifications
You must be signed in to change notification settings - Fork 15
Normalisation Features
The parser normalizes language features using the following methods:
The AS
token is always added to a column alias.
In the following cases parentheses are added to ensure the semantic meaning:
-
surrounding the subquery itself and each statement (
ALTER USER
,CREATE TABLE
,CREATE USER
,DELETE
,GRANT
,INSERT
,REVOKE
,TRUNCATE TABLE
,UPDATE
) inside the subquery:all_or_any_predicate -> scalar_exp COMPARISON any_all_some subquery
-
surrounding subqueries included in the following terms:
query_exp
,query_spec
,query_term
,scalar_exp
andscalar_sub_exp
:all_or_any_predicate -> scalar_exp COMPARISON any_all_some subquery between_predicate -> scalar_exp BETWEEN scalar_exp AND scalar_exp in_predicate -> scalar_exp not_in '(' subquery ')' in_predicate -> scalar_exp IN '(' subquery ')' in_predicate -> scalar_exp not_in '(' scalar_exp_commalist ')' in_predicate -> scalar_exp IN '(' scalar_exp_commalist ')' join_ref -> '(' query_exp ')' AS NAME like_predicate -> scalar_exp not_like scalar_exp opt_escape like_predicate -> scalar_exp LIKE scalar_exp opt_escape ordering_spec -> scalar_exp opt_asc_desc [see: ordering_spec_commalist - order_by_clause] query_exp -> query_exp UNION query_term query_exp -> query_exp UNION ALL query_term query_exp -> query_exp INTERSECT query_term query_exp -> query_exp MINUS query_term scalar_opt_as_exp -> scalar_exp AS NAME scalar_sub_exp -> scalar_sub_exp '+' scalar_sub_exp scalar_sub_exp -> scalar_sub_exp '-' scalar_sub_exp scalar_sub_exp -> scalar_sub_exp '*' scalar_sub_exp scalar_sub_exp -> scalar_sub_exp '/' scalar_sub_exp scalar_sub_exp -> scalar_sub_exp 'div' scalar_sub_exp scalar_sub_exp -> unary_add_or_subtract scalar_sub_exp table_ref -> '(' query_exp ')' NAME test_for_null -> scalar_exp is_not_null test_for_null -> scalar_exp is_null
-
surrounding subqueries representing
from_column
terms:from_clause -> FROM from_column_commalist
-
surrounding subqueries representing function arguments and each statement (
ALTER USER
,CREATE TABLE
,CREATE USER
,DELETE
,GRANT
,INSERT
,REVOKE
,TRUNCATE TABLE
,UPDATE
) inside the function argumentsfunction_ref -> NAME '.' NAME '.' NAME '(' fun_args ')' function_ref -> NAME '.' NAME '(' fun_args ')' function_ref -> NAME '(' fun_args ')' function_ref -> FUNS '(' fun_args ')' function_ref -> FUNS '(' DISTINCT column_ref ')' function_ref -> FUNS '(' ALL scalar_exp ')'
-
surrounding the whole set operator:
query_exp -> query_exp UNION query_term query_exp -> query_exp UNION ALL query_term query_exp -> query_exp INTERSECT query_term query_exp -> query_exp MINUS query_term
-
surrounding subqueries inside the
selection
term:query_spec -> SELECT opt_hint opt_all_distinct selection opt_into table_exp
-
surrounding binary operations to secure the precedence rules:
scalar_sub_exp -> scalar_sub_exp '+' scalar_sub_exp scalar_sub_exp -> scalar_sub_exp '-' scalar_sub_exp scalar_sub_exp -> scalar_sub_exp '*' scalar_sub_exp scalar_sub_exp -> scalar_sub_exp '/' scalar_sub_exp search_condition -> search_condition OR search_condition search_condition -> search_condition AND search_condition
-
The following parentheses are not necessary and therefore removed:
case_when_exp -> '(' case_when_exp ')' from_column -> '(' join_clause ')' fun_arg -> '(' fun_arg ')' query_partition_clause -> PARTITION BY '(' scalar_exp_commalist ')' query_term -> '(' query_exp ')' scalar_sub_exp -> '(' scalar_sub_exp ')'
-
IS NOT NULL
scalar_exp IS NOT NULL
becomes:
NOT ( scalar_exp IS NULL )
-
NOT BETWEEN
scalar_exp NOT BETWEEN scalar_exp AND scalar_exp
becomes:
NOT ( scalar_exp BETWEEN scalar_exp AND scalar_exp )
-
NOT IN
scalar_exp NOT IN '(' subquery ')' scalar_exp NOT IN '(' scalar_exp_commalist ')'
becomes:
NOT ( scalar_exp IN '(' subquery ')' ) NOT ( scalar_exp IN '(' scalar_exp_commalist ')' )
-
NOT LIKE
scalar_exp NOT LIKE scalar_exp opt_escape
becomes:
NOT ( scalar_exp LIKE scalar_exp opt_escape )