This file contains a depth-first tree traversal of the BNF for the language done at about 27-AUG-1992 11:03:41.64. The specific version of the BNF included here is: ANSI-only, SQL2-only.


<SQL_terminal_character> ::=
      <SQL_language_character>
    | <SQL_embedded_language_character>

<SQL_language_character> ::=
      <simple_Latin_letter>
    | <digit>
    | <SQL_special_character>

<simple_Latin_letter> ::=
      <simple_Latin_upper_case_letter>
    | <simple_Latin_lower_case_letter>

<simple_Latin_upper_case_letter> ::=
          A | B | C | D | E | F | G | H | I | J | K | L | M | N | O
    | P | Q | R | S | T | U | V | W | X | Y | Z

<simple_Latin_lower_case_letter> ::=
          a | b | c | d | e | f | g | h | i | j | k | l | m | n | o
    | p | q | r | s | t | u | v | w | x | y | z

<digit> ::=
    0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

<SQL_special_character> ::=
      <space>
    | <double_quote>
    | <percent>
    | <ampersand>
    | <quote>
    | <left_paren>
    | <right_paren>
    | <asterisk>
    | <plus_sign>
    | <comma>
    | <minus_sign>
    | <period>
    | <solidus>
    | <colon>
    | <semicolon>
    | <less_than_operator>
    | <equals_operator>
    | <greater_than_operator>
    | <question_mark>
    | <underscore>
    | <vertical_bar>

<space> ::= !! <EMPHASIS>(space character in character set in use)

<double_quote> ::= "

<percent> ::= %

<ampersand> ::= &

<quote> ::= '

<left_paren> ::= (

<right_paren> ::= )

<asterisk> ::= *

<plus_sign> ::= +

<comma> ::= ,

<minus_sign> ::= -

<period> ::= .

<solidus> ::= /

<colon> ::= :

<semicolon> ::= ;

<less_than_operator> ::= <

<equals_operator> ::= =

<greater_than_operator> ::= >

<question_mark> ::= ?

<underscore> ::= _

<vertical_bar> ::= |

<SQL_embedded_language_character> ::=
      <left_bracket>
    | <right_bracket>

<left_bracket> ::= [

<right_bracket> ::= ]

<token> ::=
      <nondelimiter_token>
    | <delimiter_token>

<nondelimiter_token> ::=
      <regular_identifier>
    | <key_word>
    | <unsigned_numeric_literal>
    | <national_character_string_literal>
    | <bit_string_literal>
    | <hex_string_literal>

<regular_identifier> ::= <identifier_body>

<identifier_body> ::=
    <identifier_start> [ { <underscore> | <identifier_part> }... ]

<identifier_start> ::= <EMPHASIS>(!! See the Syntax Rules)

<identifier_part> ::=
      <identifier_start>
    | <digit>

<key_word> ::=
      <reserved_word>
    | <non-reserved_word>

<reserved_word> ::=
      ABSOLUTE | ACTION | ADD | ALL
    | ALLOCATE | ALTER | AND
    | ANY | ARE
    | AS | ASC
    | ASSERTION | AT
    | AUTHORIZATION | AVG
    | BEGIN | BETWEEN | BIT | BIT_LENGTH
    | BOTH | BY
    | CASCADE | CASCADED | CASE | CAST
    | CATALOG
    | CHAR | CHARACTER | CHAR_LENGTH
    | CHARACTER_LENGTH | CHECK | CLOSE | COALESCE
    | COLLATE | COLLATION
    | COLUMN | COMMIT
    | CONNECT
    | CONNECTION | CONSTRAINT
    | CONSTRAINTS | CONTINUE
    | CONVERT | CORRESPONDING | COUNT | CREATE | CROSS
    | CURRENT
    | CURRENT_DATE | CURRENT_TIME
    | CURRENT_TIMESTAMP | CURRENT_USER | CURSOR
    | DATE | DAY | DEALLOCATE | DEC
    | DECIMAL | DECLARE | DEFAULT | DEFERRABLE
    | DEFERRED | DELETE | DESC | DESCRIBE | DESCRIPTOR
    | DIAGNOSTICS
    | DISCONNECT | DISTINCT | DOMAIN | DOUBLE | DROP
    | ELSE | END | END-EXEC | ESCAPE
    | EXCEPT | EXCEPTION
    | EXEC | EXECUTE | EXISTS
    | EXTERNAL | EXTRACT
    | FALSE | FETCH | FIRST | FLOAT | FOR
    | FOREIGN | FOUND | FROM | FULL
    | GET | GLOBAL | GO | GOTO
    | GRANT | GROUP
    | HAVING | HOUR
    | IDENTITY | IMMEDIATE | IN | INDICATOR
    | INITIALLY | INNER | INPUT
    | INSENSITIVE | INSERT | INT | INTEGER | INTERSECT
    | INTERVAL | INTO | IS
    | ISOLATION
    | JOIN
    | KEY
    | LANGUAGE | LAST | LEADING | LEFT
    | LEVEL | LIKE | LOCAL | LOWER
    | MATCH | MAX | MIN | MINUTE | MODULE
    | MONTH
    | NAMES | NATIONAL | NATURAL | NCHAR | NEXT | NO
    | NOT | NULL
    | NULLIF | NUMERIC
    | OCTET_LENGTH | OF
    | ON | ONLY | OPEN | OPTION | OR
    | ORDER | OUTER
    | OUTPUT | OVERLAPS
    | PAD | PARTIAL | POSITION | PRECISION | PREPARE
    | PRESERVE | PRIMARY
    | PRIOR | PRIVILEGES | PROCEDURE | PUBLIC
    | READ | REAL | REFERENCES | RELATIVE | RESTRICT
    | REVOKE | RIGHT
    | ROLLBACK | ROWS
    | SCHEMA | SCROLL | SECOND | SECTION
    | SELECT
    | SESSION | SESSION_USER | SET
    | SIZE | SMALLINT | SOME | SPACE | SQL | SQLCODE
    | SQLERROR | SQLSTATE
    | SUBSTRING | SUM | SYSTEM_USER
    | TABLE | TEMPORARY
    | THEN | TIME | TIMESTAMP
    | TIMEZONE_HOUR | TIMEZONE_MINUTE
    | TO | TRAILING | TRANSACTION
    | TRANSLATE | TRANSLATION | TRIM | TRUE
    | UNION | UNIQUE | UNKNOWN | UPDATE | UPPER | USAGE
    | USER | USING
    | VALUE | VALUES | VARCHAR | VARYING | VIEW
    | WHEN | WHENEVER | WHERE | WITH | WORK | WRITE
    | YEAR
    | ZONE

<non-reserved_word> ::=
    
      ADA
    | C | CATALOG_NAME
    | CHARACTER_SET_CATALOG | CHARACTER_SET_NAME
    | CHARACTER_SET_SCHEMA | CLASS_ORIGIN | COBOL | COLLATION_CATALOG
    | COLLATION_NAME | COLLATION_SCHEMA | COLUMN_NAME | COMMAND_FUNCTION
    | COMMITTED
    | CONDITION_NUMBER | CONNECTION_NAME | CONSTRAINT_CATALOG | CONSTRAINT_NAME
    | CONSTRAINT_SCHEMA | CURSOR_NAME
    | DATA | DATETIME_INTERVAL_CODE
    | DATETIME_INTERVAL_PRECISION | DYNAMIC_FUNCTION
    | FORTRAN
    | LENGTH
    | MESSAGE_LENGTH | MESSAGE_OCTET_LENGTH | MESSAGE_TEXT | MORE | MUMPS
    | NAME | NULLABLE | NUMBER
    | PASCAL | PLI
    | REPEATABLE | RETURNED_LENGTH | RETURNED_OCTET_LENGTH | RETURNED_SQLSTATE
    | ROW_COUNT
    | SCALE | SCHEMA_NAME | SERIALIZABLE | SERVER_NAME | SUBCLASS_ORIGIN
    | TABLE_NAME | TYPE
    | UNCOMMITTED | UNNAMED

<unsigned_numeric_literal> ::=
      <exact_numeric_literal>
    | <approximate_numeric_literal>

<exact_numeric_literal> ::=
      <unsigned_integer> [ <period> [ <unsigned_integer> ] ]
    | <period> <unsigned_integer>

<unsigned_integer> ::= <digit>...

<approximate_numeric_literal> ::= <mantissa> E <exponent>

<mantissa> ::= <exact_numeric_literal>

<exponent> ::= <signed_integer>

<signed_integer> ::= [ <sign> ] <unsigned_integer>

<sign> ::= <plus_sign> | <minus_sign>

<national_character_string_literal> ::=
    N <quote> [ <character_representation>... ] <quote>
      [ { <separator>... <quote> [ <character_representation>... ] <quote> }... ]

<character_representation> ::=
      <nonquote_character>
    | <quote_symbol>

<nonquote_character> ::= !! <EMPHASIS>(See the Syntax Rules.)

<quote_symbol> ::= <quote>

<separator> ::= { <comment> | <space> | <newline> }...

<comment> ::=
    <comment_introducer> [ <comment_character>... ] <newline>

<comment_introducer> ::= <minus_sign>[...]

<comment_character> ::=
      <nonquote_character>
    | <quote>

<newline> ::= !! <EMPHASIS>(implementation-defined end-of-line indicator)

<bit_string_literal> ::=
    B <quote> [ <bit>... ] <quote>
      [ { <separator>... <quote> [ <bit>... ] <quote> }... ]

<bit> ::= 0 | 1

<hex_string_literal> ::=
    X <quote> [ <hexit>... ] <quote>
      [ { <separator>... <quote> [ <hexit>... ] <quote> }... ]

<hexit> ::= <digit> | A | B | C | D | E | F | a | b | c | d | e | f

<delimiter_token> ::=
      <character_string_literal>
    | <date_string>
    | <time_string>
    | <timestamp_string>
    | <interval_string>
    | <delimited_identifier>
    | <SQL_special_character>
    | <not_equals_operator>
    | <greater_than_or_equals_operator>
    | <less_than_or_equals_operator>
    | <concatenation_operator>
    | <double_period>
    | <left_bracket>
    | <right_bracket>

<character_string_literal> ::=
    [ <introducer> ]
    <quote> [ <character_representation>... ] <quote>
      [ { <separator>... <quote> [ <character_representation>... ] <quote> }... ]

<introducer> ::= <underscore>

<character_set_specification> ::=
      <standard_character_repertoire_name>
    | <implementation-defined_character_repertoire_name>
    | <user-defined_character_repertoire_name>
    | <standard_universal_character_form-of-use_name>
    | <implementation-defined_universal_character_form-of-use_name>

<standard_character_repertoire_name> ::= <character_set_name>

<character_set_name> ::= [ <schema_name> <period> ]
      <SQL_language_identifier>

<schema_name> ::=
    [ <catalog_name> <period> ] <unqualified_schema_name>

<catalog_name> ::= <identifier>

<identifier> ::=
    [ <introducer> ] <actual_identifier>

<actual_identifier> ::=
      <regular_identifier>
    | <delimited_identifier>

<delimited_identifier> ::=
    <double_quote> <delimited_identifier_body> <double_quote>

<delimited_identifier_body> ::= <delimited_identifier_part>...

<delimited_identifier_part> ::=
      <nondoublequote_character>
    | <doublequote_symbol>

<nondoublequote_character> ::= <EMPHASIS>(!! See the Syntax Rules)

<doublequote_symbol> ::= <double_quote>

<unqualified_schema_name> ::= <identifier>

<SQL_language_identifier> ::=
    <SQL_language_identifier_start>
       [ { <underscore> | <SQL_language_identifier_part> }... ]

<SQL_language_identifier_start> ::= <simple_Latin_letter>

<SQL_language_identifier_part> ::=
      <simple_Latin_letter>
    | <digit>

<implementation-defined_character_repertoire_name> ::=
    <character_set_name>

<user-defined_character_repertoire_name> ::= <character_set_name>

<standard_universal_character_form-of-use_name> ::=
    <character_set_name>

<implementation-defined_universal_character_form-of-use_name> ::=
    <character_set_name>

<date_string> ::=
    <quote> <date_value> <quote>

<date_value> ::=
    <years_value> <minus_sign> <months_value>
        <minus_sign> <days_value>

<years_value> ::= <datetime_value>

<datetime_value> ::= <unsigned_integer>

<months_value> ::= <datetime_value>

<days_value> ::= <datetime_value>

<time_string> ::=
    <quote> <time_value> [ <time_zone_interval> ] <quote>

<time_value> ::=
    <hours_value> <colon> <minutes_value> <colon> <seconds_value>

<hours_value> ::= <datetime_value>

<minutes_value> ::= <datetime_value>

<seconds_value> ::=
      <seconds_integer_value> [ <period> [ <seconds_fraction> ] ]

<seconds_integer_value> ::= <unsigned_integer>

<seconds_fraction> ::= <unsigned_integer>

<time_zone_interval> ::=
    <sign> <hours_value> <colon> <minutes_value>

<timestamp_string> ::=
    <quote> <date_value> <space> <time_value>
        [ <time_zone_interval> ] <quote>

<interval_string> ::=
    <quote> { <year-month_literal> | <day-time_literal> } <quote>

<year-month_literal> ::=
      <years_value>
    | [ <years_value> <minus_sign> ] <months_value>

<day-time_literal> ::=
      <day-time_interval>
    | <time_interval>

<day-time_interval> ::=
    <days_value>
      [ <space> <hours_value> [ <colon> <minutes_value>
        [ <colon> <seconds_value> ] ] ]

<time_interval> ::=
      <hours_value> [ <colon> <minutes_value> [ <colon> <seconds_value> ] ]
    | <minutes_value> [ <colon> <seconds_value> ]
    | <seconds_value>

<not_equals_operator> ::= <>

<greater_than_or_equals_operator> ::= >=

<less_than_or_equals_operator> ::= <=

<concatenation_operator> ::= ||

<double_period> ::= ..

<module> ::=
    <module_name_clause>
    <language_clause>
    <module_authorization_clause>
    [ <temporary_table_declaration>... ]
    <module_contents>...

<module_name_clause> ::=
    MODULE [ <module_name> ]
      [ <module_character_set_specification> ]

<module_name> ::= <identifier>

<module_character_set_specification> ::=
    NAMES ARE <character_set_specification>

<language_clause> ::=
    LANGUAGE <language_name>

<language_name> ::=
    ADA | C | COBOL | FORTRAN | MUMPS | PASCAL | PLI

<module_authorization_clause> ::=
      SCHEMA <schema_name>
    | AUTHORIZATION <module_authorization_identifier>
    | SCHEMA <schema_name>
          AUTHORIZATION <module_authorization_identifier>

<module_authorization_identifier> ::=
    <authorization_identifier>

<authorization_identifier> ::= <identifier>

<temporary_table_declaration> ::=
    DECLARE LOCAL TEMPORARY TABLE
        <qualified_local_table_name>
      <table_element_list>
      [ ON COMMIT { PRESERVE | DELETE } ROWS ]

<qualified_local_table_name> ::=
    MODULE <period> <local_table_name>

<local_table_name> ::= <qualified_identifier>

<qualified_identifier> ::= <identifier>

<table_element_list> ::=
      <left_paren> <table_element> [ { <comma> <table_element> }... ] <right_paren>

<table_element> ::=
      <column_definition>
    | <table_constraint_definition>

<column_definition> ::=
    <column_name> { <data_type> | <domain_name> }
    [ <default_clause> ]
    [ <column_constraint_definition>... ]
    [ <collate_clause> ]

<column_name> ::= <identifier>

<data_type> ::=
      <character_string_type>
           [ CHARACTER SET <character_set_specification> ]
    | <national_character_string_type>
    | <bit_string_type>
    | <numeric_type>
    | <datetime_type>
    | <interval_type>

<character_string_type> ::=
      CHARACTER [ <left_paren> <length> <right_paren> ]
    | CHAR [ <left_paren> <length> <right_paren> ]
    | CHARACTER VARYING <left_paren> <length> <right_paren>
    | CHAR VARYING <left_paren> <length> <right_paren>
    | VARCHAR <left_paren> <length> <right_paren>

<length> ::= <unsigned_integer>

<national_character_string_type> ::=
      NATIONAL CHARACTER [ <left_paren> <length> <right_paren> ]
    | NATIONAL CHAR [ <left_paren> <length> <right_paren> ]
    | NCHAR [ <left_paren> <length> <right_paren> ]
    | NATIONAL CHARACTER VARYING <left_paren> <length> <right_paren>
    | NATIONAL CHAR VARYING <left_paren> <length> <right_paren>
    | NCHAR VARYING <left_paren> <length> <right_paren>

<bit_string_type> ::=
      BIT [ <left_paren> <length> <right_paren> ]
    | BIT VARYING <left_paren> <length> <right_paren>

<numeric_type> ::=
      <exact_numeric_type>
    | <approximate_numeric_type>

<exact_numeric_type> ::=
      NUMERIC [ <left_paren> <precision> [ <comma> <scale> ] <right_paren> ]
    | DECIMAL [ <left_paren> <precision> [ <comma> <scale> ] <right_paren> ]
    | DEC [ <left_paren> <precision> [ <comma> <scale> ] <right_paren> ]
    | INTEGER
    | INT
    | SMALLINT

<precision> ::= <unsigned_integer>

<scale> ::= <unsigned_integer>

<approximate_numeric_type> ::=
      FLOAT [ <left_paren> <precision> <right_paren> ]
    | REAL
    | DOUBLE PRECISION

<datetime_type> ::=
      DATE
    | TIME [ <left_paren> <time_precision> <right_paren> ]
          [ WITH TIME ZONE ]
    | TIMESTAMP [ <left_paren> <timestamp_precision> <right_paren> ]
          [ WITH TIME ZONE ]

<time_precision> ::= <time_fractional_seconds_precision>

<time_fractional_seconds_precision> ::= <unsigned_integer>

<timestamp_precision> ::= <time_fractional_seconds_precision>

<interval_type> ::= INTERVAL <interval_qualifier>

<interval_qualifier> ::=
      <start_field> TO <end_field>
    | <single_datetime_field>

<start_field> ::=
    <non-second_datetime_field>
        [ <left_paren> <interval_leading_field_precision> <right_paren> ]

<non-second_datetime_field> ::= YEAR | MONTH | DAY | HOUR
    | MINUTE

<interval_leading_field_precision> ::= <unsigned_integer>

<end_field> ::=
      <non-second_datetime_field>
    | SECOND [ <left_paren> <interval_fractional_seconds_precision> <right_paren> ]

<interval_fractional_seconds_precision> ::= <unsigned_integer>

<single_datetime_field> ::=
      <non-second_datetime_field>
          [ <left_paren> <interval_leading_field_precision> <right_paren> ]
    | SECOND [ <left_paren> <interval_leading_field_precision>
          [ <comma> <interval_fractional_seconds_precision> ] <right_paren> ]

<domain_name> ::= <qualified_name>

<qualified_name> ::=
    [ <schema_name> <period> ] <qualified_identifier>

<default_clause> ::=
      DEFAULT <default_option>

<default_option> ::=
      <literal>
    | <datetime_value_function>
    | USER
    | CURRENT_USER
    | SESSION_USER
    | SYSTEM_USER
    | NULL

<literal> ::=
      <signed_numeric_literal>
    | <general_literal>

<signed_numeric_literal> ::=
    [ <sign> ] <unsigned_numeric_literal>

<general_literal> ::=
      <character_string_literal>
    | <national_character_string_literal>
    | <bit_string_literal>
    | <hex_string_literal>
    | <datetime_literal>
    | <interval_literal>

<datetime_literal> ::=
      <date_literal>
    | <time_literal>
    | <timestamp_literal>

<date_literal> ::=
    DATE <date_string>

<time_literal> ::=
    TIME <time_string>

<timestamp_literal> ::=
    TIMESTAMP <timestamp_string>

<interval_literal> ::=
    INTERVAL [ <sign> ] <interval_string> <interval_qualifier>

<datetime_value_function> ::=
      <current_date_value_function>
    | <current_time_value_function>
    | <current_timestamp_value_function>

<current_date_value_function> ::= CURRENT_DATE

<current_time_value_function> ::=
      CURRENT_TIME [ <left_paren> <time_precision> <right_paren> ]

<current_timestamp_value_function> ::=
      CURRENT_TIMESTAMP [ <left_paren> <timestamp_precision> <right_paren> ]

<column_constraint_definition> ::=
    [ <constraint_name_definition> ]
    <column_constraint>
      [ <constraint_attributes> ]

<constraint_name_definition> ::= CONSTRAINT <constraint_name>

<constraint_name> ::= <qualified_name>

<column_constraint> ::=
      NOT NULL
    | <unique_specification>
    | <references_specification>
    | <check_constraint_definition>

<unique_specification> ::=
    UNIQUE | PRIMARY KEY

<references_specification> ::=
    REFERENCES <referenced_table_and_columns>
      [ MATCH <match_type> ]
      [ <referential_triggered_action> ]

<referenced_table_and_columns> ::=
     <table_name> [ <left_paren> <reference_column_list> <right_paren> ]

<table_name> ::=
      <qualified_name>
    | <qualified_local_table_name>

<reference_column_list> ::= <column_name_list>

<column_name_list> ::=
    <column_name> [ { <comma> <column_name> }... ]

<match_type> ::=
      FULL
    | PARTIAL

<referential_triggered_action> ::=
      <update_rule> [ <delete_rule> ]
    | <delete_rule> [ <update_rule> ]

<update_rule> ::= ON UPDATE <referential_action>

<referential_action> ::=
      CASCADE
    | SET NULL
    | SET DEFAULT
    | NO ACTION

<delete_rule> ::= ON DELETE <referential_action>

<check_constraint_definition> ::=
    CHECK
        <left_paren> <search_condition> <right_paren>

<search_condition> ::=
      <boolean_term>
    | <search_condition> OR <boolean_term>

<boolean_term> ::=
      <boolean_factor>
    | <boolean_term> AND <boolean_factor>

<boolean_factor> ::=
    [ NOT ] <boolean_test>

<boolean_test> ::=
    <boolean_primary> [ IS [ NOT ]
          <truth_value> ]

<boolean_primary> ::=
      <predicate>
    | <left_paren> <search_condition> <right_paren>

<predicate> ::=
      <comparison_predicate>
    | <between_predicate>
    | <in_predicate>
    | <like_predicate>
    | <null_predicate>
    | <quantified_comparison_predicate>
    | <exists_predicate>
    | <unique_predicate>
    | <match_predicate>
    | <overlaps_predicate>

<comparison_predicate> ::=
    <row_value_constructor> <comp_op>
        <row_value_constructor>

<row_value_constructor> ::=
       <row_value_constructor_element>
    | <left_paren> <row_value_constructor_list> <right_paren>
    | <row_subquery>

<row_value_constructor_element> ::=
      <value_expression>
    | <null_specification>
    | <default_specification>

<value_expression> ::=
      <numeric_value_expression>
    | <string_value_expression>
    | <datetime_value_expression>
    | <interval_value_expression>

<numeric_value_expression> ::=
      <term>
    | <numeric_value_expression> <plus_sign> <term>
    | <numeric_value_expression> <minus_sign> <term>

<term> ::=
      <factor>
    | <term> <asterisk> <factor>
    | <term> <solidus> <factor>

<factor> ::=
    [ <sign> ] <numeric_primary>

<numeric_primary> ::=
      <value_expression_primary>
    | <numeric_value_function>

<value_expression_primary> ::=
      <unsigned_value_specification>
    | <column_reference>
    | <set_function_specification>
    | <scalar_subquery>
    | <case_expression>
    | <left_paren> <value_expression> <right_paren>
    | <cast_specification>

<unsigned_value_specification> ::=
      <unsigned_literal>
    | <general_value_specification>

<unsigned_literal> ::=
      <unsigned_numeric_literal>
    | <general_literal>

<general_value_specification> ::=
      <parameter_specification>
    | <dynamic_parameter_specification>
    | <variable_specification>
    | USER
    | CURRENT_USER
    | SESSION_USER
    | SYSTEM_USER
    | VALUE

<parameter_specification> ::=
    <parameter_name> [ <indicator_parameter> ]

<parameter_name> ::= <colon> <identifier>

<indicator_parameter> ::=
    [ INDICATOR ] <parameter_name>

<dynamic_parameter_specification> ::= <question_mark>

<variable_specification> ::=
    <embedded_variable_name> [ <indicator_variable> ]

<embedded_variable_name> ::=
    <colon>

<host_identifier> ::=
      <Ada_host_identifier>
    | <C_host_identifier>
    | <COBOL_host_identifier>
    | <Fortran_host_identifier>
    | <MUMPS_host_identifier>
    | <Pascal_host_identifier>
    | <PL/I_host_identifier>

<Ada_host_identifier> ::= !! <EMPHASIS>(See the Syntax Rules.)

<C_host_identifier> ::=
    !! <EMPHASIS>(See the Syntax Rules.)

<COBOL_host_identifier> ::= !! <EMPHASIS>(See the Syntax Rules.)

<Fortran_host_identifier> ::= !! <EMPHASIS>(See the Syntax Rules.)

<MUMPS_host_identifier> ::= !! <EMPHASIS>(See the Syntax Rules.)

<Pascal_host_identifier> ::= !! <EMPHASIS>(See the Syntax Rules.)

<PL/I_host_identifier> ::= !! <EMPHASIS>(See the Syntax Rules.)

<indicator_variable> ::=
    [ INDICATOR ] <embedded_variable_name>

<column_reference> ::= [ <qualifier> <period> ] <column_name>

<qualifier> ::=
      <table_name>
    | <correlation_name>

<correlation_name> ::= <identifier>

<set_function_specification> ::=
      COUNT <left_paren> <asterisk> <right_paren>
    | <general_set_function>

<general_set_function> ::=
      <set_function_type>
          <left_paren> [ <set_quantifier> ] <value_expression> <right_paren>

<set_function_type> ::=
    AVG | MAX | MIN | SUM | COUNT

<set_quantifier> ::= DISTINCT | ALL

<scalar_subquery> ::= <subquery>

<subquery> ::= <left_paren> <query_expression> <right_paren>

<query_expression> ::=
      <non-join_query_expression>
    | <joined_table>

<non-join_query_expression> ::=
      <non-join_query_term>
    | <query_expression> UNION  [ ALL ]
          [ <corresponding_spec> ] <query_term>
    | <query_expression> EXCEPT [ ALL ]
          [ <corresponding_spec> ] <query_term>

<non-join_query_term> ::=
      <non-join_query_primary>
    | <query_term> INTERSECT [ ALL ]
          [ <corresponding_spec> ] <query_primary>

<non-join_query_primary> ::=
      <simple_table>
    | <left_paren> <non-join_query_expression> <right_paren>

<simple_table> ::=
      <query_specification>
    | <table_value_constructor>
    | <explicit_table>

<query_specification> ::=
    SELECT [ <set_quantifier> ] <select_list> <table_expression>

<select_list> ::=
      <asterisk>
    | <select_sublist> [ { <comma> <select_sublist> }... ]

<select_sublist> ::=
      <derived_column>
    | <qualifier> <period> <asterisk>

<derived_column> ::= <value_expression> [ <as_clause> ]

<as_clause> ::= [ AS ] <column_name>

<table_expression> ::=
    <from_clause>
    [ <where_clause> ]
    [ <group_by_clause> ]
    [ <having_clause> ]

<from_clause> ::= FROM <table_reference>
    [ { <comma> <table_reference> }... ]

<table_reference> ::=
      <table_name> [ [ AS ] <correlation_name>
          [ <left_paren> <derived_column_list> <right_paren> ] ]
    | <derived_table> [ AS ] <correlation_name>
          [ <left_paren> <derived_column_list> <right_paren> ]
    | <joined_table>

<derived_column_list> ::= <column_name_list>

<derived_table> ::= <table_subquery>

<table_subquery> ::= <subquery>

<joined_table> ::=
      <cross_join>
    | <qualified_join>
    | <left_paren> <joined_table> <right_paren>

<cross_join> ::=
    <table_reference> CROSS JOIN <table_reference>

<qualified_join> ::=
    <table_reference> [ NATURAL ] [ <join_type> ] JOIN
      <table_reference> [ <join_specification> ]

<join_type> ::=
      INNER
    | <outer_join_type> [ OUTER ]
    | UNION

<outer_join_type> ::=
      LEFT
    | RIGHT
    | FULL

<join_specification> ::=
      <join_condition>
    | <named_columns_join>

<join_condition> ::= ON <search_condition>

<named_columns_join> ::=
    USING <left_paren> <join_column_list> <right_paren>

<join_column_list> ::= <column_name_list>

<where_clause> ::= WHERE <search_condition>

<group_by_clause> ::=
    GROUP BY <grouping_column_reference_list>

<grouping_column_reference_list> ::=
    <grouping_column_reference>
        [ { <comma> <grouping_column_reference> }... ]

<grouping_column_reference> ::=
    <column_reference> [ <collate_clause> ]

<collate_clause> ::= COLLATE <collation_name>

<collation_name> ::= <qualified_name>

<having_clause> ::= HAVING <search_condition>

<table_value_constructor> ::=
    VALUES <table_value_constructor_list>

<table_value_constructor_list> ::=
    <row_value_constructor> [ { <comma> <row_value_constructor> }... ]

<explicit_table> ::= TABLE <table_name>

<query_term> ::=
      <non-join_query_term>
    | <joined_table>

<corresponding_spec> ::=
    CORRESPONDING [ BY <left_paren> <corresponding_column_list> <right_paren> ]

<corresponding_column_list> ::= <column_name_list>

<query_primary> ::=
      <non-join_query_primary>
    | <joined_table>

<case_expression> ::=
      <case_abbreviation>
    | <case_specification>

<case_abbreviation> ::=
      NULLIF <left_paren> <value_expression> <comma>
            <value_expression> <right_paren>
    | COALESCE <left_paren> <value_expression>
            { <comma> <value_expression> }... <right_paren>

<case_specification> ::=
      <simple_case>
    | <searched_case>

<simple_case> ::=
    CASE <case_operand>
      <simple_when_clause>...
      [ <else_clause> ]
    END

<case_operand> ::= <value_expression>

<simple_when_clause> ::= WHEN <when_operand> THEN <result>

<when_operand> ::= <value_expression>

<result> ::= <result_expression> | NULL

<result_expression> ::= <value_expression>

<else_clause> ::= ELSE <result>

<searched_case> ::=
    CASE
      <searched_when_clause>...
      [ <else_clause> ]
    END

<searched_when_clause> ::= WHEN <search_condition> THEN <result>

<cast_specification> ::=
    CAST <left_paren> <cast_operand> AS
        <cast_target> <right_paren>

<cast_operand> ::=
      <value_expression>
    | NULL

<cast_target> ::=
      <domain_name>
    | <data_type>

<numeric_value_function> ::=
      <position_expression>
    | <extract_expression>
    | <length_expression>

<position_expression> ::=
    POSITION <left_paren> <character_value_expression>
        IN <character_value_expression> <right_paren>

<character_value_expression> ::=
      <concatenation>
    | <character_factor>

<concatenation> ::=
    <character_value_expression> <concatenation_operator>
        <character_factor>

<character_factor> ::=
    <character_primary> [ <collate_clause> ]

<character_primary> ::=
      <value_expression_primary>
    | <string_value_function>

<string_value_function> ::=
      <character_value_function>
    | <bit_value_function>

<character_value_function> ::=
      <character_substring_function>
    | <fold>
    | <form-of-use_conversion>
    | <character_translation>
    | <trim_function>

<character_substring_function> ::=
    SUBSTRING <left_paren> <character_value_expression> FROM <start_position>
                [ FOR <string_length> ] <right_paren>

<start_position> ::= <numeric_value_expression>

<string_length> ::= <numeric_value_expression>

<fold> ::= { UPPER | LOWER }
     <left_paren> <character_value_expression> <right_paren>

<form-of-use_conversion> ::=
    CONVERT <left_paren> <character_value_expression>
        USING <form-of-use_conversion_name> <right_paren>

<form-of-use_conversion_name> ::= <qualified_name>

<character_translation> ::=
    TRANSLATE <left_paren> <character_value_expression>
        USING <translation_name> <right_paren>

<translation_name> ::= <qualified_name>

<trim_function> ::=
    TRIM <left_paren> <trim_operands> <right_paren>

<trim_operands> ::=
    [ [ <trim_specification> ] [ <trim_character> ] FROM ] <trim_source>

<trim_specification> ::=
      LEADING
    | TRAILING
    | BOTH

<trim_character> ::= <character_value_expression>

<trim_source> ::= <character_value_expression>

<bit_value_function> ::=
    <bit_substring_function>

<bit_substring_function> ::=
    SUBSTRING <left_paren> <bit_value_expression> FROM <start_position>
        [ FOR <string_length> ] <right_paren>

<bit_value_expression> ::=
      <bit_concatenation>
    | <bit_factor>

<bit_concatenation> ::=
    <bit_value_expression> <concatenation_operator> <bit_factor>

<bit_factor> ::= <bit_primary>

<bit_primary> ::=
      <value_expression_primary>
    | <string_value_function>

<extract_expression> ::=
    EXTRACT <left_paren> <extract_field>
        FROM <extract_source> <right_paren>

<extract_field> ::=
      <datetime_field>
    | <time_zone_field>

<datetime_field> ::=
      <non-second_datetime_field>
    | SECOND

<time_zone_field> ::=
      TIMEZONE_HOUR
    | TIMEZONE_MINUTE

<extract_source> ::=
      <datetime_value_expression>
    | <interval_value_expression>

<datetime_value_expression> ::=
      <datetime_term>
    | <interval_value_expression> <plus_sign> <datetime_term>
    | <datetime_value_expression> <plus_sign> <interval_term>
    | <datetime_value_expression> <minus_sign> <interval_term>

<interval_term> ::=
      <interval_factor>
    | <interval_term_2> <asterisk> <factor>
    | <interval_term_2> <solidus> <factor>
    | <term> <asterisk> <interval_factor>

<interval_factor> ::=
    [ <sign> ] <interval_primary>

<interval_primary> ::=
      <value_expression_primary> [ <interval_qualifier> ]

<interval_term_2> ::= <interval_term>

<interval_value_expression> ::=
      <interval_term>
    | <interval_value_expression_1> <plus_sign> <interval_term_1>
    | <interval_value_expression_1> <minus_sign> <interval_term_1>
    | <left_paren> <datetime_value_expression> <minus_sign>
          <datetime_term> <right_paren> <interval_qualifier>

<interval_value_expression_1> ::= <interval_value_expression>

<interval_term_1> ::= <interval_term>

<datetime_term> ::=
      <datetime_factor>

<datetime_factor> ::=
      <datetime_primary> [ <time_zone> ]

<datetime_primary> ::=
      <value_expression_primary>
    | <datetime_value_function>

<time_zone> ::=
    AT <time_zone_specifier>

<time_zone_specifier> ::=
      LOCAL
    | TIME ZONE <interval_value_expression>

<length_expression> ::=
      <char_length_expression>
    | <octet_length_expression>
    | <bit_length_expression>

<char_length_expression> ::=
    { CHAR_LENGTH | CHARACTER_LENGTH }
        <left_paren> <string_value_expression> <right_paren>

<string_value_expression> ::=
      <character_value_expression>
    | <bit_value_expression>

<octet_length_expression> ::=
    OCTET_LENGTH <left_paren> <string_value_expression> <right_paren>

<bit_length_expression> ::=
    BIT_LENGTH <left_paren> <string_value_expression> <right_paren>

<null_specification> ::=
    NULL

<default_specification> ::=
    DEFAULT

<row_value_constructor_list> ::=
    <row_value_constructor_element>
        [ { <comma> <row_value_constructor_element> }... ]

<row_subquery> ::= <subquery>

<comp_op> ::=
      <equals_operator>
    | <not_equals_operator>
    | <less_than_operator>
    | <greater_than_operator>
    | <less_than_or_equals_operator>
    | <greater_than_or_equals_operator>

<between_predicate> ::=
    <row_value_constructor> [ NOT ] BETWEEN
      <row_value_constructor> AND <row_value_constructor>

<in_predicate> ::=
    <row_value_constructor>
      [ NOT ] IN <in_predicate_value>

<in_predicate_value> ::=
      <table_subquery>
    | <left_paren> <in_value_list> <right_paren>

<in_value_list> ::=
    <value_expression> { <comma> <value_expression> }...

<like_predicate> ::=
    <match_value> [ NOT ] LIKE <pattern>
      [ ESCAPE <escape_character> ]

<match_value> ::= <character_value_expression>

<pattern> ::= <character_value_expression>

<escape_character> ::= <character_value_expression>

<null_predicate> ::= <row_value_constructor>
    IS [ NOT ] NULL

<quantified_comparison_predicate> ::=
    <row_value_constructor> <comp_op> <quantifier> <table_subquery>

<quantifier> ::= <all> | <some>

<all> ::= ALL

<some> ::= SOME | ANY

<exists_predicate> ::= EXISTS <table_subquery>

<unique_predicate> ::= UNIQUE <table_subquery>

<match_predicate> ::=
    <row_value_constructor> MATCH [ UNIQUE ]
        [ PARTIAL | FULL ] <table_subquery>

<overlaps_predicate> ::=
    <row_value_constructor_1> OVERLAPS <row_value_constructor_2>

<row_value_constructor_1> ::= <row_value_constructor>

<row_value_constructor_2> ::= <row_value_constructor>

<truth_value> ::=
      TRUE
    | FALSE
    | UNKNOWN

<constraint_attributes> ::=
      <constraint_check_time> [ [ NOT ] DEFERRABLE ]
    | [ NOT ] DEFERRABLE [ <constraint_check_time> ]

<constraint_check_time> ::=
      INITIALLY DEFERRED
    | INITIALLY IMMEDIATE

<table_constraint_definition> ::=
    [ <constraint_name_definition> ]
    <table_constraint> [ <constraint_attributes> ]

<table_constraint> ::=
      <unique_constraint_definition>
    | <referential_constraint_definition>
    | <check_constraint_definition>

<unique_constraint_definition> ::=
            <unique_specification> even in SQL3)
    <unique_specification>
      <left_paren> <unique_column_list> <right_paren>

<unique_column_list> ::= <column_name_list>

<referential_constraint_definition> ::=
    FOREIGN KEY
        <left_paren> <referencing_columns> <right_paren>
      <references_specification>

<referencing_columns> ::=
    <reference_column_list>

<module_contents> ::=
      <declare_cursor>
    | <dynamic_declare_cursor>
    | <procedure>

<declare_cursor> ::=
    DECLARE <cursor_name> [ INSENSITIVE ] [ SCROLL ] CURSOR
      FOR <cursor_specification>

<cursor_name> ::= <identifier>

<cursor_specification> ::=
    <query_expression> [ <order_by_clause> ]
      [ <updatability_clause> ]

<order_by_clause> ::=
    ORDER BY <sort_specification_list>

<sort_specification_list> ::=
    <sort_specification> [ { <comma> <sort_specification> }... ]

<sort_specification> ::=
    <sort_key> [ <collate_clause> ] [ <ordering_specification> ]

<sort_key> ::=
      <column_name>
    | <unsigned_integer>

<ordering_specification> ::= ASC | DESC

<updatability_clause> ::=
    FOR
        { READ ONLY |
          UPDATE [ OF <column_name_list> ] }

<dynamic_declare_cursor> ::=
    DECLARE <cursor_name> [ INSENSITIVE ] [ SCROLL ] CURSOR
        FOR <statement_name>

<statement_name> ::= <identifier>

<procedure> ::=
    PROCEDURE <procedure_name>
        <parameter_declaration_list> <semicolon>
      <SQL_procedure_statement> <semicolon>

<procedure_name> ::= <identifier>

<parameter_declaration_list> ::=
      <left_paren> <parameter_declaration>
          [ { <comma> <parameter_declaration> }... ] <right_paren>
    | <parameter_declaration>...

<parameter_declaration> ::=
      <parameter_name> <data_type>
    | <status_parameter>

<status_parameter> ::=
    SQLCODE | SQLSTATE

<SQL_procedure_statement> ::=
      <SQL_schema_statement>
    | <SQL_data_statement>
    | <SQL_transaction_statement>
    | <SQL_connection_statement>
    | <SQL_session_statement>
    | <SQL_dynamic_statement>
    | <SQL_diagnostics_statement>

<SQL_schema_statement> ::=
      <SQL_schema_definition_statement>
    | <SQL_schema_manipulation_statement>

<SQL_schema_definition_statement> ::=
      <schema_definition>
    | <table_definition>
    | <view_definition>
    | <grant_statement>
    | <domain_definition>
    | <character_set_definition>
    | <collation_definition>
    | <translation_definition>
    | <assertion_definition>

<schema_definition> ::=
    CREATE SCHEMA <schema_name_clause>
      [ <schema_character_set_specification> ]
      [ <schema_element>... ]

<schema_name_clause> ::=
      <schema_name>
    | AUTHORIZATION <schema_authorization_identifier>
    | <schema_name> AUTHORIZATION
          <schema_authorization_identifier>

<schema_authorization_identifier> ::=
    <authorization_identifier>

<schema_character_set_specification> ::=
    DEFAULT CHARACTER
        SET <character_set_specification>

<schema_element> ::=
      <domain_definition>
    | <table_definition>
    | <view_definition>
    | <grant_statement>
    | <assertion_definition>
    | <character_set_definition>
    | <collation_definition>
    | <translation_definition>

<domain_definition> ::=
    CREATE DOMAIN <domain_name>
        [ AS ] <data_type>
      [ <default_clause> ]
      [ <domain_constraint>... ]
      [ <collate_clause> ]

<domain_constraint> ::=
    [ <constraint_name_definition> ]
    <check_constraint_definition> [ <constraint_attributes> ]

<table_definition> ::=
    CREATE [ { GLOBAL | LOCAL } TEMPORARY ] TABLE
        <table_name>
      <table_element_list>
      [ ON COMMIT { DELETE | PRESERVE } ROWS ]

<view_definition> ::=
    CREATE VIEW <table_name> [ <left_paren> <view_column_list>
                                  <right_paren> ]
      AS <query_expression>
      [ WITH [ <levels_clause> ] CHECK OPTION ]

<view_column_list> ::= <column_name_list>

<levels_clause> ::=
    CASCADED | LOCAL

<grant_statement> ::=
   GRANT <privileges> ON <object_name>
     TO <grantee> [ { <comma> <grantee> }... ]
       [ WITH GRANT OPTION ]

<privileges> ::=
      ALL PRIVILEGES
    | <action_list>

<action_list> ::= <action> [ { <comma> <action> }... ]

<action> ::=
      SELECT
    | DELETE
    | INSERT [ <left_paren> <privilege_column_list> <right_paren> ]
    | UPDATE [ <left_paren> <privilege_column_list> <right_paren> ]
    | REFERENCES [ <left_paren> <privilege_column_list> <right_paren> ]
    | USAGE

<privilege_column_list> ::= <column_name_list>

<object_name> ::=
      [ TABLE ] <table_name>
    | DOMAIN <domain_name>
    | COLLATION <collation_name>
    | CHARACTER SET <character_set_name>
    | TRANSLATION <translation_name>

<grantee> ::=
      PUBLIC
    | <authorization_identifier>

<assertion_definition> ::=
    CREATE ASSERTION <constraint_name> <assertion_check>
      [ <constraint_attributes> ]

<assertion_check> ::=
    CHECK
        <left_paren> <search_condition> <right_paren>

<character_set_definition> ::=
    CREATE CHARACTER SET <character_set_name>
        [ AS ]
      <character_set_source>
      [ <collate_clause> | <limited_collation_definition> ]

<character_set_source> ::=
      GET <existing_character_set_name>

<existing_character_set_name> ::=
      <standard_character_repertoire_name>
    | <implementation-defined_character_repertoire_name>
    | <schema_character_set_name>

<schema_character_set_name> ::= <character_set_name>

<limited_collation_definition> ::=
    COLLATION FROM <collation_source>

<collation_source> ::=
      <collating_sequence_definition>
    | <translation_collation>

<collating_sequence_definition> ::=
      <external_collation>
    | <schema_collation_name>
    | DESC <left_paren> <collation_name> <right_paren>
    | DEFAULT

<external_collation> ::=
    EXTERNAL <left_paren> <quote> <external_collation_name> <quote> <right_paren>

<external_collation_name> ::=
      <standard_collation_name>
    | <implementation-defined_collation_name>

<standard_collation_name> ::= <collation_name>

<implementation-defined_collation_name> ::= <collation_name>

<schema_collation_name> ::= <collation_name>

<translation_collation> ::=
    TRANSLATION <translation_name>
        [ THEN COLLATION <collation_name> ]

<collation_definition> ::=
    CREATE COLLATION <collation_name> FOR
        <character_set_specification>
      FROM <collation_source>
        [ <pad_attribute> ]

<pad_attribute> ::=
      NO PAD
    | PAD SPACE

<translation_definition> ::=
    CREATE TRANSLATION <translation_name>
      FOR <source_character_set_specification>
        TO <target_character_set_specification>
      FROM <translation_source>

<source_character_set_specification> ::= <character_set_specification>

<target_character_set_specification> ::= <character_set_specification>

<translation_source> ::=
      <translation_specification>

<translation_specification> ::=
      <external_translation>
    | IDENTITY
    | <schema_translation_name>

<external_translation> ::=
    EXTERNAL <left_paren> <quote> <external_translation_name> <quote> <right_paren>

<external_translation_name> ::=
      <standard_translation_name>
    | <implementation-defined_translation_name>

<standard_translation_name> ::= <translation_name>

<implementation-defined_translation_name> ::= <translation_name>

<schema_translation_name> ::= <translation_name>

<SQL_schema_manipulation_statement> ::=
      <drop_schema_statement>
    | <alter_table_statement>
    | <drop_table_statement>
    | <drop_view_statement>
    | <revoke_statement>
    | <alter_domain_statement>
    | <drop_domain_statement>
    | <drop_character_set_statement>
    | <drop_collation_statement>
    | <drop_translation_statement>
    | <drop_assertion_statement>

<drop_schema_statement> ::=
    DROP SCHEMA <schema_name> <drop_behavior>

<drop_behavior> ::= CASCADE | RESTRICT

<alter_table_statement> ::=
    ALTER TABLE <table_name> <alter_table_action>

<alter_table_action> ::=
      <add_column_definition>
    | <alter_column_definition>
    | <drop_column_definition>
    | <add_table_constraint_definition>
    | <drop_table_constraint_definition>

<add_column_definition> ::=
    ADD [ COLUMN ] <column_definition>

<alter_column_definition> ::=
    ALTER [ COLUMN ] <column_name> <alter_column_action>

<alter_column_action> ::=
      <set_column_default_clause>
    | <drop_column_default_clause>

<set_column_default_clause> ::=
    SET <default_clause>

<drop_column_default_clause> ::=
    DROP DEFAULT

<drop_column_definition> ::=
    DROP [ COLUMN ] <column_name> <drop_behavior>

<add_table_constraint_definition> ::=
    ADD <table_constraint_definition>

<drop_table_constraint_definition> ::=
    DROP CONSTRAINT <constraint_name> <drop_behavior>

<drop_table_statement> ::=
    DROP TABLE <table_name> <drop_behavior>

<drop_view_statement> ::=
    DROP VIEW <table_name> <drop_behavior>

<revoke_statement> ::=
    REVOKE [ GRANT OPTION FOR ]
        <privileges>
        ON <object_name>
      FROM <grantee> [ { <comma> <grantee> }... ] <drop_behavior>

<alter_domain_statement> ::=
    ALTER DOMAIN <domain_name> <alter_domain_action>

<alter_domain_action> ::=
      <set_domain_default_clause>
    | <drop_domain_default_clause>
    | <add_domain_constraint_definition>
    | <drop_domain_constraint_definition>

<set_domain_default_clause> ::= SET <default_clause>

<drop_domain_default_clause> ::= DROP DEFAULT

<add_domain_constraint_definition> ::=
    ADD <domain_constraint>

<drop_domain_constraint_definition> ::=
    DROP CONSTRAINT <constraint_name>

<drop_domain_statement> ::=
    DROP DOMAIN <domain_name> <drop_behavior>

<drop_character_set_statement> ::=
    DROP CHARACTER SET <character_set_name>

<drop_collation_statement> ::=
    DROP COLLATION <collation_name>

<drop_translation_statement> ::=
    DROP TRANSLATION <translation_name>

<drop_assertion_statement> ::=
    DROP ASSERTION <constraint_name>

<SQL_data_statement> ::=
      <open_statement>
    | <fetch_statement>
    | <close_statement>
    | <select_statement:_single_row>
    | <SQL_data_change_statement>

<open_statement> ::=
    OPEN <cursor_name>

<fetch_statement> ::=
    FETCH [ [ <fetch_orientation> ] FROM ]
      <cursor_name> INTO <fetch_target_list>

<fetch_orientation> ::=
      NEXT
    | PRIOR
    | FIRST
    | LAST
    | { ABSOLUTE | RELATIVE } <simple_value_specification>

<simple_value_specification> ::=
      <parameter_name>
    | <embedded_variable_name>
    | <literal>

<fetch_target_list> ::=
    <target_specification> [ { <comma> <target_specification> }... ]

<target_specification> ::=
      <parameter_specification>
    | <variable_specification>

<close_statement> ::=
    CLOSE <cursor_name>

<select_statement:_single_row> ::=
    SELECT [ <set_quantifier> ] <select_list>
      INTO <select_target_list>
        <table_expression>

<select_target_list> ::=
    <target_specification> [ { <comma> <target_specification> }... ]

<SQL_data_change_statement> ::=
      <delete_statement:_positioned>
    | <delete_statement:_searched>
    | <insert_statement>
    | <update_statement:_positioned>
    | <update_statement:_searched>

<delete_statement:_positioned> ::=
    DELETE FROM <table_name>
      WHERE CURRENT OF <cursor_name>

<delete_statement:_searched> ::=
    DELETE FROM <table_name>
      [ WHERE <search_condition> ]

<insert_statement> ::=
    INSERT INTO <table_name>
      <insert_columns_and_source>

<insert_columns_and_source> ::=
      [ <left_paren> <insert_column_list> <right_paren> ]
            <query_expression>
    | DEFAULT VALUES

<insert_column_list> ::= <column_name_list>

<update_statement:_positioned> ::=
    UPDATE <table_name>
      SET <set_clause_list>
        WHERE CURRENT OF <cursor_name>

<set_clause_list> ::=
    <set_clause> [ { <comma> <set_clause> }... ]

<set_clause> ::=
    <object_column> <equals_operator> <update_source>

<object_column> ::= <column_name>

<update_source> ::=
      <value_expression>
    | <null_specification>
    | DEFAULT

<update_statement:_searched> ::=
    UPDATE <table_name>
      SET <set_clause_list>
      [ WHERE <search_condition> ]

<SQL_transaction_statement> ::=
      <set_transaction_statement>
    | <set_constraints_mode_statement>
    | <commit_statement>
    | <rollback_statement>

<set_transaction_statement> ::=
    SET TRANSACTION <transaction_mode>
        [ { <comma> <transaction_mode> }... ]

<transaction_mode> ::=
      <isolation_level>
    | <transaction_access_mode>
    | <diagnostics_size>

<isolation_level> ::=
    ISOLATION LEVEL <level_of_isolation>

<level_of_isolation> ::=
      READ UNCOMMITTED
    | READ COMMITTED
    | REPEATABLE READ
    | SERIALIZABLE

<transaction_access_mode> ::=
      READ ONLY
    | READ WRITE

<diagnostics_size> ::=
    DIAGNOSTICS SIZE <number_of_conditions>

<number_of_conditions> ::= <simple_value_specification>

<set_constraints_mode_statement> ::=
    SET CONSTRAINTS <constraint_name_list>
        { DEFERRED | IMMEDIATE }

<constraint_name_list> ::=
      ALL
    | <constraint_name> [ { <comma> <constraint_name> }... ]

<commit_statement> ::=
    COMMIT [ WORK ]

<rollback_statement> ::=
    ROLLBACK [ WORK ]

<SQL_connection_statement> ::=
      <connect_statement>
    | <set_connection_statement>
    | <disconnect_statement>

<connect_statement> ::=
    CONNECT TO <connection_target>

<connection_target> ::=
      <SQL-server_name>
        [ AS <connection_name> ]
          correspondence with Tony Gordon)
        [ USER <user_name> ]
    | DEFAULT

<SQL-server_name> ::= <simple_value_specification>

<connection_name> ::= <simple_value_specification>

<user_name> ::= <simple_value_specification>

<set_connection_statement> ::=
    SET CONNECTION <connection_object>

<connection_object> ::=
      DEFAULT
    | <connection_name>

<disconnect_statement> ::=
    DISCONNECT <disconnect_object>

<disconnect_object> ::=
      <connection_object>
    | ALL
    | CURRENT

<SQL_session_statement> ::=
      <set_catalog_statement>
    | <set_schema_statement>
    | <set_names_statement>
    | <set_session_authorization_identifier_statement>
    | <set_local_time_zone_statement>

<set_catalog_statement> ::=
    SET CATALOG <value_specification>

<value_specification> ::=
      <literal>
    | <general_value_specification>

<set_schema_statement> ::=
    SET SCHEMA <value_specification>

<set_names_statement> ::=
    SET NAMES <value_specification>

<set_session_authorization_identifier_statement> ::=
    SET SESSION AUTHORIZATION
        <value_specification>

<set_local_time_zone_statement> ::=
    SET TIME ZONE
        <set_time_zone_value>

<set_time_zone_value> ::=
      <interval_value_expression>
    | LOCAL

<SQL_dynamic_statement> ::=
      <system_descriptor_statement>
    | <prepare_statement>
    | <deallocate_prepared_statement>
    | <describe_statement>
    | <execute_statement>
    | <execute_immediate_statement>
    | <SQL_dynamic_data_statement>

<system_descriptor_statement> ::=
      <allocate_descriptor_statement>
    | <deallocate_descriptor_statement>
    | <set_descriptor_statement>
    | <get_descriptor_statement>

<allocate_descriptor_statement> ::=
    ALLOCATE DESCRIPTOR <descriptor_name>
       [ WITH MAX <occurrences> ]

<descriptor_name> ::=
    [ <scope_option> ] <simple_value_specification>

<scope_option> ::=
      GLOBAL
    | LOCAL

<occurrences> ::= <simple_value_specification>

<deallocate_descriptor_statement> ::=
    DEALLOCATE DESCRIPTOR <descriptor_name>

<set_descriptor_statement> ::=
    SET DESCRIPTOR <descriptor_name>
        <set_descriptor_information>

<set_descriptor_information> ::=
      <set_count>
    | VALUE <item_number>
        <set_item_information> [ { <comma> <set_item_information> }... ]

<set_count> ::=
    COUNT <equals_operator> <simple_value_specification_1>

<simple_value_specification_1> ::= <simple_value_specification>

<item_number> ::= <simple_value_specification>

<set_item_information> ::=
    <descriptor_item_name> <equals_operator> <simple_value_specification_2>

<descriptor_item_name> ::=
      TYPE
    | LENGTH
    | OCTET_LENGTH
    | RETURNED_LENGTH
    | RETURNED_OCTET_LENGTH
    | PRECISION
    | SCALE
    | DATETIME_INTERVAL_CODE
    | DATETIME_INTERVAL_PRECISION
    | NULLABLE
    | INDICATOR
    | DATA
    | NAME
    | UNNAMED
    | COLLATION_CATALOG
    | COLLATION_SCHEMA
    | COLLATION_NAME
    | CHARACTER_SET_CATALOG
    | CHARACTER_SET_SCHEMA
    | CHARACTER_SET_NAME

<simple_value_specification_2> ::= <simple_value_specification>

<item_number> ::= <simple_value_specification>

<get_descriptor_statement> ::=
    GET DESCRIPTOR <descriptor_name> <get_descriptor_information>

<get_descriptor_information> ::=
      <get_count>
    | VALUE <item_number>
        <get_item_information> [ { <comma> <get_item_information> }... ]

<get_count> ::=
    <simple_target_specification_1> <equals_operator>
         COUNT

<simple_target_specification_1> ::= <simple_target_specification>

<simple_target_specification> ::=
      <parameter_name>
    | <embedded_variable_name>

<get_item_information> ::=
    <simple_target_specification_2> <equals_operator> <descriptor_item_name>>

<simple_target_specification_2> ::= <simple_target_specification>

<prepare_statement> ::=
    PREPARE <SQL_statement_name> FROM <SQL_statement_variable>

<SQL_statement_name> ::=
      <statement_name>
    | <extended_statement_name>

<extended_statement_name> ::=
    [ <scope_option> ] <simple_value_specification>

<SQL_statement_variable> ::= <simple_value_specification>

<deallocate_prepared_statement> ::=
    DEALLOCATE PREPARE <SQL_statement_name>

<describe_statement> ::=
      <describe_input_statement>
    | <describe_output_statement>

<describe_input_statement> ::=
    DESCRIBE INPUT <SQL_statement_name> <using_descriptor>

<using_descriptor> ::=
    { USING | INTO } SQL DESCRIPTOR <descriptor_name>

<describe_output_statement> ::=
    DESCRIBE [ OUTPUT ] <SQL_statement_name> <using_descriptor>

<execute_statement> ::=
    EXECUTE <SQL_statement_name>
      [ <result_using_clause> ]
      [ <parameter_using_clause> ]

<result_using_clause> ::= <using_clause>

<using_clause> ::=
      <using_arguments>
    | <using_descriptor>

<using_arguments> ::=
    { USING | INTO } <argument> [ { <comma> <argument> }... ]

<argument> ::= <target_specification>

<parameter_using_clause> ::= <using_clause>

<execute_immediate_statement> ::=
    EXECUTE IMMEDIATE <SQL_statement_variable>

<SQL_dynamic_data_statement> ::=
      <allocate_cursor_statement>
    | <dynamic_open_statement>
    | <dynamic_fetch_statement>
    | <dynamic_close_statement>
    | <dynamic_delete_statement:_positioned>
    | <dynamic_update_statement:_positioned>

<allocate_cursor_statement> ::=
    ALLOCATE <extended_cursor_name> [ INSENSITIVE ]
        [ SCROLL ] CURSOR
      FOR <extended_statement_name>

<extended_cursor_name> ::=
    [ <scope_option> ] <simple_value_specification>

<dynamic_open_statement> ::=
    OPEN <dynamic_cursor_name> [ <using_clause> ]

<dynamic_cursor_name> ::=
      <cursor_name>
    | <extended_cursor_name>

<dynamic_fetch_statement> ::=
    FETCH [ [ <fetch_orientation> ] FROM ] <dynamic_cursor_name>
        <using_clause>

<dynamic_close_statement> ::=
    CLOSE <dynamic_cursor_name>

<dynamic_delete_statement:_positioned> ::=
    DELETE FROM <table_name>
      WHERE CURRENT OF
          <dynamic_cursor_name>

<dynamic_update_statement:_positioned> ::=
    UPDATE <table_name>
      SET <set_clause>
          [ { <comma> <set_clause> }... ]
        WHERE CURRENT OF
            <dynamic_cursor_name>

<SQL_diagnostics_statement> ::=
    <get_diagnostics_statement>

<get_diagnostics_statement> ::=
    GET DIAGNOSTICS <sql_diagnostics_information>

<sql_diagnostics_information> ::=
      <statement_information>
    | <condition_information>

<statement_information> ::=
    <statement_information_item> [ { <comma> <statement_information_item> }... ]

<statement_information_item> ::=
    <simple_target_specification> <equals_operator> <statement_information_item_name>

<statement_information_item_name> ::=
      NUMBER
    | MORE
    | COMMAND_FUNCTION
    | DYNAMIC_FUNCTION
    | ROW_COUNT

<condition_information> ::=
    EXCEPTION <condition_number>
      <condition_information_item> [ { <comma> <condition_information_item> }... ]

<condition_number> ::= <simple_value_specification>

<condition_information_item> ::=
    <simple_target_specification> <equals_operator> <condition_information_item_name>

<condition_information_item_name> ::=
      CONDITION_NUMBER
    | RETURNED_SQLSTATE
    | CLASS_ORIGIN
    | SUBCLASS_ORIGIN
    | SERVER_NAME
    | CONNECTION_NAME
    | CONSTRAINT_CATALOG
    | CONSTRAINT_SCHEMA
    | CONSTRAINT_NAME
    | CATALOG_NAME
    | SCHEMA_NAME
    | TABLE_NAME
    | COLUMN_NAME
    | CURSOR_NAME
    | MESSAGE_TEXT
    | MESSAGE_LENGTH
    | MESSAGE_OCTET_LENGTH

<embedded_SQL_host_program> ::=
      <embedded_SQL_Ada_program>
    | <embedded_SQL_C_program>
    | <embedded_SQL_COBOL_program>
    | <embedded_SQL_Fortran_program>
    | <embedded_SQL_MUMPS_program>
    | <embedded_SQL_Pascal_program>
    | <embedded_SQL_PL/I_program>

<embedded_SQL_Ada_program> ::= !! <EMPHASIS>(See the Syntax Rules.)

<embedded_SQL_C_program> ::=
      !! <EMPHASIS>(See the Syntax Rules.)

<embedded_SQL_COBOL_program> ::= !! <EMPHASIS>(See the Syntax Rules.)

<embedded_SQL_Fortran_program> ::=
    !! <EMPHASIS>(See the Syntax Rules.)

<embedded_SQL_MUMPS_program> ::= !! <EMPHASIS>(See the Syntax Rules.)

<embedded_SQL_Pascal_program> ::=
    !! <EMPHASIS>(See the Syntax Rules.)

<embedded_SQL_PL/I_program> ::= !! <EMPHASIS>(See the Syntax Rules.)

<embedded_SQL_declare_section> ::=
      <embedded_SQL_begin_declare>
        [ <embedded_character_set_declaration> ]
        [ <host_variable_definition>... ]
      <embedded_SQL_end_declare>
    | <embedded_SQL_MUMPS_declare>

<embedded_SQL_begin_declare> ::=
    <SQL_prefix> BEGIN DECLARE SECTION
        [ <SQL_terminator> ]

<SQL_prefix> ::=
      EXEC SQL
    | <ampersand>SQL

<SQL_terminator> ::=
      END-EXEC
    | <semicolon>
    | <right_paren>

<embedded_character_set_declaration> ::=
    SQL NAMES ARE <character_set_specification>

<host_variable_definition> ::=
      <Ada_variable_definition>
    | <C_variable_definition>
    | <COBOL_variable_definition>
    | <Fortran_variable_definition>
    | <MUMPS_variable_definition>
    | <Pascal_variable_definition>
    | <PL/I_variable_definition>

<Ada_variable_definition> ::=
    <Ada_host_identifier> [ { <comma> <Ada_host_identifier> }... ] :
    <Ada_type_specification> [ <Ada_initial_value> ]

<Ada_type_specification> ::=
      <Ada_qualified_type_specification>
    | <Ada_unqualified_type_specification>

<Ada_qualified_type_specification> ::=
      SQL_STANDARD.CHAR [ CHARACTER SET
         [ IS ] <character_set_specification> ]
          <left_paren> 1 <double_period> <length> <right_paren>
    | SQL_STANDARD.BIT
          <left_paren> 1 <double_period> <length> <right_paren>
    | SQL_STANDARD.SMALLINT
    | SQL_STANDARD.INT
    | SQL_STANDARD.REAL
    | SQL_STANDARD.DOUBLE_PRECISION
    | SQL_STANDARD.SQLCODE_TYPE
    | SQL_STANDARD.SQLSTATE_TYPE
    | SQL_STANDARD.INDICATOR_TYPE

<Ada_unqualified_type_specification> ::=
      CHAR
          <left_paren> 1 <double_period> <length> <right_paren>
    | BIT
          <left_paren> 1 <double_period> <length> <right_paren>
    | SMALLINT
    | INT
    | REAL
    | DOUBLE_PRECISION
    | SQLCODE_TYPE
    | SQLSTATE_TYPE
    | INDICATOR_TYPE

<Ada_initial_value> ::=
    <Ada_assignment_operator> <character_representation>...

<Ada_assignment_operator> ::= <colon>

<C_variable_definition> ::=
      [ <C_storage_class> ]
      [ <C_class_modifier> ]
      <C_variable_specification>
    <semicolon>

<C_storage_class> ::=
      auto
    | extern
    | static

<C_class_modifier> ::= const | volatile

<C_variable_specification> ::=
      <C_numeric_variable>
    | <C_character_variable>
    | <C_derived_variable>

<C_numeric_variable> ::=
    { long | short | float | double }
      <C_host_identifier> [ <C_initial_value> ]
            [ { <comma> <C_host_identifier> [ <C_initial_value> ] }... ]

<C_initial_value> ::=
    <equals_operator> <character_representation>...

<C_character_variable> ::=
    char [ CHARACTER SET
             [ IS ] <character_set_specification> ]
      <C_host_identifier>
        <C_array_specification> [ <C_initial_value> ]
        [ { <comma> <C_host_identifier>
          <C_array_specification>
                 [ <C_initial_value> ] }... ]

<C_array_specification> ::=
    <left_bracket> <length> <right_bracket>

<C_derived_variable> ::=
      <C_VARCHAR_variable>
    | <C_bit_variable>

<C_VARCHAR_variable> ::=
    VARCHAR [ CHARACTER SET [ IS ]
        <character_set_specification> ]
        <C_host_identifier>
            <C_array_specification> [ <C_initial_value> ]
          [ { <comma> <C_host_identifier>
              <C_array_specification>
                      [ <C_initial_value> ] }... ]

<C_bit_variable> ::=
    BIT <C_host_identifier>
        <C_array_specification> [ <C_initial_value> ]
      [ { <comma> <C_host_identifier>
        <C_array_specification>
                   [ <C_initial_value> ] }... ]

<COBOL_variable_definition> ::=
    {01|77} <COBOL_host_identifier> <COBOL_type_specification>
      [ <character_representation>... ] <period>

<COBOL_type_specification> ::=
      <COBOL_character_type>
    | <COBOL_bit_type>
    | <COBOL_numeric_type>
    | <COBOL_integer_type>

<COBOL_character_type> ::=
    [ CHARACTER SET [ IS ]
          <character_set_specification> ]
    { PIC | PICTURE } [ IS ] { X [ <left_paren> <length> <right_paren> ] }...

<COBOL_bit_type> ::=
    { PIC | PICTURE } [ IS ]
        { B [ <left_paren> <length> <right_paren> ] }...

<COBOL_numeric_type> ::=
    { PIC | PICTURE } [ IS ]
      S <COBOL_nines_specification>
    [ USAGE [ IS ] ] DISPLAY SIGN LEADING SEPARATE

<COBOL_nines_specification> ::=
      <COBOL_nines> [ V [ <COBOL_nines> ] ]
    | V <COBOL_nines>

<COBOL_nines> ::= { 9 [ <left_paren> <length> <right_paren> ] }...

<COBOL_integer_type> ::=
      <COBOL_computational_integer>
    | <COBOL_binary_integer>

<COBOL_computational_integer> ::=
    { PIC | PICTURE } [ IS ] S
      [ USAGE [ IS ] ] { COMP | COMPUTATIONAL }

<COBOL_binary_integer> ::=
    { PIC | PICTURE } [ IS ] S
      [ USAGE [ IS ] ] BINARY

<Fortran_variable_definition> ::=
    <Fortran_type_specification>
    <Fortran_host_identifier>
        [ { <comma> <Fortran_host_identifier> }... ]

<Fortran_type_specification> ::=
      CHARACTER [ <asterisk> <length> ]
          [ CHARACTER SET [ IS ]
                <character_set_specification> ]
    | BIT [ <asterisk> <length> ]
    | INTEGER
    | REAL
    | DOUBLE PRECISION

<MUMPS_variable_definition> ::=
    { <MUMPS_numeric_variable> | <MUMPS_character_variable> }
        <semicolon>

<MUMPS_numeric_variable> ::=
    <MUMPS_type_specification>
      <MUMPS_host_identifier> [ { <comma> <MUMPS_host_identifier> }... ]

<MUMPS_type_specification> ::=
      INT
    | DEC
          [ <left_paren> <precision> [ <comma> <scale> ] <right_paren> ]
    | REAL

<MUMPS_character_variable> ::=
    VARCHAR <MUMPS_host_identifier> <MUMPS_length_specification>
      [ { <comma> <MUMPS_host_identifier> <MUMPS_length_specification> }... ]

<MUMPS_length_specification> ::=
    <left_paren> <length> <right_paren>

<Pascal_variable_definition> ::=
    <Pascal_host_identifier> [ { <comma> <Pascal_host_identifier> }... ] <colon>
      <Pascal_type_specification> <semicolon>

<Pascal_type_specification> ::=
      PACKED ARRAY
          <left_bracket> 1 <double_period> <length> <right_bracket>
        OF CHAR
          [ CHARACTER SET [ IS ]
                <character_set_specification> ]
    | PACKED ARRAY
          <left_bracket> 1 <double_period> <length> <right_bracket>
        OF BIT
    | INTEGER
    | REAL
    | CHAR [ CHARACTER SET
                                [ IS ] <character_set_specification> ]
    | BIT

<PL/I_variable_definition> ::=
    {DCL | DECLARE}
        {   <PL/I_host_identifier>
          | <left_paren> <PL/I_host_identifier>
                [ { <comma> <PL/I_host_identifier> }... ] <right_paren> }
    <PL/I_type_specification>
    [ <character_representation>... ] <semicolon>

<PL/I_type_specification> ::=
      { CHAR | CHARACTER } [ VARYING ]
          <left_paren>
          [ CHARACTER SET
                [ IS ] <character_set_specification> ]
    | BIT [ VARYING ] <left_paren>
    | <PL/I_type_fixed_decimal> <left_paren> <precision>
          [ <comma> <scale> ] <right_paren>
    | <PL/I_type_fixed_binary> [ <left_paren> <precision> <right_paren> ]
    | <PL/I_type_float_binary> <left_paren> <precision> <right_paren>

<PL/I_type_fixed_decimal> ::=
      { DEC | DECIMAL } FIXED
    | FIXED { DEC | DECIMAL }

<PL/I_type_fixed_binary> ::=
      { BIN | BINARY } FIXED
    | FIXED { BIN | BINARY }

<PL/I_type_float_binary> ::=
      { BIN | BINARY } FLOAT
    | FLOAT { BIN | BINARY }

<embedded_SQL_end_declare> ::=
    <SQL_prefix> END DECLARE SECTION
        [ <SQL_terminator> ]

<embedded_SQL_MUMPS_declare> ::=
    <SQL_prefix>
      BEGIN DECLARE SECTION
        [ <embedded_character_set_declaration> ]
        [ <host_variable_definition>... ]
      END DECLARE SECTION
    <SQL_terminator>

<embedded_SQL_statement> ::=
    <SQL_prefix>
      <statement_or_declaration>
    [ <SQL_terminator> ]

<statement_or_declaration> ::=
      <declare_cursor>
    | <dynamic_declare_cursor>
    | <temporary_table_declaration>
    | <embedded_exception_declaration>
    | <SQL_procedure_statement>

<embedded_exception_declaration> ::=
    WHENEVER <condition> <condition_action>

<condition> ::=
    SQLERROR | NOT FOUND

<condition_action> ::=
    CONTINUE | <go_to>

<go_to> ::=
    { GOTO | GO TO } <goto_target>

<goto_target> ::=
      <host_label_identifier>
    | <unsigned_integer>
    | <host_PL/I_label_variable>

<host_label_identifier> ::= !!(See the Syntax Rules.)

<host_PL/I_label_variable> ::= !!(See the Syntax Rules.)

<preparable_statement> ::=
      <preparable_SQL_data_statement>
    | <preparable_SQL_schema_statement>
    | <preparable_SQL_transaction_statement>
    | <preparable_SQL_session_statement>
    | <preparable_implementation-defined_statement>

<preparable_SQL_data_statement> ::=
      <delete_statement:_searched>
    | <dynamic_single_row_select_statement>
    | <insert_statement>
    | <dynamic_select_statement>
    | <update_statement:_searched>
    | <preparable_dynamic_delete_statement:_positioned>
    | <preparable_dynamic_update_statement:_positioned>

<dynamic_single_row_select_statement> ::= <query_specification>

<dynamic_select_statement> ::= <cursor_specification>

<preparable_dynamic_delete_statement:_positioned> ::=
   DELETE [ FROM <table_name> ]
      WHERE CURRENT OF <cursor_name>

<preparable_dynamic_update_statement:_positioned> ::=
   UPDATE [ <table_name> ]
      SET <set_clause_list>
      WHERE CURRENT OF <cursor_name>

<preparable_SQL_schema_statement> ::=
      <SQL_schema_statement>

<preparable_SQL_transaction_statement> ::=
      <SQL_transaction_statement>

<preparable_SQL_session_statement> ::=
      <SQL_session_statement>

<preparable_implementation-defined_statement> ::=
    !! <EMPHASIS>(See the Syntax Rules.)

<direct_SQL_statement> ::=
    <directly_executable_statement> <semicolon>

<directly_executable_statement> ::=
      <direct_SQL_data_statement>
    | <SQL_schema_statement>
    | <SQL_transaction_statement>
    | <SQL_connection_statement>
    | <SQL_session_statement>
    | <direct_implementation-defined_statement>

<direct_SQL_data_statement> ::=
      <delete_statement:_searched>
    | <direct_select_statement:_multiple_rows>
    | <insert_statement>
    | <update_statement:_searched>
    | <temporary_table_declaration>

<direct_select_statement:_multiple_rows> ::=
    <query_expression> [ <order_by_clause> ]

<direct_implementation-defined_statement> ::=
    !!(See the Syntax Rules)

<SQL_object_identifier> ::=
    <SQL_provenance> <SQL_variant>

<SQL_provenance> ::= <arc1> <arc2> <arc3>

<arc1> ::= iso | 1 | iso <left_paren> 1 <right_paren>

<arc2> ::= standard | 0 | standard <left_paren> 0 <right_paren>

<arc3> ::= 9075

<SQL_variant> ::= <SQL_edition> <SQL_conformance>

<SQL_edition> ::= <1987> | <1989> | <1992>

<1987> ::= 0 | edition1987 <left_paren> 0 <right_paren>

<1989> ::= <1989_base> <1989_package>

<1989_base> ::= 1 | edition1989 <left_paren> 1 <right_paren>

<1989_package> ::= <integrity_no> | <integrity_yes>

<integrity_no> ::= 0 | IntegrityNo <left_paren> 0 <right_paren>

<integrity_yes> ::= 1 | IntegrityYes <left_paren> 1 <right_paren>

<1992> ::= 2 | edition1992 <left_paren> 2 <right_paren>

<SQL_conformance> ::= <low> | <intermediate> | <high>

<low> ::= 0 | Low <left_paren> 0 <right_paren>

<intermediate> ::= 1 | Intermediate <left_paren> 1 <right_paren>

<high> ::= 2 | High <left_paren> 2 <right_paren>