blob: 4aa92e168fed90718e2dd946d0f019474f46092e [file] [log] [blame]
<#--
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to you under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
-->
boolean IfNotExistsOpt() :
{
}
{
<IF> <NOT> <EXISTS> { return true; }
|
{ return false; }
}
SqlNodeList WithCreateTableOptionList() :
{
List<SqlNode> list = new ArrayList<SqlNode>();
final Span s;
}
{
[
<WITH> { s = span(); }
(
<QUOTED_IDENTIFIER>
{
return IgniteSqlCreateTableOption.parseOptionList(
SqlParserUtil.stripQuotes(token.image, DQ, DQ, DQDQ, quotedCasing),
getPos().withQuoting(true)
);
}
|
CreateTableOption(list)
(
<COMMA> { s.add(this); } CreateTableOption(list)
)*
{
return new SqlNodeList(list, s.end(this));
}
)
]
{ return null; }
}
SqlLiteral CreateTableOptionKey() :
{
}
{
<TEMPLATE> { return SqlLiteral.createSymbol(IgniteSqlCreateTableOptionEnum.TEMPLATE, getPos()); }
|
<BACKUPS> { return SqlLiteral.createSymbol(IgniteSqlCreateTableOptionEnum.BACKUPS, getPos()); }
|
<AFFINITY_KEY> { return SqlLiteral.createSymbol(IgniteSqlCreateTableOptionEnum.AFFINITY_KEY, getPos()); }
|
<ATOMICITY> { return SqlLiteral.createSymbol(IgniteSqlCreateTableOptionEnum.ATOMICITY, getPos()); }
|
<WRITE_SYNCHRONIZATION_MODE> { return SqlLiteral.createSymbol(IgniteSqlCreateTableOptionEnum.WRITE_SYNCHRONIZATION_MODE, getPos()); }
|
<CACHE_GROUP> { return SqlLiteral.createSymbol(IgniteSqlCreateTableOptionEnum.CACHE_GROUP, getPos()); }
|
<CACHE_NAME> { return SqlLiteral.createSymbol(IgniteSqlCreateTableOptionEnum.CACHE_NAME, getPos()); }
|
<DATA_REGION> { return SqlLiteral.createSymbol(IgniteSqlCreateTableOptionEnum.DATA_REGION, getPos()); }
|
<KEY_TYPE> { return SqlLiteral.createSymbol(IgniteSqlCreateTableOptionEnum.KEY_TYPE, getPos()); }
|
<VALUE_TYPE> { return SqlLiteral.createSymbol(IgniteSqlCreateTableOptionEnum.VALUE_TYPE, getPos()); }
|
<ENCRYPTED> { return SqlLiteral.createSymbol(IgniteSqlCreateTableOptionEnum.ENCRYPTED, getPos()); }
}
void CreateTableOption(List<SqlNode> list) :
{
final Span s;
final SqlLiteral key;
final SqlNode val;
}
{
key = CreateTableOptionKey() { s = span(); }
<EQ>
(
val = Literal()
|
val = SimpleIdentifier()
) {
list.add(new IgniteSqlCreateTableOption(key, val, s.end(this)));
}
}
SqlDataTypeSpec DataTypeEx() :
{
final SqlDataTypeSpec dt;
}
{
(
dt = DataType()
|
dt = IntervalType()
)
{
return dt;
}
}
SqlDataTypeSpec IntervalType() :
{
final Span s;
final SqlIntervalQualifier intervalQualifier;
}
{
<INTERVAL> { s = span(); } intervalQualifier = IntervalQualifier() {
return new SqlDataTypeSpec(new IgniteSqlIntervalTypeNameSpec(intervalQualifier, s.end(this)), s.pos());
}
}
void TableElement(List<SqlNode> list) :
{
final SqlDataTypeSpec type;
final boolean nullable;
final SqlNodeList columnList;
final Span s = Span.of();
final ColumnStrategy strategy;
final SqlNode dflt;
SqlIdentifier id = null;
}
{
id = SimpleIdentifier() type = DataTypeEx() nullable = NullableOptDefaultTrue()
(
<DEFAULT_> { s.add(this); } dflt = Literal() {
strategy = ColumnStrategy.DEFAULT;
}
|
{
dflt = null;
strategy = nullable ? ColumnStrategy.NULLABLE
: ColumnStrategy.NOT_NULLABLE;
}
)
[
<PRIMARY> { s.add(this); } <KEY> {
columnList = SqlNodeList.of(id);
list.add(SqlDdlNodes.primary(s.end(columnList), null, columnList));
}
]
{
list.add(
SqlDdlNodes.column(s.add(id).end(this), id,
type.withNullable(nullable), dflt, strategy));
}
|
[ <CONSTRAINT> { s.add(this); } id = SimpleIdentifier() ]
<PRIMARY> { s.add(this); } <KEY>
columnList = ParenthesizedSimpleIdentifierList() {
list.add(SqlDdlNodes.primary(s.end(columnList), id, columnList));
}
}
SqlNodeList TableElementList() :
{
final Span s;
final List<SqlNode> list = new ArrayList<SqlNode>();
}
{
<LPAREN> { s = span(); }
TableElement(list)
(
<COMMA> TableElement(list)
)*
<RPAREN> {
return new SqlNodeList(list, s.end(this));
}
}
SqlCreate SqlCreateTable(Span s, boolean replace) :
{
final boolean ifNotExists;
final SqlIdentifier id;
final SqlNodeList columnList;
final SqlNodeList optionList;
final SqlNode query;
}
{
{
if (replace)
throw SqlUtil.newContextException(getPos(), IgniteResource.INSTANCE.unsupportedClause("REPLACE"));
}
<TABLE>
ifNotExists = IfNotExistsOpt()
id = CompoundIdentifier()
(
LOOKAHEAD(3)
columnList = TableElementList()
optionList = WithCreateTableOptionList()
{ query = null; }
|
(
columnList = ParenthesizedSimpleIdentifierList()
|
{ columnList = null; }
)
optionList = WithCreateTableOptionList()
<AS> { s.add(this); } query = OrderedQueryOrExpr(ExprContext.ACCEPT_QUERY)
)
{
return new IgniteSqlCreateTable(s.end(this), ifNotExists, id, columnList, query, optionList);
}
}
SqlNode IndexedColumn() :
{
final Span s;
SqlNode col;
}
{
col = SimpleIdentifier()
(
<ASC>
| <DESC> {
col = SqlStdOperatorTable.DESC.createCall(getPos(), col);
}
)?
{
return col;
}
}
SqlNodeList IndexedColumnList() :
{
final Span s;
final List<SqlNode> list = new ArrayList<SqlNode>();
SqlNode col = null;
}
{
<LPAREN> { s = span(); }
col = IndexedColumn() { list.add(col); }
(
<COMMA> col = IndexedColumn() { list.add(col); }
)*
<RPAREN> {
return new SqlNodeList(list, s.end(this));
}
}
SqlCreate SqlCreateIndex(Span s, boolean replace) :
{
final boolean ifNotExists;
final SqlIdentifier tblId;
final SqlNodeList columnList;
SqlIdentifier idxId = null;
SqlNumericLiteral parallel = null;
SqlNumericLiteral inlineSize = null;
}
{
{
if (replace)
throw SqlUtil.newContextException(getPos(), IgniteResource.INSTANCE.unsupportedClause("REPLACE"));
}
<INDEX>
ifNotExists = IfNotExistsOpt()
[ idxId = SimpleIdentifier() ]
<ON>
tblId = CompoundIdentifier()
columnList = IndexedColumnList()
(
<PARALLEL> <UNSIGNED_INTEGER_LITERAL> {
if (parallel != null)
throw SqlUtil.newContextException(getPos(), IgniteResource.INSTANCE.optionAlreadyDefined("PARALLEL"));
parallel = SqlLiteral.createExactNumeric(token.image, getPos());
}
|
<INLINE_SIZE> <UNSIGNED_INTEGER_LITERAL> {
if (inlineSize != null)
throw SqlUtil.newContextException(getPos(), IgniteResource.INSTANCE.optionAlreadyDefined("INLINE_SIZE"));
inlineSize = SqlLiteral.createExactNumeric(token.image, getPos());
}
)*
{
return new IgniteSqlCreateIndex(s.end(this), ifNotExists, idxId, tblId, columnList, parallel, inlineSize);
}
}
boolean IfExistsOpt() :
{
}
{
<IF> <EXISTS> { return true; }
|
{ return false; }
}
SqlDrop SqlDropTable(Span s, boolean replace) :
{
final boolean ifExists;
final SqlIdentifier id;
}
{
<TABLE> ifExists = IfExistsOpt() id = CompoundIdentifier() {
return SqlDdlNodes.dropTable(s.end(this), ifExists, id);
}
}
SqlDrop SqlDropIndex(Span s, boolean replace) :
{
final boolean ifExists;
final SqlIdentifier id;
}
{
<INDEX> ifExists = IfExistsOpt() id = CompoundIdentifier() {
return new IgniteSqlDropIndex(s.end(this), ifExists, id);
}
}
void InfixCast(List<Object> list, ExprContext exprContext, Span s) :
{
final SqlDataTypeSpec dt;
}
{
<INFIX_CAST> {
checkNonQueryExpression(exprContext);
}
dt = DataTypeEx() {
list.add(
new SqlParserUtil.ToTreeListItem(SqlLibraryOperators.INFIX_CAST,
s.pos()));
list.add(dt);
}
}
SqlNodeList ColumnWithTypeList() :
{
final Span s;
List<SqlNode> list = new ArrayList<SqlNode>();
SqlNode col;
}
{
<LPAREN> { s = span(); }
col = ColumnWithType() { list.add(col); }
(
<COMMA> col = ColumnWithType() { list.add(col); }
)*
<RPAREN> {
return new SqlNodeList(list, s.end(this));
}
}
SqlNode ColumnWithType() :
{
SqlIdentifier id;
SqlDataTypeSpec type;
boolean nullable = true;
final Span s = Span.of();
}
{
id = SimpleIdentifier()
type = DataTypeEx()
[
<NOT> <NULL> {
nullable = false;
}
]
{
return SqlDdlNodes.column(s.add(id).end(this), id, type.withNullable(nullable), null, null);
}
}
SqlNodeList ColumnWithTypeOrList() :
{
SqlNode col;
SqlNodeList list;
}
{
col = ColumnWithType() { return new SqlNodeList(Collections.singletonList(col), col.getParserPosition()); }
|
list = ColumnWithTypeList() { return list; }
}
SqlNode SqlAlterTable() :
{
final Span s;
final boolean ifExists;
final SqlIdentifier id;
boolean colIgnoreErr;
SqlNode col;
SqlNodeList cols;
}
{
<ALTER> { s = span(); }
<TABLE> ifExists = IfExistsOpt() id = CompoundIdentifier()
(
<LOGGING> { return new IgniteSqlAlterTable(s.end(this), ifExists, id, true); }
|
<NOLOGGING> { return new IgniteSqlAlterTable(s.end(this), ifExists, id, false); }
|
<ADD> [<COLUMN>] colIgnoreErr = IfNotExistsOpt() cols = ColumnWithTypeOrList() {
return new IgniteSqlAlterTableAddColumn(s.end(this), ifExists, id, colIgnoreErr, cols);
}
|
<DROP> [<COLUMN>] colIgnoreErr = IfExistsOpt() cols = SimpleIdentifierOrList() {
return new IgniteSqlAlterTableDropColumn(s.end(this), ifExists, id, colIgnoreErr, cols);
}
)
}
SqlCreate SqlCreateUser(Span s, boolean replace) :
{
final SqlIdentifier user;
final SqlNode password;
}
{
{
if (replace)
throw SqlUtil.newContextException(getPos(), IgniteResource.INSTANCE.unsupportedClause("REPLACE"));
}
<USER> user = SimpleIdentifier()
<WITH> <PASSWORD> password = StringLiteral() {
return new IgniteSqlCreateUser(s.end(this), user, SqlLiteral.unchain(password));
}
}
SqlNode SqlAlterUser() :
{
final Span s;
final SqlIdentifier user;
final SqlNode password;
}
{
<ALTER> { s = span(); } <USER> user = SimpleIdentifier()
<WITH> <PASSWORD> password = StringLiteral() {
return new IgniteSqlAlterUser(s.end(this), user, SqlLiteral.unchain(password));
}
}
SqlDrop SqlDropUser(Span s, boolean replace) :
{
final SqlIdentifier user;
}
{
<USER> user = SimpleIdentifier() {
return new IgniteSqlDropUser(s.end(this), user);
}
}
<DEFAULT, DQID, BTID> TOKEN :
{
< NEGATE: "!" >
| < TILDE: "~" >
}
SqlNumericLiteral SignedIntegerLiteral() :
{
final Span s;
}
{
<PLUS> <UNSIGNED_INTEGER_LITERAL> {
return SqlLiteral.createExactNumeric(token.image, getPos());
}
|
<MINUS> { s = span(); } <UNSIGNED_INTEGER_LITERAL> {
return SqlLiteral.createNegative(SqlLiteral.createExactNumeric(token.image, getPos()), s.end(this));
}
|
<UNSIGNED_INTEGER_LITERAL> {
return SqlLiteral.createExactNumeric(token.image, getPos());
}
}
SqlCharStringLiteral UuidLiteral():
{
final Span s;
final String rawUuuid;
}
{
<QUOTED_STRING> {
String rawUuid = SqlParserUtil.parseString(token.image);
try {
java.util.UUID.fromString(rawUuid);
return SqlLiteral.createCharString(rawUuid, getPos());
}
catch (Exception e) {
throw SqlUtil.newContextException(getPos(), IgniteResource.INSTANCE.illegalUuid(rawUuid));
}
}
}
SqlCharStringLiteral IgniteUuidLiteral():
{
final Span s;
final String rawUuuid;
}
{
<QUOTED_STRING> {
String rawUuid = SqlParserUtil.parseString(token.image);
try {
IgniteUuid.fromString(rawUuid);
return SqlLiteral.createCharString(rawUuid, getPos());
}
catch (Exception e) {
throw SqlUtil.newContextException(getPos(), IgniteResource.INSTANCE.illegalIgniteUuid(rawUuid));
}
}
}
SqlNode SqlKillScanQuery():
{
final Span s;
final SqlCharStringLiteral originNodeId;
final SqlCharStringLiteral cacheName;
final SqlNumericLiteral queryId;
}
{
<KILL> { s = span(); } <SCAN>
originNodeId = UuidLiteral()
<QUOTED_STRING> {
cacheName = SqlLiteral.createCharString(SqlParserUtil.parseString(token.image), getPos());
}
queryId = SignedIntegerLiteral() {
return IgniteSqlKill.createScanQueryKill(s.end(this), originNodeId, cacheName, queryId);
}
}
SqlNode SqlKillContinuousQuery():
{
final Span s;
final SqlCharStringLiteral originNodeId;
final SqlCharStringLiteral routineId;
}
{
<KILL> { s = span(); } <CONTINUOUS>
originNodeId = UuidLiteral()
routineId = UuidLiteral() {
return IgniteSqlKill.createContinuousQueryKill(s.end(this), originNodeId, routineId);
}
}
SqlNode SqlKillTransaction():
{
final Span s;
final SqlCharStringLiteral xid;
}
{
<KILL> { s = span(); } <TRANSACTION>
xid = IgniteUuidLiteral() {
return IgniteSqlKill.createTransactionKill(s.end(this), xid);
}
}
SqlNode SqlKillService():
{
final Span s;
final SqlCharStringLiteral srvName;
}
{
<KILL> { s = span(); } <SERVICE>
<QUOTED_STRING> {
srvName = SqlLiteral.createCharString(SqlParserUtil.parseString(token.image), getPos());
return IgniteSqlKill.createServiceKill(s.end(this), srvName);
}
}
SqlNode SqlKillComputeTask():
{
final Span s;
final SqlCharStringLiteral sesId;
}
{
<KILL> { s = span(); } <COMPUTE>
sesId = IgniteUuidLiteral() {
return IgniteSqlKill.createComputeTaskKill(s.end(this), sesId);
}
}
boolean IsAsyncOpt() :
{
}
{
<ASYNC> { return true; } | { return false; }
}
SqlNode SqlKillQuery():
{
final Span s;
final boolean isAsync;
}
{
<KILL> { s = span(); } <QUERY>
isAsync = IsAsyncOpt()
<QUOTED_STRING> {
String rawQueryId = SqlParserUtil.parseString(token.image);
SqlCharStringLiteral queryIdLiteral = SqlLiteral.createCharString(rawQueryId, getPos());
Pair<UUID, Long> id = IgniteSqlKill.parseGlobalQueryId(rawQueryId);
if (id == null) {
throw SqlUtil.newContextException(getPos(), IgniteResource.INSTANCE.illegalGlobalQueryId(rawQueryId));
}
return IgniteSqlKill.createQueryKill(s.end(this), queryIdLiteral, id.getKey(), id.getValue(), isAsync);
}
}
SqlNode SqlCommitTransaction():
{
final Span s;
}
{
<COMMIT> { s = span(); } (<TRANSACTION>)? {
return new IgniteSqlCommit(s.end(this));
}
}
SqlNode SqlRollbackTransaction():
{
final Span s;
}
{
<ROLLBACK> { s = span(); } (<TRANSACTION>)? {
return new IgniteSqlRollback(s.end(this));
}
}
IgniteSqlStatisticsTable StatisticsTable():
{
final Span s = Span.of();
final SqlIdentifier id;
final SqlNodeList columnList;
}
{
id = CompoundIdentifier()
(
columnList = ParenthesizedSimpleIdentifierList()
|
{ columnList = null; }
)
{
return new IgniteSqlStatisticsTable(id, columnList, s.end(this));
}
}
SqlNodeList StatisticsTables():
{
final Span s = Span.of();
List<SqlNode> tbls = new ArrayList<SqlNode>();
SqlNode tbl;
}
{
tbl = StatisticsTable() { tbls.add(tbl); }
(
<COMMA> tbl = StatisticsTable() { tbls.add(tbl); }
)*
{
return new SqlNodeList(tbls, s.end(this));
}
}
SqlNodeList WithStatisticsAnalyzeOptionList() :
{
List<SqlNode> list = new ArrayList<SqlNode>();
final Span s;
}
{
[
<WITH> { s = span(); }
(
StatisticsAnalyzeOption(list)
(
<COMMA> { s.add(this); } StatisticsAnalyzeOption(list)
)*
{
return new SqlNodeList(list, s.end(this));
}
|
<QUOTED_IDENTIFIER>
{
return IgniteSqlStatisticsAnalyzeOption.parseOptionList(
SqlParserUtil.stripQuotes(token.image, DQ, DQ, DQDQ, quotedCasing),
getPos().withQuoting(true)
);
}
)
]
{ return null; }
}
SqlLiteral StatisticsAnalyzeOptionKey() :
{
}
{
<DISTINCT> { return SqlLiteral.createSymbol(IgniteSqlStatisticsAnalyzeOptionEnum.DISTINCT, getPos()); }
|
<TOTAL> { return SqlLiteral.createSymbol(IgniteSqlStatisticsAnalyzeOptionEnum.TOTAL, getPos()); }
|
<SIZE> { return SqlLiteral.createSymbol(IgniteSqlStatisticsAnalyzeOptionEnum.SIZE, getPos()); }
|
<NULLS> { return SqlLiteral.createSymbol(IgniteSqlStatisticsAnalyzeOptionEnum.NULLS, getPos()); }
|
<MAX_CHANGED_PARTITION_ROWS_PERCENT> { return SqlLiteral.createSymbol(IgniteSqlStatisticsAnalyzeOptionEnum.MAX_CHANGED_PARTITION_ROWS_PERCENT, getPos()); }
}
void StatisticsAnalyzeOption(List<SqlNode> list) :
{
final Span s;
final SqlLiteral key;
final SqlNode val;
}
{
key = StatisticsAnalyzeOptionKey() { s = span(); }
<EQ>
(
val = Literal()
|
val = SimpleIdentifier()
) {
list.add(new IgniteSqlStatisticsAnalyzeOption(key, val, s.end(this)));
}
}
SqlNode SqlStatisticsDrop():
{
final Span s;
SqlNodeList tablesList;
}
{
<DROP> <STATISTICS> { s = span(); }
tablesList = StatisticsTables()
{
return new IgniteSqlStatisticsDrop(tablesList, s.end(this));
}
}
SqlNode SqlStatisticsRefresh():
{
final Span s;
SqlNodeList tablesList;
}
{
<REFRESH> <STATISTICS> { s = span(); }
tablesList = StatisticsTables()
{
return new IgniteSqlStatisticsRefresh(tablesList, s.end(this));
}
}
SqlNode SqlStatisticsAnalyze():
{
final Span s;
SqlNodeList tablesList;
SqlNodeList optionsList;
}
{
<ANALYZE> { s = span(); }
tablesList = StatisticsTables()
optionsList = WithStatisticsAnalyzeOptionList()
{
return new IgniteSqlStatisticsAnalyze(tablesList, optionsList, s.end(this));
}
}
SqlCreate SqlCreateView(Span s, boolean replace) :
{
final SqlIdentifier id;
final SqlNode query;
}
{
<VIEW> id = CompoundIdentifier()
<AS> query = OrderedQueryOrExpr(ExprContext.ACCEPT_QUERY) {
return SqlDdlNodes.createView(s.end(this), replace, id, null, query);
}
}
SqlDrop SqlDropView(Span s, boolean replace) :
{
final boolean ifExists;
final SqlIdentifier id;
}
{
<VIEW> ifExists = IfExistsOpt() id = CompoundIdentifier() {
return SqlDdlNodes.dropView(s.end(this), ifExists, id);
}
}