All versions: 3.12 | 3.11 | 3.10 | Development versions: 3.13

SQL Parser Grammar

Available in ✅ Open Source Edition   ✅ Express Edition   ✅ Professional Edition   ✅ Enterprise Edition

The existing implementation of the SQL parser is a hand-written, recursive descent parser. There are great advantages of this approach over formal grammar-based, generated parsers (e.g. by using ANTLR). These advantages are, among others:

  • They can be tuned easily for performance
  • They are very simple and easy to maintain
  • It's easy to implement corner cases of the grammar, which might require context (that's a big plus with SQL)
  • It's the easiest way to bind a grammar to an existing backing expression tree implementation (which is what jOOQ really is)

Nevertheless, there is a grammar available for documentation purposes and it is included in the manual here:

(The layout of the grammar and the grammar itself is still work in progress)

batch ::=

; query

query ::=

ddlStatement dmlStatement blockStatement

ddlStatement ::=

alterTableStatement alterIndexStatement alterSchemaStatement alterSequenceStatement alterSessionStatement alterViewStatement commentStatement createTableStatement createTypeStatement createIndexStatement createSchemaStatement createSequenceStatement createViewStatement dropTableStatement dropTypeStatement dropIndexStatement dropViewStatement dropSequenceStatement dropSchemaStatement grantStatement renameStatement revokeStatement setCatalogStatement setSchemaStatement truncateStatement useStatement

dmlStatement ::=

deleteStatement insertStatement mergeStatement selectStatement updateStatement

proceduralStatements ::=

proceduralStatement ;

proceduralStatement ::=

label query declareStatement assignmentStatement ifStatement labelReference caseStatement labelReference loopStatement labelReference forStatement labelReference whileStatement labelReference repeatStatement labelReference gotoStatement continueStatement exitStatement nullStatement

label ::=

<< identifier >> identifier :

labelReference ::=

identifier

blockStatement ::=

EXECUTE BLOCK AS DECLARE declarationStatement ; BEGIN proceduralStatements END DO stringLiteral

declarationStatement ::=

identifier CONSTANT dataType NOT NULL = := DEFAULT field

declareStatement ::=

DECLARE , , identifier AS dataType = DEFAULT field

assignmentStatement ::=

SET identifier = field identifier := field

ifStatement ::=

IF condition THEN proceduralStatements ELSIF ELSEIF condition THEN proceduralStatements ELSE proceduralStatements END IF proceduralStatement ELSE proceduralStatement

caseStatement ::=

CASE field WHEN field THEN proceduralStatements WHEN condition THEN proceduralStatements ELSE proceduralStatements END CASE

loopStatement ::=

LOOP proceduralStatements END LOOP

forStatement ::=

FOR identifier IN REVERSE signedInteger .. signedInteger BY signedInteger loopStatement

whileStatement ::=

WHILE condition loopStatement DO proceduralStatements END WHILE

repeatStatement ::=

REPEAT proceduralStatements UNTIL condition END REPEAT

gotoStatement ::=

GOTO identifier

continueStatement ::=

CONTINUE ITERATE identifier WHEN condition

exitStatement ::=

EXIT LEAVE identifier WHEN condition

nullStatement ::=

NULL

alterTableStatement ::=

ALTER TABLE IF EXISTS ONLY tableName ADD constraint CONSTRAINT constraintName constraint COLUMN IF NOT EXISTS column ( , CONSTRAINT constraintName constraint constraint column ) ALTER MODIFY COLUMN identifier SET DATA TYPE dataType NOT NULL SET DROP NOT NULL NOT NULL RENAME TO AS identifier column ( column ) COMMENT = stringLiteral DROP COLUMN IF EXISTS identifier CASCADE RESTRICT CONSTRAINT FOREIGN KEY constraintName PRIMARY KEY constraintName RENAME COLUMN INDEX CONSTRAINT identifier TO AS identifier

alterIndexStatement ::=

ALTER INDEX IF EXISTS indexName RENAME TO AS indexName

alterSchemaStatement ::=

ALTER SCHEMA IF EXISTS schemaName RENAME TO AS schemaName

alterSequenceStatement ::=

ALTER SEQUENCE IF EXISTS sequenceName RENAME TO AS sequenceName RESTART WITH unsignedInteger SET GENERATOR sequenceName TO unsignedInteger

alterSessionStatement ::=

ALTER SESSION SET CURRENT_SCHEMA = schemaName

alterViewStatement ::=

ALTER VIEW IF EXISTS tableName RENAME TO AS tableName

commentStatement ::=

COMMENT ON COLUMN fieldName TABLE tableName VIEW tableName IS stringLiteral

createTableStatement ::=

CREATE GLOBAL TEMPORARY TABLE IF NOT EXISTS tableName ( identifiers ) AS select ( , CONSTRAINT constraintName constraint constraint index column ) ON COMMIT DELETE ROWS DROP PRESERVE ROWS COMMENT = stringLiteral

createTypeStatement ::=

CREATE TYPE typeName AS ENUM ( , stringLiteral )

createIndexStatement ::=

CREATE UNIQUE INDEX IF NOT EXISTS indexName ON tableName USING BTREE ( sortFields ) INCLUDE ( identifiers ) WHERE condition

createSchemaStatement ::=

CREATE SCHEMA IF NOT EXISTS schemaName

createSequenceStatement ::=

CREATE SEQUENCE GENERATOR IF NOT EXISTS sequenceName START WITH signedInteger INCREMENT BY signedInteger MINVALUE signedInteger NO MINVALUE NOMINVALUE MAXVALUE signedInteger NO MAXVALUE NOMAXVALUE CYCLE NO CYCLE NOCYCLE CACHE unsignedInteger NO CACHE NOCACHE

createViewStatement ::=

CREATE OR ALTER REPLACE VIEW IF NOT EXISTS tableName ( fieldNames ) AS select

dropTableStatement ::=

DROP TEMPORARY TABLE IF EXISTS tableName CASCADE RESTRICT

dropTypeStatement ::=

DROP TYPE IF EXISTS , typeName CASCADE RESTRICT

dropIndexStatement ::=

DROP INDEX IF EXISTS indexName ON tableName

dropViewStatement ::=

DROP VIEW IF EXISTS tableName

dropSequenceStatement ::=

DROP SEQUENCE GENERATOR IF EXISTS sequenceName

dropSchemaStatement ::=

DROP SCHEMA IF EXISTS schemaName CASCADE RESTRICT

renameStatement ::=

RENAME COLUMN fieldName TO AS fieldName INDEX indexName TO AS indexName SCHEMA schemaName TO AS schemaName SEQUENCE sequenceName TO AS sequenceName VIEW tableName TO AS tableName TABLE tableName TO AS tableName

setCatalogStatement ::=

SET CATALOG catalogName

setSchemaStatement ::=

SET CURRENT SCHEMA CURRENT SQLID = schemaName stringLiteral

useStatement ::=

USE catalogName schemaName

truncateStatement ::=

TRUNCATE TABLE tableName CONTINUE IDENTITY RESTART IDENTITY CASCADE RESTRICT

grantStatement ::=

GRANT SELECT INSERT UPDATE DELETE ON tableName TO userName roleName PUBLIC WITH GRANT OPTION

revokeStatement ::=

REVOKE GRANT OPTION FOR SELECT INSERT UPDATE DELETE ON tableName FROM userName roleName PUBLIC

selectStatement ::=

select

insertStatement ::=

with INSERT INS INTO tableName ( select ) AS identifier ( identifiers ) values DEFAULT VALUES SET setClauses select ON DUPLICATE KEY UPDATE SET setClauses WHERE condition ON DUPLICATE KEY IGNORE ON CONFLICT ON CONSTRAINT constraintName ( fieldNames ) DO NOTHING UPDATE SET setClauses WHERE condition RETURNING * fields

values ::=

VALUES , ( fields )

updateStatement ::=

with UPDATE UPD topSimple tableName ( select ) AS identifier SET setClauses FROM tables WHERE condition ORDER BY sortFields LIMIT unsignedInteger RETURNING * fields

setClauses ::=

, setClause

setClause ::=

fieldName = field

deleteStatement ::=

with DELETE DEL topSimple FROM tableName ( select ) AS identifier WHERE condition ORDER BY sortFields LIMIT unsignedInteger RETURNING * fields

mergeStatement ::=

with MERGE INTO tableName AS identifier USING ( select ) AS identifier ON condition WHEN MATCHED AND condition THEN UPDATE SET setClauses WHERE condition WHEN NOT MATCHED AND condition THEN INSERT ( identifiers ) VALUES ( fields ) WHERE condition

column ::=

identifier dataType NOT NULL DEFAULT ON NULL concat ON UPDATE concat GENERATED ALWAYS BY DEFAULT ON NULL AS IDENTITY ( identity ) CONSTRAINT constraintName PRIMARY KEY UNIQUE KEY INDEX CHECK ( condition ) REFERENCES constraintReferenceSpecification AUTO_INCREMENT AUTOINCREMENT IDENTITY ( signedInteger , signedInteger ) COMMENT stringLiteral

index ::=

KEY INDEX identifier ( sortFields )

constraint ::=

PRIMARY KEY ( fieldNames ) UNIQUE KEY INDEX identifier ( sortFields ) FOREIGN KEY ( fieldNames ) REFERENCES constraintReferenceSpecification CHECK ( condition ) ENABLE

constraintReferenceSpecification ::=

tableName ( fieldNames ) ON DELETE UPDATE CASCADE NO ACTION RESTRICT SET DEFAULT SET NULL

identity ::=

identityProperty , identityProperty

identityProperty ::=

START WITH LIMIT VALUE unsignedInteger INCREMENT BY unsignedInteger MAXVALUE unsignedInteger NOMAXVALUE MINVALUE unsignedInteger NOMINVALUE CACHE unsignedInteger NOCACHE CYCLE NOCYCLE ORDER NOORDER

with ::=

WITH RECURSIVE , commonTableExpression

commonTableExpression ::=

identifier ( identifiers ) AS ( select )

select ::=

with queryExpressionBody orderBy seekFetch offsetFetch forUpdate values

queryExpressionBody ::=

queryTerm UNION EXCEPT MINUS ALL DISTINCT queryTerm

queryTerm ::=

queryPrimary INTERSECT ALL DISTINCT queryTerm

queryPrimary ::=

( select ) SELECT SEL distinct top selectList INTO tableName tableExpression

distinct ::=

DISTINCT UNIQUE ON ( fields ) ALL

topSimple ::=

TOP unsignedInteger PERCENT

top ::=

TOP unsignedInteger PERCENT START AT unsignedInteger WITH TIES SKIP unsignedInteger FIRST unsignedInteger

selectList ::=

, selectField

selectField ::=

* EXCEPT ( fields ) tableName . * EXCEPT ( fields ) field AS identifier

tableExpression ::=

FROM tables WHERE condition connectBy groupBy HAVING condition WINDOW windows QUALIFY condition

connectBy ::=

START WITH condition CONNECT BY NOCYCLE condition CONNECT BY NOCYCLE condition START WITH condition

groupBy ::=

GROUP BY () ROLLUP ( fields ) CUBE ( fields ) GROUPING SETS ( , groupingSet ) fields WITH ROLLUP

groupingSet ::=

( fields )

windows ::=

, window

window ::=

identifier AS ( windowSpecification )

windowSpecification ::=

PARTITION BY fields ORDER BY sortFields ROWS RANGE GROUPS BETWEEN rangeBound AND rangeBound rangeBound EXCLUDE CURRENT ROW TIES GROUPS NO OTHERS

orderBy ::=

ORDER SIBLINGS BY sortFields

seekFetch ::=

SEEK , field FETCH FIRST NEXT unsignedInteger PERCENT ROW ROWS ONLY WITH TIES LIMIT unsignedInteger PERCENT WITH TIES

offsetFetch ::=

OFFSET unsignedInteger ROW ROWS FETCH FIRST NEXT unsignedInteger PERCENT ROW ROWS ONLY WITH TIES LIMIT unsignedInteger PERCENT WITH TIES LIMIT unsignedInteger PERCENT WITH TIES OFFSET unsignedInteger , unsignedInteger

forUpdate ::=

FOR SHARE FOR KEY SHARE FOR NO KEY UPDATE FOR UPDATE OF fields NOWAIT WAIT unsignedInteger SKIP LOCKED

sortFields ::=

, sortField

sortField ::=

field ASC DESC NULLS FIRST NULLS LAST

tables ::=

, table

table ::=

lateral unqualifiedJoin innerJoin outerJoin semiAntiJoin

optionallyQualifiedJoin ::=

CROSS JOIN table joinQualification lateral

unqualifiedJoin ::=

CROSS APPLY OUTER APPLY NATURAL LEFT RIGHT FULL OUTER JOIN lateral

innerJoin ::=

INNER JOIN STRAIGHT_JOIN table joinQualification

outerJoin ::=

LEFT RIGHT FULL OUTER JOIN table PARTITION BY ( fields ) joinQualification

semiAntiJoin ::=

LEFT SEMI ANTI JOIN table joinQualification

lateral ::=

LATERAL tableFactor tableFactor

tableFactor ::=

tableName versions correlationName tableHints ( table ) correlationName ( select ) correlationName tableFunction correlationName UNNEST ( field ) values correlationName

tableFunction ::=

GENERATE_SERIES ( numericOp , numericOp , numericOp )

tableHints ::=

WITH ( , tableHint )

pivot ::=

todo

versions ::=

VERSIONS BETWEEN SCN TIMESTAMP MINVALUE field AND MAXVALUE field AS OF SCN TIMESTAMP

joinQualification ::=

ON condition USING ( identifiers )

correlationName ::=

AS identifier ( identifiers )

fields ::=

, field

field ::=

or

condition ::=

or

or ::=

OR and

and ::=

AND not

not ::=

NOT predicate

predicate ::=

EXISTS ( select ) UNIQUE ( select ) concat comparator ALL ANY SOME ( select ) concat IS NOT NULL JSON DISTINCT FROM concat NOT IN ( select fields ) BETWEEN SYMMETRIC concat AND concat REGEXP RLIKE LIKE_REGEX concat LIKE ANY ALL ( , concat ) ESCAPE characterLiteral LIKE ILIKE concat ESCAPE characterLiteral SIMILAR TO concat ESCAPE characterLiteral @> concat concat *= concat concat =* concat row2 OVERLAPS row2 REGEXP_LIKE ( concat , concat )

row2 ::=

ROW ( field , field )

concat ::=

|| collated

collated ::=

numericOp COLLATE collation

numericOp ::=

sum << >> sum

sum ::=

factor + - factor

factor ::=

exp * / % MOD exp

exp ::=

^ unaryOps

unaryOps ::=

+ - CONNECT_BY_ROOT term (+) :: dataType

term ::=

: identifier ? stringLiteral ANY ( field ) filter over ACOS ( numericOp ) ARRAY_AGG ( DISTINCT field ORDER BY sortFields ) filter over ASCII ( field ) ASIN ( numericOp ) ATAN ( numericOp ) ATN2 ATAN2 ( numericOp , numericOp ) ARRAY [ fields ] AVG ( DISTINCT ALL field ) keep filter over BIN_AND ( field , field ) BIN_SHL ( field , field ) BIN_SHR ( field , field ) BIN_OR ( field , field ) BIN_XOR ( field , field ) BITAND ( field , field ) BITOR ( field , field ) BITXOR ( field , field ) BIT_AND ( field , field ) BIT_COUNT ( field ) BIT_LENGTH ( field ) BIT_NAND ( field , field ) BIT_NOR ( field , field ) BIT_NOT ( field , field ) BIT_OR ( field , field ) BIT_XNOR ( field , field ) BITXOR ( field , field ) BIT_XOR ( field , field ) case CAST ( field AS castDataType ) CEIL CEILING ( numericOp ) CENTURY ( field ) CHARINDEX ( field , field ) CHAR_LENGTH ( field ) CHOOSE ( , field ) COALESCE ( fields ) CONCAT ( fields ) CONNECT_BY_ISCYCLE CONNECT_BY_ISLEAF CONVERT ( dataType , field , unsignedInteger ) COS ( numericOp ) COSH ( numericOp ) COT ( numericOp ) COTH ( numericOp ) COUNT ( * DISTINCT ALL field ) keep filter over CUME_DIST ( ) over ( fields ) withinGroup CURRVAL ( name stringLiteral ) CURRENT DATE CURRENT_DATE ( ) CURRENT SCHEMA CURRENT_SCHEMA ( ) CURRENT TIME CURRENT_TIME ( ) CURRENT TIMESTAMP CURRENT_TIMESTAMP ( unsignedInteger ) CURRENT USER CURRENT_USER ( ) CURDATE ( ) CURTIME ( ) dateLiteral DATEADD ( datePart , field , field ) DATEDIFF ( datePart , field , field ) DATEPART ( datePart , field ) DATE_TRUNC ( stringLiteral , field ) DAY ( field ) DAYOFMONTH ( field ) DAYOFWEEK ( field ) DECADE ( field ) DECODE ( field , field , , field ) DENSE_RANK ( ) over ( fields ) withinGroup DEG DEGREE DEGREES ( numericOp ) EPOCH ( field ) EXTRACT ( datePart FROM field ) EXP ( numericOp ) EVERY ( field ) filter over FLOOR ( numericOp ) FIELD ( field , , field ) FIRST_VALUE ( field RESPECT NULLS IGNORE NULLS ) over GETDATE ( ) GREATEST ( fields ) GROUP_CONCAT ( DISTINCT field ORDER BY sortFields SEPARATOR stringLiteral ) GROUP_ID ( ) GROUPING_ID ( fields ) GROUPING ( fields ) HOUR ( field ) IFNULL ( field , field ) INSTR ( field , field ) intervalLiteral IIF ( condition , field , field ) ISNULL ( field , field ) JSON_ARRAY ( fields ) JSON_OBJECT ( jsonEntries ) LOWER LCASE ( field ) LPAD ( field , field , field ) LTRIM ( field , field ) LEFT ( field , field ) LEN ( field ) LENGTH ( field ) LN ( numericOp ) LOG ( numericOp , numericOp ) LEVEL LEAST ( fields ) LEAD ( field , unsignedInteger , field RESPECT NULLS IGNORE NULLS ) over LAG ( field , unsignedInteger , field RESPECT NULLS IGNORE NULLS ) over LAST_VALUE ( field RESPECT NULLS IGNORE NULLS ) over LISTAGG ( field , stringLiteral ) withinGroup over MAX ( DISTINCT ALL field ) keep filter over MEDIAN ( field ) filter over MICROSECOND ( field ) MILLISECOND ( field ) MIN ( DISTINCT ALL field ) keep filter over MOD ( field , field ) MODE ( ) withinGroup over MONTH ( field ) MINUTE ( field ) MID ( field , field , field ) MD5 ( field ) NEXT VALUE FOR sequenceName NEXTVAL ( name stringLiteral ) NOW ( unsignedInteger ) NTH_VALUE ( field , unsignedInteger FROM FIRST FROM LAST RESPECT NULLS IGNORE NULLS ) over NTILE ( unsignedInteger ) over NULLIF ( field , field ) NVL ( field , field ) NVL2 ( field , field , field ) OCTET_LENGTH ( field ) PI ( ) POSITION ( field IN field ) PERCENT_RANK ( ) over ( fields ) withinGroup PERCENTILE_CONT PERCENTILE_DISC ( unsignedNumericLiteral ) withinGroup over POW POWER ( field , field ) PRIOR concat PRODUCT ( DISTINCT ALL field ) keep filter over QUARTER ( field ) REGR_SLOPE REGR_INTERCEPT REGR_COUNT REGR_R2 REGR_AVGX REGR_AVGY REGR_SXX REGR_SYY REGR_SXY ( numericOp , numericOp ) RAD RADIAN RADIANS ( numericOp ) RANK ( ) over ( fields ) withinGroup RATIO_TO_REPORT ( field ) over REPEAT ( field , field ) REPLACE OREPLACE ( field , field , field ) REVERSE ( field ) RIGHT ( field , field ) ROUND ( field , unsignedInteger ) ROW ( fields ) ROW_NUMBER ( ) over ROWNUM RPAD ( field , field , field ) RTRIM ( field , field ) SUBSTR SUBSTRING ( field , numericOp , numericOp ) SECOND ( field ) SHL SHIFTLEFT ( field , field ) SHR SHIFTRIGHT ( field , field ) SIGN ( field ) SQR SQRT ( numericOp ) SIN ( numericOp ) SINH ( numericOp ) SPACE ( field ) STDDEV_POP STDEVP ( field ) over STDDEV_SAMP STDEV ( field ) over STR_REPLACE ( field , field , field ) SUBSTRING ( field FROM numericOp FOR numericOp ) SUM ( DISTINCT ALL field ) keep filter over SYS_CONNECT_BY_PATH ( field stringLiteral ) TAN ( numericOp ) TANH ( numericOp ) timeLiteral timestampLiteral TIMEZONE ( field ) TIMEZONE_HOUR ( field ) TIMEZONE_MINUTE ( field ) TO_CHAR ( field ) TO_DATE ( field , field ) TO_NUMBER ( field ) TO_TIMESTAMP ( field , field ) TRANSLATE OTRANSLATE ( field , field , field ) TRIM ( field , field ) TRIM ( LEADING L TRAILING T BOTH B field FROM field ) TRUNC ( field , stringLiteral ) TRUNC ( numericOp , numericOp ) truthValue UNIX_TIMESTAMP ( field ) UPPER UCASE ( field ) VAR_POP ( field ) over VAR_SAMP ( field ) over WIDTH_BUCKET ( field , field , field , field ) binaryLiteral YEAR ( field ) unsignedNumericLiteral ( select ) ( fields ) { d stringLiteral } { t stringLiteral } { fn term } { ts stringLiteral } identifier ( , field )

jsonEntries ::=

, jsonEntry

jsonEntry ::=

KEY field VALUE field field field

truthValue ::=

TRUE FALSE NULL

datePart ::=

YEAR YYYY YY MONTH MM M DAY DD D HOUR HH MINUTE MI N SECOND SS S MILLISECOND MS MICROSECOND MCS NANOSECOND NS EPOCH QUARTER QQ Q WEEK WW WK ISO_DAY_OF_WEEK ISODOW DAY_OF_WEEK DAYOFWEEK WEEKDAY W DAY_OF_YEAR DAYOFYEAR DOY DY Y

keep ::=

KEEP ( DENSE_RANK FIRST LAST ORDER BY sortFields )

filter ::=

FILTER ( WHERE condition )

over ::=

FROM FIRST FROM LAST RESPECT NULLS IGNORE NULLS OVER identifier ( windowSpecification )

withinGroup ::=

WITHIN GROUP ( ORDER BY sortFields )

rangeBound ::=

UNBOUNDED unsignedInteger PRECEDING FOLLOWING CURRENT ROW

case ::=

CASE WHEN condition THEN field field WHEN field THEN field ELSE field END

comparator ::=

= != <> ^= >= > <=> <= <

castDataType ::=

dataType SIGNED INTEGER UNSIGNED INTEGER

dataType ::=

ARRAY BIGINT UNSIGNED BINARY ( unsignedInteger ) BIT ( unsignedInteger ) BLOB ( unsignedInteger ) BOOL BOOLEAN CHAR CHARACTER ( unsignedInteger ) BYTE CHAR COLLATE collationName CLOB ( unsignedInteger ) COLLATE collationName DATE DECIMAL ( * unsignedInteger , signedInteger ) DOUBLE PRECISION ( unsignedInteger , unsignedInteger ) ENUM ( stringLiteral , stringLiteral ) COLLATE collationName FLOAT ( unsignedInteger , unsignedInteger ) INT INTEGER ( unsignedInteger ) UNSIGNED LONGBLOB LONGTEXT COLLATE collationName LONG NVARCHAR ( unsignedInteger ) COLLATE collationName LONG VARBINARY ( unsignedInteger ) LONG VARCHAR ( unsignedInteger ) COLLATE collationName MEDIUMBLOB MEDIUMINT ( unsignedInteger ) UNSIGNED MEDIUMTEXT COLLATE collationName NCHAR ( unsignedInteger ) COLLATE collationName NCLOB COLLATE collationName NUMBER NUMERIC ( * unsignedInteger , signedInteger ) NVARCHAR ( unsignedInteger ) COLLATE collationName OTHER REAL ( unsignedInteger , unsignedInteger ) SERIAL SERIAL4 SERIAL8 SET ( stringLiteral , stringLiteral ) COLLATE collationName SMALLINT ( unsignedInteger ) UNSIGNED TEXT ( unsignedInteger ) COLLATE collationName TIMESTAMP ( unsignedInteger ) WITH WITHOUT TIME ZONE TIMESTAMPTZ ( unsignedInteger ) TIME ( unsignedInteger ) WITH WITHOUT TIME ZONE TIMETZ ( unsignedInteger ) TINYBLOB TINYINT ( unsignedInteger ) UNSIGNED TINYTEXT COLLATE collationName UUID VARCHAR CHARACTER VARYING ( unsignedInteger BYTE CHAR ) COLLATE collationName VARCHAR2 ( unsignedInteger ) BYTE CHAR COLLATE collationName VARBINARY ( unsignedInteger ) arraySuffix

arraySuffix ::=

ARRAY [ signedInteger ]

constraintName ::=

identifier

catalogName ::=

name

schemaName ::=

name

tableName ::=

name

typeName ::=

name

indexName ::=

name

sequenceName ::=

name

userName ::=

name

roleName ::=

name

fieldNames ::=

, fieldName

fieldName ::=

name

collation ::=

name

name ::=

. identifier

stringLiteral ::=

' character ' $ nonSpaceCharacter $ character $ nonSpaceCharacter $ q'[ characters ]' q'{ characters }' q'( characters )' q'< characters >' q' nonSpaceCharacter characters nonSpaceCharacter '

characterLiteral ::=

' character '

dateLiteral ::=

DATE stringLiteral

timeLiteral ::=

TIME stringLiteral

timestampLiteral ::=

TIMESTAMP stringLiteral

intervalLiteral ::=

INTERVAL stringLiteral field YEAR YEARS QUARTER QUARTERS MONTH MONTHS WEEK WEEKS DAY DAYS HOUR HOURS MINUTE MINUTES SECOND SECONDS MILLISECOND MILLISECONDS MICROSECOND MICROSECONDS NANOSECOND NANOSECONDS

signedInteger ::=

todo

unsignedInteger ::=

todo

unsignedNumericLiteral ::=

todo

identifiers ::=

, identifier

identifier ::=

identifierStart identifierPart " doubleQuotedIdentifierPart " ` backtickQuotedIdentifierPart ` [ brackedQuotedIdentifierPart ]

identifierStart ::=

todo

identifierPart ::=

todo

doubleQuotedIdentifierPart ::=

nonDoubleQuoteCharacter doubleQuote

backtickQuotedIdentifierPart ::=

nonBacktickCharacter doubleBacktick

brackedQuotedIdentifierPart ::=

nonClosingBracketCharacter doubleClosingBracket

nonDoubleQuoteCharacter ::=

todo

nonBacktickCharacter ::=

todo

nonClosingBracketCharacter ::=

todo

doubleQuote ::=

""

doubleBacktick ::=

``

doubleClosingBracket ::=

]]

The diagrams have been created with the neat RRDiagram library by Christopher Deckers.

The jOOQ Logo