Advertisement
Guest User

Untitled

a guest
Sep 9th, 2010
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 52.28 KB | None | 0 0
  1. grammar PLSQL3c;
  2.  
  3. options {
  4.     language=C;
  5.     backtrack=true;
  6.     memoize=true;
  7.     output=AST;
  8. }
  9.  
  10. @members {
  11.     // there is no strcasecmp() on Windows, map it to _strcmpi instead
  12.    
  13.     #include <stdlib.h>
  14.    
  15.     #define strcasecmp _strcmpi
  16.    
  17.     #define _BOOL int
  18.     #define _TRUE 1
  19.     #define _FALSE 0
  20.  
  21.     _BOOL PLSQL3c_is_sql  = _FALSE;
  22.  
  23.     // this method will check the table name against the configuration from the connector
  24.     extern int CheckTable(char *TestString);
  25.    
  26.     // this method will add an alias name to a temporary list
  27.     extern void AddAlias(char *Alias);
  28.  
  29.     // this method adds columns to the StatementChecker for blocking statements based on table fields
  30.     // (not used at the moment)
  31.     //extern void AddColumn(char *column);
  32.    
  33.     // our logging callback method
  34.     extern void P_LOG(const char* prefix, const char* str);
  35.  }
  36.  
  37. /*
  38. @parser::context
  39. {
  40. pMY = myDisplayRecognitionError;
  41. }
  42.  
  43. @parser::apifuncs {
  44.     RECOGNIZER->displayRecognitionError = myDisplayRecognitionError;
  45. }
  46. */
  47.  
  48. start_rule
  49.     :   (create_package)* EOF
  50.     ;
  51.  
  52. create_package
  53.     :   'CREATE' ( 'OR' keyREPLACE )?
  54.         ( package_spec | package_body )
  55.     ;
  56.  
  57. package_spec
  58.     :   keyPACKAGE package_name ( 'IS' | 'AS' )
  59.         ( package_obj_spec )*
  60.         'END' (package_name)? SEMI
  61.     ;
  62.  
  63. package_body
  64.     :   keyPACKAGE ( keyBODY ) package_name ( 'IS' | 'AS' )
  65.         ( package_obj_body )*
  66.         ( 'BEGIN' seq_of_statements )?
  67.         'END' ( package_name )? SEMI
  68.     ;
  69.  
  70. package_name
  71.     :   ( schema_name DOT )? identifier
  72.     ;
  73.  
  74. package_obj_spec
  75.     :   variable_declaration
  76.     |   type_declaration
  77.     |   subtype_declaration
  78.     |   record_declaration
  79.     |   plsql_table_declaration
  80.     |   varray_declaration
  81.     |   cursor_declaration
  82.     |   cursor_spec
  83.     |   procedure_spec
  84.     |   function_spec
  85.     |   exception_declaration
  86.     |   pragma_declaration
  87.     ;
  88.  
  89. variable_declaration
  90.     :   variable_name ('CONSTANT')?
  91.         type_spec ('NOT' 'NULL')?
  92.         ( ( ASSIGN | 'DEFAULT' ) plsql_expression)? SEMI
  93.     ;
  94.  
  95. type_declaration
  96.     :   keyTYPE type_spec 'IS' ( keyNEW )? ( type_spec ( 'NOT' 'NULL' )? | LPAREN plsql_expressions RPAREN ) SEMI
  97.     ;
  98.  
  99. subtype_declaration
  100.     :   keySUBTYPE type_spec 'IS' type_spec ( 'NOT' 'NULL' | keyRANGE literal DOUBLEDOT literal )? SEMI
  101.     ;
  102.  
  103. cursor_declaration
  104.     :   keyCURSOR cursor_name
  105.         ( LPAREN parameter_specs RPAREN )?
  106.         'IS' select_command SEMI
  107.     ;
  108. package_obj_body
  109.     :   variable_declaration
  110.     |   subtype_declaration
  111.     |   cursor_declaration
  112.     |   exception_declaration
  113.     |   record_declaration
  114.     |   plsql_table_declaration
  115.     |   varray_declaration
  116.     |   procedure_body
  117.     |   function_body
  118.     |   pragma_declaration
  119.     ;
  120.  
  121. parse_statements
  122.     :   statement (SEMI statement)* SEMI? EOF
  123.     ;
  124.  
  125. seq_of_statements
  126.     :   statement SEMI ( statement SEMI )*
  127.     ;
  128.  
  129. statement
  130.     :   assignment_statement
  131.     |   exit_statement
  132.     |   goto_statement
  133.     |   case_statement
  134.     |   if_statement
  135.     |   loop_statement
  136.     |   null_statement
  137.     |   raise_statement
  138.     |   return_statement
  139.     |   sql_statement
  140.     |   plsql_block
  141. //  |       begin_block
  142.     |   function_call
  143.     ;
  144.  
  145. plsql_block
  146.     :   ( LLABEL label_name RLABEL )?
  147.         ( ( 'DECLARE' )? (declare_spec)+ )?
  148.         ( 'BEGIN' )
  149.         seq_of_statements
  150.         ( 'EXCEPTION' ( exception_handler )+ )?
  151.         ( 'END' ( label_name )? )
  152.     ;
  153.  
  154. declare_spec
  155.     :   variable_declaration
  156.     |   subtype_declaration
  157.     |   cursor_declaration
  158.     |   exception_declaration
  159.     |   record_declaration
  160.     |   plsql_table_declaration
  161.     |   varray_declaration
  162.     |   procedure_declaration
  163.     |   function_declaration
  164.     |   type_declaration
  165.     |   pragma_declaration
  166.     ;
  167.  
  168. pragma_declaration
  169.     :   keyPRAGMA
  170.         (   keyRESTRICT_REFERENCES LPAREN ( 'DEFAULT' | function_name ) ( COMMA pragma_param )+ RPAREN
  171.         |   keyEXCEPTION_INIT LPAREN exception_name COMMA literal RPAREN
  172.         |   keyAUTONOMOUS_TRANSACTION
  173.         |   keySERIALLY_REUSABLE
  174.         |   keyBUILTIN LPAREN pragma_params RPAREN
  175.         |   keyFIPSFLAG LPAREN pragma_params RPAREN
  176.         |   keyINTERFACE LPAREN pragma_params RPAREN
  177.         |   keyNEW_NAMES LPAREN pragma_params RPAREN
  178.         |   keyTIMESTAMP LPAREN pragma_params RPAREN
  179.         )
  180.         SEMI
  181.     ;
  182.  
  183. pragma_params
  184.     :   pragma_param ( COMMA pragma_param )*
  185.     ;
  186.  
  187. pragma_param
  188.     :   ( PLUS | MINUS )? NUMBER
  189.     |   QUOTED_STRING
  190.     |   identifier
  191.     ;
  192.  
  193. assignment_statement
  194.     :   //(lvalue ASSIGN function_call) => (lvalue ASSIGN function_call)
  195. //  |   (lvalue ASSIGN plsql_expression)  =>
  196.         (lvalue ASSIGN plsql_expression)
  197. //  |   function_call
  198.     ;
  199. lvalues
  200.     :   lvalue ( COMMA lvalue )*
  201.     ;
  202. lvalue
  203.     :   variable_name
  204.     |   record_name DOT field_name
  205.     |   plsql_table_name LPAREN subscript RPAREN ( DOT field_name )*
  206.     |   COLON host_variable ( COLON host_variable )?
  207.     ;
  208.  
  209. field_name
  210.     :   identifier
  211.     ;
  212.  
  213. subscript
  214.     :   plsql_expression
  215.     ;
  216.  
  217. host_variable
  218.     :   identifier
  219.     ;
  220.  
  221. goto_statement
  222.     :   'GOTO' label_name
  223.     ;
  224.  
  225. label_name
  226.     :   identifier
  227.     ;
  228.  
  229. exit_statement
  230.     :   keyEXIT ( label_name )? ( 'WHEN' plsql_condition )?
  231.     ;
  232.  
  233. datatype
  234.     :   'BINARY_INTEGER'
  235.     |   'BINARY_FLOAT'
  236.     |   'BINARY_DOUBLE'
  237.     |   'NATURAL'
  238.     |   'POSITIVE'
  239.     |   ( 'NUMBER' | 'NUMERIC' | 'DECIMAL' | 'DEC' ) ( LPAREN NUMBER ( COMMA NUMBER )? RPAREN )?
  240.     |   'LONG' ( 'RAW')? ( LPAREN NUMBER RPAREN )?
  241.     |   'RAW' ( LPAREN NUMBER RPAREN )?
  242.     |   'BOOLEAN'
  243.     |   'DATE'
  244.     |   keyINTERVAL keyDAY ( LPAREN NUMBER RPAREN )? 'TO' keySECOND ( LPAREN NUMBER RPAREN )?
  245.     |   keyINTERVAL keyYEAR ( LPAREN NUMBER RPAREN )? 'TO' keyMONTH
  246.     |   ( keyTIME | keyTIMESTAMP ) ( LPAREN NUMBER RPAREN )? ( 'WITH' ( keyLOCAL )? keyTIME keyZONE)?
  247.     |   'INTEGER'
  248.     |   'INT'
  249.     |   'SMALLINT'
  250.     |   'FLOAT' ( LPAREN NUMBER RPAREN )?
  251.     |   'REAL'
  252.     |   'DOUBLE' keyPRECISION
  253.     |   'CHAR'      ( keyVARYING )? ( LPAREN NUMBER ( keyBYTE | 'CHAR' )? RPAREN )? ( 'CHARACTER' 'SET' ( identifier | column_spec CHARSET_ATTR ) )?
  254.     |   'VARCHAR'                   ( LPAREN NUMBER ( keyBYTE | 'CHAR' )? RPAREN )? ( 'CHARACTER' 'SET' ( identifier | column_spec CHARSET_ATTR ) )?
  255.     |   'VARCHAR2'                  ( LPAREN NUMBER ( keyBYTE | 'CHAR' )? RPAREN )? ( 'CHARACTER' 'SET' ( identifier | column_spec CHARSET_ATTR ) )?
  256.     |   'CHARACTER' ( keyVARYING )? ( LPAREN NUMBER RPAREN )?
  257.     |   'NCHAR'     ( keyVARYING )? ( LPAREN NUMBER RPAREN )?
  258.     |   'NVARCHAR'  ( LPAREN NUMBER RPAREN )?
  259.     |   'NVARCHAR2' ( LPAREN NUMBER RPAREN )?
  260.     |   'NATIONAL'  ( 'CHARACTER' | 'CHAR' ) ( keyVARYING )? ( LPAREN NUMBER RPAREN )?
  261.     |   'MLSLABEL'
  262.     |   'PLS_INTEGER'
  263.     |   'BLOB'
  264.     |   'CLOB' ( 'CHARACTER' 'SET' ( identifier | column_spec CHARSET_ATTR ) )?
  265.     |   'NCLOB'
  266.     |   'BFILE'
  267.     |   'ROWID'
  268.     |   'UROWID' ( LPAREN NUMBER RPAREN )?
  269.     ;
  270.  
  271. type_spec
  272.     :   datatype
  273. //  |   variable_name TYPE_ATTR
  274.     |   column_spec TYPE_ATTR
  275. //  |   package_name DOT variable_name
  276.     |   table_spec ROWTYPE_ATTR
  277. //  |   keyREF ( keyCURSOR | type_name )
  278.     |   type_name ( LPAREN NUMBER RPAREN )?
  279.     ;
  280.  
  281. type_name
  282.     :   identifier ( DOT identifier )*
  283.     ;
  284.  
  285. parameter_specs
  286.     :   parameter_spec ( COMMA parameter_spec )*
  287.     ;
  288.  
  289. parameter_spec
  290.     :   parameter_name ( 'IN' )? ( type_spec )?
  291.     ;
  292.  
  293. parameter_name
  294.     :   identifier
  295.     ;
  296.  
  297. cursor_spec
  298.     :   keyCURSOR cursor_name
  299.         ( LPAREN parameter_specs RPAREN )?
  300.         keyRETURN return_type SEMI!
  301.     ;
  302.  
  303. procedure_spec:
  304.     'PROCEDURE' procedure_name
  305.     ( LPAREN arguments RPAREN )? SEMI
  306.     ;
  307.  
  308. function_spec
  309.     :   'FUNCTION' function_name
  310.         ( LPAREN arguments RPAREN )?
  311.         keyRETURN return_type SEMI
  312.     ;
  313.  
  314. exception_declaration
  315.     :   exception_name 'EXCEPTION' SEMI
  316.     ;
  317.  
  318. exception_names
  319.     :   exception_name ( 'OR' exception_name )*
  320.     ;
  321.  
  322. exception_name
  323.     :   ( exception_package_name DOT )? identifier
  324.     ;
  325.  
  326. exception_package_name
  327.     :   identifier
  328.     ;
  329.  
  330.  
  331. //oracle_err_number
  332. //  :   ( PLUS | MINUS )? NUMBER
  333. //  |   QUOTED_STRING
  334. //  ;
  335.  
  336. record_declaration
  337.     :   record_type_dec
  338. //  |   record_var_dec
  339.     ;
  340.  
  341. record_type_dec
  342.     :   keyTYPE type_name 'IS' keyRECORD
  343.         LPAREN field_specs RPAREN SEMI
  344.     ;
  345.  
  346. //record_var_dec
  347. //  :   record_name type_name ROWTYPE_ATTR SEMI
  348. //  ;
  349.  
  350. field_specs
  351.     :   field_spec ( COMMA field_spec )*
  352.     ;
  353. field_spec
  354.     :   column_name type_spec
  355.         ('NOT' 'NULL')?
  356.         ( ( ASSIGN | 'DEFAULT' ) plsql_expression)?
  357.     ;
  358.  
  359. plsql_table_declaration
  360.     :   table_type_dec
  361. //  |   table_var_dec
  362.     ;
  363.  
  364. table_type_dec
  365.     :   keyTYPE type_name 'IS' 'TABLE'
  366.         'OF' type_spec ( 'NOT' 'NULL' )?
  367.         (   'INDEX' 'BY'
  368.             (   'BINARY_INTEGER'
  369.             |   'PLS_INTEGER'
  370.             |   'VARCHAR2' LPAREN integer RPAREN
  371.             )
  372.         )?
  373.         SEMI
  374.     ;
  375.  
  376. table_var_dec
  377.     :   plsql_table_name type_name SEMI
  378.     ;
  379.  
  380. plsql_table_name
  381.     :   identifier ( DOT identifier )*
  382.     ;
  383.  
  384. varray_declaration
  385.     :   keyTYPE type_name 'IS'
  386.         ( keyVARRAY | keyVARYING keyARRAY ) LPAREN integer RPAREN
  387.         'OF' type_spec ( 'NOT' 'NULL' )?
  388.     ;
  389.  
  390. procedure_declaration
  391.     :   procedure_body
  392.     ;
  393.  
  394. procedure_body
  395.     :   ( proc_fun_start )? 'PROCEDURE'^ procedure_name
  396.         ( LPAREN argument ( COMMA argument )* RPAREN )?
  397.         ( 'IS' | 'AS' )
  398.         //( keyPRAGMA keyAUTONOMOUS_TRANSACTION )?
  399.         ( ( declare_spec ) => ( declare_spec )* )
  400.         ( 'BEGIN' )
  401.         ( seq_of_statements )
  402.         ( 'EXCEPTION' ( exception_handler )* )?
  403.         'END' ( procedure_name )? SEMI
  404.     ;
  405.  
  406. begin_block
  407.     :   'BEGIN'
  408.         ( seq_of_statements )
  409.         ( 'EXCEPTION' ( exception_handler )+ )?
  410.         'END'
  411.     ;
  412.  
  413. //Exception handler needs to be defined
  414. exception_handler
  415.     :   'WHEN' exception_names 'THEN'
  416.         seq_of_statements
  417.     ;
  418.  
  419. proc_fun_start
  420.     :   'CREATE' ( 'OR' keyREPLACE )?
  421.     ;
  422.  
  423. function_body
  424.     :   ( proc_fun_start )? 'FUNCTION'^ function_name
  425.         ( LPAREN arguments RPAREN )?
  426.         keyRETURN return_type ( 'IS' | 'AS' )
  427.         //( keyPRAGMA keyAUTONOMOUS_TRANSACTION )?
  428.         ( ( declare_spec ) => ( declare_spec )* )
  429.         ( 'BEGIN' )
  430.         ( seq_of_statements )
  431.         ( 'EXCEPTION' ( exception_handler )+ )?
  432.         'END' ( function_name )? SEMI
  433.     ;
  434.  
  435. function_name
  436.     :   identifier | QUOTED_STRING //( schema_name DOT )? identifier
  437.     ;
  438.  
  439. procedure_name
  440.     :   identifier | QUOTED_STRING //( schema_name DOT )? identifier
  441.     ;
  442.  
  443. arguments
  444.     :   argument ( COMMA argument )*
  445.     ;
  446.  
  447. argument
  448.     :   argument_name ( keyOUT | 'IN' keyOUT | 'IN' )? (argument_type )?
  449.         ( ( ASSIGN | 'DEFAULT' ) plsql_expression )?
  450.     ;
  451.  
  452. argument_name
  453.     :   identifier
  454.     ;
  455.  
  456. argument_type
  457.     :   type_spec
  458.     ;
  459.  
  460. value
  461.     :   ( PLUS | MINUS )? NUMBER
  462.     |   quoted_string
  463.     |   'TRUE' | 'FALSE'
  464.     |   'NULL'
  465.     ;
  466.  
  467. return_type
  468.     :   type_spec
  469.     ;
  470.  
  471. function_declaration
  472.     :   function_body
  473.     ;
  474.  
  475. function_call
  476.     :   user_defined_function ( { LA(1) != LPAREN || LA(2) != PLUS || LA(3) != RPAREN }? LPAREN ( call_parameters )? RPAREN )?
  477. //  |   //{ input.LA(1) == ID && input.LA(2) == LPAREN && input.LA(3) == ASTERISK && input.LA(4) == RPAREN }?
  478. //      { PLSQL3c_is_sql }?
  479. //      keyCOUNT LPAREN ( ASTERISK | sql_expression ) RPAREN
  480. //  |   { PLSQL3c_is_sql }?
  481. //      'DISTINCT' LPAREN call_parameters RPAREN
  482.     ;
  483.  
  484. collection_function_call
  485.     :   plsql_table_name
  486.     ;
  487.  
  488. variable_names
  489.     :   variable_name ( COMMA variable_name )*
  490.     ;
  491. variable_name
  492.     :   identifier
  493.     ;
  494.  
  495. null_statement
  496.     :   'NULL'
  497.     ;
  498.  
  499. raise_statement
  500.     :   keyRAISE ( exception_name )?
  501.     ;
  502.  
  503. return_statement
  504.     :   keyRETURN ( plsql_expression )?
  505.     ;
  506.  
  507. loop_statement
  508.     :   ( LLABEL label_name RLABEL )?
  509.         (   keyWHILE^ plsql_condition
  510.         |   (   'FOR'^
  511.                 (   ( numeric_loop_param ) => numeric_loop_param
  512.                 |   ( cursor_loop_param ) => cursor_loop_param
  513.                 )
  514.             )
  515.         )?
  516.         keyLOOP
  517.         seq_of_statements
  518.         'END' keyLOOP
  519.         ( label_name )?
  520.     ;
  521.  
  522. numeric_loop_param
  523.     :   index_name 'IN' ( keyREVERSE )? integer_expr DOUBLEDOT integer_expr
  524.     ;
  525.  
  526. index_name
  527.     :   identifier
  528.     ;
  529.  
  530. //Added typespec to handle packagename.variablename for loop statement
  531. integer_expr
  532.     :   sql_expression
  533.     ;
  534.  
  535. cursor_name
  536.     :   identifier
  537.     ;
  538.  
  539. cursor_loop_param
  540.     :   record_name 'IN'
  541.         (   cursor_name ( LPAREN plsql_expressions RPAREN )?
  542.         |   LPAREN select_statement RPAREN
  543.         )
  544.     ;
  545.  
  546. record_name
  547.     :   identifier
  548.     ;
  549.  
  550. commit_statement
  551.     :   'COMMIT'
  552.     ;
  553.  
  554. if_statement
  555.     :   'IF'^ plsql_condition 'THEN' seq_of_statements
  556.         (   //{ input.LA(1) != ELSE }?
  557.             keyELSIF plsql_condition 'THEN' seq_of_statements
  558.         )*
  559.         ( 'ELSE' seq_of_statements )?
  560.         'END' 'IF'
  561.     ;
  562.  
  563. sql_statement
  564.     :   sql_command
  565.     ;
  566.  
  567. sql_command
  568.     :   to_modify_data
  569.     |   to_control_data
  570.     ;
  571.  
  572. to_modify_data
  573.     :   select_command
  574.     |   insert_command
  575.     //| update_command
  576.     |   update_statement
  577.     |   delete_command
  578.     |   set_transaction_command
  579.     ;
  580.  
  581. to_control_data
  582.     :   close_statement
  583.     |   commit_statement
  584.     |   fetch_statement
  585.     |   lock_table_statement
  586.     |   open_statement
  587.     |   rollback_statement
  588.     |   savepoint_statement
  589.     |   create_user_statement
  590.     |   create_table_statement
  591.     |   alter_user_statement
  592.     |   alter_table_statement
  593.     |   create_materialized_view_statement
  594.     |   create_materialized_view_log_statement
  595.     |   create_view_statement
  596.     |   create_synonym_statement
  597.     |   drop_table_statement
  598.     |   drop_view_statement
  599.     |   drop_materialized_view_statement
  600.     |   drop_synonym_statement
  601.     |   alter_session_statement
  602.     |   alter_materialized_view_statement
  603.     |   alter_view_statement
  604.     |   analyze_table_statement
  605.     |   create_index_statement
  606.     |   create_schema_statement
  607.     ;
  608.    
  609. create_schema_statement
  610.     :   'CREATE' 'SCHEMA' 'AUTHORIZATION' table_spec
  611.         (create_table_statement | create_view_statement | ('GRANT' .*))+
  612.     ;
  613.    
  614. create_index_statement
  615.     :   'CREATE'
  616.         ('UNIQUE' | 'BITMAP')?
  617.         'INDEX' index_spec 'ON' table_spec .*
  618.     ;  
  619.  
  620.        
  621. analyze_table_statement
  622.     :   'ANALYZE' 'TABLE' table_spec .*
  623.     ;
  624.    
  625. alter_materialized_view_statement
  626.     :   'ALTER' 'MATERIALIZED' 'VIEW'
  627.         ('LOG' 'FORCE'? 'ON')? table_spec .*   
  628.     ;
  629.    
  630.  
  631. alter_view_statement
  632.     :   'ALTER' 'VIEW' table_spec
  633.         ('ADD' | 'MODIFY' | 'DROP' | 'COMPILE') .*     
  634.     ;
  635.        
  636. select_command
  637.     :   select_statement// ( 'UNION' select_statement )*
  638.     ;
  639.  
  640. select_statement
  641.     :   //( LPAREN select_command RPAREN ) => LPAREN select_command RPAREN |
  642.         subquery_factoring_clause?
  643.         (select_expression | (LPAREN select_expression RPAREN))
  644.     ;
  645.  
  646. create_user_statement
  647.     :   'CREATE' 'USER' identifier 'INDENTIFIED' .*
  648.     ;
  649.    
  650. create_table_statement
  651.     :   'CREATE' ('GLOBAL' 'TEMPORARY')? 'TABLE'
  652.         table_spec  
  653.         (LPAREN
  654.             identifier datatype (COMMA identifier datatype)*
  655.          RPAREN)? .*
  656.     ;
  657.  
  658. alter_user_statement
  659.     :   'ALTER' 'USER' identifier .*
  660.     ;
  661.  
  662. alter_table_statement
  663.     :   'ALTER' 'TABLE' table_spec .*
  664.     ;
  665.    
  666. create_view_statement
  667.     :   'CREATE' ( 'OR' 'REPLACE' )? ('NO'? 'FORCE')? 'VIEW'
  668.         view_name
  669.         ( '(' alias (',' alias )* ')' )?
  670.         'AS' subquery subquery_restriction_clause?
  671.     ;
  672.    
  673. create_materialized_view_log_statement
  674.     :   'CREATE' 'MATERIALIZED' 'VIEW' 'LOG' 'ON' table_spec .*
  675.     ;
  676.    
  677. create_materialized_view_statement
  678.     :   'CREATE' 'MATERIALIZED' 'VIEW'
  679.         table_spec
  680.         ( '(' alias (',' alias )* ')' )?
  681.         ('FOR' 'UPDATE')?
  682.         ( ('ENABLE' | 'DISABLE') 'QUERY' 'REWRITE' )?
  683.         'AS' subquery subquery_restriction_clause?
  684.     ;
  685.    
  686. create_synonym_statement
  687.     :   'CREATE' ( 'OR' 'REPLACE' )? ( 'PUBLIC' )? 'SYNONYM'
  688.            table_spec
  689.            'FOR' table_spec
  690.     ;
  691.  
  692. drop_table_statement
  693.     :   'DROP' 'TABLE'
  694.         table_spec ('CASCADE' 'CONSTRAINTS')? 'PURGE'?
  695.     ;
  696.    
  697. drop_view_statement
  698.     :   'DROP' 'VIEW'
  699.         table_spec ('CASCADE' 'CONSTRAINTS')?
  700.     ;
  701.  
  702. drop_materialized_view_statement
  703.     :   'DROP' 'MATERIALIZED' 'VIEW'
  704.         table_spec ('PRESERVE' 'TABLE')?
  705.     ;
  706.    
  707. drop_synonym_statement
  708.     :   'DROP' ('PUBLIC')? 'SYNONYM'
  709.         table_spec ('FORCE')?
  710.     ;
  711. alter_session_statement
  712.     :   'ALTER' 'SESSION'
  713.             (
  714.                 ( 'ADVISE' ( 'COMMIT' | 'ROLLBACK' | 'NOTHING' ) )
  715.         |   ( 'CLOSE' 'DATABASE' 'LINK' identifier )
  716.         |   ( 'ENABLE' | 'DISABLE' 'COMMIT' 'IN' 'PROCEDURE' )
  717.         |   ( 'ENABLE' | 'DISABLE' 'GUARD' )
  718.         |   (
  719.                 ('ENABLE' | 'DISABLE' | 'FORCE') 'PARALLEL'
  720.                 ( 'DML' | 'DDL' | 'QUERY' ) ( 'PARALLEL' integer )?
  721.             )
  722.         |   (
  723.                 'ENABLE' 'RESUMABLE'
  724.                     ( 'TIMEOUT' integer )? ( 'NAME' identifier )?
  725.                 )
  726.         |   ( 'DISABLE' 'RESUMABLE' )
  727.         |   ( alter_session_set_clauses )
  728.         )
  729. ;
  730.  
  731. alter_session_set_clauses
  732.     :   'SET' alter_session_set_clause+
  733.     ;
  734.  
  735. alter_session_set_clause
  736.     :   (identifier '=' sql_expressions)
  737.         |
  738.         ('CURRENT_SCHEMA' '=' s=schema_name)
  739.             {
  740.                 if (s.tree) {
  741.                     char schemastr[256];
  742.                     memset(schemastr, 0, sizeof(schemastr));
  743.                     strcat(schemastr, s.tree->getText(s.tree)->chars);
  744.                     strcat(schemastr, ".");
  745.                
  746.                 // Call check function in OCI.DLL
  747.                 CheckTable(schemastr);
  748.             }
  749.             }
  750.     ;
  751.  
  752. subquery_restriction_clause
  753.     :   'WITH'
  754.         (
  755.             ('READ' 'ONLY')
  756.             |
  757.             ('CHECK' 'OPTION' ('CONSTRAINT' identifier)?)
  758.         )
  759.     ;
  760.  
  761. subquery_factoring_clause
  762.     :   'WITH' query_name_expression (COMMA query_name_expression)*
  763.     ;
  764.  
  765. query_name_expression
  766.     :   n=query_name 'AS' LPAREN s=select_expression RPAREN
  767.         {
  768.             if (s.isBlocked != 0 && n.tree)
  769.             {
  770.                 char aliasstr[256];
  771.                     memset(aliasstr, 0, sizeof(aliasstr));
  772.                     strcat(aliasstr, n.tree->getText(n.tree)->chars);
  773.                 AddAlias(aliasstr);
  774.             }
  775.         }
  776.     ;
  777.    
  778. query_name
  779.     :   sql_identifier
  780.     ;
  781.    
  782. select_expression returns [int isBlocked]
  783.     :
  784.         'SELECT'! hint? ( 'DISTINCT'! | 'UNIQUE'! | 'ALL'! )?
  785.         select_list
  786.         ( keyBULK keyCOLLECT )?
  787.         ( 'INTO' lvalues )?
  788.         'FROM' ( join_clause | LPAREN join_clause RPAREN | s=table_reference_list )
  789.         ( where_clause )? ( hierarchical_query_clause )? ( group_by_clause )?
  790.         ( 'HAVING' sql_condition )? ( model_clause )?
  791.         (   (   'UNION' ( 'ALL' )?
  792.             |   'INTERSECT'
  793.             |   'MINUS'
  794.             )
  795.             (   select_expression //LPAREN subquery RPAREN
  796.             |   subquery
  797.             )
  798.         )?
  799.         ( order_by_clause )?
  800.        
  801.         { $isBlocked = s.isBlocked; }
  802.     ;
  803.  
  804. select_list
  805.     :   ASTERISK
  806.     |   displayed_column ( COMMA displayed_column )*
  807.         {
  808.             P_LOG("SELECT_LIST", $text->chars);
  809.         }
  810.     ;
  811.  
  812. table_reference_list_from
  813.     :   'FROM' table_reference_list
  814.     ;
  815.  
  816. table_reference_list returns [int isBlocked]
  817.     :  
  818.         { int isBlocked = _FALSE; }
  819.     s1=selected_table           { $isBlocked = s1.isBlocked; }
  820.         ( COMMA s2=selected_table   { $isBlocked = $isBlocked && s2.isBlocked; }
  821.             )*
  822.     ;
  823.  
  824. join_clause
  825.     :   selected_table ( inner_cross_join_clause | outer_join_clause )+
  826.     ;
  827. inner_cross_join_clause
  828.     :   ( keyINNER )? keyJOIN selected_table ( 'ON' sql_condition | keyUSING LPAREN column_specs RPAREN )
  829.     |   ( keyCROSS | keyNATURAL ( keyINNER ) ) keyJOIN selected_table
  830.     ;
  831. outer_join_clause
  832.     :   ( query_partition_clause )?
  833.         (   outer_join_type keyJOIN
  834.         |   keyNATURAL ( outer_join_type )? keyJOIN
  835.         )
  836.         selected_table ( query_partition_clause )?
  837.         ( 'ON' sql_condition | keyUSING LPAREN column_specs RPAREN )?
  838.     ;
  839. query_partition_clause
  840.     :   keyPARTITION 'BY' expression_list
  841.     ;
  842. outer_join_type
  843.     :   ( keyFULL | keyLEFT | keyRIGHT ) ( keyOUTER )?
  844.     ;
  845. outer_join_sign
  846.     :   LPAREN PLUS RPAREN
  847.     ;
  848. where_clause
  849.     :   'WHERE' sql_condition
  850.     ;
  851. hierarchical_query_clause
  852.     :   ( 'START' 'WITH' sql_condition )? 'CONNECT' 'BY' ( keyNOCYCLE )? sql_condition
  853.     ;
  854. group_by_clause
  855.     :   'GROUP' 'BY' group_by_exprs
  856.     ;
  857. group_by_exprs
  858.     :   group_by_expr ( COMMA group_by_expr )*
  859.     ;
  860. group_by_expr
  861.     :   rollup_cube_clause
  862.     |   grouping_sets_clause
  863.     |   grouping_expression_list
  864.     ;
  865. rollup_cube_clause
  866.     :   ( keyROLLUP | keyCUBE ) LPAREN grouping_expression_list RPAREN
  867.     ;
  868. grouping_sets_clause
  869.     :   keyGROUPING keySETS LPAREN grouping_expression_list RPAREN
  870.     ;
  871. grouping_sets_exprs
  872.     :   grouping_sets_expr ( COMMA grouping_sets_expr )*
  873.     ;
  874. grouping_sets_expr
  875.     :   rollup_cube_clause | grouping_expression_list
  876.     ;
  877. model_clause
  878.     :   keyMODEL ( cell_reference_options )
  879.         ( return_rows_clause )?
  880.         ( reference_model )+ main_model
  881.     ;
  882. cell_reference_options
  883.     :   ( ( keyIGNORE | keyKEEP ) keyNAV )?
  884.         ( 'UNIQUE' ( keyDIMENSION | keySINGLE keyREFERENCE ) )?
  885.     ;
  886. return_rows_clause
  887.     :   keyRETURN ( keyUPDATED | 'ALL' ) 'ROWS'
  888.     ;
  889. reference_model
  890.     :   keyREFERENCE reference_model_name 'ON' LPAREN subquery RPAREN
  891.         model_column_clauses ( cell_reference_options )
  892.     ;
  893. reference_model_name
  894.     :   identifier
  895.     ;
  896. main_model
  897.     :   ( keyMAIN main_model_name )? model_column_clauses
  898.         ( cell_reference_options ) model_rules_clause
  899.     ;
  900. main_model_name
  901.     :   identifier
  902.     ;
  903. model_column_clauses
  904.     :   ( query_partition_clause ( column_spec )? )?
  905.         keyDIMENSION 'BY' LPAREN model_columns RPAREN
  906.         keyMEASURES LPAREN model_columns RPAREN
  907.     ;
  908. model_columns
  909.     :   model_column ( COMMA model_column )*
  910.     ;
  911. model_column
  912.     :   sql_expression ( ( 'AS' )? column_spec )?
  913.     ;
  914. model_rules_clause
  915.     :   ( keyRULES ( 'UPDATE' | keyUPSERT ( 'ALL' )? )? ( ( keyAUTOMATIC | keySEQUENTIAL ) 'ORDER' )? )?
  916.         ( keyITERATE LPAREN NUMBER RPAREN ( keyUNTIL LPAREN sql_condition RPAREN )? )?
  917.         LPAREN model_rules_exprs RPAREN
  918.     ;
  919. model_rules_exprs
  920.     :   model_rules_expr ( COMMA model_rules_expr )*
  921.     ;
  922. model_rules_expr
  923.     :   ( 'UPDATE' | keyUPSERT ( 'ALL' )? )? cell_assignment ( order_by_clause )? EQ sql_expression
  924.     ;
  925. cell_assignment
  926.     :   measure_column LBRACK ( multi_column_for_loop | cell_assignment_exprs ) RBRACK
  927.     ;
  928. cell_assignment_exprs
  929.     :   cell_assignment_expr ( COMMA cell_assignment_expr )*
  930.     ;
  931. cell_assignment_expr
  932.     :   sql_condition | sql_expression | single_column_for_loop
  933.     ;
  934. measure_column
  935.     :   column_name
  936.     ;
  937. single_column_for_loop
  938.     :   'FOR' column_name
  939.         (   'IN' LPAREN ( literals | subquery ) RPAREN
  940.         |   ( 'LIKE' pattern )? 'FROM' literal 'TO' literal ( keyINCREMENT | keyDECREMENT ) literal
  941.         )
  942.     ;
  943. literal
  944.     :   ( PLUS | MINUS )? NUMBER
  945.     |   QUOTED_STRING
  946.     ;
  947. literals
  948.     :   literal ( COMMA literal )*
  949.     ;
  950. bracket_literals
  951.     :   LPAREN literals RPAREN
  952.     ;
  953. bracket_literals_list
  954.     :   bracket_literals ( COMMA bracket_literals )*
  955.     ;
  956. pattern
  957.     :   QUOTED_STRING
  958.     ;
  959. multi_column_for_loop
  960.     :   'FOR' LPAREN column_specs RPAREN 'IN' LPAREN ( bracket_literals_list | subquery ) RPAREN
  961.     ;
  962. order_by_clause
  963.     :   'ORDER' ( keySIBLINGS )? 'BY' order_by_exprs
  964.     ;
  965. order_by_exprs
  966.     :   order_by_expr ( COMMA order_by_expr )*
  967.     ;
  968. order_by_expr
  969.     :   (   sql_expression
  970. //      |   position
  971. //      |   column_alias
  972.         )
  973.         ( 'ASC' | 'DESC' )? ( keyNULLS keyFIRST | keyNULLS keyLAST )?
  974.     ;
  975. for_update_clause
  976.     :   'FOR' 'UPDATE' ( 'OF' column_specs )? ( keyWAIT integer | 'NOWAIT' )?
  977.     ;
  978.  
  979. where_condition_whole
  980.     :   'WHERE' sql_condition
  981.     ;
  982.  
  983. where_condition
  984.     :   sql_condition
  985.     ;
  986.  
  987. displayed_column
  988.     :   (   column_spec DOT ASTERISK
  989. //      |   keyCOUNT LPAREN ( ASTERISK | 'DISTINCT' LPAREN sql_expression RPAREN ) RPAREN
  990. //      |
  991.         |   sql_expression
  992.         )
  993.         ( alias )?
  994.         {
  995.         //AddColumn($text->chars);
  996.     }
  997.     ;
  998.  
  999. schema_name
  1000.     :   sql_identifier
  1001.     ;
  1002.  
  1003. view_name
  1004.     :   sql_identifier
  1005.     ;
  1006.  
  1007. table_name
  1008.     :   sql_identifier
  1009.     ;
  1010.  
  1011. nested_expressions
  1012.     :   nested_expression ( COMMA nested_expression )*
  1013.     ;
  1014.  
  1015. nested_expression
  1016.     :   {  PLSQL3c_is_sql }? sql_expression
  1017.     |   { !PLSQL3c_is_sql }? plsql_expression
  1018.     ;
  1019. plsql_condition
  1020.         @init { PLSQL3c_is_sql = _FALSE; }
  1021.     :   expr_bool
  1022.     ;
  1023.  
  1024. plsql_expressions
  1025.     :   plsql_expression ( COMMA plsql_expression )*
  1026.     ;
  1027.  
  1028. plsql_expression
  1029.         @init { PLSQL3c_is_sql = _FALSE; }
  1030.     :   expr_bool
  1031.     ;
  1032.  
  1033.  
  1034. expr_bool
  1035.     :   expr_or ( 'OR' expr_or )*
  1036.     ;
  1037. expr_or
  1038.     :   expr_and ( 'AND' expr_and )*
  1039.     ;
  1040. expr_and
  1041.     :   ( 'NOT' )? expr_not
  1042.     ;
  1043. expr_not
  1044.     :   expr_add
  1045.         (   relational_op expr_add
  1046.         |   FOUND_ATTR | NOTFOUND_ATTR | ISOPEN_ATTR | ROWCOUNT_ATTR | BULK_ROWCOUNT_ATTR
  1047.         |   'IS' ( 'NOT' )? 'NULL'
  1048.         |   ( 'NOT' )? 'LIKE' expr_add
  1049.         |   ( 'NOT' )? 'BETWEEN' expr_add 'AND' expr_add
  1050.         |   ( 'NOT' )? 'IN' LPAREN nested_expressions RPAREN
  1051.         )*
  1052.     ;
  1053.  
  1054. boolean_literal
  1055.     :   'TRUE' | 'FALSE'
  1056.     ;
  1057.  
  1058. sql_expressions
  1059.     :   sql_expression ( COMMA sql_expression )*
  1060.     ;
  1061. sql_expression
  1062.         @init { PLSQL3c_is_sql = _TRUE;  }
  1063.     :   expr_add
  1064.     ;
  1065. expr_add
  1066.     :   expr_mul ( ( PLUS | MINUS | DOUBLEVERTBAR ) expr_mul )*
  1067.     ;
  1068. expr_mul
  1069.     :   expr_sign ( ( ASTERISK | DIVIDE ) expr_sign )*
  1070.     ;
  1071. expr_sign
  1072.     :   ( PLUS | MINUS )? expr_pow
  1073.     ;
  1074. expr_pow
  1075.     :   expr_expr ( EXPONENT expr_expr )*
  1076.     ;
  1077. expr_expr
  1078.     :   ( expr_paren ) => expr_paren
  1079.     |   ( function_expression ) => function_expression
  1080. //  |   ( compound_expression ) => compound_expression
  1081.     |   ( case_expression ) => case_expression
  1082.     |   ( cursor_expression ) => cursor_expression
  1083.     |   ( simple_expression ) => simple_expression
  1084.     |   ( select_expression ) => select_expression
  1085. //  |   ( special_expression ) => special_expression
  1086. //  |   datetime_expression
  1087. //  |   interval_expression
  1088. //  |   object_access_expression
  1089. //  |   scalar_subquery_expression
  1090. //  |   model_expression
  1091. //  |   type_constructor_expression
  1092. //  |   variable_expression
  1093. //  :   'NULL' | NUMBER | QUOTED_STRING | IDENTIFIER
  1094.     ;
  1095. simple_expression
  1096.     :   boolean_literal
  1097.     |   'SQL' ( FOUND_ATTR | NOTFOUND_ATTR | ISOPEN_ATTR | ROWCOUNT_ATTR | BULK_ROWCOUNT_ATTR )
  1098.     |   ( column_spec ) => column_spec
  1099.     |   QUOTED_STRING
  1100.     |   NUMBER
  1101. //  |   sequence_name DOT ( 'CURRVAL' | 'NEXTVAL' )
  1102. //  |   'ROWID'
  1103. //  |   'ROWNUM'
  1104.     |   'NULL'
  1105.     ;
  1106. compound_expression
  1107. //  :   expr_paren
  1108. //  |   expr_sign
  1109.     :   expr_prior
  1110. //  |   expr_add
  1111. //  |   expr_cat
  1112.     ;
  1113. expr_paren
  1114.     :   LPAREN nested_expression RPAREN
  1115.     ;
  1116. expr_prior
  1117.     :   'PRIOR' expr_add
  1118.     ;
  1119. case_expression
  1120.     :   'CASE' ( simple_case_expression | searched_case_expression ) ( else_case_expression )? 'END'
  1121.     ;
  1122. simple_case_expression
  1123.     :   nested_expression ( 'WHEN' nested_expression 'THEN' nested_expression )+
  1124.     ;
  1125. searched_case_expression
  1126.     :   ( 'WHEN' nested_condition 'THEN' nested_expression )+
  1127.     ;
  1128. else_case_expression
  1129.     :   'ELSE' nested_expression
  1130.     ;
  1131. case_statement
  1132.     :   ( label_name )? 'CASE'^ ( simple_case_statement | searched_case_statement ) ( else_case_statement )? 'END' 'CASE' ( label_name )?
  1133.     ;
  1134. simple_case_statement
  1135.     :   plsql_expression ( 'WHEN' plsql_expression 'THEN' seq_of_statements )+
  1136.     ;
  1137. searched_case_statement
  1138.     :   ( 'WHEN' plsql_expression 'THEN' seq_of_statements )+
  1139.     ;
  1140. else_case_statement
  1141.     :   'ELSE' seq_of_statements
  1142.     ;
  1143. cursor_expression
  1144.     :   keyCURSOR LPAREN subquery RPAREN
  1145.     ;
  1146. datetime_expression
  1147.     :   sql_expression 'AT'
  1148.         (   keyLOCAL
  1149.         |   keyTIME keyZONE ( keyDBTIMEZONE | keySESSIONTIMEZONE | sql_expression )
  1150.         )
  1151.     ;
  1152. function_expression
  1153.     :   function_call ( DOT nested_expression )?
  1154.     |   { PLSQL3c_is_sql }?
  1155.         (   keyCOUNT LPAREN ( ASTERISK | nested_expression ) RPAREN
  1156.         |   'DISTINCT' ( LPAREN nested_expression RPAREN | nested_expression )
  1157.         )
  1158.     ;
  1159. special_expression
  1160.     :   { PLSQL3c_is_sql }?
  1161.         (   keyCOUNT LPAREN ( ASTERISK | nested_expression ) RPAREN
  1162.         |   'DISTINCT' LPAREN nested_expression RPAREN
  1163.         )
  1164.     ;
  1165. interval_expression
  1166.     :   sql_expression
  1167.         (   keyDAY ( LPAREN leading_field_precision RPAREN )? 'TO' keySECOND ( LPAREN fractional_second_precision RPAREN )?
  1168.         |   keyYEAR ( LPAREN leading_field_precision RPAREN )? 'TO' keyMONTH
  1169.         )
  1170.     ;
  1171. leading_field_precision
  1172.     :   integer // TODO validate digit from 0 to 9
  1173.     ;
  1174. fractional_second_precision
  1175.     :   integer // TODO validate digit from 0 to 9
  1176.     ;
  1177. object_access_expression
  1178.     :
  1179.     ;
  1180. scalar_subquery_expression
  1181.     :
  1182.     ;
  1183. model_expression
  1184.     :
  1185.     ;
  1186. type_constructor_expression
  1187.     :
  1188.     ;
  1189. variable_expression
  1190.     :
  1191.     ;
  1192. sequence_name
  1193.     :   identifier
  1194.     ;
  1195. integer
  1196.     :   NUMBER
  1197.     ;
  1198.  
  1199.  
  1200. alias
  1201.     :   ( 'AS' )? sql_identifier
  1202. //      { printf("alias: \%s\n", $text->chars); }
  1203.     ;
  1204.  
  1205. column_specs
  1206.     :   column_spec ( COMMA column_spec )*
  1207.     ;
  1208.  
  1209. column_spec
  1210.     :   a=sql_identifier ( DOT b=sql_identifier ( DOT c=sql_identifier )? )?
  1211. //  |   { PLSQL3c_is_sql }?
  1212. //      (   ASTERISK
  1213. //      |   sql_identifier ( DOT sql_identifier )* ( DOT ASTERISK )
  1214. //      )
  1215. //      ( ( schema_name DOT )? table_name DOT )? column_name
  1216.     {
  1217.     /*
  1218.             char colstr[256];
  1219.             memset(colstr, 0, sizeof(colstr));
  1220.             strcat(colstr, a.tree ? a.tree->getText(a.tree)->chars : "");
  1221.             strcat(colstr, b.tree ? "." : "");
  1222.             strcat(colstr, b.tree ? b.tree->getText(b.tree)->chars : "");
  1223.             strcat(colstr, c.tree ? "." : "");
  1224.             strcat(colstr, c.tree ? c.tree->getText(c.tree)->chars : "");
  1225.             AddColumn(colstr);
  1226.     */
  1227.     }
  1228.     ;
  1229.  
  1230. column_name
  1231.     :   sql_identifier
  1232.     ;
  1233. nested_table
  1234.     :   sql_identifier
  1235.     ;
  1236. nested_table_column_name
  1237.     :   ( schema_name DOT )? table_name DOT nested_table DOT column_name
  1238.     ;
  1239.  
  1240. user_defined_function
  1241.     :   sql_identifier ( DOT sql_identifier )* ( DOT ( 'EXISTS' | 'PRIOR' | 'DELETE' ) )? //( ( schema_name DOT )? package_name DOT )? identifier // sql_identifier ( DOT sql_identifier )*
  1242.     ;
  1243.  
  1244. //function
  1245. //  :   user_defined_function
  1246. //      number_function
  1247. //  |   char_function
  1248. //  |   group_function
  1249. //  |   conversion_function
  1250. //  |   other_function
  1251. //  ;
  1252.  
  1253. selected_table returns [int isBlocked]
  1254.     :   (s=table_spec | ( 'TABLE' | keyTHE )? subquery ) ( alias )?
  1255.         { $isBlocked = s.isBlocked; }
  1256.     ;
  1257.  
  1258. index_spec
  1259.     :   ( schema_name DOT )? index_name
  1260.     ;
  1261.  
  1262. table_spec returns [int isBlocked]
  1263.     :   ( s=schema_name DOT )? t=table_name ( AT_SIGN link_name )?
  1264.         {
  1265.             char tblstr[256];
  1266.             memset(tblstr, 0, sizeof(tblstr));
  1267.             strcat(tblstr, s.tree ? s.tree->getText(s.tree)->chars : "");
  1268.             strcat(tblstr, s.tree ? "." : "");
  1269.             strcat(tblstr, t.tree ? t.tree->getText(t.tree)->chars : "");
  1270.        
  1271.         // Call check function in OCI.DLL
  1272.         $isBlocked = CheckTable(tblstr);
  1273.         }
  1274.     ;
  1275. /*
  1276. table_alias
  1277.     :   ( s=schema_name DOT )? t=table_name ( AT_SIGN link_name )? ( alias )?
  1278.         {
  1279.             char tblstr[256];
  1280.             memset(tblstr, 0, sizeof(tblstr));
  1281.             strcat(tblstr, s.tree ? s.tree->getText(s.tree)->chars : "");
  1282.             strcat(tblstr, s.tree ? "." : "");
  1283.             strcat(tblstr, t.tree ? t.tree->getText(t.tree)->chars : "");
  1284.        
  1285.         // Call check function in OCI.DLL
  1286.         CheckTable(tblstr);
  1287.         }
  1288.     ;
  1289. */
  1290.  
  1291. link_name
  1292.     :   sql_identifier
  1293.     ;
  1294. nested_condition
  1295.     :   {  PLSQL3c_is_sql }? condition_or
  1296.     |   { !PLSQL3c_is_sql }? expr_bool
  1297.     ;
  1298. sql_condition
  1299.         @init { PLSQL3c_is_sql = _TRUE; }
  1300.     :   condition_or
  1301. //  |   column 'IS' 'NOT' 'NULL' // TODO must be any boolean expression with table columns
  1302.     ;
  1303. condition_paren
  1304.     :   LPAREN sql_condition RPAREN
  1305.     ;
  1306. condition_or
  1307.     :   condition_and ( 'OR' condition_and )*
  1308.     ;
  1309. condition_and
  1310.     :   condition_not ( 'AND' condition_not )*
  1311.     ;
  1312. condition_not
  1313.     :   'NOT' condition_expr
  1314.     |   condition_expr
  1315.     ;
  1316. condition_expr
  1317.     :   condition_exists
  1318.     |   condition_is
  1319.     |   condition_comparison
  1320.     |   condition_group_comparison
  1321.     |   condition_in
  1322.     |   condition_is_a_set
  1323.     |   condition_is_any
  1324.     |   condition_is_empty
  1325.     |   condition_is_of_type
  1326.     |   condition_is_present
  1327.     |   condition_like
  1328.     |   condition_memeber
  1329.     |   condition_between
  1330.     |   condition_regexp_like
  1331.     |   condition_submultiset
  1332.     |   condition_equals_path
  1333.     |   condition_under_path
  1334.     |   condition_paren
  1335.     ;
  1336. condition_exists
  1337.     :   'EXISTS' LPAREN select_command RPAREN
  1338.     ;
  1339. condition_is
  1340.     :   sql_expression 'IS' ( 'NOT' )? ( keyNAN | keyINFINITE | 'NULL' )
  1341.     ;
  1342. condition_comparison
  1343.     :   LPAREN sql_expressions RPAREN ( outer_join_sign )? ( EQ | NOT_EQ ) LPAREN select_command RPAREN ( outer_join_sign )?
  1344.     |   ( 'PRIOR' )? sql_expression ( outer_join_sign )? ( EQ | NOT_EQ | GTH | GEQ | LTH | LEQ ) ( 'PRIOR' )? ( sql_expression | LPAREN select_command RPAREN ) ( outer_join_sign )?
  1345.     ;
  1346. condition_group_comparison
  1347.     :   LPAREN sql_expressions RPAREN ( EQ | NOT_EQ ) ( 'ANY' | keySOME | 'ALL' ) LPAREN ( grouping_expression_list | select_command ) RPAREN
  1348.     |   sql_expression ( EQ | NOT_EQ | GTH | GEQ | LTH | LEQ ) ( 'ANY' | keySOME | 'ALL' ) LPAREN ( sql_expressions | select_command ) RPAREN
  1349.     ;
  1350. condition_in
  1351.     :   LPAREN sql_expressions RPAREN ( 'NOT' )? 'IN' LPAREN ( grouping_expression_list | select_command ) RPAREN
  1352.     |   sql_expression ( 'NOT' )? 'IN' LPAREN ( expression_list | select_command ) RPAREN
  1353.     ;
  1354. condition_is_a_set
  1355.     :   nested_table_column_name 'IS' ( 'NOT' )? keyA 'SET'
  1356.     ;
  1357. condition_is_any
  1358.     :   ( column_name 'IS' )? 'ANY'
  1359.     ;
  1360. condition_is_empty
  1361.     :   nested_table_column_name 'IS' ( 'NOT' )? keyEMPTY
  1362.     ;
  1363. condition_is_of_type
  1364.     :   sql_expression 'IS' ( 'NOT' )? 'OF' ( keyTYPE )? LPAREN type_name RPAREN
  1365.     ;
  1366. condition_is_of_type_names
  1367.     :   condition_is_of_type_name ( COMMA condition_is_of_type_name )*
  1368.     ;
  1369. condition_is_of_type_name
  1370.     :   ( keyONLY )? type_name
  1371.     ;
  1372. condition_is_present
  1373.     :   cell_reference 'IS' keyPRESENT
  1374.     ;
  1375. condition_like
  1376.     :   sql_expression ( 'NOT' )? ( 'LIKE' | keyLIKEC | keyLIKE2 | keyLIKE4 ) sql_expression ( keyESCAPE sql_expression )?
  1377.     ;
  1378. condition_memeber
  1379.     :   sql_expression ( 'NOT' )? keyMEMBER ( 'OF' )? nested_table_column_name
  1380.     ;
  1381. condition_between
  1382.     :   sql_expression ( 'NOT' )? 'BETWEEN' sql_expression 'AND' sql_expression
  1383.     ;
  1384. condition_regexp_like
  1385.     :   keyREGEXP_LIKE LPAREN call_parameters RPAREN
  1386.     ;
  1387. condition_submultiset
  1388.     :   nested_table_column_name ( 'NOT' )? keySUBMULTISET ( 'OF' )? nested_table_column_name
  1389.     ;
  1390. condition_equals_path
  1391.     :   keyEQUALS_PATH LPAREN column_name COMMA path_string ( COMMA correlation_integer )? RPAREN
  1392.     ;
  1393. condition_under_path
  1394.     :   keyUNDER_PATH LPAREN column_name ( COMMA levels )? COMMA path_string ( COMMA correlation_integer )? RPAREN
  1395.     ;
  1396. levels
  1397.     :   integer
  1398.     ;
  1399. correlation_integer
  1400.     :   integer
  1401.     ;
  1402. path_string
  1403.     :   QUOTED_STRING
  1404.     ;
  1405. grouping_expression_list
  1406.     :   expression_list ( COMMA expression_list )*
  1407.     ;
  1408. expression_list
  1409.     :   LPAREN sql_expressions RPAREN
  1410.     |   sql_expressions
  1411.     ;
  1412. cell_reference
  1413.     :   sql_identifier
  1414.     ;
  1415. call_parameters
  1416.     :   call_parameter ( COMMA call_parameter )*
  1417.     ;
  1418. call_parameter
  1419.     :   ( parameter_name ARROW )? nested_expression
  1420.     ;
  1421.  
  1422. relational_op
  1423.     :   EQ | LTH | GTH | NOT_EQ | LEQ | GEQ
  1424.     ;
  1425.  
  1426. exp_set
  1427.     :   ( sql_expression ) => sql_expression
  1428.     |   subquery
  1429.     ;
  1430.  
  1431. subquery
  1432.     :   LPAREN? select_command RPAREN?
  1433.     ;
  1434.  
  1435. connect_clause
  1436.     :   ( 'START' 'WITH' sql_condition )?
  1437.         'CONNECT' 'BY'
  1438.         (   'PRIOR' sql_expression relational_op sql_expression
  1439.         |   sql_expression relational_op sql_expression 'PRIOR'
  1440.         )
  1441.         (   ( ( 'PRIOR' )? sql_condition ) => ('PRIOR')? sql_condition
  1442.         |   sql_expression relational_op ( 'PRIOR' )? sql_expression ( 'AND' sql_condition )?
  1443.         )
  1444.         ( 'START' 'WITH' sql_condition )?
  1445.     ;
  1446.  
  1447. group_clause
  1448.     :   'GROUP' 'BY' sql_expression ( COMMA sql_expression )* ( 'HAVING' sql_condition )?
  1449.     ;
  1450.  
  1451. set_clause
  1452.     :   ( ( 'UNION' 'ALL' ) | 'INTERSECT' | 'MINUS' ) select_command
  1453.     ;
  1454.  
  1455. order_clause
  1456.     :   'ORDER' 'BY' sorted_def ( COMMA sorted_def )*
  1457.     ;
  1458.  
  1459. sorted_def
  1460.     :   ( ( sql_expression ) => sql_expression | ( NUMBER ) => NUMBER ) ( 'ASC' | 'DESC' )?
  1461.     ;
  1462.  
  1463. update_clause
  1464.     :   'FOR' 'UPDATE' ( 'OF' column_name ( COMMA column_name )* )? ( 'NOWAIT' )?
  1465.     ;
  1466.  
  1467. insert_command
  1468.     :   'INSERT' hint? 'INTO' table_reference_list
  1469.         ( LPAREN column_specs RPAREN )?
  1470.         (   'VALUES' LPAREN plsql_expressions RPAREN
  1471.         |   select_statement
  1472.         )
  1473.         ( returning_clause )?
  1474.     ;
  1475.    
  1476. update_statement
  1477.     :   'UPDATE' hint? table_spec 'SET' .*
  1478.     ;
  1479.  
  1480. update_command
  1481.     :   'UPDATE' hint? selected_table
  1482.         'SET'
  1483.         (   update_nested_column_specs
  1484.         |   update_column_specs
  1485.         )
  1486.         (   'WHERE'
  1487.             (   keyCURRENT_OF cursor_name
  1488.             |   sql_condition
  1489.             )
  1490.         )?
  1491.         ( returning_clause )?
  1492.     ;
  1493.  
  1494. update_column_specs
  1495.     :   update_column_spec ( COMMA update_column_spec )*
  1496.     ;
  1497.  
  1498. update_column_spec
  1499.     :   column_spec EQ sql_expression
  1500.     ;
  1501.  
  1502. update_nested_column_specs
  1503.     :   update_nested_column_spec ( COMMA update_nested_column_spec )*
  1504.     ;
  1505.  
  1506. update_nested_column_spec
  1507.     :   LPAREN column_specs RPAREN EQ subquery
  1508.     ;
  1509.  
  1510. delete_command
  1511.     :   'DELETE' hint? ( 'FROM' )? selected_table
  1512.         (   'WHERE'
  1513.             (   keyCURRENT_OF cursor_name
  1514.             |   sql_condition
  1515.             )
  1516.         )?
  1517.         ( returning_clause )?
  1518.     ;
  1519.  
  1520. returning_clause
  1521.     :   ( keyRETURN | keyRETURNING ) select_list ( keyBULK keyCOLLECT )? 'INTO' lvalues
  1522.     ;
  1523.  
  1524. set_transaction_command
  1525.     :   'SET' keyTRANSACTION keyREAD keyONLY
  1526.     ;
  1527.  
  1528. close_statement
  1529.     :   keyCLOSE cursor_name
  1530.     ;
  1531.  
  1532. fetch_statement
  1533.     :   'FETCH' cursor_name 'INTO'
  1534.         (   variable_names
  1535.         |   record_name
  1536.         )
  1537.     ;
  1538.  
  1539. lock_table_statement
  1540.     :   'LOCK' 'TABLE' table_reference_list
  1541.         'IN' lock_mode 'MODE' ( 'NOWAIT' )?
  1542.     ;
  1543.  
  1544. lock_mode
  1545.     :   'ROW' 'SHARE'
  1546.     |   'ROW' 'EXCLUSIVE'
  1547.     |   'SHARE' 'UPDATE'
  1548.     |   'SHARE'
  1549.     |   'SHARE' 'ROW' 'EXCLUSIVE'
  1550.     |   'EXCLUSIVE'
  1551.     ;
  1552.  
  1553. open_statement
  1554.     :   keyOPEN cursor_name ( LPAREN plsql_expressions RPAREN )?
  1555.     ;
  1556.  
  1557. rollback_statement
  1558.     :   keyROLLBACK ( keyWORK )?
  1559.         ( 'TO' ( 'SAVEPOINT' )? savepoint_name )?
  1560.         ( 'COMMENT' quoted_string )?
  1561.     ;
  1562.  
  1563. savepoint_statement
  1564.     :   'SAVEPOINT' savepoint_name
  1565.     ;
  1566.  
  1567. savepoint_name
  1568.     :   identifier
  1569.     ;
  1570.  
  1571. identifier
  1572.     :   ID
  1573.     |   DOUBLEQUOTED_STRING
  1574. //  |   keyword
  1575.        ;
  1576.  
  1577. quoted_string
  1578.     :   QUOTED_STRING
  1579.     ;
  1580.  
  1581. match_string
  1582.     :   QUOTED_STRING
  1583.     ;
  1584. hint    :   (ML_COMMENT | SL_COMMENT)
  1585.     ;
  1586.    
  1587.  
  1588.  
  1589. sql_identifier
  1590.     :   identifier
  1591.     |   'ROWID'
  1592.     |   keyA
  1593. //  |   'ROWNUM'
  1594.     ;
  1595.  
  1596. QUOTED_STRING
  1597.     :   ( 'n' )? '\'' ( '\'\'' | ~('\'') )* '\''
  1598.     ;
  1599. ID /*options { testLiterals=true; }*/
  1600.     :   'A' .. 'Z' ( 'A' .. 'Z' | '0' .. '9' | '_' | '$' | '#' )*
  1601.     |   DOUBLEQUOTED_STRING
  1602.     ;
  1603. SEMI
  1604.     :   ';'
  1605.     ;
  1606. COLON
  1607.     :   ':'
  1608.     ;
  1609. DOUBLEDOT
  1610.     :   POINT POINT
  1611.     ;
  1612. DOT
  1613.     :   POINT
  1614.     ;
  1615. fragment
  1616. POINT
  1617.     :   '.'
  1618.     ;
  1619. COMMA
  1620.     :   ','
  1621.     ;
  1622. EXPONENT
  1623.     :   '**'
  1624.     ;
  1625. ASTERISK
  1626.     :   '*'
  1627.     ;
  1628. AT_SIGN
  1629.     :   '@'
  1630.     ;
  1631. RPAREN
  1632.     :   ')'
  1633.     ;
  1634. LPAREN
  1635.     :   '('
  1636.     ;
  1637. RBRACK
  1638.     :   ']'
  1639.     ;
  1640. LBRACK
  1641.     :   '['
  1642.     ;
  1643. PLUS
  1644.     :   '+'
  1645.     ;
  1646. MINUS
  1647.     :   '-'
  1648.     ;
  1649. DIVIDE
  1650.     :   '/'
  1651.     ;
  1652. EQ
  1653.     :   '='
  1654.     ;
  1655. PERCENTAGE
  1656.     :   '%'
  1657.     ;
  1658. LLABEL
  1659.     :   '<<'
  1660.     ;
  1661. RLABEL
  1662.     :   '>>'
  1663.     ;
  1664. ASSIGN
  1665.     :   ':='
  1666.     ;
  1667. ARROW
  1668.     :   '=>'
  1669.     ;
  1670. VERTBAR
  1671.     :   '|'
  1672.     ;
  1673. DOUBLEVERTBAR
  1674.     :   '||'
  1675.     ;
  1676. NOT_EQ
  1677.     :   '<>' | '!=' | '^='
  1678.     ;
  1679. LTH
  1680.     :   '<'
  1681.     ;
  1682. LEQ
  1683.     :   '<='
  1684.     ;
  1685. GTH
  1686.     :   '>'
  1687.     ;
  1688. GEQ
  1689.     :   '>='
  1690.     ;
  1691. NUMBER
  1692.     :   //( PLUS | MINUS )?
  1693.         (   ( N POINT N ) => N POINT N
  1694.         |   POINT N
  1695.         |   N
  1696.         )
  1697.         ( 'E' ( PLUS | MINUS )? N )?
  1698.     ;
  1699. fragment
  1700. N
  1701.     : '0' .. '9' ( '0' .. '9' )*
  1702.     ;
  1703. QUOTE
  1704.     :   '\''
  1705.     ;
  1706. fragment
  1707. DOUBLEQUOTED_STRING
  1708.     :   '"' ( ~('"') )* '"'
  1709.     ;
  1710. WS  :   (' '|'\r'|'\t'|'\n')+ {$channel=HIDDEN;}
  1711.     ;
  1712. SL_COMMENT
  1713.     :   '--' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
  1714.     ;
  1715. ML_COMMENT
  1716.     :   '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
  1717.     ;
  1718. TYPE_ATTR
  1719.     :   '%TYPE'
  1720.     ;
  1721. ROWTYPE_ATTR
  1722.     :   '%ROWTYPE'
  1723.     ;
  1724. NOTFOUND_ATTR
  1725.     :   '%NOTFOUND'
  1726.     ;
  1727. FOUND_ATTR
  1728.     :   '%FOUND'
  1729.     ;
  1730. ISOPEN_ATTR
  1731.     :   '%ISOPEN'
  1732.     ;
  1733. ROWCOUNT_ATTR
  1734.     :   '%ROWCOUNT'
  1735.     ;
  1736. BULK_ROWCOUNT_ATTR
  1737.     :   '%BULK_ROWCOUNT'
  1738.     ;
  1739. CHARSET_ATTR
  1740.     :   '%CHARSET'
  1741.     ;
  1742.  
  1743.  
  1744. keyA                             : 'A'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"A") == 0}? ID;
  1745. keyAUTOMATIC                     : 'AUTOMATIC'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"AUTOMATIC") == 0}? ID;
  1746. keyCOUNT                         : 'COUNT'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"COUNT") == 0}? ID;
  1747. keyCROSS                         : 'CROSS'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"CROSS") == 0}? ID;
  1748. keyCUBE                          : 'CUBE'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"CUBE") == 0}? ID;
  1749. keyCURRENT_OF                    : 'CURRENT_OF'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"CURRENT_OF") == 0}? ID;
  1750. keyDAY                           : 'DAY'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"DAY") == 0}? ID;
  1751. keyDBTIMEZONE                    : 'DBTIMEZONE'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"DBTIMEZONE") == 0}? ID;
  1752. keyDECREMENT                     : 'DECREMENT'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"DECREMENT") == 0}? ID;
  1753. keyDIMENSION                     : 'DIMENSION'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"DIMENSION") == 0}? ID;
  1754. keyEMPTY                         : 'EMPTY'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"EMPTY") == 0}? ID;
  1755. keyEQUALS_PATH                   : 'EQUALS_PATH'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"EQUALS_PATH") == 0}? ID;
  1756. keyESCAPE                        : 'ESCAPE'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"ESCAPE") == 0}? ID;
  1757. keyFIRST                         : 'FIRST'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"FIRST") == 0}? ID;
  1758. keyFULL                          : 'FULL'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"FULL") == 0}? ID;
  1759. keyGROUPING                      : 'GROUPING'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"GROUPING") == 0}? ID;
  1760. keyIGNORE                        : 'IGNORE'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"IGNORE") == 0}? ID;
  1761. keyINCREMENT                     : 'INCREMENT'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"INCREMENT") == 0}? ID;
  1762. keyINFINITE                      : 'INFINITE'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"INFINITE") == 0}? ID;
  1763. keyINNER                         : 'INNER'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"INNER") == 0}? ID;
  1764. keyINTERVAL                      : 'INTERVAL'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"INTERVAL") == 0}? ID;
  1765. keyITERATE                       : 'ITERATE'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"ITERATE") == 0}? ID;
  1766. keyJOIN                          : 'JOIN'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"JOIN") == 0}? ID;
  1767. keyKEEP                          : 'KEEP'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"KEEP") == 0}? ID;
  1768. keyLAST                          : 'LAST'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"LAST") == 0}? ID;
  1769. keyLEFT                          : 'LEFT'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"LEFT") == 0}? ID;
  1770. keyLIKE2                         : 'LIKE2'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"LIKE2") == 0}? ID;
  1771. keyLIKE4                         : 'LIKE4'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"LIKE4") == 0}? ID;
  1772. keyLIKEC                         : 'LIKEC'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"LIKEC") == 0}? ID;
  1773. keyLOCAL                         : 'LOCAL'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"LOCAL") == 0}? ID;
  1774. keyMAIN                          : 'MAIN'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"MAIN") == 0}? ID;
  1775. keyMEASURES                      : 'MEASURES'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"MEASURES") == 0}? ID;
  1776. keyMEMBER                        : 'MEMBER'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"MEMBER") == 0}? ID;
  1777. keyMODEL                         : 'MODEL'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"MODEL") == 0}? ID;
  1778. keyMONTH                         : 'MONTH'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"MONTH") == 0}? ID;
  1779. keyNAN                           : 'NAN'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"NAN") == 0}? ID;
  1780. keyNATURAL                       : 'NATURAL'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"NATURAL") == 0}? ID;
  1781. keyNAV                           : 'NAV'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"NAV") == 0}? ID;
  1782. keyNOCYCLE                       : 'NOCYCLE'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"NOCYCLE") == 0}? ID;
  1783. keyNULLS                         : 'NULLS'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"NULLS") == 0}? ID;
  1784. keyONLY                          : 'ONLY'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"ONLY") == 0}? ID;
  1785. keyOUTER                         : 'OUTER'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"OUTER") == 0}? ID;
  1786. keyPARTITION                     : 'PARTITION'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"PARTITION") == 0}? ID;
  1787. keyPRECISION                     : 'PRECISION'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"PRECISION") == 0}? ID;
  1788. keyPRESENT                       : 'PRESENT'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"PRESENT") == 0}? ID;
  1789. keyREFERENCE                     : 'REFERENCE'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"REFERENCE") == 0}? ID;
  1790. keyREGEXP_LIKE                   : 'REGEXP_LIKE'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"REGEXP_LIKE") == 0}? ID;
  1791. //keyRETURN                      : 'RETURN'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"RETURN") == 0}? ID;
  1792. keyRIGHT                         : 'RIGHT'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"RIGHT") == 0}? ID;
  1793. keyROLLUP                        : 'ROLLUP'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"ROLLUP") == 0}? ID;
  1794. keyRULES                         : 'RULES'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"RULES") == 0}? ID;
  1795. keySECOND                        : 'SECOND'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"SECOND") == 0}? ID;
  1796. keySECONDS                       : 'SECONDS'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"SECONDS") == 0}? ID;
  1797. keySEQUENTIAL                    : 'SEQUENTIAL'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"SEQUENTIAL") == 0}? ID;
  1798. keySESSIONTIMEZONE               : 'SESSIONTIMEZONE'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"SESSIONTIMEZONE") == 0}? ID;
  1799. keySETS                          : 'SETS'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"SETS") == 0}? ID;
  1800. keySIBLINGS                      : 'SIBLINGS'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"SIBLINGS") == 0}? ID;
  1801. keySINGLE                        : 'SINGLE'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"SINGLE") == 0}? ID;
  1802. keySOME                          : 'SOME'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"SOME") == 0}? ID;
  1803. keySUBMULTISET                   : 'SUBMULTISET'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"SUBMULTISET") == 0}? ID;
  1804. keyTIME                          : 'TIME'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"TIME") == 0}? ID;
  1805. keyTIMESTAMP                     : 'TIMESTAMP'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"TIMESTAMP") == 0}? ID;
  1806. keyTHE                           : 'THE'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"THE") == 0}? ID;
  1807. keyUNDER_PATH                    : 'UNDER_PATH'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"UNDER_PATH") == 0}? ID;
  1808. keyUNTIL                         : 'UNTIL'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"UNTIL") == 0}? ID;
  1809. keyUPDATED                       : 'UPDATED'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"UPDATED") == 0}? ID;
  1810. keyUPSERT                        : 'UPSERT'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"UPSERT") == 0}? ID;
  1811. keyWAIT                          : 'WAIT'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"WAIT") == 0}? ID;
  1812. keyYEAR                          : 'YEAR'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"YEAR") == 0}? ID;
  1813. keyZONE                          : 'ZONE'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"ZONE") == 0}? ID;
  1814.  
  1815. keyARRAY                         : 'ARRAY'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"ARRAY") == 0}? ID;
  1816. keyAUTONOMOUS_TRANSACTION        : 'AUTONOMOUS_TRANSACTION'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"AUTONOMOUS_TRANSACTION") == 0}? ID;
  1817. keyBODY                          : 'BODY'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"BODY") == 0}? ID;
  1818. keyBUILTIN                       : 'BUILTIN'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"BUILTIN") == 0}? ID;
  1819. keyBULK                          : 'BULK'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"BULK") == 0}? ID;
  1820. keyBYTE                          : 'BYTE'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"BYTE") == 0}? ID;
  1821. keyCLOSE                         : 'CLOSE'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"CLOSE") == 0}? ID;
  1822. keyCOLLECT                       : 'COLLECT'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"COLLECT") == 0}? ID;
  1823. keyCURSOR                        : 'CURSOR'; // {strcasecmp(LT(1)->getText(LT(1))->chars,"CURSOR") == 0}? ID;
  1824.  
  1825. keyELSIF                         : 'ELSIF'; //{strcasecmp(LT(1)->getText(LT(1))->chars, "ELSIF") == 0}? ID;
  1826. keyEXCEPTION_INIT                : 'EXCEPTION_INIT'; // {strcasecmp(LT(1)->getText(LT(1))->chars, "EXCEPTION_INIT") == 0}? ID;
  1827. keyEXIT                          : 'EXIT'; // {strcasecmp(LT(1)->getText(LT(1))->chars, "EXIT") == 0}? ID;
  1828. keyFIPSFLAG                      : 'FIPSFLAG'; // {strcasecmp(LT(1)->getText(LT(1))->chars, "FIPSFLAG") == 0}? ID;
  1829. keyFUNCTION                      : 'FUNCTION'; //{strcasecmp(LT(1)->getText(LT(1))->chars, "FUNCTION") == 0}? ID;
  1830. keyINTERFACE                     : 'INTERFACE'; // {strcasecmp(LT(1)->getText(LT(1))->chars, "INTERFACE") == 0}? ID;
  1831. keyLOOP                          : 'LOOP'; //{strcasecmp(LT(1)->getText(LT(1))->chars, "LOOP") == 0}? ID;
  1832. keyNEW                           : 'NEW'; //{strcasecmp(LT(1)->getText(LT(1))->chars, "NEW") == 0}? ID;
  1833. keyNEW_NAMES                     : 'NEW_NAMES'; // {strcasecmp(LT(1)->getText(LT(1))->chars, "NEW_NAMES") == 0}? ID;
  1834. keyOPEN                          : 'OPEN'; // {strcasecmp(LT(1)->getText(LT(1))->chars, "OPEN") == 0}? ID;
  1835. keyOUT                           : 'OUT'; //{strcasecmp(LT(1)->getText(LT(1))->chars, "OUT") == 0}? ID;
  1836. keyPACKAGE                       : 'PACKAGE'; //{strcasecmp(LT(1)->getText(LT(1))->chars, "PACKAGE") == 0}? ID;
  1837. keyPRAGMA                        : 'PRAGMA'; //{strcasecmp(LT(1)->getText(LT(1))->chars, "PRAGMA") == 0}? ID;
  1838. keyRAISE                         : 'RAISE'; //{strcasecmp(LT(1)->getText(LT(1))->chars, "RAISE") == 0}? ID;
  1839. keyRANGE                         : 'RANGE'; // {strcasecmp(LT(1)->getText(LT(1))->chars, "RANGE") == 0}? ID;
  1840. keyREAD                          : 'READ'; // {strcasecmp(LT(1)->getText(LT(1))->chars, "READ") == 0}? ID;
  1841. keyRECORD                        : 'RECORD'; //{strcasecmp(LT(1)->getText(LT(1))->chars, "RECORD") == 0}? ID;
  1842. keyREF                           : 'REF'; // {strcasecmp(LT(1)->getText(LT(1))->chars, "REF") == 0}? ID;
  1843. keyREPLACE                       : 'REPLACE'; // {strcasecmp(LT(1)->getText(LT(1))->chars, "REPLACE") == 0}? ID;
  1844. keyRESTRICT_REFERENCES           : 'RESTRICT_REFERENCES'; // {strcasecmp(LT(1)->getText(LT(1))->chars, "RESTRICT_REFERENCES") == 0}? ID;
  1845. keyRETURN                        : 'RETURN'; //{strcasecmp(LT(1)->getText(LT(1))->chars, "RETURN") == 0}? ID;
  1846. keyRETURNING                     : 'RETURNING'; //{strcasecmp(LT(1)->getText(LT(1))->chars, "RETURNING") == 0}? ID;
  1847. keyREVERSE                       : 'REVERSE'; // {strcasecmp(LT(1)->getText(LT(1))->chars, "REVERSE") == 0}? ID;
  1848. keyROLLBACK                      : 'ROLLBACK'; //{strcasecmp(LT(1)->getText(LT(1))->chars, "ROLLBACK") == 0}? ID;
  1849. keySERIALLY_REUSABLE             : 'SERIALLY_REUSABLE'; // {strcasecmp(LT(1)->getText(LT(1))->chars, "SERIALLY_REUSABLE") == 0}? ID;
  1850. keySUBTYPE                       : 'SUBTYPE'; // {strcasecmp(LT(1)->getText(LT(1))->chars, "SUBTYPE") == 0}? ID;
  1851. keyTRANSACTION                   : 'TRANSACTION'; // {strcasecmp(LT(1)->getText(LT(1))->chars, "TRANSACTION") == 0}? ID;
  1852. keyTYPE                          : 'TYPE'; // {strcasecmp(LT(1)->getText(LT(1))->chars, "TYPE") == 0}? ID;
  1853. keyUSING                         : 'USING'; // {strcasecmp(LT(1)->getText(LT(1))->chars, "USING") == 0}? ID;
  1854. keyVARRAY                        : 'VARRAY'; // {strcasecmp(LT(1)->getText(LT(1))->chars, "VARRAY") == 0}? ID;
  1855. keyVARYING                      : 'VARYING'; // {strcasecmp(LT(1)->getText(LT(1))->chars, "VARYING") == 0}? ID;
  1856. keyWHILE                         : 'WHILE'; //{strcasecmp(LT(1)->getText(LT(1))->chars, "WHILE") == 0}? ID;
  1857. keyWORK                          : 'WORK'; // {strcasecmp(LT(1)->getText(LT(1))->chars, "WORK") == 0}? ID;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement