Derived from file sql-99.bnf version 2.8 dated 2004/07/26 18:00:06
Generated on 2005-07-13 18:32:52+00:00 by file bnf2html.pl version 3.7 dated 2005/07/13 18:32:35
Using Appendix G of "SQL:1999 Understanding Relational Language Components" by J Melton and A R Simon (Morgan Kaufmann, May 2001, ISBN 0-55860-456-1) as the primary source of the syntax, here is the BNF syntax for SQL-99. The Word 97 version of this document is available from: http://www.mkp.com/books_catalog/catalog.asp?ISBN=1-55860-456-1 .
Note that this version of this file includes the corrections from ISO 9075:1999/Cor.1:2000.
The plain text version of this grammar is sql-99.bnf .
This material (starting with <SQL object identifier>) is defined in section 6.3 "Object Identifier for Database Language SQL" of ISO/IEC 9075-1:1999 (SQL Framework). It is used to express the capabilities of an implementation. The package names are identifiers such as 'PKG001', equivalent to 'Enhanced datetime facilities', as defined in the informative Annex B to SQL Framework. Each such package identifies a number of features that are provided when the SQL object identifier claims to provide the package.
<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>
<SQL variant> ::= <SQL edition> <SQL conformance>
<SQL edition> ::= <1987> | <1989> | <1992> | <1999>
<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>
<1999> ::= 3 | edition1999 <left paren> 3 <right paren>
<SQL conformance> ::= <level> <parts> <packages>
<level> ::= <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>
<parts> ::= <Part 3> <Part 4> <Part 5> <Part 6> <Part 7> <Part 8> <Part 9> <Part 10>
The parenthesized (i) and (n) are italic in the SQL standard. It is not clear exactly what this should look like, despite all the information. However, it is also not important; this is not really a part of the SQL language per se. Note that the package numbers are PKG001 to PKG009, for example. We still have to devise a mechanism to persuade bnf2yacc.pl to ignore this information.
<packages> ::= <Package PKG (i)> ...
<Part (n)> ::= <Part (n) no > | <Part (n) yes >
<Part (n) no> ::= 0 | Part -(n)No <left paren> 0 <right paren>
<Part (n) yes> ::= !! (as specified in ISO/IEC 9075-(n))
<Package PKG(i)> ::= <Package PKG (i)Yes> | <Package PKG (i)No>
<Part 3 yes> ::= <Part 3 conformance>
<Part 3 conformance> ::= 3 | sqlcli1999 <left paren> 3 <right paren>
<Part 4 yes> ::= <Part 4 conformance> <Part 4 module>
<Part 4 conformance> ::= 4 | sqlpsm1999 <left paren> 4 <right paren>
<Part 4 module> ::= <Part 4 module yes> | <Part 4 module no>
<Part 4 module yes> ::= 1 | moduleyes <left paren> 1 <right paren>
<Part 4 module no> ::= 0 | moduleno <left paren> 0 <right paren>
<Part 5 yes> ::= <Part 5 conformance> <Part 5 direct> <Part 5 embedded>
The original used sqlbindings199x, but the x should clearly be a 9.
<Part 5 conformance> ::= 5 | sqlbindings1999 <left paren> 5 <right paren>
<Part 5 direct> ::= <Part 5 direct yes> | <Part 5 direct no>
<Part 5 direct yes> ::= 1 | directyes <left paren> 1 <right paren>
<Part 5 direct no> ::= 0 | directno <left paren> 0 <right paren>
<Part 5 embedded> ::= <Part 5 embedded no> | <Part 5 embedded languages> ...
<Part 5 embedded no> ::= 0 | embeddedno <left paren> 0 <right paren>
<Part 5 embedded languages> ::=
<Part 5 embedded Ada>
| <Part 5 embedded C>
| <Part 5 embedded COBOL>
| <Part 5 embedded Fortran>
| <Part 5 embedded MUMPS>
| <Part 5 embedded Pascal>
| <Part 5 embedded PL/I>
<Part 5 embedded Ada> ::= 1 | embeddedAda <left paren> 1 <right paren>
<Part 5 embedded C> ::= 2 | embeddedC <left paren> 2 <right paren>
<Part 5 embedded COBOL> ::= 3 | embeddedCOBOL <left paren> 3 <right paren>
<Part 5 embedded Fortran> ::= 4 | embeddedFortran <left paren> 4 <right paren>
<Part 5 embedded MUMPS> ::= 5 | embeddedMUMPS <left paren> 5 <right paren>
<Part 5 embedded Pascal> ::= 6 | embeddedPascal <left paren> 6 <right paren>
<Part 5 embedded PL/I> ::= 7 | embeddedPLI <left paren> 7 <right paren>
Most of this section would normally be handled within the lexical analyzer rather than in the grammar proper. Further, the original document does not quote the various single characters, which makes it hard to process automatically.
<SQL terminal character> ::= <SQL 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>
| <left bracket>
| <right bracket>
| <circumflex>
| <underscore>
| <vertical bar>
| <left brace>
| <right brace>
<space> ::= !! (See the Syntax Rules)
<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> ::= ?
<left bracket> ::= [
<right bracket> ::= ]
<circumflex> ::= ^
<underscore> ::= _
<vertical bar> ::= /* Nothing */ |
<left brace> ::= {
<right brace> ::= }
<SQL-client module definition> modified per ISO 9075:1999/Cor.1:2000(E)
<SQL-client module definition> ::=
<module name clause>
<language clause>
<module authorization clause>
[ <module path specification> ]
[ <module transform group specification> ]
[ <temporary table declaration> ... ]
<module contents> ...
<module name clause> ::=
MODULE [ <SQL-client module name> ] [ <module character set specification> ]
<SQL-client module name> ::= <identifier>
<identifier> ::= <actual identifier>
<actual identifier> ::= <regular identifier> | <delimited identifier>
<regular identifier> ::= <identifier body>
<identifier body> modified per ISO 9075:1999/Cor.1:2000(E).
<identifier body> also rationalized by removing curly brackets around <identifier part> because they are unnecessary and inconsistent with other places where '...' modifies a single non-terminal.
<identifier body> ::= <identifier start> [ <identifier part> ... ]
<identifier start> ::= <initial alphabetic character> | <ideographic character>
<initial alphabetic character> ::= !! (See the Syntax Rules)
<ideographic character> ::= !! (See the Syntax Rules)
<identifier part> ::=
<alphabetic character>
| <ideographic character>
| <decimal digit character>
| <identifier combining character>
| <underscore>
| <alternate underscore>
| <extender character>
| <identifier ignorable character>
| <connector character>
<alphabetic character> ::= !! (See the Syntax Rules)
<decimal digit character> ::= !! (See the Syntax Rules)
<identifier combining character> ::= !! (See the Syntax Rules)
<alternate underscore> ::= !! (See the Syntax Rules)
<extender character> ::= !! (See the Syntax Rules)
<identifier ignorable character> ::= !! (See the Syntax Rules)
<connector character> ::= !! (See the Syntax Rules)
<delimited identifier> ::= <double quote> <delimited identifier body> <double quote>
<delimited identifier body> ::= <delimited identifier part> ...
<delimited identifier part> ::= <nondoublequote character> | <doublequote symbol>
<nondoublequote character> ::= !! (See the Syntax Rules)
Note that the two successive double quote characters must have no other character (such as a space) between them. The lexical analyzer would normally deal with this sort of issue.
<doublequote symbol> ::= <double quote> <double quote>
<module character set specification> ::= NAMES ARE <character set specification>
<character set specification> ::=
<standard character set name>
| <implementation-defined character set name>
| <user-defined character set name>
<standard character set name> ::= <character set name>
<character set name> ::= [ <schema name> <period> ] <SQL language identifier>
<schema name> ::= [ <catalog name> <period> ] <unqualified schema name>
<catalog name> ::= <identifier>
<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 set name> ::= <character set name>
<user-defined character set name> ::= <character set name>
<language clause> ::= LANGUAGE <language name>
<language name> ::= ADA | C | COBOL | FORTRAN | MUMPS | PASCAL | PLI | SQL
<module authorization clause> ::=
SCHEMA <schema name>
| AUTHORIZATION <module authorization identifier>
| SCHEMA <schema name> AUTHORIZATION <module authorization identifier>
<module authorization identifier> ::= <authorization identifier>
<authorization identifier> ::= <role name> | <user identifier>
<user identifier> ::= <identifier>
<module path specification> ::= <path specification>
<path specification> ::= PATH <schema name list>
<schema name list> ::= <schema name> [ { <comma> <schema name> }... ]
<module transform group specification> ::= <transform group specification>
<transform group specification> ::=
TRANSFORM GROUP { <single group specification> | <multiple group specification> }
<single group specification> ::= <group name>
<multiple group specification> ::= <group specification> [ { <comma> <group specification> }... ]
<group specification> ::= <group name> FOR TYPE <user-defined type>
<user-defined type> ::= <user-defined type name>
<user-defined type name> ::= <schema qualified type name>
<schema qualified type name> ::= [ <schema name> <period> ] <qualified identifier>
<qualified identifier> ::= <identifier>
<temporary table declaration> ::=
DECLARE LOCAL TEMPORARY TABLE <table name>
<table element list>
[ ON COMMIT <table commit action> ROWS ]
<table name> ::= <local or schema qualified name>
<local or schema qualified name> ::= [ <local or schema qualifier> <period> ] <qualified identifier>
<local or schema qualifier> ::= <schema name> | MODULE
<table element list> ::=
<left paren> <table element> [ { <comma> <table element> }... ] <right paren>
<table element> ::=
<column definition>
| <table constraint definition>
| <like clause>
| <self-referencing column specification>
| <column options>
<column definition> ::=
<column name>
{ <data type> | <domain name> }
[ <reference scope check> ]
[ <default clause> ]
[ <column constraint definition> ... ]
[ <collate clause> ]
<column name> ::= <identifier>
<data type> ::=
<predefined type>
| <row type>
| <user-defined type>
| <reference type>
| <collection type>
<predefined type> ::=
<character string type> [ CHARACTER SET <character set specification> ]
| <national character string type>
| <binary large object string type>
| <bit string type>
| <numeric type>
| <boolean 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>
| CHARACTER LARGE OBJECT [ <left paren> <large object length> <right paren> ]
| CHAR LARGE OBJECT [ <left paren> <large object length> <right paren> ]
| CLOB [ <left paren> <large object length> <right paren> ]
<length> ::= <unsigned integer>
<unsigned integer> ::= <digit> ...
<large object length> ::= <unsigned integer> [ <multiplier> ] | <large object length token>
<multiplier> ::= K | M | G
<large object length token> ::= <digit> ... <multiplier>
<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>
| NATIONAL CHARACTER LARGE OBJECT [ <left paren> <large object length> <right paren> ]
| NCHAR LARGE OBJECT [ <left paren> <large object length> <right paren> ]
| NCLOB [ <left paren> <large object length> <right paren> ]
<binary large object string type> ::=
BINARY LARGE OBJECT [ <left paren> <large object length> <right paren> ]
| BLOB [ <left paren> <large object 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 or without time zone> ]
| TIMESTAMP [ <left paren> <timestamp precision> <right paren> ] [ <with or without time zone> ]
<time precision> ::= <time fractional seconds precision>
<time fractional seconds precision> ::= <unsigned integer>
<with or without time zone> ::= WITH TIME ZONE | WITHOUT TIME ZONE
<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 primary datetime field> [ <left paren> <interval leading field precision> <right paren> ]
<non-second primary datetime field> ::= YEAR | MONTH | DAY | HOUR | MINUTE
<interval leading field precision> ::= <unsigned integer>
<end field> ::=
<non-second primary datetime field>
| SECOND [ <left paren> <interval fractional seconds precision> <right paren> ]
<interval fractional seconds precision> ::= <unsigned integer>
<single datetime field> ::=
<non-second primary datetime field> [ <left paren> <interval leading field precision> <right paren> ]
| SECOND [ <left paren> <interval leading field precision> [ <comma> <interval fractional seconds precision> ] <right paren> ]
<row type> ::= ROW <row type body>
<row type body> ::= <left paren> <field definition> [ { <comma> <field definition> }... ] <right paren>
<field definition> ::= <field name> <data type> [ <reference scope check> ] [ <collate clause> ]
<reference scope check> ::=
REFERENCES ARE [ NOT ] CHECKED [ ON DELETE <reference scope check action> ]
<reference scope check action> ::= <referential action>
<referential action> ::=
CASCADE
| SET NULL
| SET DEFAULT
| RESTRICT
| NO ACTION
<collate clause> ::= COLLATE <collation name>
<collation name> ::= <schema qualified name>
<schema qualified name> ::= [ <schema name> <period> ] <qualified identifier>
<reference type> ::= REF <left paren> <referenced type> <right paren> [ <scope clause> ]
<referenced type> ::= <user-defined type>
<scope clause> ::= SCOPE <table name>
<collection type> ::= <data type> <array specification>
<array specification> ::=
<collection type constructor> <left bracket or trigraph> <unsigned integer> <right bracket or trigraph>
<collection type constructor> ::= ARRAY
<left bracket or trigraph> ::= <left bracket> | <left bracket trigraph>
The trigraphs are strictly sequences of characters, not sequences of tokens. There may not be any spaces between the characters. Normally, the lexical analyzer would return the trigraphs as a simple symbol.
<left bracket trigraph> ::= <question mark> <question mark> <left paren>
<right bracket or trigraph> ::= <right bracket> | <right bracket trigraph>
<right bracket trigraph> ::= <question mark> <question mark> <right paren>
<domain name> ::= <schema qualified name>
<default clause> ::= DEFAULT <default option>
<default option> ::=
<literal>
| <datetime value function>
| USER
| CURRENT_USER
| CURRENT_ROLE
| SESSION_USER
| SYSTEM_USER
| CURRENT_PATH
| <implicitly typed value specification>
<literal> ::= <signed numeric literal> | <general literal>
<signed numeric literal> ::= [ <sign> ] <unsigned numeric literal>
<sign> ::= <plus sign> | <minus sign>
<unsigned numeric literal> ::= <exact numeric literal> | <approximate numeric literal>
<exact numeric literal> ::=
<unsigned integer> [ <period> [ <unsigned integer> ] ]
| <period> <unsigned integer>
<approximate numeric literal> ::= <mantissa> E <exponent>
<mantissa> ::= <exact numeric literal>
<exponent> ::= <signed integer>
<signed integer> ::= [ <sign> ] <unsigned integer>
<general literal> ::=
<character string literal>
| <national character string literal>
| <bit string literal>
| <hex string literal>
| <binary string literal>
| <datetime literal>
| <interval literal>
| <boolean literal>
<character string literal> ::=
[ <introducer> <character set specification> ]
<quote> [ <character representation> ... ] <quote>
[ { <separator> <quote> [ <character representation> ... ] <quote> }... ]
<character representation> ::= <nonquote character> | <quote symbol>
<nonquote character> ::= !! (See the Syntax Rules.)
The <quote symbol> rule consists of two immediately adjacent <quote> marks with no spaces. As usual, this would be best handled in the lexical analyzer, not in the grammar.
<quote symbol> ::= <quote> <quote>
<separator> ::= { <comment> | <white space> }...
<comment> ::= <simple comment> | <bracketed comment>
<simple comment> ::= <simple comment introducer> [ <comment character> ... ] <newline>
<simple comment introducer> ::= <minus sign> <minus sign> [ <minus sign> ... ]
<comment character> ::= <nonquote character> | <quote>
<newline> ::= !! (See the Syntax Rules)
The <bracketed comment> rule included '!! (See the Syntax Rules)'. This probably says something about the <slash> <asterisk> and <asterisk> <slash> needing to be adjacent characters rather than adjacent tokens.
<bracketed comment> ::=
<bracketed comment introducer> <bracketed comment contents> <bracketed comment terminator>
<bracketed comment introducer> ::= <slash> <asterisk>
<bracketed comment contents> ::= [ { <comment character> | <separator> }... ]
<bracketed comment terminator> ::= <asterisk> <slash>
<white space> ::= !! (See the Syntax Rules)
<national character string literal> ::=
N <quote> [ <character representation> ... ] <quote>
[ { <separator> <quote> [ <character representation> ... ] <quote> }... ]
<bit string literal> ::=
B <quote> [ <bit> ... ] <quote>
[ { <separator> <quote> [ <bit> ... ] <quote> }... ]
<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
<binary string literal> ::=
X <quote> [ { <hexit> <hexit> }... ] <quote>
[ { <separator> <quote> [ { <hexit> <hexit> }... ] <quote> }... ]
<datetime literal> ::= <date literal> | <time literal> | <timestamp literal>
<date literal> ::= DATE <date string>
<date string> ::= <quote> <unquoted date string> <quote>
<unquoted date string> ::= <date value>
<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 literal> ::= TIME <time string>
<time string> ::= <quote> <unquoted time string> <quote>
<unquoted time string> ::= <time value> [ <time zone interval> ]
<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 literal> ::= TIMESTAMP <timestamp string>
<timestamp string> ::= <quote> <unquoted timestamp string> <quote>
<unquoted timestamp string> ::= <unquoted date string> <space> <unquoted time string>
<interval literal> ::= INTERVAL [ <sign> ] <interval string> <interval qualifier>
<interval string> ::= <quote> <unquoted interval string> <quote>
<unquoted interval string> ::= [ <sign> ] { <year-month literal> | <day-time literal> }
<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>
<boolean literal> ::= TRUE | FALSE | UNKNOWN
<datetime value function> ::=
<current date value function>
| <current time value function>
| <current timestamp value function>
| <current local time value function>
| <current local 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> ]
<current local time value function> ::=
LOCALTIME [ <left paren> <time precision> <right paren> ]
<current local timestamp value function> ::=
LOCALTIMESTAMP [ <left paren> <timestamp precision> <right paren> ]
<implicitly typed value specification> ::= <null specification> | <empty specification>
<empty specification> ::= ARRAY <left bracket or trigraph> <right bracket or trigraph>
<column constraint definition> ::=
[ <constraint name definition> ] <column constraint> [ <constraint characteristics> ]
<constraint name definition> ::= CONSTRAINT <constraint name>
<constraint name> ::= <schema 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> ]
<reference column list> ::= <column name list>
<column name list> ::= <column name> [ { <comma> <column name> }... ]
<match type> ::= FULL | PARTIAL | SIMPLE
<referential triggered action> ::=
<update rule> [ <delete rule> ]
| <delete rule> [ <update rule> ]
<update rule> ::= ON UPDATE <referential action>
<delete rule> ::= ON DELETE <referential action>
<check constraint definition> ::= CHECK <left paren> <search condition> <right paren>
<search condition> ::= <boolean value expression>
<boolean value expression> ::=
<boolean term>
| <boolean value expression> 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>
| <parenthesized boolean value expression>
| <nonparenthesized value expression primary>
<predicate> ::=
<comparison predicate>
| <between predicate>
| <in predicate>
| <like predicate>
| <null predicate>
| <quantified comparison predicate>
| <exists predicate>
| <unique predicate>
| <match predicate>
| <overlaps predicate>
| <similar predicate>
| <distinct predicate>
| <type predicate>
<comparison predicate> ::= <row value expression> <comp op> <row value expression>
<row value expression> ::= <row value special case> | <row value constructor>
<row value special case> ::= <value specification> | <value expression>
<value specification> ::= <literal> | <general value specification>
<general value specification> ::=
<host parameter specification>
| <SQL parameter reference>
| <SQL variable reference>
| <dynamic parameter specification>
| <embedded variable specification>
| CURRENT_DEFAULT_TRANSFORM_GROUP
| CURRENT_PATH
| CURRENT_ROLE
| CURRENT_TRANSFORM_GROUP_FOR_TYPE <user-defined type>
| CURRENT_USER
| SESSION_USER
| SYSTEM_USER
| USER
| VALUE
<host parameter specification> ::= <host parameter name> [ <indicator parameter> ]
<host parameter name> ::= <colon> <identifier>
<indicator parameter> ::= [ INDICATOR ] <host parameter name>
<SQL parameter reference> ::= <basic identifier chain>
<basic identifier chain> ::= <identifier chain>
<identifier chain> ::= <identifier> [ { <period> <identifier> }... ]
<value expression> ::=
<numeric value expression>
| <string value expression>
| <datetime value expression>
| <interval value expression>
| <boolean value expression>
| <user-defined type value expression>
| <row value expression>
| <reference value expression>
| <collection 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> ::=
<parenthesized value expression>
| <nonparenthesized value expression primary>
<parenthesized value expression> ::= <left paren> <value expression> <right paren>
<nonparenthesized value expression primary> ::=
<unsigned value specification>
| <column reference>
| <set function specification>
| <scalar subquery>
| <case expression>
| <cast specification>
| <subtype treatment>
| <attribute or method reference>
| <reference resolution>
| <collection value constructor>
| <routine invocation>
| <field reference>
| <element reference>
| <method invocation>
| <static method invocation>
| <new specification>
<unsigned value specification> ::= <unsigned literal> | <general value specification>
<unsigned literal> ::= <unsigned numeric literal> | <general literal>
<column reference> ::=
<basic identifier chain>
| MODULE <period> <qualified identifier> <period> <column name>
<set function specification> ::=
COUNT <left paren> <asterisk> <right paren>
| <general set function>
| <grouping operation>
<general set function> ::=
<set function type> <left paren> [ <set quantifier> ] <value expression> <right paren>
<set function type> ::= <computational operation>
<computational operation> ::= AVG | MAX | MIN | SUM | EVERY | ANY | SOME | COUNT
<set quantifier> ::= DISTINCT | ALL
<grouping operation> ::= GROUPING <left paren> <column reference> <right paren>
<scalar subquery> ::= <subquery>
<subquery> ::= <left paren> <query expression> <right paren>
<query expression> ::= [ <with clause> ] <query expression body>
<with clause> ::= WITH [ RECURSIVE ] <with list>
<with list> ::= <with list element> [ { <comma> <with list element> }... ]
<with list element> ::=
<query name>
[ <left paren> <with column list> <right paren> ]
AS <left paren> <query expression> <right paren>
[ <search or cycle clause> ]
<with column list> ::= <column name list>
<search or cycle clause> ::=
<search clause>
| <cycle clause>
| <search clause> <cycle clause>
<search clause> ::=
SEARCH <recursive search order> SET <sequence column>
<recursive search order> ::=
DEPTH FIRST BY <sort specification list>
| BREADTH FIRST BY <sort specification list>