From: <ibr...@us...> - 2010-05-21 12:09:54
|
Revision: 3532 http://tora.svn.sourceforge.net/tora/?rev=3532&view=rev Author: ibre5041 Date: 2010-05-21 12:09:47 +0000 (Fri, 21 May 2010) Log Message: ----------- bugfixes, 11G features, analytic functions Modified Paths: -------------- branches/tora-trotl/sandbox/SELECT_SIMPLE.g Modified: branches/tora-trotl/sandbox/SELECT_SIMPLE.g =================================================================== --- branches/tora-trotl/sandbox/SELECT_SIMPLE.g 2010-05-21 08:56:41 UTC (rev 3531) +++ branches/tora-trotl/sandbox/SELECT_SIMPLE.g 2010-05-21 12:09:47 UTC (rev 3532) @@ -55,7 +55,7 @@ T_SELECT = 't_select'; T_COLUMN_LIST = 't_column_list'; T_SELECT_COLUMN = 't_select_column'; - T_FROM = 'from'; + T_FROM = 't_from'; T_SELECTED_TABLE = 'selected_table'; T_WHERE = 't_where'; T_HIERARCHICAL = 't_hierarchical'; @@ -94,25 +94,26 @@ select_expression : subquery_factoring_clause? - /*'SELECT'*/k_select /*( hint )?*/ ( /*'DISTINCT'*/k_distinct | /*'UNIQUE'*/k_union | /*'ALL'*/k_all )? select_list - /*'FROM'*/k_from + /*'SELECT'*/k_select /*( hint )?*/ ( /*'DISTINCT'*/k_distinct | /*'UNIQUE'*/k_union | /*'ALL'*/k_all )? select_list + /*'FROM'*/k_from ( table_reference_list | join_clause | LPAREN join_clause RPAREN ) ( where_clause )? ( hierarchical_query_clause )? ( group_by_clause )? ( /*'HAVING'*/k_having sql_condition )? ( model_clause )? - ( ( /*'UNION'*/k_union ( /*'ALL'*/k_all )? - | /*'INTERSECT'*/k_intersect - | /*'MINUS'*/k_minus - ) - ( select_expression | subquery ) - )? - ( order_by_clause )? + ( union_clause )? +// ( ( /*'UNION'*/k_union ( /*'ALL'*/k_all )? +// | /*'INTERSECT'*/k_intersect +// | /*'MINUS'*/k_minus +// ) +// ( select_expression | subquery ) +// )? + ( order_by_clause )? -> ^('t_select' /*'SELECT'*/k_select subquery_factoring_clause? select_list - ^('from' k_from table_reference_list? join_clause?) + ^('t_from' k_from table_reference_list? join_clause?) where_clause? hierarchical_query_clause? //TODO TEST ME model_clause? @@ -120,13 +121,31 @@ order_by_clause? ) ; - +/* ================================================================================ + subquery factoring + ================================================================================ */ subquery_factoring_clause - : k_with sql_identifier (LPAREN select_list RPAREN)? k_as subquery (COMMA sql_identifier k_as subquery)* - //->^('t_with' 'WITH' select_list? (sql_identifier 'AS' subquery)+ ) + : k_with + sql_identifier (LPAREN select_list RPAREN)? k_as subquery + (COMMA sql_identifier (LPAREN select_list RPAREN)? k_as subquery)* + search_clause? + cycle_clause? + ->^('t_with' (sql_identifier LPAREN? select_list? RPAREN? k_as subquery)+ search_clause? cycle_clause?) //TODO comma is missing here ; +search_clause + : 'SEARCH' ('DEPTH'|'BREADTH') 'FIRST' 'BY' + ( c_alias 'ASC'? 'DESC'? ('NULLS' 'FIRST')? ('NULLS' 'LAST')? ) + ( COMMA c_alias 'ASC'? 'DESC'? ('NULLS' 'FIRST')? ('NULLS' 'LAST')? )* + 'SET' sql_identifier + ; + +cycle_clause + : 'CYCLE' c_alias ( COMMA c_alias)* + 'SET' sql_identifier 'TO' literal 'DEFAULT' literal + ; + /* ================================================================================ Query column list specs (ie. everything between 'SELECT' ... 'FROM' ================================================================================ */ @@ -142,7 +161,7 @@ | sql_expression ) (alias|alias_name=sql_identifier)? - -> ^('select_column' $asterisk1? $schema? DOT? $asterisk2? sql_expression? alias? $alias_name? ) + -> ^('t_select_column' $asterisk1? $schema? DOT? $asterisk2? sql_expression? alias? $alias_name? ) ; sql_expression : expr_add @@ -153,14 +172,15 @@ expr_mul : expr_sign ( ( ASTERISK | DIVIDE ) expr_sign )* ; -expr_sign - : ( PLUS | MINUS )? expr_pow +expr_sign // in fact this is not "sign" but unary operator + : ( PLUS | MINUS | 'PRIOR' | 'CONNECT_BY_ROOT' )? expr_pow ; expr_pow : expr_expr ( EXPONENT expr_expr )* ; expr_expr : ( expr_paren ) => expr_paren + | ( analytic_function ) => analytic_function | ( function_expression ) => function_expression // | ( compound_expression ) => compound_expression | ( case_expression ) => case_expression @@ -176,7 +196,8 @@ // | type_constructor_expression // | variable_expression // : 'NULL' | NUMBER | QUOTED_STRING | IDENTIFIER - | ( subquery ) => subquery + | ( cast_expression) => cast_expression + | ( subquery ) => subquery ; expr_paren : LPAREN nested_expression RPAREN @@ -186,7 +207,8 @@ ; function_expression : (function_name|analytic_function_name) LPAREN call_parameters RPAREN - ; + ; + call_parameters : ASTERISK | call_parameter ( COMMA call_parameter )* @@ -198,16 +220,19 @@ : identifier ; case_expression - : /*'CASE'*/k_case ( simple_case_expression | searched_case_expression ) ( else_case_expression )? /*'END'*/k_end + : k_case + ( simple_case_expression | searched_case_expression ) + ( else_case_expression )? + k_end ; simple_case_expression - : nested_expression ( /*'WHEN'*/k_when nested_expression /*'THEN'*/k_then nested_expression )+ + : nested_expression ( k_when nested_expression k_then nested_expression )+ ; searched_case_expression - : ( /*'WHEN'*/k_when sql_condition /*'THEN'*/k_then nested_expression )+ + : ( k_when sql_condition k_then nested_expression )+ ; else_case_expression - : /*'ELSE'*/k_else nested_expression + : k_else nested_expression ; simple_expression @@ -227,17 +252,72 @@ : LPAREN select_expression RPAREN ; +cast_expression + : 'CAST' + LPAREN + ( sql_expression | ( 'MULTISET' subquery) ) + k_as datatype + RPAREN + ; + +datatype + : 'BINARY_INTEGER' + | 'BINARY_FLOAT' + | 'BINARY_DOUBLE' + | 'NATURAL' + | 'POSITIVE' + | ( 'NUMBER' | 'NUMERIC' | 'DECIMAL' | 'DEC' ) ( LPAREN NUMBER ( COMMA NUMBER )? RPAREN )? + | 'LONG' ( 'RAW')? ( LPAREN NUMBER RPAREN )? + | 'RAW' ( LPAREN NUMBER RPAREN )? + | 'BOOLEAN' + | 'DATE' + | 'INTERVAL' 'DAY' ( LPAREN NUMBER RPAREN )? 'TO' 'SECOND' ( LPAREN NUMBER RPAREN )? + | 'INTERVAL' 'YEAR' ( LPAREN NUMBER RPAREN )? 'TO' 'MONTH' + | ( 'TIME' | 'TIMESTAMP' ) ( LPAREN NUMBER RPAREN )? ( 'WITH' ( 'LOCAL' )? 'TIME' 'ZONE')? + | 'INTEGER' + | 'INT' + | 'SMALLINT' + | 'FLOAT' ( LPAREN NUMBER RPAREN )? + | 'REAL' + | 'DOUBLE' 'PRECISION' + | 'CHAR' ( 'VARYING' )? ( LPAREN NUMBER ( 'BYTE' | 'CHAR' )? RPAREN )? ( 'CHARACTER' 'SET' ( identifier | column_spec CHARSET_ATTR ) )? + | 'VARCHAR' ( LPAREN NUMBER ( 'BYTE' | 'CHAR' )? RPAREN )? ( 'CHARACTER' 'SET' ( identifier | column_spec CHARSET_ATTR ) )? + | 'VARCHAR2' ( LPAREN NUMBER ( 'BYTE' | 'CHAR' )? RPAREN )? ( 'CHARACTER' 'SET' ( identifier | column_spec CHARSET_ATTR ) )? + | 'CHARACTER' ( 'VARYING' )? ( LPAREN NUMBER RPAREN )? + | 'NCHAR' ( 'VARYING' )? ( LPAREN NUMBER RPAREN )? + | 'NVARCHAR' ( LPAREN NUMBER RPAREN )? + | 'NVARCHAR2' ( LPAREN NUMBER RPAREN )? + | 'NATIONAL' ( 'CHARACTER' | 'CHAR' ) ( 'VARYING' )? ( LPAREN NUMBER RPAREN )? + | 'MLSLABEL' + | 'PLS_INTEGER' + | 'BLOB' + | 'CLOB' ( 'CHARACTER' 'SET' ( identifier | column_spec CHARSET_ATTR ) )? + | 'NCLOB' + | 'BFILE' + | 'ROWID' + | 'UROWID' ( LPAREN NUMBER RPAREN )? + ; + boolean_literal : /*'TRUE'*/k_true | /*'FALSE'*/k_false ; + +c_alias // Note this one is used in 11G query factoring ATM + : (k_as? sql_identifier) + | k_as + ; + alias - : ( /*'AS'*/k_as ) sql_identifier? + : k_as sql_identifier? ; column_spec : sql_identifier DOT sql_identifier DOT sql_identifier | sql_identifier DOT sql_identifier | sql_identifier + | 'LEVEL' //TODO more pseudocolumns here - especially those who are reserved words + | 'CONNECT_BY_ISLEAF' + | 'CONNECT_BY_ISCYCLE' ; function_name @@ -292,12 +372,13 @@ : LPAREN PLUS RPAREN ; selected_table - : ( table_spec | ( 'TABLE' | 'THE' )? subquery ) ( alias )? + : ( table_spec | ( 'TABLE' | 'THE' )? subquery ) (alias|alias_name=sql_identifier)? + -> ^('selected_table' table_spec? 'TABLE'? 'THE'? subquery? alias? $alias_name? ) ; table_spec : ( schema_name DOT )? table_name ( AT_SIGN link_name )? - -> ^('selected_table' schema_name? DOT? table_name AT_SIGN? link_name?) +// -> ^('selected_table' schema_name? DOT? table_name AT_SIGN? link_name?) ; schema_name @@ -318,14 +399,14 @@ ================================================================================ */ where_clause : /*'WHERE'*/k_where sql_condition - -> ^( 'where' k_where sql_condition) + -> ^( 't_where' k_where sql_condition) ; /* ================================================================================ hierarchical query clause ================================================================================ */ hierarchical_query_clause : ( 'START' 'WITH' start=sql_condition )? 'CONNECT' 'BY' ( 'NOCYCLE' )? connect=sql_condition - -> ^('hierarchical' 'START'? 'WITH'? $start? 'CONNECT' 'BY' 'NOCYCLE'? $connect) + -> ^('t_hierarchical' 'START'? 'WITH'? $start? 'CONNECT' 'BY' 'NOCYCLE'? $connect) ; /* ================================================================================ @@ -333,7 +414,7 @@ ================================================================================ */ group_by_clause : 'GROUP' 'BY' group_by_exprs - -> ^('group_by' 'GROUP' 'BY' group_by_exprs) + -> ^('t_group_by' 'GROUP' 'BY' group_by_exprs) ; group_by_exprs : group_by_expr ( COMMA group_by_expr )* @@ -583,21 +664,23 @@ ; /* ================================================================================ - ORDER BY clause + UNION clause ================================================================================ */ union_clause : - ( /*'UNION'*/k_union ( /*'ALL'*/k_all )? - | /*'INTERSECT'*/k_intersect - | /*'MINUS'*/k_minus + ( k_union ( k_all )? + | k_intersect + | k_minus ) ( select_expression | subquery ) + -> ^('t_union' k_union? k_all? k_intersect? k_minus? select_expression? subquery?) ; /* ================================================================================ ORDER BY clause ================================================================================ */ order_by_clause +//TODO use search_clause here : 'ORDER' 'SIBLINGS'? 'BY' ( sql_expression 'ASC'? 'DESC'? ('NULLS' 'FIRST')? ('NULLS' 'LAST')? ) ( COMMA sql_expression 'ASC'? 'DESC'? ('NULLS' 'FIRST')? ('NULLS' 'LAST')? )* @@ -623,7 +706,7 @@ ; analytic_function - : function_expression 'OVER' LPAREN analytic_clause RPAREN + : analytic_function_call 'OVER' LPAREN analytic_clause RPAREN ; analytic_clause This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |