SQL Support
MetaMatrix SQL Grammar
The following is specific to MetaMatrix release 5.5 or later.
TERMINALS
TOKEN: /* Data types */
{
<STRING: "string">
| <BOOLEAN: "boolean">
| <BYTE: "byte">
| <SHORT: "short">
| <CHAR: "char">
| <INTEGER: "integer">
| <LONG: "long">
| <BIGINTEGER: "biginteger">
| <FLOAT: "float">
| <DOUBLE: "double">
| <BIGDECIMAL: "bigdecimal">
| <DATE: "date">
| <TIME: "time">
| <TIMESTAMP: "timestamp">
| <OBJECT: "object">
| <BLOB: "blob">
| <CLOB: "clob">
| <XML: "xml">
}
TOKEN: /* Functions with special syntax */
{
<CAST: "cast">
| <CONVERT: "convert">
| <TIMESTAMPADD: "timestampadd">
| <TIMESTAMPDIFF: "timestampdiff">
/* aggregate */
| <COUNT: "count">
| <SUM: "sum">
| <AVG: "avg">
| <MIN: "min">
| <MAX: "max">
}
TOKEN : /* Reserved words */
{
<ALL: "all">
| <AND: "and">
| <ANY: "any">
| <AS: "as">
| <ASC: "asc">
| <BEGIN: "begin">
| <BETWEEN: "between">
| <BREAK: "break">
| <BY: "by">
| <CASE: "case">
| <CONTINUE: "continue">
| <CREATE: "create">
| <CRITERIA: "criteria">
| <CROSS: "cross">
| <DEBUG: "debug">
| <DECLARE: "declare">
| <DELETE: "delete">
| <DESC: "desc">
| <DISTINCT: "distinct">
| <DROP: "drop">
| <ELSE: "else">
| <END: "end">
| <ERROR: "error">
| <ESCAPE: "escape">
| <EXCEPT: "except">
| <EXEC: "exec">
| <EXECUTE: "execute">
| <EXISTS: "exists">
| <FALSE: "false">
| <FN: "fn">
| <FOR: "for">
| <FROM: "from">
| <FULL: "full">
| <GROUP: "group">
| <HAS: "has">
| <HAVING: "having">
| <IF: "if">
| <IN: "in">
| <INNER: "inner">
| <INSERT: "insert">
| <INTERSECT: "intersect">
| <INTO: "into">
| <IS: "is">
| <JOIN: "join">
| <LEFT: "left">
| <LIKE: "like">
| <LIMIT: "limit">
| <LOCAL: "local">
| <LOOP: "loop">
| <MAKEDEP: "makedep">
| <MAKENOTDEP: "makenotdep">
| <NOCACHE: "nocache">
| <NOT: "not">
| <NULL: "null">
| <ON: "on">
| <OJ: "oj">
| <OPTION: "option">
| <OR: "or">
| <ORDER: "order">
| <OUTER: "outer">
| <PLANONLY: "planonly">
| <PROCEDURE: "procedure">
| <RIGHT: "right">
| <SELECT: "select">
| <SET: "set">
| <SHOWPLAN: "showplan">
| <SOME: "some">
| <TABLE: "table">
| <TEMPORARY: "temporary">
| <THEN: "then">
| <TRANSLATE: "translate">
| <TRUE: "true">
| <UNION: "union">
| <UNKNOWN: "unknown">
| <UPDATE: "update">
| <USING: "using">
| <VALUES: "values">
| <VIRTUAL: "virtual">
| <WHEN: "when">
| <WHERE: "where">
| <WITH: "with">
| <WHILE: "while">
}
TOKEN : /* Special function words */
{
<SQL_TSI_FRAC_SECOND: "SQL_TSI_FRAC_SECOND">
| <SQL_TSI_SECOND: "SQL_TSI_SECOND">
| <SQL_TSI_MINUTE: "SQL_TSI_MINUTE">
| <SQL_TSI_HOUR: "SQL_TSI_HOUR">
| <SQL_TSI_DAY: "SQL_TSI_DAY">
| <SQL_TSI_WEEK: "SQL_TSI_WEEK">
| <SQL_TSI_MONTH: "SQL_TSI_MONTH">
| <SQL_TSI_QUARTER: "SQL_TSI_QUARTER">
| <SQL_TSI_YEAR: "SQL_TSI_YEAR">
}
TOKEN : /* User variables and literals */
{
< ALL_IN_GROUP: (<GROUP_PART> | <MMUUID_PART>) <PERIOD> <STAR> >
| < VARIABLE: <ID> | <MMUUID> >
| < #ID: <GROUP_PART> // Group name
( (<PERIOD>|<SLASH>) (<QUOTED_ID> | <MMUUID_PART>) )? > // Element name extension
| < #ELEMENT: <GROUP_PART> (<PERIOD>|<SLASH>) <QUOTED_ID> >
| < #GROUP_PART: ("#")? (<QUOTED_ID> (<PERIOD>|<SLASH>))? <QUOTED_ID> >
| < #QUOTED_ID: <DOTTED_ID> | ("\"" <DOTTED_ID> "\"") >
| < #DOTTED_ID: <ID_PART> ((<PERIOD>|<SLASH>) <ID_PART>)* >
| < #ID_PART: ("@")? <LETTER> (<ID_CHAR>)* >
| < #ID_CHAR: (<LETTER> | "_" | <DIGIT>) >
| < #MMUUID: <MMUUID_PART> (<PERIOD> <MMUUID_PART>)? > // Modeler-only mmuuid formats
| < #MMUUID_PART: "mmuuid:" (<MMUUID_CHAR>)* >
| < #MMUUID_CHAR: ["a"-"f"] | ["0"-"9"] | "-">
| < DATETYPE: "{" "d" >
| < TIMETYPE: "{" "t" >
| < TIMESTAMPTYPE: "{" "ts" >
| < BOOLEANTYPE: "{" "b" >
| < INTEGERVAL: (<MINUS>)?(<DIGIT>)+ >
| < FLOATVAL: (<MINUS>)? (<DIGIT>)* <PERIOD> (<DIGIT>)+
( ["e", "E"] (["+","-"])? (<DIGIT>)+ )? >
| < STRINGVAL: (("N")? (<STRINGA> | <STRINGB>)) >
| < #STRINGA: "'" (~["'"])* ( "''" (~["'"])* )* "'" >
| < #STRINGB: "\"" (~["\""])* ( "\"\"" (~["\""])* )* "\"" >
| < #LETTER: (["a"-"z","A"-"Z"] | ["\u0153"-"\ufffd"]) >
| < #DIGIT: ["0"-"9"] >
| < #COLON: ":">
}
TOKEN : /* Punctuation */
{
<COMMA: ",">
| <PERIOD: ".">
| <LPAREN: "(">
| <RPAREN: ")">
| <LBRACE: "{">
| <RBRACE: "}">
| <EQ: "=">
| <NE: "<>">
| <NE2: "!=">
| <LT: "<">
| <LE: "<=">
| <GT: ">">
| <GE: ">=">
| <STAR: "*">
| <SLASH: "/">
| <PLUS: "+">
| <MINUS: "-">
| <QMARK: "?">
| <DOLLAR: "$">
| <SEMICOLON: ";">
| <CONCAT_OP: "||">
}
NON-TERMINALS
| command | ::= | ( ( setQuery | storedProcedure | insert | update | delete ) | ( createTempTable | createUpdateProcedure | dropTable ) ) ( <SEMICOLON> )? <EOF> |
| dropTable | ::= | <DROP> <TABLE> <VARIABLE> |
| createTempTable | ::= | <CREATE> <LOCAL> <TEMPORARY> <TABLE> <VARIABLE> <LPAREN> createElementsWithTypes <RPAREN> |
| errorStatement | ::= | <ERROR> expression |
| statement | ::= | ( ifStatement | loopStatement | whileStatement | delimitedStatement ) |
| delimitedStatement | ::= | ( sqlStatement | errorStatement | assignStatement | declareStatement | continueStatement | breakStatement ) <SEMICOLON> |
| block | ::= | ( statement | ( <BEGIN> ( statement )* <END> ) ) |
| breakStatement | ::= | <BREAK> |
| continueStatement | ::= | <CONTINUE> |
| whileStatement | ::= | <WHILE> <LPAREN> criteria <RPAREN> block |
| loopStatement | ::= | <LOOP> <ON> <LPAREN> setQuery <RPAREN> <AS> <VARIABLE> block |
| ifStatement | ::= | <IF> <LPAREN> criteria <RPAREN> block ( <ELSE> block )? |
| criteriaSelector | ::= | ( ( <EQ> | <NE> | <NE2> | <LE> | <GE> | <LT> | <GT> | <IN> | <LIKE> | ( <IS> <NULL> ) | <BETWEEN> ) )? <CRITERIA> ( <ON> <LPAREN> <VARIABLE> ( <COMMA> <VARIABLE> )* <RPAREN> )? |
| hasCriteria | ::= | <HAS> criteriaSelector |
| declareStatement | ::= | <DECLARE> dataType <VARIABLE> ( <EQ> assignStatementOperand )? |
| assignStatement | ::= | <VARIABLE> <EQ> assignStatementOperand |
| assignStatementOperand | ::= | ( ( insert ) | update | delete | storedProcedure | ( expression ) | setQuery ) |
| sqlStatement | ::= | ( setQuery | ( dynamicCommand ) | storedProcedure | insert | update | delete | createTempTable | dropTable ) |
| translateCriteria | ::= | <TRANSLATE> criteriaSelector ( <WITH> <LPAREN> <VARIABLE> <EQ> expression ( <COMMA> <VARIABLE> <EQ> expression )* <RPAREN> )? |
| createUpdateProcedure | ::= | <CREATE> ( <VIRTUAL> )? ( <UPDATE> )? <PROCEDURE> block |
| dynamicCommand | ::= | <EXECUTE> <STRING> expression ( <AS> createElementsWithTypes ( <INTO> <VARIABLE> )? )? ( <USING> <VARIABLE> <EQ> ( <COMMA> <VARIABLE> <EQ> )* )? ( <UPDATE> ( ( <INTEGERVAL> ) | ( <STAR> ) ) )? |
| createElementsWithTypes | ::= | <VARIABLE> dataType ( <COMMA> <VARIABLE> dataType )* |
| storedProcedure | ::= | ( ( <EXEC> | <EXECUTE> ) <VARIABLE> <LPAREN> ( executeNamedParams | executeUnnamedParams ) <RPAREN> ) ( option )? |
| executeUnnamedParams | ::= | ( expression ( <COMMA> expression )* )? |
| executeNamedParams | ::= | ( paramName <EQ> expression ( <COMMA> paramName <EQ> expression )* ) |
| paramName | ::= | <VARIABLE> |
| insert | ::= | <INSERT> <INTO> <VARIABLE> <LPAREN> <VARIABLE> ( <COMMA> <VARIABLE> )* <RPAREN> <VALUES> rowValues ( option )? |
| rowValues | ::= | <LPAREN> expression ( <COMMA> expression )* <RPAREN> |
| update | ::= | <UPDATE> <VARIABLE> <SET> <VARIABLE> <EQ> expression ( <COMMA> <VARIABLE> <EQ> expression )* ( where )? ( option )? |
| delete | ::= | <DELETE> <FROM> <VARIABLE> ( where )? ( option )? |
| setQuery | ::= | basicQuery ( ( <UNION> ( <ALL> )? basicQuery )+ )? ( orderby )? ( limit )? ( option )? |
| basicQuery | ::= | ( query | ( <LPAREN> setQuery <RPAREN> ) ) |
| query | ::= | select ( into )? ( from ( where )? ( groupBy )? ( having )? )? |
| into | ::= | <INTO> ( <VARIABLE> ) |
| select | ::= | <SELECT> ( <ALL> | ( <DISTINCT> ) )? ( <STAR> | ( selectSymbol ( <COMMA> selectSymbol )* ) ) |
| selectSymbol | ::= | ( ( <ALL_IN_GROUP> ) | ( expression ) ( ( <AS> )? ( <VARIABLE> | <STRINGVAL> ) )? ) |
| aggregateSymbol | ::= | ( ( <COUNT> <LPAREN> <STAR> <RPAREN> ) | ( ( <COUNT> | <SUM> | <AVG> | <MIN> | <MAX> ) <LPAREN> ( <DISTINCT> )? expression <RPAREN> ) ) |
| from | ::= | <FROM> ( fromClause ( <COMMA> fromClause )* ) |
| fromClause | ::= | ( ( <LBRACE> <OJ> fromClauseUnescaped <RBRACE> ) | fromClauseUnescaped ) |
| fromClauseUnescaped | ::= | basicFromClause ( ( ( ( <CROSS> <JOIN> | <UNION> <JOIN> ) fromClauseUnescaped ) | ( ( <RIGHT> ( <OUTER> )? | <LEFT> ( <OUTER> )? | <FULL> ( <OUTER> )? | <INNER> )? <JOIN> fromClauseUnescaped <ON> criteria ) ) )* |
| basicFromClause | ::= | ( unaryFromClause | subqueryFromClause | ( <LPAREN> fromClause <RPAREN> ) ) ( ( <MAKEDEP> ) | ( <MAKENOTDEP> ) )? |
| subqueryFromClause | ::= | <LPAREN> ( setQuery | storedProcedure ) <RPAREN> ( <AS> )? <VARIABLE> |
| unaryFromClause | ::= | ( <VARIABLE> ( ( <AS> )? <VARIABLE> )? ) |
| where | ::= | <WHERE> criteria |
| criteria | ::= | compoundCritOr |
| compoundCritOr | ::= | compoundCritAnd ( <OR> compoundCritAnd )* |
| compoundCritAnd | ::= | notCrit ( <AND> notCrit )* |
| notCrit | ::= | ( <NOT> )? primary |
| primary | ::= | ( predicate | ( <LPAREN> criteria <RPAREN> ) ) |
| predicate | ::= | ( subqueryCompareCriteria | compareCrit | matchCrit | betweenCrit | setCrit | existsCriteria | hasCriteria | translateCriteria | isNullCrit ) |
| compareCrit | ::= | expression ( <EQ> | <NE> | <NE2> | <LT> | <LE> | <GT> | <GE> ) expression |
| subquery | ::= | <LPAREN> ( setQuery | storedProcedure ) <RPAREN> |
| subqueryCompareCriteria | ::= | expression ( <EQ> | <NE> | <NE2> | <LT> | <LE> | <GT> | <GE> ) ( <ANY> | <SOME> | <ALL> ) subquery |
| matchCrit | ::= | ( expression ( <NOT> )? <LIKE> expression ( ( <ESCAPE> <STRINGVAL> ) | ( <LBRACE> <ESCAPE> <STRINGVAL> <RBRACE> ) )? ) |
| betweenCrit | ::= | expression ( <NOT> )? <BETWEEN> expression <AND> expression |
| isNullCrit | ::= | expression <IS> ( <NOT> )? <NULL> |
| setCrit | ::= | expression ( <NOT> )? <IN> ( ( subquery ) | ( <LPAREN> expression ( <COMMA> expression )* <RPAREN> ) ) |
| existsCriteria | ::= | <EXISTS> subquery |
| groupBy | ::= | <GROUP> <BY> ( groupByItem ( <COMMA> groupByItem )* ) |
| groupByItem | ::= | expression |
| having | ::= | <HAVING> criteria |
| orderby | ::= | <ORDER> <BY> ( <VARIABLE> | <STRINGVAL> | <INTEGERVAL> ) ( <ASC> | <DESC> )? ( <COMMA> ( <VARIABLE> | <STRINGVAL> | <INTEGERVAL> ) ( <ASC> | <DESC> )? )* |
| limit | ::= | <LIMIT> ( <INTEGERVAL> | <QMARK> ) ( <COMMA> ( <INTEGERVAL> | <QMARK> ) )? |
| option | ::= | <OPTION> ( <SHOWPLAN> | <PLANONLY> | <DEBUG> | <MAKEDEP> <VARIABLE> ( <COMMA> <VARIABLE> )* | <MAKENOTDEP> <VARIABLE> ( <COMMA> <VARIABLE> )* | <NOCACHE> ( <VARIABLE> ( <COMMA> <VARIABLE> )* )? )* |
| expression | ::= | concatExpression |
| concatExpression | ::= | ( plusExpression ( <CONCAT_OP> plusExpression )* ) |
| plusExpression | ::= | ( timesExpression ( plusOperator timesExpression )* ) |
| plusOperator | ::= | ( <PLUS> | <MINUS> ) |
| timesExpression | ::= | ( basicExpression ( timesOperator basicExpression )* ) |
| timesOperator | ::= | ( <STAR> | <SLASH> ) |
| basicExpression | ::= | ( <QMARK> | literal | ( <LBRACE> <FN> function <RBRACE> ) | ( aggregateSymbol ) | ( function ) | ( <VARIABLE> ) | ( <LPAREN> expression <RPAREN> ) | subquery | caseExpression | searchedCaseExpression ) |
| 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> ) | ( ( <TIMESTAMPADD> | <TIMESTAMPDIFF> ) <LPAREN> intervalType <COMMA> expression <COMMA> expression <RPAREN> ) | ( ( <LEFT> | <RIGHT> | <CHAR> ) <LPAREN> ( expression ( <COMMA> expression )* )? <RPAREN> ) | ( ( <INSERT> ) <LPAREN> ( expression ( <COMMA> expression )* )? <RPAREN> ) | ( ( <TRANSLATE> ) <LPAREN> ( expression ( <COMMA> expression )* )? <RPAREN> ) | ( <VARIABLE> <LPAREN> ( expression ( <COMMA> expression )* )? <RPAREN> ) ) |
| dataType | ::= | ( <STRING> | <BOOLEAN> | <BYTE> | <SHORT> | <CHAR> | <INTEGER> | <LONG> | <BIGINTEGER> | <FLOAT> | <DOUBLE> | <BIGDECIMAL> | <DATE> | <TIME> | <TIMESTAMP> | <OBJECT> | <BLOB> | <CLOB> | <XML> ) |
| intervalType | ::= | ( <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> ) |
| literal | ::= | ( <STRINGVAL> | <INTEGERVAL> | <FLOATVAL> | <FALSE> | <TRUE> | <NULL> | ( <BOOLEANTYPE> <STRINGVAL> <RBRACE> ) | ( <TIMESTAMPTYPE> <STRINGVAL> <RBRACE> ) | ( <DATETYPE> <STRINGVAL> <RBRACE> ) | ( <TIMETYPE> <STRINGVAL> <RBRACE> ) ) |