A.7. Productions
string ::=
- < string literal >
'a string'
'it''s a string'
reserved identifier ::=
- INSTEAD
- VIEW
- ENABLED
- DISABLED
- KEY
- SERIAL
- TEXTAGG
- COUNT
- ROW_NUMBER
- RANK
- DENSE_RANK
- SUM
- AVG
- MIN
- MAX
- EVERY
- STDDEV_POP
- STDDEV_SAMP
- VAR_SAMP
- VAR_POP
- DOCUMENT
- CONTENT
- TRIM
- EMPTY
- ORDINALITY
- PATH
- FIRST
- LAST
- NEXT
- SUBSTRING
- EXTRACT
- TO_CHARS
- TO_BYTES
- TIMESTAMPADD
- TIMESTAMPDIFF
- QUERYSTRING
- NAMESPACE
- RESULT
- INDEX
- ACCESSPATTERN
- AUTO_INCREMENT
- WELLFORMED
- SQL_TSI_FRAC_SECOND
- SQL_TSI_SECOND
- SQL_TSI_MINUTE
- SQL_TSI_HOUR
- SQL_TSI_DAY
- SQL_TSI_WEEK
- SQL_TSI_MONTH
- SQL_TSI_QUARTER
- SQL_TSI_YEAR
- TEXTTABLE
- ARRAYTABLE
- SELECTOR
- SKIP
- WIDTH
- PASSING
- NAME
- ENCODING
- COLUMNS
- DELIMITER
- QUOTE
- HEADER
- NULLS
- OBJECTTABLE
- VERSION
- INCLUDING
- EXCLUDING
- XMLDECLARATION
- VARIADIC
- RAISE
- EXCEPTION
- CHAIN
- JSONARRAY_AGG
- JSONOBJECT
identifier ::=
- < identifier >
- < non-reserved identifier >
tbl.col
"tbl"."col"
create trigger ::=
- CREATE TRIGGER ON < identifier > INSTEAD OF ( INSERT | UPDATE | DELETE ) AS < for each row trigger action >
CREATE TRIGGER ON vw INSTEAD OF INSERT AS FOR EACH ROW BEGIN ATOMIC ... END
alter ::=
- ALTER ( ( VIEW < identifier > AS < query expression > ) | ( PROCEDURE < identifier > AS < statement > ) | ( TRIGGER ON < identifier > INSTEAD OF ( INSERT | UPDATE | DELETE ) ( ( AS < for each row trigger action > ) | ENABLED | DISABLED ) ) )
ALTER VIEW vw AS SELECT col FROM tbl
for each row trigger action ::=
- FOR EACH ROW ( ( BEGIN ( ATOMIC )? ( < statement > )* END ) | < statement > )
FOR EACH ROW BEGIN ATOMIC ... END
directly executable statement ::=
- < query expression >
- < call statement >
- < insert statement >
- < update statement >
- < delete statement >
- < drop table >
- < create temporary table >
- < create foreign temp table >
- < alter >
- < create trigger >
SELECT * FROM tbl
drop table ::=
- DROP TABLE < identifier >
CREATE TRIGGER ON vw INSTEAD OF INSERT AS FOR EACH ROW BEGIN ATOMIC ... END
create temporary table ::=
- CREATE LOCAL TEMPORARY TABLE < identifier > < lparen > < temporary table element > ( < comma > < temporary table element > )* ( < comma > PRIMARY KEY < column list > )? < rparen >
CREATE LOCAL TEMPORARY TABLE tmp (col integer)
temporary table element ::=
- < identifier > ( < data type > | SERIAL ) ( NOT NULL )?
col string NOT NULL
raise error statement ::=
- ERROR < expression >
ERROR 'something went wrong'
raise statement ::=
- RAISE ( SQLWARNING )? < exception reference >
RAISE SQLEXCEPTION 'something went wrong'
exception reference ::=
- < identifier >
- < sql exception >
SQLEXCEPTION 'something went wrong' SQLSTATE '00X', 2
sql exception ::=
- SQLEXCEPTION < common value expression > ( SQLSTATE < common value expression > ( < comma > < common value expression > )? )? ( CHAIN < exception reference > )?
SQLEXCEPTION 'something went wrong' SQLSTATE '00X', 2
statement ::=
- ( ( < identifier > < colon > )? ( < loop statement > | < while statement > | < compound statement > ) )
- < if statement > | < delimited statement >
IF (x = 5) BEGIN ... END
delimited statement ::=
- ( < assignment statement > | < data statement > | < raise error statement > | < raise statement > | < declare statement > | < branching statement > | < return statement > ) < semicolon >
SELECT * FROM tbl;
compound statement ::=
- BEGIN ( ( NOT )? ATOMIC )? ( < statement > )* ( EXCEPTION < identifier > ( < statement > )* )? END
BEGIN NOT ATOMIC ... END
branching statement ::=
- ( ( BREAK | CONTINUE ) ( < identifier > )? )
- ( LEAVE < identifier > )
BREAK x
return statement ::=
- RETURN ( < expression > )?
RETURN 1
while statement ::=
- WHILE < lparen > < condition > < rparen > < statement >
WHILE (var) BEGIN ... END
loop statement ::=
- LOOP ON < lparen > < query expression > < rparen > AS < identifier > < statement >
IF (boolVal) BEGIN variables.x = 1 END ELSE BEGIN variables.x = 2 END
if statement ::=
- IF < lparen > < condition > < rparen > < statement > ( ELSE < statement > )?
LOOP ON (SELECT * FROM tbl) AS x BEGIN ... END
declare statement ::=
- DECLARE ( < data type > | EXCEPTION ) < identifier > ( < eq > < assignment statement operand > )?
DECLARE STRING x = 'a'
assignment statement ::=
- < identifier > < eq > ( < assignment statement operand > | ( < call statement > ( ( WITH | WITHOUT ) RETURN )? ) )
x = 'b'
assignment statement operand ::=
- < insert statement >
- < update statement >
- < delete statement >
- < expression >
- < query expression >
- < sql exception >
Note
data statement ::=
- ( < directly executable statement > | < dynamic data statement > ) ( ( WITH | WITHOUT ) RETURN )?
procedure body definition ::=
- ( CREATE ( VIRTUAL )? PROCEDURE )? < statement >
CREATE VIRTUAL PROCEDURE BEGIN ... END
dynamic data statement ::=
- ( EXECUTE | EXEC ) ( STRING | IMMEDIATE )? < expression > ( AS < typed element list > ( INTO < identifier > )? )? ( USING < set clause list > )? ( UPDATE ( < unsigned integer > | < star > ) )?
EXECUTE IMMEDIATE 'SELECT * FROM tbl' AS x STRING INTO #temp
set clause list ::=
- < identifier > < eq > < expression > ( < comma > < identifier > < eq > < expression > )*
col1 = 'x', col2 = 'y' ...
typed element list ::=
- < identifier > < data type > ( < comma > < identifier > < data type > )*
col1 string, col2 integer ...
callable statement ::=
- < lbrace > ( < qmark > < eq > )? CALL < identifier > ( < lparen > ( < expression list > )? < rparen > )? < rbrace > ( < option clause > )?
{? = CALL proc}call statement ::=
- ( ( EXEC | EXECUTE | CALL ) < identifier > < lparen > ( < named parameter list > | ( < expression list > )? ) < rparen > ) ( < option clause > )?
CALL proc('a', 1)named parameter list ::=
- ( < identifier > < eq > ( < gt > )? < expression > ( < comma > < identifier > < eq > ( < gt > )? < expression > )* )
param1 => 'x', param2 => 1
insert statement ::=
- ( INSERT | MERGE ) INTO < identifier > ( < column list > )? ( ( VALUES < lparen > < expression list > < rparen > ) | < query expression > ) ( < option clause > )?
INSERT INTO tbl (col1, col2) VALUES ('a', 1)expression list ::=
- < expression > ( < comma > < expression > )*
col1, 'a', ...
update statement ::=
- UPDATE < identifier > SET < set clause list > ( < where clause > )? ( < option clause > )?
UPDATE tbl SET (col1 = 'a') WHERE col2 = 1
delete statement ::=
- DELETE FROM < identifier > ( < where clause > )? ( < option clause > )?
DELETE FROM tbl WHERE col2 = 1
query expression ::=
- ( WITH < with list element > ( < comma > < with list element > )* )? < query expression body >
SELECT * FROM tbl WHERE col2 = 1
with list element ::=
- < identifier > ( < column list > )? AS < lparen > < query expression > < rparen >
X (Y, Z) AS (SELECT 1, 2)
query expression body ::=
- < query term > ( ( UNION | EXCEPT ) ( ALL | DISTINCT )? < query term > )* ( < order by clause > )? ( < limit clause > )? ( < option clause > )?
SELECT * FROM tbl ORDER BY col1 LIMIT 1
query term ::=
- < query primary > ( INTERSECT ( ALL | DISTINCT )? < query primary > )*
SELECT * FROM tbl
SELECT * FROM tbl1 INTERSECT SELECT * FROM tbl2
query primary ::=
- < query >
- ( TABLE < identifier > )
- ( < lparen > < query expression body > < rparen > )
TABLE tbl
SELECT * FROM tbl1
query ::=
- < select clause > ( < into clause > )? ( < from clause > ( < where clause > )? ( < group by clause > )? ( < having clause > )? )?
SELECT col1, max(col2) FROM tbl GROUP BY col1
into clause ::=
- INTO < identifier >
Note
INTO tbl
select clause ::=
- SELECT ( ALL | DISTINCT )? ( < star > | ( < select sublist > ( < comma > < select sublist > )* ) )
SELECT *
SELECT DISTINCT a, b, c
select sublist ::=
- < select derived column >
- < all in group >
tbl.*
tbl.col AS x
select derived column ::=
- ( < expression > ( ( AS )? < identifier > )? )
Note
tbl.col AS x
derived column ::=
- ( < expression > ( AS < identifier > )? )
tbl.col AS x
all in group ::=
- < all in group identifier >
tbl.*
ordered aggreate function ::=
- ( XMLAGG | ARRAY_AGG | JSONARRAY_AGG ) < lparen > < expression > ( < order by clause > )? < rparen >
XMLAGG(col1) ORDER BY col2
ARRAY_AGG(col1)
text aggreate function ::=
- TEXTAGG < lparen > ( FOR )? < derived column > ( < comma > < derived column > )* ( DELIMITER < character > )? ( QUOTE < character > )? ( HEADER )? ( ENCODING < identifier > )? ( < order by clause > )? < rparen >
TEXTAGG (col1 as t1, col2 as t2 DELIMITER ',' HEADER)
standard aggregate function ::=
- ( COUNT < lparen > < star > < rparen > )
- ( ( COUNT | SUM | AVG | MIN | MAX | EVERY | STDDEV_POP | STDDEV_SAMP | VAR_SAMP | VAR_POP | SOME | ANY ) < lparen > ( DISTINCT | ALL )? < expression > < rparen > )
COUNT(*)
analytic aggregate function ::=
- ( ROW_NUMBER | RANK | DENSE_RANK ) < lparen > < rparen >
ROW_NUMBER()
filter clause ::=
- FILTER < lparen > WHERE < boolean primary > < rparen >
FILTER (WHERE col1='a')
from clause ::=
- FROM ( < table reference > ( < comma > < table reference > )* )
FROM a, b
FROM a right outer join b, c, d join e".</p>
table reference ::=
- ( < escaped join > < joined table > < rbrace > )
- < joined table >
a
a inner join b
joined table ::=
- < table primary > ( < cross join > | < qualified table > )*
a
a inner join b
cross join ::=
- ( ( CROSS | UNION ) JOIN < table primary > )
a CROSS JOIN b
qualified table ::=
- ( ( ( RIGHT ( OUTER )? ) | ( LEFT ( OUTER )? ) | ( FULL ( OUTER )? ) | INNER )? JOIN < table reference > ON < condition > )
a inner join b
table primary ::=
- ( < text table > | < array table > | < xml table > | < object table > | < table name > | < table subquery > | ( < lparen > < joined table > < rparen > ) ) ( MAKEDEP | MAKENOTDEP )?
a
xml serialize ::=
- XMLSERIALIZE < lparen > ( DOCUMENT | CONTENT )? < expression > ( AS ( STRING | VARCHAR | CLOB | VARBINARY | BLOB ) )? ( ENCODING < identifier > )? ( VERSION < string > )? ( ( INCLUDING | EXCLUDING ) XMLDECLARATION )? < rparen >
XMLSERIALIZE(col1 AS CLOB)
array table ::=
- ARRAYTABLE < lparen > < value expression primary > COLUMNS < typed element list > < rparen > ( AS )? < identifier >
ARRAYTABLE (col1 COLUMNS x STRING) AS y
text table ::=
- TEXTTABLE < lparen > < common value expression > ( SELECTOR < string > )? COLUMNS < text table column > ( < comma > < text table column > )* ( NO ROW DELIMITER )? ( DELIMITER < character > )? ( ( ESCAPE < character > ) | ( QUOTE < character > ) )? ( HEADER ( < unsigned integer > )? )? ( SKIP < unsigned integer > )? < rparen > ( AS )? < identifier >
TEXTTABLE (file COLUMNS x STRING) AS y
text table column ::=
- < identifier > < data type > ( WIDTH < unsigned integer > ( NO TRIM )? )? ( SELECTOR < string > < unsigned integer > )?
x INTEGER WIDTH 6
xml query ::=
- XMLQUERY < lparen > ( < xml namespaces > < comma > )? < string > ( PASSING < derived column > ( < comma > < derived column > )* )? ( ( NULL | EMPTY ) ON EMPTY )? < rparen >
XMLQUERY('<a>...</a>' PASSING doc)object table ::=
- OBJECTTABLE < lparen > ( LANGUAGE < string > )? < string > ( PASSING < derived column > ( < comma > < derived column > )* )? COLUMNS < object table column > ( < comma > < object table column > )* < rparen > ( AS )? < identifier >
OBJECTTABLE('z' PASSING val AS z COLUMNS col OBJECT 'teiid_row') AS Xobject table column ::=
- < identifier > < data type > < string > ( DEFAULT < expression > )?
y integer 'teiid_row_number'
xml table ::=
- XMLTABLE < lparen > ( < xml namespaces > < comma > )? < string > ( PASSING < derived column > ( < comma > < derived column > )* )? ( COLUMNS < xml table column > ( < comma > < xml table column > )* )? < rparen > ( AS )? < identifier >
XMLTABLE('/a/b' PASSING doc COLUMNS col XML PATH '.') AS Xxml table column ::=
- < identifier > ( ( FOR ORDINALITY ) | ( < data type > ( DEFAULT < expression > )? ( PATH < string > )? ) )
y FOR ORDINALITY
unsigned integer ::=
- < unsigned integer literal >
12345
table subquery ::=
- ( TABLE | LATERAL )? < lparen > ( < query expression > | < call statement > ) < rparen > ( AS )? < identifier >
(SELECT * FROM tbl) AS x
table name ::=
- ( < identifier > ( ( AS )? < identifier > )? )
tbl AS x
where clause ::=
- WHERE < condition >
WHERE x = 'a'
condition ::=
- < boolean value expression >
boolean value expression ::=
- < boolean term > ( OR < boolean term > )*
boolean term ::=
- < boolean factor > ( AND < boolean factor > )*
boolean factor ::=
- ( NOT )? < boolean primary >
NOT x = 'a'
boolean primary ::=
- ( < common value expression > ( < between predicate > | < match predicate > | < like regex predicate > | < in predicate > | < is null predicate > | < quantified comparison predicate > | < comparison predicate > )? )
- < exists predicate >
col LIKE 'a%'
comparison operator ::=
- < eq >
- < ne >
- < ne2 >
- < lt >
- < le >
- < gt >
- < ge >
=
comparison predicate ::=
- < comparison operator > < common value expression >
= 'a'
subquery ::=
- < lparen > ( < query expression > | < call statement > ) < rparen >
(SELECT * FROM tbl)
quantified comparison predicate ::=
- < comparison operator > ( ANY | SOME | ALL ) < subquery >
= ANY (SELECT col FROM tbl)
match predicate ::=
- ( NOT )? ( LIKE | ( SIMILAR TO ) ) < common value expression > ( ESCAPE < character > | ( < lbrace > ESCAPE < character > < rbrace > ) )?
LIKE 'a_'
like regex predicate ::=
- ( NOT )? LIKE_REGEX < common value expression >
LIKE_REGEX 'a.*b'
character ::=
- < string >
'a'
between predicate ::=
- ( NOT )? BETWEEN < common value expression > AND < common value expression >
BETWEEN 1 AND 5
is null predicate ::=
- IS ( NOT )? NULL
IS NOT NULL
in predicate ::=
- ( NOT )? IN ( < subquery > | ( < lparen > < common value expression > ( < comma > < common value expression > )* < rparen > ) )
IN (1, 5)
exists predicate ::=
- EXISTS < subquery >
EXISTS (SELECT col FROM tbl)
group by clause ::=
- GROUP BY < expression list >
GROUP BY col1, col2
having clause ::=
- HAVING < condition >
HAVING max(col1) = 5
order by clause ::=
- ORDER BY < sort specification > ( < comma > < sort specification > )*
ORDER BY x, y DESC
sort specification ::=
- < sort key > ( ASC | DESC )? ( NULLS ( FIRST | LAST ) )?
col1 NULLS FIRST
sort key ::=
- < expression >
col1
integer parameter ::=
- < unsigned integer >
- < qmark >
?
limit clause ::=
- ( LIMIT < integer parameter > ( < comma > < integer parameter > )? )
- ( OFFSET < integer parameter > ( ROW | ROWS ) ( < fetch clause > )? )
- < fetch clause >
LIMIT 2
fetch clause ::=
- FETCH ( FIRST | NEXT ) ( < integer parameter > )? ( ROW | ROWS ) ONLY
FETCH FIRST 1 ROWS ONLY
option clause ::=
- OPTION ( MAKEDEP < identifier > ( < comma > < identifier > )* | MAKENOTDEP < identifier > ( < comma > < identifier > )* | NOCACHE ( < identifier > ( < comma > < identifier > )* )? )*
OPTION MAKEDEP tbl
expression ::=
- < condition >
col1
common value expression ::=
- ( < numeric value expression > ( < concat_op > < numeric value expression > )* )
'a' || 'b'
numeric value expression ::=
- ( < term > ( < plus or minus > < term > )* )
1 + 2
plus or minus ::=
- < plus >
- < minus >
+
term ::=
- ( < value expression primary > ( < star or slash > < value expression primary > )* )
1 * 2
star or slash ::=
- < star >
- < slash >
/
value expression primary ::=
- < non numeric literal >
- ( < plus or minus > )? ( < unsigned numeric literal > | < unsigned value expression primary > )
+col1
unsigned value expression primary ::=
- < qmark >
- ( < dollar > < unsigned integer > )
- ( < escaped function > < function > < rbrace > )
- ( ( < text aggreate function > | < standard aggregate function > | < ordered aggreate function > ) ( < filter clause > )? ( < window specification > )? )
- ( < analytic aggregate function > ( < filter clause > )? < window specification > )
- ( < function > ( < window specification > )? )
- ( ( < identifier > | < non-reserved identifier > ) ( < lsbrace > < common value expression > < rsbrace > )? )
- < subquery >
- ( < lparen > < expression > < rparen > ( < lsbrace > < common value expression > < rsbrace > )? )
- < searched case expression >
- < case expression >
col1
window specification ::=
- OVER < lparen > ( PARTITION BY < expression list > )? ( < order by clause > )? < rparen >
OVER (PARTION BY col1)
case expression ::=
- CASE < expression > ( WHEN < expression > THEN < expression > )+ ( ELSE < expression > )? END
CASE col1 WHEN 'a' THEN 1 ELSE 2
searched case expression ::=
- CASE ( WHEN < condition > THEN < expression > )+ ( ELSE < expression > )? END
CASE WHEN x = 'a' THEN 1 WHEN y = 'b' THEN 2
function ::=
- ( CONVERT < lparen > < expression > < comma > < data type > < rparen > )
- ( CAST < lparen > < expression > AS < data type > < rparen > )
- ( SUBSTRING < lparen > < expression > ( ( FROM < expression > ( FOR < expression > )? ) | ( < comma > < expression list > ) ) < rparen > )
- ( EXTRACT < lparen > ( YEAR | MONTH | DAY | HOUR | MINUTE | SECOND ) FROM < expression > < rparen > )
- ( TRIM < lparen > ( ( ( ( LEADING | TRAILING | BOTH ) ( < expression > )? ) | < expression > ) FROM )? < expression > < rparen > )
- ( ( TO_CHARS | TO_BYTES ) < lparen > < expression > < comma > < string > < rparen > )
- ( ( TIMESTAMPADD | TIMESTAMPDIFF ) < lparen > < time interval > < comma > < expression > < comma > < expression > < rparen > )
- < querystring function >
- ( ( LEFT | RIGHT | CHAR | USER | YEAR | MONTH | HOUR | MINUTE | SECOND | XMLCONCAT | XMLCOMMENT ) < lparen > ( < expression list > )? < rparen > )
- ( ( TRANSLATE | INSERT ) < lparen > ( < expression list > )? < rparen > )
- < xml parse >
- < xml element >
- ( XMLPI < lparen > ( ( NAME )? < identifier > ) ( < comma > < expression > )? < rparen > )
- < xml forest >
- < json object >
- < xml serialize >
- < xml query >
- ( < identifier > < lparen > ( ALL | DISTINCT )? ( < expression list > )? ( < order by clause > )? < rparen > ( < filter clause > )? )
func('1', col1)xml parse ::=
- XMLPARSE < lparen > ( DOCUMENT | CONTENT ) < expression > ( WELLFORMED )? < rparen >
XMLPARSE(DOCUMENT doc WELLFORMED)
querystring function ::=
- QUERYSTRING < lparen > < expression > ( < comma > < derived column > )* < rparen >
QUERYSTRING(col1 AS opt, col2 AS val)
xml element ::=
- XMLELEMENT < lparen > ( ( NAME )? < identifier > ) ( < comma > < xml namespaces > )? ( < comma > < xml attributes > )? ( < comma > < expression > )* < rparen >
XMLELEMENT(NAME "root", child)
xml attributes ::=
- XMLATTRIBUTES < lparen > < derived column > ( < comma > < derived column > )* < rparen >
XMLATTRIBUTES(col1 AS attr1, col2 AS attr2)
json object ::=
- JSONOBJECT < lparen > < derived column list > < rparen >
JSONOBJECT(col1 AS val1, col2 AS val2)
derived column list ::=
- < derived column > ( < comma > < derived column > )*
col1 AS val1, col2 AS val2
xml forest ::=
- XMLFOREST < lparen > ( < xml namespaces > < comma > )? < derived column list > < rparen >
XMLFOREST(col1 AS ELEM1, col2 AS ELEM2)
xml namespaces ::=
- XMLNAMESPACES < lparen > < xml namespace element > ( < comma > < xml namespace element > )* < rparen >
XMLNAMESPACES('http://foo' AS foo)xml namespace element ::=
- ( < string > AS < identifier > )
- ( NO DEFAULT )
- ( DEFAULT < string > )
NO DEFAULT
data type ::=
- ( STRING ( < lparen > < unsigned integer > < rparen > )? )
- ( VARCHAR ( < lparen > < unsigned integer > < rparen > )? )
- BOOLEAN
- BYTE
- TINYINT
- SHORT
- SMALLINT
- ( CHAR ( < lparen > < unsigned integer > < rparen > )? )
- INTEGER
- LONG
- BIGINT
- ( BIGINTEGER ( < lparen > < unsigned integer > < rparen > )? )
- FLOAT
- REAL
- DOUBLE
- ( BIGDECIMAL ( < lparen > < unsigned integer > ( < comma > < unsigned integer > )? < rparen > )? )
- ( DECIMAL ( < lparen > < unsigned integer > ( < comma > < unsigned integer > )? < rparen > )? )
- DATE
- TIME
- TIMESTAMP
- OBJECT
- ( BLOB ( < lparen > < unsigned integer > < rparen > )? )
- ( CLOB ( < lparen > < unsigned integer > < rparen > )? )
- ( VARBINARY ( < lparen > < unsigned integer > < rparen > )? )
- XML
STRING
time interval ::=
- SQL_TSI_FRAC_SECOND
- SQL_TSI_SECOND
- SQL_TSI_MINUTE
- SQL_TSI_HOUR
- SQL_TSI_DAY
- SQL_TSI_WEEK
- SQL_TSI_MONTH
- SQL_TSI_QUARTER
- SQL_TSI_YEAR
SQL_TSI_HOUR
non numeric literal ::=
- < string >
- < binary string literal >
- FALSE
- TRUE
- UNKNOWN
- NULL
- ( < escaped type > < string > < rbrace > )
'a'
unsigned numeric literal ::=
- < unsigned integer literal >
- < approximate numeric literal >
- < decimal numeric literal >
1.234
ddl statement ::=
- ( < create table > | < create procedure > | < option namespace > | < alter options > | < create trigger > ) ( < semicolon > )?
CREATE FOREIGN TABLE X (Y STRING)
option namespace ::=
- SET NAMESPACE < string > AS < identifier >
SET NAMESPACE 'http://foo' AS foo
create procedure ::=
- CREATE ( VIRTUAL | FOREIGN )? ( PROCEDURE | FUNCTION ) ( < identifier > < lparen > ( < procedure parameter > ( < comma > < procedure parameter > )* )? < rparen > ( RETURNS ( ( ( TABLE )? < lparen > < procedure result column > ( < comma > < procedure result column > )* < rparen > ) | < data type > ) )? ( < options clause > )? ( AS < statement > )? )
CREATE FOREIGN PROCEDURE proc (param STRING) RETURNS STRING
procedure parameter ::=
- ( IN | OUT | INOUT | VARIADIC )? < identifier > < data type > ( NOT NULL )? ( RESULT )? ( DEFAULT < string > )? ( < options clause > )?
OUT x INTEGER
procedure result column ::=
- < identifier > < data type > ( NOT NULL )? ( < options clause > )?
x INTEGER
create table ::=
- CREATE ( FOREIGN TABLE | ( VIRTUAL )? VIEW ) < identifier > ( < create table body > | ( < options clause > )? ) ( AS < query expression > )?
CREATE VIEW vw AS SELECT 1
create foreign temp table ::=
- CREATE FOREIGN TEMPORARY TABLE < identifier > < create table body > ON < identifier >
CREATE FOREIGN TEMPORARY TABLE t (x string) ON z
create table body ::=
- ( < lparen > < table element > ( < comma > < table element > )* ( < comma > ( CONSTRAINT < identifier > )? ( < primary key > | < other constraints > | < foreign key > ) ( < options clause > )? )* < rparen > )? ( < options clause > )?
(x string) OPTIONS (CARDINALITY 100)
foreign key ::=
- FOREIGN KEY < column list > REFERENCES < identifier > ( < column list > )?
FOREIGN KEY (a, b) REFERENCES tbl (x, y)
primary key ::=
- PRIMARY KEY < column list >
PRIMARY KEY (a, b)
other constraints ::=
- ( ( UNIQUE | ACCESSPATTERN ) < column list > )
- ( INDEX < lparen > < expression list > < rparen > )
UNIQUE (a)
column list ::=
- < lparen > < identifier > ( < comma > < identifier > )* < rparen >
(a, b)
table element ::=
- < identifier > < data type > ( NOT NULL )? ( AUTO_INCREMENT )? ( ( PRIMARY KEY ) | ( ( UNIQUE )? ( INDEX )? ) ) ( DEFAULT < string > )? ( < options clause > )?
x INTEGER NOT NULL
options clause ::=
- OPTIONS < lparen > < option pair > ( < comma > < option pair > )* < rparen >
OPTIONS ('x' 'y', 'a' 'b')option pair ::=
- < identifier > ( < non numeric literal > | ( < plus or minus > )? < unsigned numeric literal > )
'key' 'value'
alter options ::=
- ALTER ( VIRTUAL | FOREIGN )? ( TABLE | VIEW | PROCEDURE ) < identifier > ( < alter options list > | < alter column options > )
ALTER FOREIGN TABLE foo OPTIONS (ADD cardinality 100)
alter options list ::=
- OPTIONS < lparen > ( < add set option > | < drop option > ) ( < comma > ( < add set option > | < drop option > ) )* < rparen >
OPTIONS (ADD updatable true)
drop option ::=
- DROP < identifier >
DROP updatable
add set option ::=
- ( ADD | SET ) < option pair >
ADD updatable true
alter column options ::=
- ALTER ( COLUMN | PARAMETER )? < identifier > < alter options list >
ALTER COLUMN bar OPTIONS (ADD updatable true)

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.