JBoss.orgCommunity Documentation

Appendix A. BNF for SQL Grammar

<DEFAULT> SKIP : { " " | "\t" | "\n" | "\r" }

<DEFAULT> MORE : { "/*" : IN_MULTI_LINE_COMMENT }

<IN_MULTI_LINE_COMMENT> SPECIAL : { <MULTI_LINE_COMMENT: "*/"> : DEFAULT }

<IN_MULTI_LINE_COMMENT> MORE : { <~[]> }

<DEFAULT> TOKEN : { <STRING: "string"> | <VARCHAR: "varchar"> | <BOOLEAN: "boolean"> | <BYTE: "byte"> | <TINYINT: "tinyint"> | <SHORT: "short"> | <SMALLINT: "smallint"> | <CHAR: "char"> | <INTEGER: "integer"> | <LONG: "long"> | <BIGINT: "bigint"> | <BIGINTEGER: "biginteger"> | <FLOAT: "float"> | <REAL: "real"> | <DOUBLE: "double"> | <BIGDECIMAL: "bigdecimal"> | <DECIMAL: "decimal"> | <DATE: "date"> | <TIME: "time"> | <TIMESTAMP: "timestamp"> | <OBJECT: "object"> | <BLOB: "blob"> | <CLOB: "clob"> | <XML: "xml"> }

<DEFAULT> TOKEN : { <CAST: "cast"> | <CONVERT: "convert"> }

<DEFAULT> TOKEN : { <ADD: "add"> | <ALL: "all"> | <ALTER: "alter"> | <AND: "and"> | <ANY: "any"> | <ARRAY: "array"> | <ARRAY_AGG: "array_agg"> | <AS: "as"> | <ASC: "asc"> | <ATOMIC: "atomic"> | <AUTORIZATION: "authorization"> | <BEGIN: "begin"> | <BETWEEN: "between"> | <BINARY: "binary"> | <BOTH: "both"> | <BREAK: "break"> | <BY: "by"> | <CALL: "call"> | <CALLED: "called"> | <CASCADED: "cascaded"> | <CASE: "case"> | <CHARACTER: "character"> | <CHECK: "check"> | <CLOSE: "close"> | <COLLATE: "collate"> | <COLUMN: "column"> | <COMMIT: "commit"> | <CONNECT: "connect"> | <CONSTRAINT: "constraint"> | <CONTINUE: "continue"> | <CORRESPONDING: "corresponding"> | <CURRENT_DATE: "current_date"> | <CURRENT_TIME: "current_time"> | <CURRENT_TIMESTAMP: "current_timestamp"> | <CURRENT_USER: "current_user"> | <CREATE: "create"> | <CRITERIA: "criteria"> | <CROSS: "cross"> | <CURSOR: "cursor"> | <DAY: "day"> | <DEALLOCATE: "deallocate"> | <DEFAULT_KEYWORD: "default"> | <DECLARE: "declare"> | <DELETE: "delete"> | <DESC: "desc"> | <DESCRIBE: "describe"> | <DETERMINISTIC: "deterministic"> | <DISCONNECT: "disconnect"> | <DISTINCT: "distinct"> | <DROP: "drop"> | <EACH: "each"> | <ELSE: "else"> | <END: "end"> | <ERROR: "error"> | <ESCAPE: "escape"> | <EXCEPT: "except"> | <EXEC: "exec"> | <EXECUTE: "execute"> | <EXTERNAL: "external"> | <EXISTS: "exists"> | <FALSE: "false"> | <FETCH: "fetch"> | <FILTER: "filter"> | <FOR: "for"> | <FORIEGN: "foriegn"> | <FROM: "from"> | <FULL: "full"> | <FUNCTION: "function"> | <GET: "get"> | <GLOBAL: "global"> | <GRANT: "grant"> | <GROUP: "group"> | <HAS: "has"> | <HAVING: "having"> | <HOLD: "hold"> | <HOUR: "hour"> | <IF: "if"> | <IDENTITY: "identity"> | <IMMEDIATE: "immediate"> | <IN: "in"> | <INDICATOR: "indicator"> | <INNER: "inner"> | <INPUT: "input"> | <INOUT: "inout"> | <INSENSITIVE: "insensitive"> | <INSERT: "insert"> | <INTERSECT: "intersect"> | <INTERVAL: "interval"> | <INTO: "into"> | <IS: "is"> | <ISOLATION: "isolation"> | <JOIN: "join"> | <LEFT: "left"> | <LANGUAGE: "language"> | <LARGE: "large"> | <LEADING: "leading"> | <LEAVE: "leave"> | <LIKE: "like"> | <LIKE_REGEX: "like_regex"> | <LIMIT: "limit"> | <LOCAL: "local"> | <LOOP: "loop"> | <MAKEDEP: "makedep"> | <MAKENOTDEP: "makenotdep"> | <MATCH: "match"> | <MERGE: "merge"> | <METHOD: "method"> | <MINUTE: "minute"> | <MODIFIES: "modifies"> | <MODULE: "module"> | <MONTH: "month"> | <NATURAL: "natural"> | <NEW: "new"> | <NOCACHE: "nocache"> | <NO: "no"> | <NONE: "none"> | <NOT: "not"> | <NULL: "null"> | <OF: "of"> | <OFFSET: "offset"> | <OLD: "old"> | <ON: "on"> | <ONLY: "only"> | <OPEN: "open"> | <OPTION: "option"> | <OR: "or"> | <ORDER: "order"> | <OUTER: "outer"> | <OUTPUT: "output"> | <OVER: "over"> | <OVERLAPS: "OVERLAPS"> | <PARAMETER: "parameter"> | <PARTITION: "partition"> | <PRECISION: "precision"> | <PREPARE: "prepare"> | <PRIMARY: "primary"> | <PROCEDURE: "procedure"> | <RANGE: "range"> | <READS: "reads"> | <RECURSIVE: "recursive"> | <REFERENCES: "REFERENCES"> | <REFERENCING: "REFERENCING"> | <RETURN: "return"> | <RETURNS: "returns"> | <REVOKE: "REVOKE"> | <RIGHT: "right"> | <ROLLBACK: "ROLLBACK"> | <ROLLUP: "ROLLUP"> | <ROW: "row"> | <ROWS: "rows"> | <SAVEPOINT: "savepoint"> | <SCROLL: "scroll"> | <SEARCH: "search"> | <SECOND: "second"> | <SELECT: "select"> | <SENSITIVE: "sensitive"> | <SESSION_USER: "session_user"> | <SET: "set"> | <SIMILAR: "similar"> | <SPECIFIC: "specific"> | <SOME: "some"> | <SQL: "sql"> | <SQLEXCEPTION: "sqlexception"> | <SQLSTATE: "sqlstate"> | <SQLWARNING: "sqlwarning"> | <START: "start"> | <STATIC: "static"> | <SYSTEM: "system"> | <SYSTEM_USER: "system_user"> | <TABLE: "table"> | <TEMPORARY: "temporary"> | <THEN: "then"> | <TIMEZONE_HOUR: "timezone_hour"> | <TIMEZONE_MINUTE: "timezone_minute"> | <TO: "to"> | <TRAILING: "trailing"> | <TRANSLATE: "translate"> | <TRIGGER: "trigger"> | <TRUE: "true"> | <UNION: "union"> | <UNIQUE: "unique"> | <UNKNOWN: "unknown"> | <USER: "user"> | <UPDATE: "update"> | <USING: "using"> | <VALUE: "value"> | <VALUES: "values"> | <VIRTUAL: "virtual"> | <WHEN: "when"> | <WHENEVER: "whenever"> | <WHERE: "where"> | <WITH: "with"> | <WHILE: "while"> | <WINDOW: "window"> | <WITHIN: "within"> | <WITHOUT: "without"> | <YEAR: "year"> | <ALLOCATE: "allocate"> | <ARE: "are"> | <ASENSITIVE: "asensitive"> | <ASYMETRIC: "asymetric"> | <CYCLE: "cycle"> | <DEC: "dec"> | <DEREF: "deref"> | <DYNAMIC: "dynamic"> | <ELEMENT: "element"> | <FREE: "free"> | <INT: "int"> | <LATERAL: "lateral"> | <LOCALTIME: "localtime"> | <LOCALTIMESTAMP: "localtimestamp"> | <MEMBER: "member"> | <MULTISET: "multiset"> | <NATIONAL: "national"> | <NCHAR: "nchar"> | <NCLOB: "nclob"> | <NUMERIC: "numeric"> | <RELEASE: "release"> | <SPECIFICTYPE: "specifictype"> | <SYMETRIC: "symetric"> | <SUBMULTILIST: "submultilist"> | <TRANSLATION: "translation"> | <TREAT: "treat"> | <VARYING: "varying"> }

<DEFAULT> TOKEN : { <XMLAGG: "xmlagg"> | <XMLATTRIBUTES: "xmlattributes"> | <XMLBINARY: "xmlbinary"> | <XMLCAST: "xmlcast"> | <XMLCONCAT: "xmlconcat"> | <XMLCOMMENT: "xmlcomment"> | <XMLDOCUMENT: "xmldocument"> | <XMLELEMENT: "xmlelement"> | <XMLEXISTS: "xmlexists"> | <XMLFOREST: "xmlforest"> | <XMLITERATE: "xmliterate"> | <XMLNAMESPACES: "xmlnamespaces"> | <XMLPARSE: "xmlparse"> | <XMLPI: "xmlpi"> | <XMLQUERY: "xmlquery"> | <XMLSERIALIZE: "xmlserialize"> | <XMLTABLE: "xmltable"> | <XMLTEXT: "xmltext"> | <XMLVALIDATE: "xmlvalidate"> }

<DEFAULT> TOKEN : { <DATALINK: "datalink"> | <DLNEWCOPY: "dlnewcopy"> | <DLPREVIOUSCOPY: "dlpreviouscopy"> | <DLURLCOMPLETE: "dlurlcomplete"> | <DLURLCOMPLETEWRITE: "dlurlcompletewrite"> | <DLURLCOMPLETEONLY: "dlurlcompleteonly"> | <DLURLPATH: "dlurlpath"> | <DLURLPATHWRITE: "dlurlpathwrite"> | <DLURLPATHONLY: "dlurlpathonly"> | <DLURLSCHEME: "dlurlscheme"> | <DLURLSERVER: "dlurlserver"> | <DLVALUE: "dlvalue"> | <IMPORT: "import"> }

<DEFAULT> TOKEN : { <ALL_IN_GROUP: <ID> <PERIOD> <STAR>> | <ID: <QUOTED_ID> (<PERIOD> <QUOTED_ID>)*> | <#QUOTED_ID: <ID_PART> | "\"" ("\"\"" | ~["\""])+ "\""> | <#ID_PART: ("@" | "#" | <LETTER>) (<LETTER> | "_" | <DIGIT>)*> | <DATETYPE: "{" "d"> | <TIMETYPE: "{" "t"> | <TIMESTAMPTYPE: "{" "ts"> | <BOOLEANTYPE: "{" "b"> | <POS_REF: ["$"] (<DIGIT>)+> | <INTEGERVAL: (<MINUS>)? (<DIGIT>)+> | <FLOATVAL: (<MINUS>)? (<DIGIT>)* <PERIOD> (<DIGIT>)+ (["e","E"] (["+","-"])? (<DIGIT>)+)?> | <STRINGVAL: ("N" | "E")? "\'" ("\'\'" | ~["\'"])* "\'"> | <#LETTER: ["a"-"z","A"-"Z"] | ["\u0153"-"\ufffd"]> | <#DIGIT: ["0"-"9"]> }

<DEFAULT> TOKEN : { <COMMA: ","> | <PERIOD: "."> | <LPAREN: "("> | <RPAREN: ")"> | <LBRACE: "{"> | <RBRACE: "}"> | <LSBRACE: "["> | <RSBRACE: "]"> | <EQ: "="> | <NE: "<>"> | <NE2: "!="> | <LT: "<"> | <LE: "<="> | <GT: ">"> | <GE: ">="> | <STAR: "*"> | <SLASH: "/"> | <PLUS: "+"> | <MINUS: "-"> | <QMARK: "?"> | <DOLLAR: "$"> | <SEMICOLON: ";"> | <COLON: ":"> | <CONCAT_OP: "||"> }

stringVal

::= ( <STRINGVAL> )

id

::= ( <ID> )

command

::= ( createUpdateProcedure | userCommand | callableStatement ) ( <SEMICOLON> )? <EOF>

designerCommand

::= ( updateProcedure | userCommand ) ( <SEMICOLON> )? <EOF>

updateProcedure

::= ( createUpdateProcedure | forEachRowTriggerAction ) <EOF>

createTrigger

::= <CREATE> <TRIGGER> <ON> id nonReserved <OF> ( <INSERT> | <UPDATE> | <DELETE> ) <AS> forEachRowTriggerAction

alter

::= <ALTER> ( ( nonReserved id <AS> queryExpression ) | ( <PROCEDURE> id <AS> statement ) | ( <TRIGGER> <ON> id nonReserved <OF> ( <INSERT> | <UPDATE> | <DELETE> ) ( ( <AS> forEachRowTriggerAction ) | nonReserved ) ) )

forEachRowTriggerAction

::= <FOR> <EACH> <ROW> ( ( <BEGIN> ( <ATOMIC> )? ( statement )* <END> ) | statement )

userCommand

::= ( queryExpression | storedProcedure | insert | update | delete | dropTable | createTempTable | alter | createTrigger )

dropTable

::= <DROP> <TABLE> id

createTempTable

::= <CREATE> <LOCAL> <TEMPORARY> <TABLE> id <LPAREN> tableElement ( <COMMA> tableElement )* ( <COMMA> <PRIMARY> nonReserved <LPAREN> id ( <COMMA> id )* <RPAREN> )? <RPAREN>

tableElement

::= id ( dataTypeString | nonReserved ) ( <NOT> <NULL> )?

errorStatement

::= <ERROR> expression

statement

::= ( ( ( id <COLON> )? ( loopStatement | whileStatement | compoundStatement ) ) | ( ifStatement | delimitedStatement ) )

delimitedStatement

::= ( assignStatement | sqlStatement | errorStatement | declareStatement | branchingStatement ) <SEMICOLON>

compoundStatement

::= <BEGIN> ( ( <NOT> )? <ATOMIC> )? ( statement )* <END>

branchingStatement

::= ( ( ( <BREAK> | <CONTINUE> ) ( id )? ) | ( <LEAVE> id ) )

whileStatement

::= <WHILE> <LPAREN> criteria <RPAREN> statement

loopStatement

::= <LOOP> <ON> <LPAREN> queryExpression <RPAREN> <AS> id statement

ifStatement

::= <IF> <LPAREN> criteria <RPAREN> statement ( <ELSE> statement )?

criteriaSelector

::= ( ( <EQ> | <NE> | <NE2> | <LE> | <GE> | <LT> | <GT> | <IN> | <LIKE> | ( <IS> <NULL> ) | <BETWEEN> ) )? <CRITERIA> ( <ON> <LPAREN> id ( <COMMA> id )* <RPAREN> )?

hasCriteria

::= <HAS> criteriaSelector

declareStatement

::= <DECLARE> dataType id ( ( nonReserved | <EQ> ) assignStatementOperand )?

assignStatement

::= id ( nonReserved | <EQ> ) assignStatementOperand

assignStatementOperand

::= ( ( insert ) | update | delete | ( expression ) | queryExpression )

sqlStatement

::= ( ( userCommand ) | dynamicCommand | ( id ( nonReserved | <EQ> ) storedProcedure ) )

translateCriteria

::= <TRANSLATE> criteriaSelector ( <WITH> <LPAREN> id <EQ> expression ( <COMMA> id <EQ> expression )* <RPAREN> )?

createUpdateProcedure

::= <CREATE> ( <VIRTUAL> )? ( <UPDATE> )? <PROCEDURE> statement

dynamicCommand

::= ( <EXECUTE> | <EXEC> ) ( ( <STRING> | <IMMEDIATE> ) )? expression ( <AS> createElementsWithTypes ( <INTO> id )? )? ( <USING> setClauseList )? ( <UPDATE> ( ( <INTEGERVAL> ) | ( <STAR> ) ) )?

setClauseList

::= id <EQ> ( <COMMA> id <EQ> )*

createElementsWithTypes

::= id dataTypeString ( <COMMA> id dataTypeString )*

callableStatement

::= <LBRACE> ( <QMARK> <EQ> )? <CALL> id ( <LPAREN> ( executeUnnamedParams ) <RPAREN> )? <RBRACE> ( option )?

storedProcedure

::= ( ( <EXEC> | <EXECUTE> | <CALL> ) id <LPAREN> ( executeNamedParams | executeUnnamedParams ) <RPAREN> ) ( option )?

executeUnnamedParams

::= ( expression ( <COMMA> expression )* )?

executeNamedParams

::= ( id <EQ> ( <GT> )? expression ( <COMMA> id <EQ> ( <GT> )? expression )* )

insert

::= <INSERT> <INTO> id ( columnList )? ( ( <VALUES> <LPAREN> expressionList <RPAREN> ) | ( queryExpression ) ) ( option )?

columnList

::= <LPAREN> id ( <COMMA> id )* <RPAREN>

expressionList

::= expression ( <COMMA> expression )*

update

::= <UPDATE> id <SET> setClauseList ( where )? ( option )?

delete

::= <DELETE> <FROM> id ( where )? ( option )?

queryExpression

::= ( <WITH> withListElement ( <COMMA> withListElement )* )? queryExpressionBody

withListElement

::= id ( columnList )? <AS> <LPAREN> queryExpression <RPAREN>

queryExpressionBody

::= queryTerm ( ( <UNION> | <EXCEPT> ) ( <ALL> | <DISTINCT> )? queryTerm )* ( orderby )? ( limit )? ( option )?

queryTerm

::= queryPrimary ( <INTERSECT> ( <ALL> | <DISTINCT> )? queryPrimary )*

queryPrimary

::= ( query | ( <TABLE> id ) | ( <LPAREN> queryExpressionBody <RPAREN> ) )

query

::= select ( into )? ( from ( where )? ( groupBy )? ( having )? )?

into

::= <INTO> ( id )

select

::= <SELECT> ( <ALL> | ( <DISTINCT> ) )? ( <STAR> | ( selectSymbol ( <COMMA> selectSymbol )* ) )

selectSymbol

::= ( selectExpression | allInGroupSymbol )

selectExpression

::= ( expression ( ( <AS> )? id )? )

derivedColumn

::= ( expression ( <AS> id )? )

allInGroupSymbol

::= <ALL_IN_GROUP>

orderedAgg

::= ( <XMLAGG> | <ARRAY_AGG> ) <LPAREN> expression ( orderby )? <RPAREN> filterClause

textAgg

::= nonReserved <LPAREN> <FOR> derivedColumn ( <COMMA> derivedColumn )* ( <ID> charVal )? ( ( <ID> charVal ) )? ( <ID> )? ( ( <ID> id ) )? ( orderby )? <RPAREN> filterClause

aggregateSymbol

::= ( ( ( nonReserved <LPAREN> <STAR> <RPAREN> ) | ( nonReserved <LPAREN> <RPAREN> ) | ( ( nonReserved | <ANY> | <SOME> ) <LPAREN> ( <DISTINCT> | <ALL> )? expression <RPAREN> ) ) filterClause )

filterClause

::= ( <FILTER> <LPAREN> <WHERE> booleanPrimary <RPAREN> )?

from

::= <FROM> ( tableReference ( <COMMA> tableReference )* )

tableReference

::= ( ( <LBRACE> nonReserved joinedTable <RBRACE> ) | joinedTable )

joinedTable

::= tablePrimary ( ( crossJoin | qualifiedJoin ) )*

crossJoin

::= ( ( <CROSS> | <UNION> ) <JOIN> tablePrimary )

qualifiedJoin

::= ( ( ( <RIGHT> ( <OUTER> )? ) | ( <LEFT> ( <OUTER> )? ) | ( <FULL> ( <OUTER> )? ) | <INNER> )? <JOIN> tableReference <ON> criteria )

tablePrimary

::= ( textTable | arrayTable | xmlTable | unaryFromClause | subqueryFromClause | ( <LPAREN> joinedTable <RPAREN> ) ) ( ( <MAKEDEP> ) | ( <MAKENOTDEP> ) )?

xmlSerialize

::= <XMLSERIALIZE> <LPAREN> ( nonReserved )? expression ( <AS> ( <STRING> | <VARCHAR> | <CLOB> ) )? <RPAREN>

nonReserved

::= <ID>

arrayTable

::= <ID> <LPAREN> expression nonReserved createElementsWithTypes <RPAREN> ( <AS> )? id

textTable

::= <ID> <LPAREN> expression nonReserved textColumn ( <COMMA> textColumn )* ( <NO> <ROW> nonReserved )? ( <ID> charVal )? ( ( <ESCAPE> charVal ) | ( <ID> charVal ) )? ( <ID> ( intVal )? )? ( <ID> intVal )? <RPAREN> ( <AS> )? id

textColumn

::= id dataType ( <ID> intVal ( <NO> nonReserved )? )?

xmlQuery

::= <XMLQUERY> <LPAREN> ( xmlNamespaces <COMMA> )? stringVal ( <ID> derivedColumn ( <COMMA> derivedColumn )* )? ( ( <NULL> | nonReserved ) <ON> nonReserved )? <RPAREN>

xmlTable

::= <XMLTABLE> <LPAREN> ( xmlNamespaces <COMMA> )? stringVal ( <ID> derivedColumn ( <COMMA> derivedColumn )* )? ( <ID> xmlColumn ( <COMMA> xmlColumn )* )? <RPAREN> ( <AS> )? id

xmlColumn

::= id ( ( <FOR> nonReserved ) | ( dataType ( <DEFAULT_KEYWORD> expression )? ( nonReserved stringVal )? ) )

intVal

::= <INTEGERVAL>

subqueryFromClause

::= ( <TABLE> )? <LPAREN> ( queryExpression | storedProcedure ) <RPAREN> ( <AS> )? id

unaryFromClause

::= ( <ID> ( ( <AS> )? id )? )

where

::= <WHERE> criteria

criteria

::= compoundCritOr

compoundCritOr

::= compoundCritAnd ( <OR> compoundCritAnd )*

compoundCritAnd

::= notCrit ( <AND> notCrit )*

notCrit

::= ( <NOT> )? booleanPrimary

booleanPrimary

::= ( translateCriteria | ( commonValueExpression ( ( betweenCrit | matchCrit | regexMatchCrit | setCrit | isNullCrit | subqueryCompareCriteria | compareCrit ) )? ) | existsCriteria | hasCriteria )

operator

::= ( <EQ> | <NE> | <NE2> | <LT> | <LE> | <GT> | <GE> )

compareCrit

::= operator commonValueExpression

subquery

::= <LPAREN> ( queryExpression | ( storedProcedure ) ) <RPAREN>

subqueryAndHint

::= subquery

subqueryCompareCriteria

::= operator ( <ANY> | <SOME> | <ALL> ) subquery

matchCrit

::= ( <NOT> )? ( <LIKE> | ( <SIMILAR> <TO> ) ) commonValueExpression ( <ESCAPE> charVal | ( <LBRACE> <ESCAPE> charVal <RBRACE> ) )?

regexMatchCrit

::= ( <NOT> )? <LIKE_REGEX> commonValueExpression

charVal

::= stringVal

betweenCrit

::= ( <NOT> )? <BETWEEN> commonValueExpression <AND> commonValueExpression

isNullCrit

::= <IS> ( <NOT> )? <NULL>

setCrit

::= ( <NOT> )? <IN> ( ( subqueryAndHint ) | ( <LPAREN> commonValueExpression ( <COMMA> commonValueExpression )* <RPAREN> ) )

existsCriteria

::= <EXISTS> subqueryAndHint

groupBy

::= <GROUP> <BY> expressionList

having

::= <HAVING> criteria

orderby

::= <ORDER> <BY> sortSpecification ( <COMMA> sortSpecification )*

sortSpecification

::= sortKey ( <ASC> | <DESC> )? ( nonReserved nonReserved )?

sortKey

::= expression

intParam

::= ( intVal | <QMARK> )

limit

::= ( ( <LIMIT> intParam ( <COMMA> intParam )? ) | ( <OFFSET> intParam ( <ROW> | <ROWS> ) ( fetchLimit )? ) | ( fetchLimit ) )

fetchLimit

::= <FETCH> nonReserved ( intParam )? ( <ROW> | <ROWS> ) <ONLY>

option

::= <OPTION> ( <MAKEDEP> id ( <COMMA> id )* | <MAKENOTDEP> id ( <COMMA> id )* | <NOCACHE> ( id ( <COMMA> id )* )? )*

expression

::= criteria

commonValueExpression

::= ( plusExpression ( <CONCAT_OP> plusExpression )* )

plusExpression

::= ( timesExpression ( plusOperator timesExpression )* )

plusOperator

::= ( <PLUS> | <MINUS> )

timesExpression

::= ( valueExpressionPrimary ( timesOperator valueExpressionPrimary )* )

timesOperator

::= ( <STAR> | <SLASH> )

valueExpressionPrimary

::= ( <QMARK> | <POS_REF> | literal | ( <LBRACE> nonReserved function <RBRACE> ) | ( textAgg ( windowSpecification )? ) | ( aggregateSymbol ( windowSpecification )? ) | ( aggregateSymbol ( windowSpecification )? ) | orderedAgg ( windowSpecification )? | ( aggregateSymbol windowSpecification ) | ( function ) | ( <ID> ( <LSBRACE> intVal <RSBRACE> )? ) | subquery | ( <LPAREN> expression <RPAREN> ( <LSBRACE> intVal <RSBRACE> )? ) | searchedCaseExpression | caseExpression )

windowSpecification

::= <OVER> <LPAREN> ( <PARTITION> <BY> expressionList )? ( orderby )? <RPAREN>

caseExpression

::= <CASE> expression ( <WHEN> expression <THEN> expression )+ ( <ELSE> expression )? <END>

searchedCaseExpression

::= <CASE> ( <WHEN> criteria <THEN> expression )+ ( <ELSE> expression )? <END>

function

::= ( ( <CONVERT> <LPAREN> expression <COMMA> dataType <RPAREN> ) | ( <CAST> <LPAREN> expression <AS> dataType <RPAREN> ) | ( nonReserved <LPAREN> expression <FROM> expression ( <FOR> expression )? <RPAREN> ) | ( nonReserved <LPAREN> ( <YEAR> | <MONTH> | <DAY> | <HOUR> | <MINUTE> | <SECOND> ) <FROM> expression <RPAREN> ) | ( nonReserved <LPAREN> ( ( ( ( <LEADING> | <TRAILING> | <BOTH> ) ( expression )? ) | expression ) <FROM> )? expression <RPAREN> ) | ( nonReserved <LPAREN> expression <COMMA> stringConstant <RPAREN> ) | ( nonReserved <LPAREN> intervalType <COMMA> expression <COMMA> expression <RPAREN> ) | queryString | ( ( <LEFT> | <RIGHT> | <CHAR> | <USER> | <YEAR> | <MONTH> | <HOUR> | <MINUTE> | <SECOND> | <XMLCONCAT> | <XMLCOMMENT> ) <LPAREN> ( expressionList )? <RPAREN> ) | ( ( <TRANSLATE> | <INSERT> ) <LPAREN> ( expressionList )? <RPAREN> ) | xmlParse | xmlElement | ( <XMLPI> <LPAREN> ( <ID> idExpression | idExpression ) ( <COMMA> expression )? <RPAREN> ) | xmlForest | xmlSerialize | xmlQuery | ( id <LPAREN> ( expressionList )? <RPAREN> ) )

stringConstant

::= stringVal

xmlParse

::= <XMLPARSE> <LPAREN> nonReserved expression ( nonReserved )? <RPAREN>

queryString

::= nonReserved <LPAREN> expression ( <COMMA> derivedColumn )* <RPAREN>

xmlElement

::= <XMLELEMENT> <LPAREN> ( <ID> id | id ) ( <COMMA> xmlNamespaces )? ( <COMMA> xmlAttributes )? ( <COMMA> expression )* <RPAREN>

xmlAttributes

::= <XMLATTRIBUTES> <LPAREN> derivedColumn ( <COMMA> derivedColumn )* <RPAREN>

xmlForest

::= <XMLFOREST> <LPAREN> ( xmlNamespaces <COMMA> )? derivedColumn ( <COMMA> derivedColumn )* <RPAREN>

xmlNamespaces

::= <XMLNAMESPACES> <LPAREN> namespaceItem ( <COMMA> namespaceItem )* <RPAREN>

namespaceItem

::= ( stringVal <AS> id )

::= ( <NO> <DEFAULT_KEYWORD> )

::= ( <DEFAULT_KEYWORD> stringVal )

idExpression

::= id

dataTypeString

::= ( <STRING> | <VARCHAR> | <BOOLEAN> | <BYTE> | <TINYINT> | <SHORT> | <SMALLINT> | <CHAR> | <INTEGER> | <LONG> | <BIGINT> | <BIGINTEGER> | <FLOAT> | <REAL> | <DOUBLE> | <BIGDECIMAL> | <DECIMAL> | <DATE> | <TIME> | <TIMESTAMP> | <OBJECT> | <BLOB> | <CLOB> | <XML> )

dataType

::= dataTypeString

intervalType

::= ( nonReserved )

literal

::= ( stringVal | <INTEGERVAL> | <FLOATVAL> | <FALSE> | <TRUE> | <UNKNOWN> | <NULL> | ( ( <BOOLEANTYPE> | <TIMESTAMPTYPE> | <DATETYPE> | <TIMETYPE> ) stringVal <RBRACE> ) )