home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / ast_comp / ora-sql.shr / sql1.y < prev   
Encoding:
Text File  |  1993-07-04  |  9.0 KB  |  620 lines

  1.     /* symbolic tokens */
  2.  
  3. %union {
  4.     int intval;
  5.     double floatval;
  6.     char *strval;
  7.     int subtok;
  8. }
  9.     
  10. %token NAME
  11. %token STRING
  12. %token INTNUM APPROXNUM
  13.  
  14.     /* operators */
  15.  
  16. %left OR
  17. %left AND
  18. %left NOT
  19. %left <subtok> COMPARISON /* = <> < > <= >= */
  20. %left '+' '-'
  21. %left '*' '/'
  22. %nonassoc UMINUS
  23.  
  24.     /* literal keyword tokens */
  25.  
  26. %token ALL AMMSC ANY AS ASC AUTHORIZATION BETWEEN BY
  27. %token CHARACTER CHECK CLOSE COMMIT CONTINUE CREATE CURRENT
  28. %token CURSOR DECIMAL DECLARE DEFAULT DELETE DESC DISTINCT DOUBLE
  29. %token ESCAPE EXISTS FETCH FLOAT FOR FOREIGN FOUND FROM GOTO
  30. %token GRANT GROUP HAVING IN INDICATOR INSERT INTEGER INTO
  31. %token IS KEY LANGUAGE LIKE MODULE NULLX NUMERIC OF ON
  32. %token OPEN OPTION ORDER PRECISION PRIMARY PRIVILEGES PROCEDURE
  33. %token PUBLIC REAL REFERENCES ROLLBACK SCHEMA SELECT SET
  34. %token SMALLINT SOME SQLCODE SQLERROR TABLE TO UNION
  35. %token UNIQUE UPDATE USER VALUES VIEW WHENEVER WHERE WITH WORK
  36. %token COBOL FORTRAN PASCAL PLI C ADA
  37.  
  38. %%
  39.  
  40. sql_list:
  41.         sql ';'
  42.     |    sql_list sql ';'
  43.     ;
  44.  
  45.  
  46.     /* schema definition language */
  47.     /* Note: other ``sql:'' rules appear later in the grammar */
  48. sql:        schema
  49.     ;
  50.     
  51. schema:
  52.         CREATE SCHEMA AUTHORIZATION user opt_schema_element_list
  53.     ;
  54.  
  55. opt_schema_element_list:
  56.         /* empty */
  57.     |    schema_element_list
  58.     ;
  59.  
  60. schema_element_list:
  61.         schema_element
  62.     |    schema_element_list schema_element
  63.     ;
  64.  
  65. schema_element:
  66.         base_table_def
  67.     |    view_def
  68.     |    privilege_def
  69.     ;
  70.  
  71. base_table_def:
  72.         CREATE TABLE table '(' base_table_element_commalist ')'
  73.     ;
  74.  
  75. base_table_element_commalist:
  76.         base_table_element
  77.     |    base_table_element_commalist ',' base_table_element
  78.     ;
  79.  
  80. base_table_element:
  81.         column_def
  82.     |    table_constraint_def
  83.     ;
  84.  
  85. column_def:
  86.         column data_type column_def_opt_list
  87.     ;
  88.  
  89. column_def_opt_list:
  90.         /* empty */
  91.     |    column_def_opt_list column_def_opt
  92.     ;
  93.  
  94. column_def_opt:
  95.         NOT NULLX
  96.     |    NOT NULLX UNIQUE
  97.     |    NOT NULLX PRIMARY KEY
  98.     |    DEFAULT literal
  99.     |    DEFAULT NULLX
  100.     |    DEFAULT USER
  101.     |    CHECK '(' search_condition ')'
  102.     |    REFERENCES table
  103.     |    REFERENCES table '(' column_commalist ')'
  104.     ;
  105.  
  106. table_constraint_def:
  107.         UNIQUE '(' column_commalist ')'
  108.     |    PRIMARY KEY '(' column_commalist ')'
  109.     |    FOREIGN KEY '(' column_commalist ')'
  110.             REFERENCES table 
  111.     |    FOREIGN KEY '(' column_commalist ')'
  112.             REFERENCES table '(' column_commalist ')'
  113.     |    CHECK '(' search_condition ')'
  114.     ;
  115.  
  116. column_commalist:
  117.         column
  118.     |    column_commalist ',' column
  119.     ;
  120.  
  121. view_def:
  122.         CREATE VIEW table opt_column_commalist
  123.         AS query_spec opt_with_check_option
  124.     ;
  125.     
  126. opt_with_check_option:
  127.         /* empty */
  128.     |    WITH CHECK OPTION
  129.     ;
  130.  
  131. opt_column_commalist:
  132.         /* empty */
  133.     |    '(' column_commalist ')'
  134.     ;
  135.  
  136. privilege_def:
  137.         GRANT privileges ON table TO grantee_commalist
  138.         opt_with_grant_option
  139.     ;
  140.  
  141. opt_with_grant_option:
  142.         /* empty */
  143.     |    WITH GRANT OPTION
  144.     ;
  145.  
  146. privileges:
  147.         ALL PRIVILEGES
  148.     |    ALL
  149.     |    operation_commalist
  150.     ;
  151.  
  152. operation_commalist:
  153.         operation
  154.     |    operation_commalist ',' operation
  155.     ;
  156.  
  157. operation:
  158.         SELECT
  159.     |    INSERT
  160.     |    DELETE
  161.     |    UPDATE opt_column_commalist
  162.     |    REFERENCES opt_column_commalist
  163.     ;
  164.  
  165.  
  166. grantee_commalist:
  167.         grantee
  168.     |    grantee_commalist ',' grantee
  169.     ;
  170.  
  171. grantee:
  172.         PUBLIC
  173.     |    user
  174.     ;
  175.  
  176.     /* module language */
  177. sql:        module_def
  178.     ;
  179.  
  180. module_def:
  181.         MODULE opt_module
  182.         LANGUAGE lang
  183.         AUTHORIZATION user
  184.         opt_cursor_def_list
  185.         procedure_def_list
  186.     ;
  187.  
  188. opt_module:
  189.         /* empty */
  190.     |    module
  191.     ;
  192.  
  193. lang:
  194.         COBOL
  195.     |    FORTRAN
  196.     |    PASCAL
  197.     |    PLI
  198.     |    C
  199.     |    ADA
  200.     ;
  201.  
  202. opt_cursor_def_list:
  203.         /* empty */
  204.     |    cursor_def_list
  205.     ;
  206.  
  207. cursor_def_list:
  208.         cursor_def
  209.     |    cursor_def_list cursor_def
  210.     ;
  211.  
  212. cursor_def:
  213.         DECLARE cursor CURSOR FOR query_exp opt_order_by_clause
  214.     ;
  215.  
  216. opt_order_by_clause:
  217.         /* empty */
  218.     |    ORDER BY ordering_spec_commalist
  219.     ;
  220.  
  221. ordering_spec_commalist:
  222.         ordering_spec
  223.     |    ordering_spec_commalist ',' ordering_spec
  224.     ;
  225.  
  226. ordering_spec:
  227.         INTNUM opt_asc_desc
  228.     |    column_ref opt_asc_desc
  229.     ;
  230.  
  231. opt_asc_desc:
  232.         /* empty */
  233.     |    ASC
  234.     |    DESC
  235.     ;
  236.  
  237. procedure_def_list:
  238.         procedure_def
  239.     |    procedure_def_list procedure_def
  240.     ;
  241.  
  242. procedure_def:
  243.         PROCEDURE procedure parameter_def_list ';'
  244.         manipulative_statement_list
  245.     ;
  246.  
  247. manipulative_statement_list:
  248.         manipulative_statement
  249.     |    manipulative_statement_list manipulative_statement
  250.     ;
  251.  
  252. parameter_def_list:
  253.         parameter_def
  254.     |    parameter_def_list parameter_def
  255.     ;
  256.  
  257. parameter_def:
  258.         parameter data_type
  259.     |    SQLCODE
  260.     ;
  261.  
  262.     /* manipulative statements */
  263.  
  264. sql:        manipulative_statement
  265.     ;
  266.  
  267. manipulative_statement:
  268.         close_statement
  269.     |    commit_statement
  270.     |    delete_statement_positioned
  271.     |    delete_statement_searched
  272.     |    fetch_statement
  273.     |    insert_statement
  274.     |    open_statement
  275.     |    rollback_statement
  276.     |    select_statement
  277.     |    update_statement_positioned
  278.     |    update_statement_searched
  279.     ;
  280.  
  281. close_statement:
  282.         CLOSE cursor
  283.     ;
  284.  
  285. commit_statement:
  286.         COMMIT WORK
  287.     ;
  288.  
  289. delete_statement_positioned:
  290.         DELETE FROM table WHERE CURRENT OF cursor
  291.     ;
  292.  
  293. delete_statement_searched:
  294.         DELETE FROM table opt_where_clause
  295.     ;
  296.  
  297. fetch_statement:
  298.         FETCH cursor INTO target_commalist
  299.     ;
  300.  
  301. insert_statement:
  302.         INSERT INTO table opt_column_commalist values_or_query_spec
  303.     ;
  304.  
  305. values_or_query_spec:
  306.         VALUES '(' insert_atom_commalist ')'
  307.     |    query_spec
  308.     ;
  309.  
  310. insert_atom_commalist:
  311.         insert_atom
  312.     |    insert_atom_commalist ',' insert_atom
  313.     ;
  314.  
  315. insert_atom:
  316.         atom
  317.     |    NULLX
  318.     ;
  319.  
  320. open_statement:
  321.         OPEN cursor
  322.     ;
  323.  
  324. rollback_statement:
  325.         ROLLBACK WORK
  326.     ;
  327.  
  328. select_statement:
  329.         SELECT opt_all_distinct selection
  330.         INTO target_commalist
  331.         table_exp
  332.     ;
  333.  
  334. opt_all_distinct:
  335.         /* empty */
  336.     |    ALL
  337.     |    DISTINCT
  338.     ;
  339.  
  340. update_statement_positioned:
  341.         UPDATE table SET assignment_commalist
  342.         WHERE CURRENT OF cursor
  343.     ;
  344.  
  345. assignment_commalist:
  346.     |    assignment
  347.     |    assignment_commalist ',' assignment
  348.     ;
  349.  
  350. assignment:
  351.         column '=' scalar_exp
  352.     |    column '=' NULLX
  353.     ;
  354.  
  355. update_statement_searched:
  356.         UPDATE table SET assignment_commalist opt_where_clause
  357.     ;
  358.  
  359. target_commalist:
  360.         target
  361.     |    target_commalist ',' target
  362.     ;
  363.  
  364. target:
  365.         parameter_ref
  366.     ;
  367.  
  368. opt_where_clause:
  369.         /* empty */
  370.     |    where_clause
  371.     ;
  372.  
  373.     /* query expressions */
  374.  
  375. query_exp:
  376.         query_term
  377.     |    query_exp UNION query_term
  378.     |    query_exp UNION ALL query_term
  379.     ;
  380.  
  381. query_term:
  382.         query_spec
  383.     |    '(' query_exp ')'
  384.     ;
  385.  
  386. query_spec:
  387.         SELECT opt_all_distinct selection table_exp
  388.     ;
  389.  
  390. selection:
  391.         scalar_exp_commalist
  392.     |    '*'
  393.     ;
  394.  
  395. table_exp:
  396.         from_clause
  397.         opt_where_clause
  398.         opt_group_by_clause
  399.         opt_having_clause
  400.     ;
  401.  
  402. from_clause:
  403.         FROM table_ref_commalist
  404.     ;
  405.  
  406. table_ref_commalist:
  407.         table_ref
  408.     |    table_ref_commalist ',' table_ref
  409.     ;
  410.  
  411. table_ref:
  412.         table 
  413.     |    table range_variable
  414.     ;
  415.  
  416. where_clause:
  417.         WHERE search_condition
  418.     ;
  419.  
  420. opt_group_by_clause:
  421.         /* empty */
  422.     |    GROUP BY column_ref_commalist
  423.     ;
  424.  
  425. column_ref_commalist:
  426.         column_ref
  427.     |    column_ref_commalist ',' column_ref
  428.     ;
  429.  
  430. opt_having_clause:
  431.         /* empty */
  432.     |    HAVING search_condition
  433.     ;
  434.  
  435.     /* search conditions */
  436.  
  437. search_condition:
  438.     |    search_condition OR search_condition
  439.     |    search_condition AND search_condition
  440.     |    NOT search_condition
  441.     |    '(' search_condition ')'
  442.     |    predicate
  443.     ;
  444.  
  445. predicate:
  446.         comparison_predicate
  447.     |    between_predicate
  448.     |    like_predicate
  449.     |    test_for_null
  450.     |    in_predicate
  451.     |    all_or_any_predicate
  452.     |    existence_test
  453.     ;
  454.  
  455. comparison_predicate:
  456.         scalar_exp COMPARISON scalar_exp
  457.     |    scalar_exp COMPARISON subquery
  458.     ;
  459.  
  460. between_predicate:
  461.         scalar_exp NOT BETWEEN scalar_exp AND scalar_exp
  462.     |    scalar_exp BETWEEN scalar_exp AND scalar_exp
  463.     ;
  464.  
  465. like_predicate:
  466.         scalar_exp NOT LIKE atom opt_escape
  467.     |    scalar_exp LIKE atom opt_escape
  468.     ;
  469.  
  470. opt_escape:
  471.         /* empty */
  472.     |    ESCAPE atom
  473.     ;
  474.  
  475. test_for_null:
  476.         column_ref IS NOT NULLX
  477.     |    column_ref IS NULLX
  478.     ;
  479.  
  480. in_predicate:
  481.         scalar_exp NOT IN '(' subquery ')'
  482.     |    scalar_exp IN '(' subquery ')'
  483.     |    scalar_exp NOT IN '(' atom_commalist ')'
  484.     |    scalar_exp IN '(' atom_commalist ')'
  485.     ;
  486.  
  487. atom_commalist:
  488.         atom
  489.     |    atom_commalist ',' atom
  490.     ;
  491.  
  492. all_or_any_predicate:
  493.         scalar_exp COMPARISON any_all_some subquery
  494.     ;
  495.             
  496. any_all_some:
  497.         ANY
  498.     |    ALL
  499.     |    SOME
  500.     ;
  501.  
  502. existence_test:
  503.         EXISTS subquery
  504.     ;
  505.  
  506. subquery:
  507.         '(' SELECT opt_all_distinct selection table_exp ')'
  508.     ;
  509.  
  510.     /* scalar expressions */
  511.  
  512. scalar_exp:
  513.         scalar_exp '+' scalar_exp
  514.     |    scalar_exp '-' scalar_exp
  515.     |    scalar_exp '*' scalar_exp
  516.     |    scalar_exp '/' scalar_exp
  517.     |    '+' scalar_exp %prec UMINUS
  518.     |    '-' scalar_exp %prec UMINUS
  519.     |    atom
  520.     |    column_ref
  521.     |    function_ref
  522.     |    '(' scalar_exp ')'
  523.     ;
  524.  
  525. scalar_exp_commalist:
  526.         scalar_exp
  527.     |    scalar_exp_commalist ',' scalar_exp
  528.     ;
  529.  
  530. atom:
  531.         parameter_ref
  532.     |    literal
  533.     |    USER
  534.     ;
  535.  
  536. parameter_ref:
  537.         parameter
  538.     |    parameter parameter
  539.     |    parameter INDICATOR parameter
  540.     ;
  541.  
  542. function_ref:
  543.         AMMSC '(' '*' ')'
  544.     |    AMMSC '(' DISTINCT column_ref ')'
  545.     |    AMMSC '(' ALL scalar_exp ')'
  546.     |    AMMSC '(' scalar_exp ')'
  547.     ;
  548.  
  549. literal:
  550.         STRING
  551.     |    INTNUM
  552.     |    APPROXNUM
  553.     ;
  554.  
  555.     /* miscellaneous */
  556.  
  557. table:
  558.         NAME
  559.     |    NAME '.' NAME
  560.     ;
  561.  
  562. column_ref:
  563.         NAME
  564.     |    NAME '.' NAME    /* needs semantics */
  565.     |    NAME '.' NAME '.' NAME
  566.     ;
  567.  
  568.         /* data types */
  569.  
  570. data_type:
  571.         CHARACTER
  572.     |    CHARACTER '(' INTNUM ')'
  573.     |    NUMERIC
  574.     |    NUMERIC '(' INTNUM ')'
  575.     |    NUMERIC '(' INTNUM ',' INTNUM ')'
  576.     |    DECIMAL
  577.     |    DECIMAL '(' INTNUM ')'
  578.     |    DECIMAL '(' INTNUM ',' INTNUM ')'
  579.     |    INTEGER
  580.     |    SMALLINT
  581.     |    FLOAT
  582.     |    FLOAT '(' INTNUM ')'
  583.     |    REAL
  584.     |    DOUBLE PRECISION
  585.     ;
  586.  
  587.     /* the various things you can name */
  588.  
  589. column:        NAME
  590.     ;
  591.  
  592. cursor:        NAME
  593.     ;
  594.  
  595. module:        NAME
  596.     ;
  597.  
  598. parameter:
  599.         ':' NAME
  600.     ;
  601.  
  602. procedure:    NAME
  603.     ;
  604.  
  605. range_variable:    NAME
  606.     ;
  607.  
  608. user:        NAME
  609.     ;
  610.  
  611.     /* embedded condition things */
  612. sql:        WHENEVER NOT FOUND when_action
  613.     |    WHENEVER SQLERROR when_action
  614.     ;
  615.  
  616. when_action:    GOTO NAME
  617.     |    CONTINUE
  618.     ;
  619. %%
  620.