diff --git a/src/main/java/net/sf/jsqlparser/schema/Sequence.java b/src/main/java/net/sf/jsqlparser/schema/Sequence.java new file mode 100644 index 0000000000..343174a542 --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/schema/Sequence.java @@ -0,0 +1,180 @@ +/* + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2020 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.schema; + +import net.sf.jsqlparser.parser.ASTNodeAccessImpl; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Represents the database type for a {@code SEQUENCE} + */ +public class Sequence extends ASTNodeAccessImpl implements MultiPartName { + + private static final int NAME_IDX = 0; + private static final int SCHEMA_IDX = 1; + private static final int DATABASE_IDX = 2; + private static final int SERVER_IDX = 3; + private List partItems = new ArrayList<>(); + + private List parameters; + + public Sequence() { + } + + public Sequence(List partItems) { + this.partItems = new ArrayList<>(partItems); + Collections.reverse(this.partItems); + } + + public void setParameters(List parameters) { + this.parameters = parameters; + } + + public List getParameters() { + return parameters; + } + + public Database getDatabase() { + return new Database(getIndex(DATABASE_IDX)); + } + + public void setDatabase(Database database) { + setIndex(DATABASE_IDX, database.getDatabaseName()); + if (database.getServer() != null) { + setIndex(SERVER_IDX, database.getServer().getFullyQualifiedName()); + } + } + + public String getSchemaName() { + return getIndex(SCHEMA_IDX); + } + + public void setSchemaName(String string) { + setIndex(SCHEMA_IDX, string); + } + + public String getName() { + return getIndex(NAME_IDX); + } + + public void setName(String string) { + setIndex(NAME_IDX, string); + } + + private void setIndex(int idx, String value) { + int size = partItems.size(); + for (int i = 0; i < idx - size + 1; i++) { + partItems.add(null); + } + partItems.set(idx, value); + } + + private String getIndex(int idx) { + if (idx < partItems.size()) { + return partItems.get(idx); + } else { + return null; + } + } + + @Override + public String getFullyQualifiedName() { + StringBuilder fqn = new StringBuilder(); + + for (int i = partItems.size() - 1; i >= 0; i--) { + String part = partItems.get(i); + if (part == null) { + part = ""; + } + fqn.append(part); + if (i != 0) { + fqn.append("."); + } + } + + return fqn.toString(); + } + + @Override + public String toString() { + StringBuilder sql = new StringBuilder(getFullyQualifiedName()); + if (parameters != null) { + for (Sequence.Parameter parameter : parameters) { + sql.append(" ").append(parameter.formatParameter()); + } + } + return sql.toString(); + } + + /** + * The available parameters to a sequence + */ + public enum ParameterType { + INCREMENT_BY, + START_WITH, + MAXVALUE, + NOMAXVALUE, + MINVALUE, + NOMINVALUE, + CYCLE, + NOCYCLE, + CACHE, + NOCACHE, + ORDER, + NOORDER, + KEEP, + NOKEEP, + SESSION, + GLOBAL + } + + /** + * Represents a parameter when declaring a sequence + */ + public static class Parameter { + private final ParameterType option; + private Long value; + + public Parameter(ParameterType option) { + this.option = option; + } + + public Long getValue() { + return value; + } + + public void setValue(Long value) { + this.value = value; + } + + public String formatParameter() { + switch (option) { + case INCREMENT_BY: + return withValue("INCREMENT BY"); + case START_WITH: + return withValue("START WITH"); + case MAXVALUE: + case MINVALUE: + case CACHE: + return withValue(option.name()); + default: + // fallthrough just return option name + return option.name(); + } + } + + private String withValue(String prefix) { + return prefix + " " + value; + } + } +} diff --git a/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java b/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java index 290ccee1bf..85fce2f79a 100644 --- a/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java +++ b/src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java @@ -13,6 +13,7 @@ import net.sf.jsqlparser.statement.comment.Comment; import net.sf.jsqlparser.statement.create.index.CreateIndex; import net.sf.jsqlparser.statement.create.schema.CreateSchema; +import net.sf.jsqlparser.statement.create.sequence.CreateSequence; import net.sf.jsqlparser.statement.create.table.CreateTable; import net.sf.jsqlparser.statement.create.view.AlterView; import net.sf.jsqlparser.statement.create.view.CreateView; @@ -48,7 +49,7 @@ public interface StatementVisitor { void visit(Truncate truncate); void visit(CreateIndex createIndex); - + void visit(CreateSchema aThis); void visit(CreateTable createTable); @@ -88,4 +89,6 @@ public interface StatementVisitor { public void visit(DeclareStatement aThis); void visit(Grant grant); + + void visit(CreateSequence createSequence); } diff --git a/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java b/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java index a4b5a99282..50a34f7e87 100644 --- a/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java +++ b/src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java @@ -13,6 +13,7 @@ import net.sf.jsqlparser.statement.comment.Comment; import net.sf.jsqlparser.statement.create.index.CreateIndex; import net.sf.jsqlparser.statement.create.schema.CreateSchema; +import net.sf.jsqlparser.statement.create.sequence.CreateSequence; import net.sf.jsqlparser.statement.create.table.CreateTable; import net.sf.jsqlparser.statement.create.view.AlterView; import net.sf.jsqlparser.statement.create.view.CreateView; @@ -165,4 +166,8 @@ public void visit(DeclareStatement aThis) { @Override public void visit(Grant grant) { } + + @Override + public void visit(CreateSequence createSequence) { + } } diff --git a/src/main/java/net/sf/jsqlparser/statement/create/sequence/CreateSequence.java b/src/main/java/net/sf/jsqlparser/statement/create/sequence/CreateSequence.java new file mode 100644 index 0000000000..5e8e506d7a --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/statement/create/sequence/CreateSequence.java @@ -0,0 +1,42 @@ +/* + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2020 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.create.sequence; + +import net.sf.jsqlparser.schema.Sequence; +import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.StatementVisitor; + +/** + * A {@code CREATE SEQUENCE} statement + */ +public class CreateSequence implements Statement { + + public Sequence sequence; + + public void setSequence(Sequence sequence) { + this.sequence = sequence; + } + + public Sequence getSequence() { + return sequence; + } + + @Override + public void accept(StatementVisitor statementVisitor) { + statementVisitor.visit(this); + } + + @Override + public String toString() { + String sql; + sql = "CREATE SEQUENCE " + sequence; + return sql; + } +} diff --git a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java index e4f17c3cf3..1fde6a8cff 100644 --- a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java +++ b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java @@ -72,6 +72,7 @@ import net.sf.jsqlparser.statement.comment.Comment; import net.sf.jsqlparser.statement.create.index.CreateIndex; import net.sf.jsqlparser.statement.create.schema.CreateSchema; +import net.sf.jsqlparser.statement.create.sequence.CreateSequence; import net.sf.jsqlparser.statement.create.table.CreateTable; import net.sf.jsqlparser.statement.create.view.AlterView; import net.sf.jsqlparser.statement.create.view.CreateView; @@ -511,7 +512,7 @@ public void visit(ExtractExpression eexpr) { public void visit(LateralSubSelect lateralSubSelect) { lateralSubSelect.getSubSelect().getSelectBody().accept(this); } - + @Override public void visit(MultiExpressionList multiExprList) { for (ExpressionList exprList : multiExprList.getExprList()) { @@ -691,7 +692,7 @@ public void visit(Truncate truncate) { public void visit(CreateIndex createIndex) { throw new UnsupportedOperationException(NOT_SUPPORTED_YET); } - + @Override public void visit(CreateSchema aThis) { throw new UnsupportedOperationException(NOT_SUPPORTED_YET); @@ -873,4 +874,9 @@ public void visit(ArrayExpression array) { array.getObjExpression().accept(this); array.getIndexExpression().accept(this); } + + @Override + public void visit(CreateSequence createSequence) { + + } } diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/CreateSequenceDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/CreateSequenceDeParser.java new file mode 100644 index 0000000000..b2ed278cba --- /dev/null +++ b/src/main/java/net/sf/jsqlparser/util/deparser/CreateSequenceDeParser.java @@ -0,0 +1,33 @@ +/* + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2020 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.util.deparser; + +import net.sf.jsqlparser.statement.create.sequence.CreateSequence; + +/** + * A class to de-parse (that is, transform from JSqlParser hierarchy into a string) a + * {@link net.sf.jsqlparser.statement.create.sequence.CreateSequence} + */ +public class CreateSequenceDeParser { + + private StringBuilder buffer; + + /** + * @param buffer the buffer that will be filled with the select + */ + public CreateSequenceDeParser(StringBuilder buffer) { + this.buffer = buffer; + } + + public void deParse(CreateSequence createSequence) { + buffer.append("CREATE SEQUENCE "); + buffer.append(createSequence.getSequence()); + } +} diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java index 5a9390e786..5d50f9b1d4 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java @@ -26,6 +26,7 @@ import net.sf.jsqlparser.statement.comment.Comment; import net.sf.jsqlparser.statement.create.index.CreateIndex; import net.sf.jsqlparser.statement.create.schema.CreateSchema; +import net.sf.jsqlparser.statement.create.sequence.CreateSequence; import net.sf.jsqlparser.statement.create.table.CreateTable; import net.sf.jsqlparser.statement.create.view.AlterView; import net.sf.jsqlparser.statement.create.view.CreateView; @@ -287,4 +288,9 @@ public void visit(Grant grant) { public void visit(CreateSchema aThis) { buffer.append(aThis.toString()); } + + @Override + public void visit(CreateSequence createSequence) { + new CreateSequenceDeParser(buffer).deParse(createSequence); + } } diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index a790df8f58..92e31b4085 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -11,7 +11,7 @@ options{ IGNORE_CASE = true ; STATIC = false; - DEBUG_PARSER = false; + DEBUG_PARSER = false; DEBUG_LOOKAHEAD = false; DEBUG_TOKEN_MANAGER = false; CACHE_TOKENS = false; @@ -40,6 +40,7 @@ import net.sf.jsqlparser.statement.alter.*; import net.sf.jsqlparser.statement.comment.*; import net.sf.jsqlparser.statement.create.index.*; import net.sf.jsqlparser.statement.create.schema.*; +import net.sf.jsqlparser.statement.create.sequence.*; import net.sf.jsqlparser.statement.create.table.*; import net.sf.jsqlparser.statement.create.view.*; import net.sf.jsqlparser.statement.delete.*; @@ -68,7 +69,7 @@ public class CCJSqlParser { token_source.allowSquareBracketQuotation = allowSquareBracketQuotation; return this; } - + private void linkAST(ASTNodeAccess access, SimpleNode node) { access.setASTNode(node); node.jjtSetValue(access); @@ -129,10 +130,11 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | -| +| | | | +| | | | @@ -153,6 +155,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -191,6 +194,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -204,6 +208,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | | @@ -227,15 +232,22 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | +| | | +| | | | | | +| | +| | +| +| +| | | | @@ -269,13 +281,14 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | -| +| | -| +| | | | | +| | | | @@ -300,7 +313,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */ | | | -| +| | | | @@ -374,8 +387,8 @@ TOKEN: | <#LETTER: ["$","A"-"Z","_","#","a"-"z","\u00a2"-"\u00a5","\u00aa","\u00b5","\u00ba","\u00c0"-"\u00d6","\u00d8"-"\u00f6","\u00f8"-"\u021f","\u0222"-"\u0233","\u0250"-"\u02ad","\u02b0"-"\u02b8","\u02bb"-"\u02c1","\u02d0"-"\u02d1","\u02e0"-"\u02e4","\u02ee","\u037a","\u0386","\u0388"-"\u038a","\u038c","\u038e"-"\u03a1","\u03a3"-"\u03ce","\u03d0"-"\u03d7","\u03da"-"\u03f3","\u0400"-"\u0481","\u048c"-"\u04c4","\u04c7"-"\u04c8","\u04cb"-"\u04cc","\u04d0"-"\u04f5","\u04f8"-"\u04f9","\u0531"-"\u0556","\u0559","\u0561"-"\u0587","\u05d0"-"\u05ea","\u05f0"-"\u05f2","\u0621"-"\u063a","\u0640"-"\u064a","\u0671"-"\u06d3","\u06d5","\u06e5"-"\u06e6","\u06fa"-"\u06fc","\u0710","\u0712"-"\u072c","\u0780"-"\u07a5","\u0905"-"\u0939","\u093d","\u0950","\u0958"-"\u0961","\u0985"-"\u098c","\u098f"-"\u0990","\u0993"-"\u09a8","\u09aa"-"\u09b0","\u09b2","\u09b6"-"\u09b9","\u09dc"-"\u09dd","\u09df"-"\u09e1","\u09f0"-"\u09f3","\u0a05"-"\u0a0a","\u0a0f"-"\u0a10","\u0a13"-"\u0a28","\u0a2a"-"\u0a30","\u0a32"-"\u0a33","\u0a35"-"\u0a36","\u0a38"-"\u0a39","\u0a59"-"\u0a5c","\u0a5e","\u0a72"-"\u0a74","\u0a85"-"\u0a8b","\u0a8d","\u0a8f"-"\u0a91","\u0a93"-"\u0aa8","\u0aaa"-"\u0ab0","\u0ab2"-"\u0ab3","\u0ab5"-"\u0ab9","\u0abd","\u0ad0","\u0ae0","\u0b05"-"\u0b0c","\u0b0f"-"\u0b10","\u0b13"-"\u0b28","\u0b2a"-"\u0b30","\u0b32"-"\u0b33","\u0b36"-"\u0b39","\u0b3d","\u0b5c"-"\u0b5d","\u0b5f"-"\u0b61","\u0b85"-"\u0b8a","\u0b8e"-"\u0b90","\u0b92"-"\u0b95","\u0b99"-"\u0b9a","\u0b9c","\u0b9e"-"\u0b9f","\u0ba3"-"\u0ba4","\u0ba8"-"\u0baa","\u0bae"-"\u0bb5","\u0bb7"-"\u0bb9","\u0c05"-"\u0c0c","\u0c0e"-"\u0c10","\u0c12"-"\u0c28","\u0c2a"-"\u0c33","\u0c35"-"\u0c39","\u0c60"-"\u0c61","\u0c85"-"\u0c8c","\u0c8e"-"\u0c90","\u0c92"-"\u0ca8","\u0caa"-"\u0cb3","\u0cb5"-"\u0cb9","\u0cde","\u0ce0"-"\u0ce1","\u0d05"-"\u0d0c","\u0d0e"-"\u0d10","\u0d12"-"\u0d28","\u0d2a"-"\u0d39","\u0d60"-"\u0d61","\u0d85"-"\u0d96","\u0d9a"-"\u0db1","\u0db3"-"\u0dbb","\u0dbd","\u0dc0"-"\u0dc6","\u0e01"-"\u0e30","\u0e32"-"\u0e33","\u0e3f"-"\u0e46","\u0e81"-"\u0e82","\u0e84","\u0e87"-"\u0e88","\u0e8a","\u0e8d","\u0e94"-"\u0e97","\u0e99"-"\u0e9f","\u0ea1"-"\u0ea3","\u0ea5","\u0ea7","\u0eaa"-"\u0eab","\u0ead"-"\u0eb0","\u0eb2"-"\u0eb3","\u0ebd","\u0ec0"-"\u0ec4","\u0ec6","\u0edc"-"\u0edd","\u0f00","\u0f40"-"\u0f47","\u0f49"-"\u0f6a","\u0f88"-"\u0f8b","\u1000"-"\u1021","\u1023"-"\u1027","\u1029"-"\u102a","\u1050"-"\u1055","\u10a0"-"\u10c5","\u10d0"-"\u10f6","\u1100"-"\u1159","\u115f"-"\u11a2","\u11a8"-"\u11f9","\u1200"-"\u1206","\u1208"-"\u1246","\u1248","\u124a"-"\u124d","\u1250"-"\u1256","\u1258","\u125a"-"\u125d","\u1260"-"\u1286","\u1288","\u128a"-"\u128d","\u1290"-"\u12ae","\u12b0","\u12b2"-"\u12b5","\u12b8"-"\u12be","\u12c0","\u12c2"-"\u12c5","\u12c8"-"\u12ce","\u12d0"-"\u12d6","\u12d8"-"\u12ee","\u12f0"-"\u130e","\u1310","\u1312"-"\u1315","\u1318"-"\u131e","\u1320"-"\u1346","\u1348"-"\u135a","\u13a0"-"\u13f4","\u1401"-"\u166c","\u166f"-"\u1676","\u1681"-"\u169a","\u16a0"-"\u16ea","\u1780"-"\u17b3","\u17db","\u1820"-"\u1877","\u1880"-"\u18a8","\u1e00"-"\u1e9b","\u1ea0"-"\u1ef9","\u1f00"-"\u1f15","\u1f18"-"\u1f1d","\u1f20"-"\u1f45","\u1f48"-"\u1f4d","\u1f50"-"\u1f57","\u1f59","\u1f5b","\u1f5d","\u1f5f"-"\u1f7d","\u1f80"-"\u1fb4","\u1fb6"-"\u1fbc","\u1fbe","\u1fc2"-"\u1fc4","\u1fc6"-"\u1fcc","\u1fd0"-"\u1fd3","\u1fd6"-"\u1fdb","\u1fe0"-"\u1fec","\u1ff2"-"\u1ff4","\u1ff6"-"\u1ffc","\u203f"-"\u2040","\u207f","\u20a0"-"\u20af","\u2102","\u2107","\u210a"-"\u2113","\u2115","\u2119"-"\u211d","\u2124","\u2126","\u2128","\u212a"-"\u212d","\u212f"-"\u2131","\u2133"-"\u2139","\u2160"-"\u2183","\u3005"-"\u3007","\u3021"-"\u3029","\u3031"-"\u3035","\u3038"-"\u303a","\u3041"-"\u3094","\u309d"-"\u309e","\u30a1"-"\u30fe","\u3105"-"\u312c","\u3131"-"\u318e","\u31a0"-"\u31b7","\u3400"-"\u4db5","\u4e00"-"\u9fa5","\ua000"-"\ua48c","\uac00"-"\ud7a3","\uf900"-"\ufa2d","\ufb00"-"\ufb06","\ufb13"-"\ufb17","\ufb1d","\ufb1f"-"\ufb28","\ufb2a"-"\ufb36","\ufb38"-"\ufb3c","\ufb3e","\ufb40"-"\ufb41","\ufb43"-"\ufb44","\ufb46"-"\ufbb1","\ufbd3"-"\ufd3d","\ufd50"-"\ufd8f","\ufd92"-"\ufdc7","\ufdf0"-"\ufdfb","\ufe33"-"\ufe34","\ufe4d"-"\ufe4f","\ufe69","\ufe70"-"\ufe72","\ufe74","\ufe76"-"\ufefc","\uff04","\uff21"-"\uff3a","\uff3f","\uff41"-"\uff5a","\uff65"-"\uffbe","\uffc2"-"\uffc7","\uffca"-"\uffcf","\uffd2"-"\uffd7","\uffda"-"\uffdc","\uffe0"-"\uffe1","\uffe5"-"\uffe6"]> | <#PART_LETTER: ["\u0000"-"\b","\u000e"-"\u001b","$","#","@","0"-"9","A"-"Z","_","a"-"z","\u007f"-"\u009f","\u00a2"-"\u00a5","\u00aa","\u00b5","\u00ba","\u00c0"-"\u00d6","\u00d8"-"\u00f6","\u00f8"-"\u021f","\u0222"-"\u0233","\u0250"-"\u02ad","\u02b0"-"\u02b8","\u02bb"-"\u02c1","\u02d0"-"\u02d1","\u02e0"-"\u02e4","\u02ee","\u0300"-"\u034e","\u0360"-"\u0362","\u037a","\u0386","\u0388"-"\u038a","\u038c","\u038e"-"\u03a1","\u03a3"-"\u03ce","\u03d0"-"\u03d7","\u03da"-"\u03f3","\u0400"-"\u0481","\u0483"-"\u0486","\u048c"-"\u04c4","\u04c7"-"\u04c8","\u04cb"-"\u04cc","\u04d0"-"\u04f5","\u04f8"-"\u04f9","\u0531"-"\u0556","\u0559","\u0561"-"\u0587","\u0591"-"\u05a1","\u05a3"-"\u05b9","\u05bb"-"\u05bd","\u05bf","\u05c1"-"\u05c2","\u05c4","\u05d0"-"\u05ea","\u05f0"-"\u05f2","\u0621"-"\u063a","\u0640"-"\u0655","\u0660"-"\u0669","\u0670"-"\u06d3","\u06d5"-"\u06dc","\u06df"-"\u06e8","\u06ea"-"\u06ed","\u06f0"-"\u06fc","\u070f"-"\u072c","\u0730"-"\u074a","\u0780"-"\u07b0","\u0901"-"\u0903","\u0905"-"\u0939","\u093c"-"\u094d","\u0950"-"\u0954","\u0958"-"\u0963","\u0966"-"\u096f","\u0981"-"\u0983","\u0985"-"\u098c","\u098f"-"\u0990","\u0993"-"\u09a8","\u09aa"-"\u09b0","\u09b2","\u09b6"-"\u09b9","\u09bc","\u09be"-"\u09c4","\u09c7"-"\u09c8","\u09cb"-"\u09cd","\u09d7","\u09dc"-"\u09dd","\u09df"-"\u09e3","\u09e6"-"\u09f3","\u0a02","\u0a05"-"\u0a0a","\u0a0f"-"\u0a10","\u0a13"-"\u0a28","\u0a2a"-"\u0a30","\u0a32"-"\u0a33","\u0a35"-"\u0a36","\u0a38"-"\u0a39","\u0a3c","\u0a3e"-"\u0a42","\u0a47"-"\u0a48","\u0a4b"-"\u0a4d","\u0a59"-"\u0a5c","\u0a5e","\u0a66"-"\u0a74","\u0a81"-"\u0a83","\u0a85"-"\u0a8b","\u0a8d","\u0a8f"-"\u0a91","\u0a93"-"\u0aa8","\u0aaa"-"\u0ab0","\u0ab2"-"\u0ab3","\u0ab5"-"\u0ab9","\u0abc"-"\u0ac5","\u0ac7"-"\u0ac9","\u0acb"-"\u0acd","\u0ad0","\u0ae0","\u0ae6"-"\u0aef","\u0b01"-"\u0b03","\u0b05"-"\u0b0c","\u0b0f"-"\u0b10","\u0b13"-"\u0b28","\u0b2a"-"\u0b30","\u0b32"-"\u0b33","\u0b36"-"\u0b39","\u0b3c"-"\u0b43","\u0b47"-"\u0b48","\u0b4b"-"\u0b4d","\u0b56"-"\u0b57","\u0b5c"-"\u0b5d","\u0b5f"-"\u0b61","\u0b66"-"\u0b6f","\u0b82"-"\u0b83","\u0b85"-"\u0b8a","\u0b8e"-"\u0b90","\u0b92"-"\u0b95","\u0b99"-"\u0b9a","\u0b9c","\u0b9e"-"\u0b9f","\u0ba3"-"\u0ba4","\u0ba8"-"\u0baa","\u0bae"-"\u0bb5","\u0bb7"-"\u0bb9","\u0bbe"-"\u0bc2","\u0bc6"-"\u0bc8","\u0bca"-"\u0bcd","\u0bd7","\u0be7"-"\u0bef","\u0c01"-"\u0c03","\u0c05"-"\u0c0c","\u0c0e"-"\u0c10","\u0c12"-"\u0c28","\u0c2a"-"\u0c33","\u0c35"-"\u0c39","\u0c3e"-"\u0c44","\u0c46"-"\u0c48","\u0c4a"-"\u0c4d","\u0c55"-"\u0c56","\u0c60"-"\u0c61","\u0c66"-"\u0c6f","\u0c82"-"\u0c83","\u0c85"-"\u0c8c","\u0c8e"-"\u0c90","\u0c92"-"\u0ca8","\u0caa"-"\u0cb3","\u0cb5"-"\u0cb9","\u0cbe"-"\u0cc4","\u0cc6"-"\u0cc8","\u0cca"-"\u0ccd","\u0cd5"-"\u0cd6","\u0cde","\u0ce0"-"\u0ce1","\u0ce6"-"\u0cef","\u0d02"-"\u0d03","\u0d05"-"\u0d0c","\u0d0e"-"\u0d10","\u0d12"-"\u0d28","\u0d2a"-"\u0d39","\u0d3e"-"\u0d43","\u0d46"-"\u0d48","\u0d4a"-"\u0d4d","\u0d57","\u0d60"-"\u0d61","\u0d66"-"\u0d6f","\u0d82"-"\u0d83","\u0d85"-"\u0d96","\u0d9a"-"\u0db1","\u0db3"-"\u0dbb","\u0dbd","\u0dc0"-"\u0dc6","\u0dca","\u0dcf"-"\u0dd4","\u0dd6","\u0dd8"-"\u0ddf","\u0df2"-"\u0df3","\u0e01"-"\u0e3a","\u0e3f"-"\u0e4e","\u0e50"-"\u0e59","\u0e81"-"\u0e82","\u0e84","\u0e87"-"\u0e88","\u0e8a","\u0e8d","\u0e94"-"\u0e97","\u0e99"-"\u0e9f","\u0ea1"-"\u0ea3","\u0ea5","\u0ea7","\u0eaa"-"\u0eab","\u0ead"-"\u0eb9","\u0ebb"-"\u0ebd","\u0ec0"-"\u0ec4","\u0ec6","\u0ec8"-"\u0ecd","\u0ed0"-"\u0ed9","\u0edc"-"\u0edd","\u0f00","\u0f18"-"\u0f19","\u0f20"-"\u0f29","\u0f35","\u0f37","\u0f39","\u0f3e"-"\u0f47","\u0f49"-"\u0f6a","\u0f71"-"\u0f84","\u0f86"-"\u0f8b","\u0f90"-"\u0f97","\u0f99"-"\u0fbc","\u0fc6","\u1000"-"\u1021","\u1023"-"\u1027","\u1029"-"\u102a","\u102c"-"\u1032","\u1036"-"\u1039","\u1040"-"\u1049","\u1050"-"\u1059","\u10a0"-"\u10c5","\u10d0"-"\u10f6","\u1100"-"\u1159","\u115f"-"\u11a2","\u11a8"-"\u11f9","\u1200"-"\u1206","\u1208"-"\u1246","\u1248","\u124a"-"\u124d","\u1250"-"\u1256","\u1258","\u125a"-"\u125d","\u1260"-"\u1286","\u1288","\u128a"-"\u128d","\u1290"-"\u12ae","\u12b0","\u12b2"-"\u12b5","\u12b8"-"\u12be","\u12c0","\u12c2"-"\u12c5","\u12c8"-"\u12ce","\u12d0"-"\u12d6","\u12d8"-"\u12ee","\u12f0"-"\u130e","\u1310","\u1312"-"\u1315","\u1318"-"\u131e","\u1320"-"\u1346","\u1348"-"\u135a","\u1369"-"\u1371","\u13a0"-"\u13f4","\u1401"-"\u166c","\u166f"-"\u1676","\u1681"-"\u169a","\u16a0"-"\u16ea","\u1780"-"\u17d3","\u17db","\u17e0"-"\u17e9","\u180b"-"\u180e","\u1810"-"\u1819","\u1820"-"\u1877","\u1880"-"\u18a9","\u1e00"-"\u1e9b","\u1ea0"-"\u1ef9","\u1f00"-"\u1f15","\u1f18"-"\u1f1d","\u1f20"-"\u1f45","\u1f48"-"\u1f4d","\u1f50"-"\u1f57","\u1f59","\u1f5b","\u1f5d","\u1f5f"-"\u1f7d","\u1f80"-"\u1fb4","\u1fb6"-"\u1fbc","\u1fbe","\u1fc2"-"\u1fc4","\u1fc6"-"\u1fcc","\u1fd0"-"\u1fd3","\u1fd6"-"\u1fdb","\u1fe0"-"\u1fec","\u1ff2"-"\u1ff4","\u1ff6"-"\u1ffc","\u200c"-"\u200f","\u202a"-"\u202e","\u203f"-"\u2040","\u206a"-"\u206f","\u207f","\u20a0"-"\u20af","\u20d0"-"\u20dc","\u20e1","\u2102","\u2107","\u210a"-"\u2113","\u2115","\u2119"-"\u211d","\u2124","\u2126","\u2128","\u212a"-"\u212d","\u212f"-"\u2131","\u2133"-"\u2139","\u2160"-"\u2183","\u3005"-"\u3007","\u3021"-"\u302f","\u3031"-"\u3035","\u3038"-"\u303a","\u3041"-"\u3094","\u3099"-"\u309a","\u309d"-"\u309e","\u30a1"-"\u30fe","\u3105"-"\u312c","\u3131"-"\u318e","\u31a0"-"\u31b7","\u3400"-"\u4db5","\u4e00"-"\u9fa5","\ua000"-"\ua48c","\uac00"-"\ud7a3","\uf900"-"\ufa2d","\ufb00"-"\ufb06","\ufb13"-"\ufb17","\ufb1d"-"\ufb28","\ufb2a"-"\ufb36","\ufb38"-"\ufb3c","\ufb3e","\ufb40"-"\ufb41","\ufb43"-"\ufb44","\ufb46"-"\ufbb1","\ufbd3"-"\ufd3d","\ufd50"-"\ufd8f","\ufd92"-"\ufdc7","\ufdf0"-"\ufdfb","\ufe20"-"\ufe23","\ufe33"-"\ufe34","\ufe4d"-"\ufe4f","\ufe69","\ufe70"-"\ufe72","\ufe74","\ufe76"-"\ufefc","\ufeff","\uff04","\uff10"-"\uff19","\uff21"-"\uff3a","\uff3f","\uff41"-"\uff5a","\uff65"-"\uffbe","\uffc2"-"\uffc7","\uffca"-"\uffcf","\uffd2"-"\uffd7","\uffda"-"\uffdc","\uffe0"-"\uffe1","\uffe5"-"\uffe6","\ufff9"-"\ufffb"]> | < S_CHAR_LITERAL: (["U","E","N","R","B"]|"RB"|"_utf8")? (("'" ( | ~["'", "\\", "\n", "\r"] )* "'") | ("'" ("''" | ~["'"])* "'")) > -| < S_QUOTED_IDENTIFIER: "\"" (~["\n","\r","\""])* "\"" | ("`" (~["\n","\r","`"])+ "`") | ( "[" ~["0"-"9","]"] (~["\n","\r","]"])* "]" ) > - { if ( !allowSquareBracketQuotation && matchedToken.image.charAt(0) == '[' ) { +| < S_QUOTED_IDENTIFIER: "\"" (~["\n","\r","\""])* "\"" | ("`" (~["\n","\r","`"])+ "`") | ( "[" ~["0"-"9","]"] (~["\n","\r","]"])* "]" ) > + { if ( !allowSquareBracketQuotation && matchedToken.image.charAt(0) == '[' ) { matchedToken.image = "["; for (int i=0;i } -Statement Statement() #Statement: -{ Statement stm = null; } +Statement Statement() #Statement: +{ Statement stm = null; } { try { stm = SingleStatement() @@ -400,12 +413,12 @@ Statement Statement() #Statement: parseErrors.add(e); error_skipto(ST_SEMICOLON); } - else + else throw e; } - { - return stm; + { + return stm; } } @@ -441,6 +454,9 @@ Statement SingleStatement() : LOOKAHEAD(CreateSchema()) stm = CreateSchema() | + LOOKAHEAD(CreateSequence()) + stm = CreateSequence() + | LOOKAHEAD(CreateTable()) stm = CreateTable() | @@ -463,9 +479,9 @@ Statement SingleStatement() : | stm = Use() | - stm = Commit() + stm = Commit() | - stm = Comment() + stm = Comment() | stm = Describe() | @@ -482,7 +498,7 @@ Statement SingleStatement() : error_skipto(ST_SEMICOLON); return null; } - else + else throw e; } } @@ -492,7 +508,7 @@ Block Block() #Block : { List list = new ArrayList(); Statement stm; Block block = new Block(); -} +} { ()* @@ -504,7 +520,7 @@ Block Block() #Block : { parseErrors.add(e); error_skipto(ST_SEMICOLON); } - else + else throw e; } { @@ -517,7 +533,7 @@ Block Block() #Block : { } } -Statements Statements() #Statements : +Statements Statements() #Statements : { Statements stmts = new Statements(); List list = new ArrayList(); Statement stm; } @@ -532,7 +548,7 @@ Statements Statements() #Statements : parseErrors.add(e); error_skipto(ST_SEMICOLON); } - else + else throw e; } { @@ -558,26 +574,26 @@ DeclareStatement Declare(): { String typeName; String columnName; ColumnDefinition colDef; -} { - userVariable = UserVariable() +} { + userVariable = UserVariable() ( ( "(" colDef = ColumnDefinition() { stmt.setUserVariable(userVariable); - stmt.setDeclareType(DeclareType.TABLE); - stmt.addColumnDefinition(colDef); } - ("," colDef = ColumnDefinition() { stmt.addColumnDefinition(colDef); })* ")" + stmt.setDeclareType(DeclareType.TABLE); + stmt.addColumnDefinition(colDef); } + ("," colDef = ColumnDefinition() { stmt.addColumnDefinition(colDef); })* ")" ) | - typeName = RelObjectName() - { stmt.setUserVariable(userVariable); - stmt.setDeclareType(DeclareType.AS); + typeName = RelObjectName() + { stmt.setUserVariable(userVariable); + stmt.setDeclareType(DeclareType.AS); stmt.setTypeName(typeName); } | - (colDataType = ColDataType() ["=" defaultExpr = Expression()] - { stmt.setDeclareType(DeclareType.TYPE); + (colDataType = ColDataType() ["=" defaultExpr = Expression()] + { stmt.setDeclareType(DeclareType.TYPE); stmt.addType(userVariable, colDataType, defaultExpr); } - ("," userVariable = UserVariable() colDataType = ColDataType() { defaultExpr = null; } - ["=" defaultExpr = Expression()] { stmt.addType(userVariable, colDataType, defaultExpr); } )* + ("," userVariable = UserVariable() colDataType = ColDataType() { defaultExpr = null; } + ["=" defaultExpr = Expression()] { stmt.addType(userVariable, colDataType, defaultExpr); } )* ) ) { @@ -654,8 +670,8 @@ ValuesStatement Values(): { List expList = new ArrayList(); Expression exp; } { - - "(" + + "(" exp=PrimaryExpression() { expList.add(exp); } ("," exp=PrimaryExpression() { expList.add(exp); } )* ")" @@ -685,8 +701,8 @@ Update Update(): { table=TableWithAlias() startJoins=JoinsList() - - + + ( LOOKAHEAD(3) tableColumn=Column() "=" value=SimpleExpression() { columns.add(tableColumn); expList.add(value); } ("," tableColumn=Column() "=" value=SimpleExpression() { columns.add(tableColumn); expList.add(value); } )* @@ -836,7 +852,7 @@ Insert Insert(): }] [{ modifierIgnore = true; }] [] table=Table() - + [ [ { useAs = true; } ] name=RelObjectNameWithoutValue() { table.setAlias(new Alias(name,useAs)); }] [LOOKAHEAD(2) "(" tableColumn=Column() { columns.add(tableColumn); } ("," tableColumn=Column() { columns.add(tableColumn); } )* ")" ] @@ -864,13 +880,13 @@ Insert Insert(): { insert.setUseValues(false); } select = Select() ) - + | - - + + ( - { - useSet = true; + { + useSet = true; insert.setUseValues(false); } tableColumn=Column() "=" exp=SimpleExpression() @@ -1015,8 +1031,8 @@ Delete Delete(): List orderByElements; } { - [LOOKAHEAD(2) (table=TableWithAlias() { tables.add(table); } - ("," table=TableWithAlias() { tables.add(table); } )* + [LOOKAHEAD(2) (table=TableWithAlias() { tables.add(table); } + ("," table=TableWithAlias() { tables.add(table); } )* | )] [ LOOKAHEAD(3) table=TableWithAlias() joins=JoinsList() ] @@ -1043,10 +1059,10 @@ Statement Merge() : { } { table=TableWithAlias() { merge.setTable(table); } - - ( table=Table() { merge.setUsingTable(table); } + + ( table=Table() { merge.setUsingTable(table); } | "(" select=SubSelect() { merge.setUsingSelect(select); } ")" ) - [ alias = Alias() { merge.setUsingAlias(alias); } ] + [ alias = Alias() { merge.setUsingAlias(alias); } ] "(" condition = Expression() { merge.setOnCondition(condition); } ")" [ @@ -1059,12 +1075,12 @@ Statement Merge() : { /*[ LOOKAHEAD(2) update = MergeUpdateClause() { merge.setMergeUpdate(update); } ] - + [ insert = MergeInsertClause() { merge.setMergeInsert(insert); } ]*/ - + { return merge; } } - + MergeUpdate MergeUpdateClause() : { MergeUpdate mu = new MergeUpdate(); List columns = new ArrayList(); @@ -1074,11 +1090,11 @@ MergeUpdate MergeUpdateClause() : { Expression condition; } { - - - col = Column() "=" exp = SimpleExpression() - { columns.add(col); expList.add(exp); } - ("," col = Column() "=" exp = SimpleExpression() { columns.add(col); expList.add(exp); } )* + + + col = Column() "=" exp = SimpleExpression() + { columns.add(col); expList.add(exp); } + ("," col = Column() "=" exp = SimpleExpression() { columns.add(col); expList.add(exp); } )* { mu.setColumns(columns); mu.setValues(expList); } @@ -1096,9 +1112,9 @@ MergeInsert MergeInsertClause() : { Expression exp; } { - - ["(" col=Column() { columns.add(col); } ("," col=Column() { columns.add(col); } )* ")"] - "(" exp=SimpleExpression() { expList.add(exp); } ("," exp=SimpleExpression() { expList.add(exp); } )* ")" + + ["(" col=Column() { columns.add(col); } ("," col=Column() { columns.add(col); } )* ")"] + "(" exp=SimpleExpression() { expList.add(exp); } ("," exp=SimpleExpression() { expList.add(exp); } )* ")" { mi.setColumns(columns); mi.setValues(expList); @@ -1135,12 +1151,12 @@ Column Column() #Column : /* Not all names should be allowed for aliases. */ -String RelObjectNameWithoutValue() : +String RelObjectNameWithoutValue() : { Token tk = null; } { (tk= | tk= | tk= | tk= | tk= | tk= - | tk= | tk= | tk= | tk= | tk= | tk= | tk= - | tk= | tk= | tk= | tk= | tk= + | tk= | tk= | tk= | tk= | tk= | tk= | tk= + | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= @@ -1148,7 +1164,7 @@ String RelObjectNameWithoutValue() : | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= - | tk= | tk= | tk= | tk= + | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= @@ -1165,24 +1181,24 @@ Normal names. String RelObjectName() : { Token tk = null; String result = null; } { - (result = RelObjectNameWithoutValue() + (result = RelObjectNameWithoutValue() | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= | tk= ) - { + { if (tk!=null) result=tk.image; - return result; + return result; } } String RelObjectNameWithoutStart() : { Token tk = null; String result = null; } { - (result = RelObjectNameWithoutValue() | tk= | tk= | tk= + (result = RelObjectNameWithoutValue() | tk= | tk= | tk= | tk=) - { + { if (tk!=null) result=tk.image; - return result; + return result; } } @@ -1192,10 +1208,10 @@ Extended version of object names. String RelObjectNameExt(): { Token tk = null; String result=null; -} +} { - ( result=RelObjectName() | tk= | tk= | tk= - | tk= | tk= | | tk= + ( result=RelObjectName() | tk= | tk= | tk= + | tk= | tk= | | tk= | tk= ) { if (tk!=null) result=tk.image; @@ -1209,7 +1225,7 @@ Extended usage of object names - part 2. Using within multipart names as followi String RelObjectNameExt2(): { Token tk = null; String result=null; -} +} { ( result=RelObjectNameExt() | tk= | tk= ) { @@ -1382,7 +1398,7 @@ SelectBody SetOperationList() #SetOperationList: ( ( - (("(" select=SelectBody() ")" { bracket=true;} ) + (("(" select=SelectBody() ")" { bracket=true;} ) | ( select=PlainSelect() | select=Values() ) { bracket=false;} ) {selects.add(select);brackets.add(bracket); } ( (( { UnionOp union = new UnionOp();linkAST(union,jjtThis);operations.add(union); } [ { union.setAll(true); } | { union.setDistinct(true); } ]) @@ -1403,8 +1419,8 @@ SelectBody SetOperationList() #SetOperationList: { if (selects.size()==1 && selects.get(0) instanceof PlainSelect && orderByElements==null) { - if (brackets.get(0)) - ((PlainSelect)selects.get(0)).setUseBrackets(true); + if (brackets.get(0)) + ((PlainSelect)selects.get(0)).setUseBrackets(true); return selects.get(0); } else { if (selects.size()>1 && selects.get(selects.size()-1) instanceof PlainSelect) { @@ -1413,7 +1429,7 @@ SelectBody SetOperationList() #SetOperationList: list.setOrderByElements(ps.getOrderByElements()); ps.setOrderByElements(null); } - } + } list.setBracketsOpsAndSelects(brackets,selects,operations); return list; } @@ -1476,7 +1492,7 @@ SelectItem SelectItem() #SelectItem: | LOOKAHEAD(AllTableColumns()) selectItem=AllTableColumns() | - selectItem=SelectExpressionItem() + selectItem=SelectExpressionItem() ) { linkAST(selectItem,jjtThis); @@ -1499,18 +1515,18 @@ AllTableColumns AllTableColumns(): Alias Alias(): { String name = null; Token token = null; - boolean useAs = false; + boolean useAs = false; Alias alias; String colname; ColDataType colDataType = null; } { - [ { useAs = true; } ] + [ { useAs = true; } ] ( name=RelObjectNameWithoutStart() | token= { name=token.image; } ) { alias = new Alias(name,useAs); } [ LOOKAHEAD(2) "(" { List list = new ArrayList(); } - colname = RelObjectName() [ colDataType = ColDataType() ] { list.add(new Alias.AliasColumn(colname, colDataType)); } + colname = RelObjectName() [ colDataType = ColDataType() ] { list.add(new Alias.AliasColumn(colname, colDataType)); } ("," { colDataType=null; } colname = RelObjectName() [ colDataType = ColDataType()] { list.add(new Alias.AliasColumn(colname, colDataType)); } )* ")" { alias.setAliasColumns(list); } ] @@ -1848,7 +1864,7 @@ LateralSubSelect LateralSubSelect(): SubSelect subSelect = null; } { - { specialSubSelect = new LateralSubSelect(); } + { specialSubSelect = new LateralSubSelect(); } "(" subSelect=SubSelect() ")" { specialSubSelect.setSubSelect(subSelect); @@ -1863,7 +1879,7 @@ FromItem SubJoin(): List joinList = null; } { - fromItem=FromItem() + fromItem=FromItem() joinList=SubJoinsList() { SubJoin subJoin = new SubJoin(); @@ -1903,15 +1919,15 @@ Join JoinerExpression() #JoinerExpression: Column tableColumn; List columns = null; KSQLJoinWindow joinWindow = null; - + } { - + [ { join.setLeft(true); } [ { join.setSemi(true); } | { join.setOuter(true); } ] | ( { join.setRight(true); } - | { join.setFull(true); } + | { join.setFull(true); } ) [ { join.setOuter(true); } ] | { join.setInner(true); } | { join.setNatural(true); } @@ -1925,7 +1941,7 @@ Join JoinerExpression() #JoinerExpression: right=FromItem() - [ + [ LOOKAHEAD(2) ([ "(" joinWindow = JoinWindow() ")" {join.setJoinWindow(joinWindow);}] ( onExpression=Expression() { join.setOnExpression(onExpression); }) | @@ -1936,7 +1952,7 @@ Join JoinerExpression() #JoinerExpression: { linkAST(join,jjtThis); join.setRightItem(right); - return join; + return join; } } @@ -2033,8 +2049,8 @@ OracleHierarchicalExpression OracleHierarchicalQueryClause(): { result.setConnectExpression(expr); } | [ { result.setNoCycle(true); } ] expr=AndExpression() - { - result.setConnectExpression(expr); + { + result.setConnectExpression(expr); result.setConnectFirst(true); } [ expr=AndExpression() {result.setStartExpression(expr);} ] @@ -2052,20 +2068,20 @@ GroupByElement GroupByColumnReferences(): ExpressionList list; } { - + ( columnReference=SimpleExpression() {groupBy.addGroupByExpression(columnReference); } ("," columnReference=SimpleExpression() {groupBy.addGroupByExpression(columnReference); } )* | - "(" + "(" ( LOOKAHEAD(2) "(" ")" { groupBy.addGroupingSet(new ExpressionList()); } - | LOOKAHEAD(3) "(" list = SimpleExpressionList() ")" { groupBy.addGroupingSet(list); } + | LOOKAHEAD(3) "(" list = SimpleExpressionList() ")" { groupBy.addGroupingSet(list); } | expr = SimpleExpression() { groupBy.addGroupingSet(expr); } ) ( "," ( LOOKAHEAD(2) "(" ")" { groupBy.addGroupingSet(new ExpressionList()); } - | LOOKAHEAD(3) "(" list = SimpleExpressionList() ")" { groupBy.addGroupingSet(list); } + | LOOKAHEAD(3) "(" list = SimpleExpressionList() ")" { groupBy.addGroupingSet(list); } | expr = SimpleExpression() { groupBy.addGroupingSet(expr); } ) )* - ")" + ")" ) { return groupBy; @@ -2104,9 +2120,9 @@ OrderByElement OrderByElement(): { columnReference = Expression() [ ( | ( { orderByElement.setAsc(false); } )) { orderByElement.setAscDescPresent(true); } ] - [ ( - { orderByElement.setNullOrdering(OrderByElement.NullOrdering.NULLS_FIRST); } | - { orderByElement.setNullOrdering(OrderByElement.NullOrdering.NULLS_LAST); } + [ ( + { orderByElement.setNullOrdering(OrderByElement.NullOrdering.NULLS_FIRST); } | + { orderByElement.setNullOrdering(OrderByElement.NullOrdering.NULLS_LAST); } )? ] { @@ -2119,7 +2135,7 @@ JdbcParameter SimpleJdbcParameter() : { JdbcParameter retval; } { - "?" { retval = new JdbcParameter(++jdbcParameterIndex, false); } + "?" { retval = new JdbcParameter(++jdbcParameterIndex, false); } [ LOOKAHEAD(2) token = { retval.setUseFixedIndex(true); retval.setIndex(Integer.valueOf(token.image)); } ] { return retval; @@ -2161,7 +2177,7 @@ Limit LimitWithOffset() #LimitWithOffset: ( token= { limit.setRowCount(new LongValue(token.image)); } | - jdbc = SimpleJdbcParameter() { limit.setRowCount(jdbc); } + jdbc = SimpleJdbcParameter() { limit.setRowCount(jdbc); } | ":" { limit.setRowCount(new JdbcNamedParameter()); } [ LOOKAHEAD(2) name = RelObjectNameExt() { ((JdbcNamedParameter)limit.getRowCount()).setName(name); } ] ) @@ -2187,7 +2203,7 @@ Limit PlainLimit() #PlainLimit: ( token= { limit.setRowCount(new LongValue(token.image)); } | - jdbc = SimpleJdbcParameter() { limit.setRowCount(jdbc); } + jdbc = SimpleJdbcParameter() { limit.setRowCount(jdbc); } | ":" { limit.setRowCount(new JdbcNamedParameter()); } [ LOOKAHEAD(2) name = RelObjectNameExt() { ((JdbcNamedParameter)limit.getRowCount()).setName(name); } ] | @@ -2214,8 +2230,8 @@ Offset Offset(): // sqlserver-oracle-> OFFSET offset (ROW | ROWS) (token= { offset.setOffset(Long.parseLong(token.image)); } - | jdbc = SimpleJdbcParameter() { offset.setOffsetJdbcParameter(jdbc); } - | jdbcNamed = SimpleJdbcNamedParameter() { offset.setOffsetJdbcParameter(jdbcNamed); }) + | jdbc = SimpleJdbcParameter() { offset.setOffsetJdbcParameter(jdbc); } + | jdbcNamed = SimpleJdbcNamedParameter() { offset.setOffsetJdbcParameter(jdbcNamed); }) [( { offset.setOffsetParam("ROWS"); } | { offset.setOffsetParam("ROW"); })] ) @@ -2237,7 +2253,7 @@ Fetch Fetch(): ( { fetch.setFetchParamFirst(true); } | ) (token= { fetch.setRowCount(Long.parseLong(token.image)); } | jdbc = SimpleJdbcParameter() { fetch.setFetchJdbcParameter(jdbc); } ) /* "?" { fetch.setFetchJdbcParameter(true); } ) */ - ( { fetch.setFetchParam("ROWS"); } | ) + ( { fetch.setFetchParam("ROWS"); } | ) ) @@ -2280,7 +2296,7 @@ Top Top(): expr=AdditiveExpression() { top.setExpression(expr); } { top.setParenthesis(true);} ")" - ) [ LOOKAHEAD(2) { top.setPercentage(true); } ] + ) [ LOOKAHEAD(2) { top.setPercentage(true); } ] { return top; } @@ -2298,7 +2314,7 @@ Skip Skip(): ( token= { skip.setRowCount(Long.parseLong(token.image)); } | token= { skip.setVariable(token.image); } - | jdbc = SimpleJdbcParameter() { skip.setJdbcParameter(jdbc); } + | jdbc = SimpleJdbcParameter() { skip.setJdbcParameter(jdbc); } /* "?" { skip.setJdbcParameter(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = { skip.getJdbcParameter().setUseFixedIndex(true); skip.getJdbcParameter().setIndex(Integer.valueOf(token.image)); } ] */ ) { @@ -2336,7 +2352,7 @@ First First(): ( token= { first.setRowCount(Long.parseLong(token.image)); } | token= { first.setVariable(token.image); } - | jdbc = SimpleJdbcParameter() { first.setJdbcParameter(jdbc); } + | jdbc = SimpleJdbcParameter() { first.setJdbcParameter(jdbc); } /* "?" { first.setJdbcParameter(new JdbcParameter(++jdbcParameterIndex, false)); } [ LOOKAHEAD(2) token = { first.getJdbcParameter().setUseFixedIndex(true); first.getJdbcParameter().setIndex(Integer.valueOf(token.image)); } ] */ ) { @@ -2470,7 +2486,7 @@ Expression RegularCondition() #RegularCondition: | "-#" { result = new JsonOperator("-#"); } ) - ( LOOKAHEAD(2) rightExpression=ComparisonItem() { oraclePrior = EqualsTo.ORACLE_PRIOR_END; } + ( LOOKAHEAD(2) rightExpression=ComparisonItem() { oraclePrior = EqualsTo.ORACLE_PRIOR_END; } | rightExpression=ComparisonItem() ) [ "(" "+" ")" { oracleJoin=EqualsTo.ORACLE_JOIN_LEFT; } ] @@ -2534,8 +2550,8 @@ Expression InExpression() #InExpression : leftExpression=SimpleExpression() { result.setLeftExpression(leftExpression); } [ "(" "+" ")" { result.setOldOracleJoinSyntax(EqualsTo.ORACLE_JOIN_RIGHT); } ] ) - [ { result.setNot(true); } ] - ( rightExpression = Function() + [ { result.setNot(true); } ] + ( rightExpression = Function() | token= { rightExpression = new StringValue(token.image); } | "(" (LOOKAHEAD(3) rightItemsList=SubSelect() | rightItemsList=SimpleExpressionList() ) ")") { @@ -2587,7 +2603,7 @@ Expression SimilarToExpression(Expression leftExpression) #SimilarToExpression: } { [ { result.setNot(true); } ] - + rightExpression=SimpleExpression() [ token= { result.setEscape((new StringValue(token.image)).getValue()); }] { @@ -2695,11 +2711,11 @@ NamedExpressionList NamedExpressionList1(): Token tk2 = null; } { - ( + ( (tk1=|tk1=|tk1=) { names.add(tk1.image); } - expr1=SimpleExpression() - (tk2=|tk2=|tk2=) - expr2=SimpleExpression() + expr1=SimpleExpression() + (tk2=|tk2=|tk2=) + expr2=SimpleExpression() { expressions.add(expr1); names.add(tk2.image); expressions.add(expr2);} ) @@ -2731,21 +2747,21 @@ NamedExpressionList NamedExpressionListExprFirst(): Token tk4 = null; } { - expr1=SimpleExpression() - (tk2=|tk2=|tk2=) + expr1=SimpleExpression() + (tk2=|tk2=|tk2=) { names.add(""); expressions.add(expr1); names.add(tk2.image); } - ( + ( expr2=SimpleExpression() { expressions.add(expr2);} - ( - (tk3=|tk3=) - expr3=SimpleExpression() {names.add(tk3.image); expressions.add(expr3);} - ( - (tk4=) - expr4=SimpleExpression() {names.add(tk4.image); expressions.add(expr4);} + ( + (tk3=|tk3=) + expr3=SimpleExpression() {names.add(tk3.image); expressions.add(expr3);} + ( + (tk4=) + expr4=SimpleExpression() {names.add(tk4.image); expressions.add(expr4);} )? )? ) @@ -2809,7 +2825,7 @@ Expression AnyComparisonExpression() : SubSelect subselect = null; } { - ( { anyType = AnyType.ANY; } | { anyType = AnyType.SOME; } ) + ( { anyType = AnyType.ANY; } | { anyType = AnyType.SOME; } ) "(" subselect=SubSelect() ")" { retval = new AnyComparisonExpression(anyType, subselect); } { return retval; @@ -3020,7 +3036,7 @@ Expression PrimaryExpression() #PrimaryExpression: | LOOKAHEAD(2) retval = NextValExpression() - | retval=Column() + | retval=Column() | token= { retval = new StringValue(token.image); linkAST(retval,jjtThis); } @@ -3036,7 +3052,7 @@ Expression PrimaryExpression() #PrimaryExpression: ) [ - token= { retval = new CollateExpression(retval, token.image); } + token= { retval = new CollateExpression(retval, token.image); } ] [ @@ -3052,7 +3068,7 @@ Expression PrimaryExpression() #PrimaryExpression: castExpr.setType(type); retval=castExpr; } )* - + { if (sign != null) { retval = new SignedExpression(sign.image.charAt(0), retval); @@ -3079,7 +3095,7 @@ JdbcNamedParameter JdbcNamedParameter() : { String name; } { - ":" (name=RelObjectNameExt2() { parameter.setName(name); }) + ":" (name=RelObjectNameExt2() { parameter.setName(name); }) { return parameter; } @@ -3092,11 +3108,11 @@ UserVariable UserVariable() : { } { ("@" | "@@" { var.setDoubleAdd(true);} ) - varName=RelObjectNameExt2() + varName=RelObjectNameExt2() ( "." var2=RelObjectNameExt2() { varName+="." + var2; } )* - { - var.setName(varName); - return var; + { + var.setName(varName); + return var; } } @@ -3105,10 +3121,10 @@ NumericBind NumericBind() : { Token token; } { - ":" token= - { - var.setBindId(Integer.valueOf(token.image)); - return var; + ":" token= + { + var.setBindId(Integer.valueOf(token.image)); + return var; } } @@ -3117,7 +3133,7 @@ DateTimeLiteralExpression DateTimeLiteralExpression() : { Token t; } { t= { expr.setType(DateTimeLiteralExpression.DateTime.valueOf(t.image.toUpperCase())); } - + t= { expr.setValue(t.image); return expr; } } @@ -3128,14 +3144,14 @@ JsonExpression JsonExpression() : { } { column=Column() ( - "->" (token= | token=) {result.addIdent(token.image,"->");} | + "->" (token= | token=) {result.addIdent(token.image,"->");} | "->>" (token= | token=) {result.addIdent(token.image,"->>");} | "#>" token= {result.addIdent(token.image,"#>");} | "#>>" token= {result.addIdent(token.image,"#>>");} )+ - { + { result.setColumn(column); - return result; + return result; } } @@ -3146,15 +3162,15 @@ IntervalExpression IntervalExpression() : { boolean signed = false; } { - + { interval = new IntervalExpression(); } ["-" {signed=true;}] (token= | token= | token= | expr = Column()) - { + { if (expr != null) { if (signed) expr = new SignedExpression('-', expr); interval.setExpression(expr); } else { - interval.setParameter((signed?"-":"") + token.image); + interval.setParameter((signed?"-":"") + token.image); } } [ LOOKAHEAD(2) (token = | token = ) { interval.setIntervalType(token.image); } ] @@ -3169,7 +3185,7 @@ IntervalExpression IntervalExpressionWithoutInterval(Expression expr) : { boolean signed = false; } { - { + { interval = new IntervalExpression(false); interval.setExpression(expr); } @@ -3214,17 +3230,17 @@ AnalyticExpression AnalyticExpression(Function function) : [ "(" filter = Expression() ")" ] - ( {retval.setType(AnalyticType.OVER);} + ( {retval.setType(AnalyticType.OVER);} | {retval.setType(AnalyticType.WITHIN_GROUP);} ) "(" - [ - (LOOKAHEAD(ComplexExpressionList()) expressionList=ComplexExpressionList() - | "(" {partitionByBrackets = true;} expressionList=ComplexExpressionList() ")" ) + [ + (LOOKAHEAD(ComplexExpressionList()) expressionList=ComplexExpressionList() + | "(" {partitionByBrackets = true;} expressionList=ComplexExpressionList() ")" ) ] [olist=OrderByElements() ] [windowElement = WindowElement() ] - + { retval.setPartitionExpressionList(expressionList, partitionByBrackets); retval.setOrderByElements(olist); @@ -3246,14 +3262,14 @@ WindowElement WindowElement(): { ( { windowElement.setType(WindowElement.Type.ROWS); } | { windowElement.setType(WindowElement.Type.RANGE); } ) ( ( - { windowElement.setRange(range); } - offset = WindowOffset() { range.setStart(offset); } + { windowElement.setRange(range); } + offset = WindowOffset() { range.setStart(offset); } offset = WindowOffset() { range.setEnd(offset); } ) - | - offset = WindowOffset() { windowElement.setOffset(offset); } + | + offset = WindowOffset() { windowElement.setOffset(offset); } ) - + { return windowElement; } @@ -3269,22 +3285,22 @@ WindowOffset WindowOffset(): ( ( { offset.setType(WindowOffset.Type.PRECEDING); } | { offset.setType(WindowOffset.Type.FOLLOWING); } ) - ) + ) | - LOOKAHEAD(2) ( { offset.setType(WindowOffset.Type.CURRENT); } ) + LOOKAHEAD(2) ( { offset.setType(WindowOffset.Type.CURRENT); } ) | ( expr = SimpleExpression() { - offset.setType(WindowOffset.Type.EXPR); - offset.setExpression(expr); - } + offset.setType(WindowOffset.Type.EXPR); + offset.setExpression(expr); + } ( { offset.setType(WindowOffset.Type.PRECEDING); } | { offset.setType(WindowOffset.Type.FOLLOWING); } ) ) ) - + { return offset; } -} +} ExtractExpression ExtractExpression() : { @@ -3350,7 +3366,7 @@ WhenClause WhenThenSearchCondition(): Expression thenExp = null; } { - (LOOKAHEAD(Expression()) whenExp=Expression() | whenExp=SimpleExpression()) + (LOOKAHEAD(Expression()) whenExp=Expression() | whenExp=SimpleExpression()) thenExp=Expression() { whenThen.setWhenExpression(whenExp); @@ -3410,25 +3426,25 @@ Execute Execute(): { Expression expr; } { - ( { execute.setExecType(Execute.EXEC_TYPE.EXEC); } - | { execute.setExecType(Execute.EXEC_TYPE.EXECUTE); } + ( { execute.setExecType(Execute.EXEC_TYPE.EXEC); } + | { execute.setExecType(Execute.EXEC_TYPE.EXECUTE); } | { execute.setExecType(Execute.EXEC_TYPE.CALL); } ) funcName=RelObjectNameList() { execute.setName(funcName); } - ( + ( LOOKAHEAD(3) ( expr = VariableExpression() { namedExprList = new ArrayList(); namedExprList.add( expr ); } - ( "," expr = VariableExpression() { namedExprList.add(expr); })* + ( "," expr = VariableExpression() { namedExprList.add(expr); })* { expressionList = new ExpressionList(namedExprList); } ) | - LOOKAHEAD(3) expressionList=SimpleExpressionList() + LOOKAHEAD(3) expressionList=SimpleExpressionList() | ("(" expressionList=SimpleExpressionList() ")" { execute.setParenthesis(true); }) )? - { + { execute.setExprList(expressionList); - return execute; + return execute; } } @@ -3468,7 +3484,7 @@ Function FunctionWithCondParams() #Function: { { (token = | token = ) { funcName=token.image; } - "(" + "(" expressionList=ComplexExpressionList() ")" @@ -3478,7 +3494,7 @@ Function FunctionWithCondParams() #Function: { linkAST(retval,jjtThis); return retval; } -} +} Function Function() #Function: @@ -3489,7 +3505,7 @@ Function Function() #Function: ( "{" { retval.setEscaped(true); } InternalFunction(retval) "}" | InternalFunction(retval) - ) + ) { linkAST(retval,jjtThis); return retval; @@ -3521,17 +3537,17 @@ Function InternalFunction(Function retval) : "*" { retval.setAllColumns(true); } | namedExpressionList=NamedExpressionList1() - | + | LOOKAHEAD(NamedExpressionListExprFirst()) namedExpressionList = NamedExpressionListExprFirst() - | + | LOOKAHEAD(3) expressionList=SimpleExpressionList() - | - expr = SubSelect() { expr.setUseBrackets(false); expressionList = new ExpressionList(expr); } - )] + | + expr = SubSelect() { expr.setUseBrackets(false); expressionList = new ExpressionList(expr); } + )] [ {retval.setIgnoreNulls(true); }] ")" - [ "." ( + [ "." ( LOOKAHEAD(2) expr1=Function() { retval.setAttribute(expr1); } | tmp=RelObjectName() { retval.setAttributeName(tmp); } ) @@ -3546,7 +3562,7 @@ Function InternalFunction(Function retval) : retval.setKeep(keep); return retval; } -} +} MySQLGroupConcat MySQLGroupConcat():{ MySQLGroupConcat retval = new MySQLGroupConcat(); @@ -3555,15 +3571,15 @@ MySQLGroupConcat MySQLGroupConcat():{ Token t; } { - "(" - [ { retval.setDistinct(true); } ] - expressionList = SimpleExpressionList() + "(" + [ { retval.setDistinct(true); } ] + expressionList = SimpleExpressionList() [ orderByList = OrderByElements() { retval.setOrderByElements(orderByList); } ] [ t= { retval.setSeparator(t.image); } ] ")" - { + { retval.setExpressionList(expressionList); - return retval; + return retval; } } @@ -3643,7 +3659,7 @@ CreateIndex CreateIndex(): { CreateIndex createIndex = new CreateIndex(); Table table = null; - List colNames; + List colNames; //Token columnName; Token using; Index index = null; @@ -3687,7 +3703,7 @@ ColumnDefinition ColumnDefinition(): { ColDataType colDataType; List columnSpecs = new ArrayList(); List parameter; -} { +} { columnName=RelObjectName() colDataType = ColDataType() @@ -3721,7 +3737,7 @@ CreateSchema CreateSchema(): [ (tk= | tk=) { schema.setAuthorization(tk.image); } ] - + /* [ tk= | {} ] */ [schemaPath=PathSpecification() { schema.setSchemaPath(schemaPath); }] @@ -3790,12 +3806,12 @@ CreateTable CreateTable(): [ { createTable.setUnlogged(true); } ] - /* [ [ (tk= | tk=) {createOptions.add(tk.image);} ] + /* [ [ (tk= | tk=) {createOptions.add(tk.image);} ] ( tk= | tk= ) {createOptions.add(tk.image);}] */ (parameter = CreateParameter() { createOptions.addAll(parameter); })* - + [ LOOKAHEAD(2) { createTable.setIfNotExists(true); }] table=Table() [ @@ -3827,7 +3843,7 @@ CreateTable CreateTable(): index = new NamedConstraint(); } [ sk3=RelObjectName() {index.setName(sk3);} ] - + (tk= tk2= {index.setType(tk.image + " " + tk2.image);} | tk= [ tk2= ] {index.setType(tk.image + (tk2!=null?" " + tk2.image:""));} ) @@ -3875,7 +3891,7 @@ CreateTable CreateTable(): fkIndex.setReferencedColumnNames(colNames2); indexes.add(fkIndex); } - [LOOKAHEAD(2) ( + [LOOKAHEAD(2) ( ( {fkIndex.setOnDeleteReferenceOption("CASCADE");} | {fkIndex.setOnDeleteReferenceOption("NO ACTION");} @@ -3963,18 +3979,18 @@ ColDataType ColDataType(): List array = new ArrayList(); } { - ( + ( (tk= | tk=) [tk2=] { colDataType.setDataType(tk.image + (tk2!=null?" " + tk2.image:"")); } | tk= [LOOKAHEAD(2) tk2=] { colDataType.setDataType(tk.image + (tk2!=null?" " + tk2.image:"")); } - | ( tk= | tk= | tk= | tk= | tk= - | tk= | tk= | tk= | tk= ) + | ( tk= | tk= | tk= | tk= | tk= + | tk= | tk= | tk= | tk= ) { colDataType.setDataType(tk.image); } | tk= tk2= {colDataType.setDataType(tk.image + " " + tk2.image);} | LOOKAHEAD(2) tk= tk2= {colDataType.setDataType(tk.image + " " + tk2.image);} | tk= { colDataType.setDataType(tk.image);} ) - [LOOKAHEAD(2) "(" {tk2 =null;} ( (tk= [ tk2= | tk2= ] | tk= | tk= ) + [LOOKAHEAD(2) "(" {tk2 =null;} ( (tk= [ tk2= | tk2= ] | tk= | tk= ) { argumentsStringList.add(tk.image + (tk2!=null?" " + tk2.image:"")); } ["," {/*argumentsStringList.add(",");*/}] )* ")"] [( "[" {tk=null;} [ tk= ] { array.add(tk!=null?Integer.valueOf(tk.image):null); } "]" )+ { colDataType.setArrayData(array); } ] [LOOKAHEAD(2) tk= { colDataType.setCharacterSet(tk.image); } ] @@ -3996,8 +4012,8 @@ CreateView CreateView(): { [ { createView.setOrReplace(true);} ] - [ - { createView.setForce(ForceOption.NO_FORCE); } + [ + { createView.setForce(ForceOption.NO_FORCE); } | { createView.setForce(ForceOption.FORCE); } ] [ @@ -4066,20 +4082,20 @@ List CreateParameter(): tk= { retval += tk.image; } | tk= { retval += tk.image; } - ) + ) { param.add(retval); } | - tk= { param.add(tk.image); } + tk= { param.add(tk.image); } | - tk= { param.add(tk.image); } + tk= { param.add(tk.image); } | - tk= { param.add(tk.image); } + tk= { param.add(tk.image); } | - tk= { param.add(tk.image); } + tk= { param.add(tk.image); } | - tk= { param.add(tk.image); } + tk= { param.add(tk.image); } | - tk= { param.add(tk.image); } + tk= { param.add(tk.image); } | tk= { param.add(tk.image); } | @@ -4151,11 +4167,11 @@ String AList(): } } -String ColumnsNamesListItem(): +String ColumnsNamesListItem(): { Token tk = null; String item = null; -} +} { ( item = RelObjectName() ) [ "(" tk = ")" { item = item + "(" + tk.image + ")"; } ] @@ -4276,7 +4292,7 @@ List AlterExpressionConstraintState(): | ( {retval.add(new DeferrableConstraint(true));} - ) + ) | ( {retval.add(new ValidateConstraint(false));} @@ -4329,7 +4345,7 @@ AlterExpression AlterExpression(): | LOOKAHEAD(2) ( (tk= { alterExp.setUk(true); } | tk=) - sk3 = RelObjectName() + sk3 = RelObjectName() columnNames = ColumnsNamesList() { index = new Index(); @@ -4468,7 +4484,7 @@ AlterExpression AlterExpression(): alterExp.setColumnName(tk.image); } [tk= { alterExp.addParameters(tk.image); } ] - + ) | ( tk= @@ -4538,10 +4554,10 @@ Wait Wait(): Token token = null; } { - // sqlserver-oracle-> WAIT (TIMEOUT) + // sqlserver-oracle-> WAIT (TIMEOUT) // https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_10002.htm#i2126016 token= { wait.setTimeout(Long.parseLong(token.image)); } - + { return wait; } @@ -4637,4 +4653,108 @@ void readGrantTypes(ArrayList privileges): {privileges.add("EXECUTE");} | {privileges.add("ALTER");} | {privileges.add("DROP");} -} \ No newline at end of file +} + +Sequence Sequence() #Sequence : +{ + List data = new ArrayList(); + String serverName = null, databaseName = null, schemaName = null, sequenceName = null; +} +{ + data = RelObjectNameList() + + { + Sequence sequence = new Sequence(data); + linkAST(sequence,jjtThis); + return sequence; + } +} + +CreateSequence CreateSequence(): +{ + CreateSequence createSequence = new CreateSequence(); + Sequence sequence; + List sequenceParameters = new ArrayList(); + Sequence.Parameter parameter = null; + Token token = null; +} +{ + + sequence=Sequence() { createSequence.setSequence(sequence); } + ( + ( token= + { + parameter = new Sequence.Parameter(Sequence.ParameterType.INCREMENT_BY); + parameter.setValue(Long.parseLong(token.image)); + sequenceParameters.add(parameter); + } + ) + | + ( token= + { + parameter = new Sequence.Parameter(Sequence.ParameterType.START_WITH); + parameter.setValue(Long.parseLong(token.image)); + sequenceParameters.add(parameter); + } + ) + | + ( + { + parameter = new Sequence.Parameter(Sequence.ParameterType.NOMAXVALUE); + sequenceParameters.add(parameter); + } + | token= + { + parameter = new Sequence.Parameter(Sequence.ParameterType.MAXVALUE); + parameter.setValue(Long.parseLong(token.image)); + sequenceParameters.add(parameter); + } + ) + | + ( + { + parameter = new Sequence.Parameter(Sequence.ParameterType.NOMINVALUE); + sequenceParameters.add(parameter); + } + | token= + { + parameter = new Sequence.Parameter(Sequence.ParameterType.MINVALUE); + parameter.setValue(Long.parseLong(token.image)); + sequenceParameters.add(parameter); + } + ) + | + ( { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.NOCYCLE)); } + | { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.CYCLE)); } + ) + | + ( + { + parameter = new Sequence.Parameter(Sequence.ParameterType.NOCACHE); + sequenceParameters.add(parameter); + } + | token= + { + parameter = new Sequence.Parameter(Sequence.ParameterType.CACHE); + parameter.setValue(Long.parseLong(token.image)); + sequenceParameters.add(parameter); + } + ) + | + ( { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.ORDER)); } + | { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.NOORDER)); } + ) + | + ( { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.KEEP)); } + | { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.NOKEEP)); } + ) + | + ( { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.SESSION)); } + | { sequenceParameters.add(new Sequence.Parameter(Sequence.ParameterType.GLOBAL)); } + ) + )* //zero or many times those productions + { + sequence.setParameters(sequenceParameters); + return createSequence; + } +} diff --git a/src/test/java/net/sf/jsqlparser/schema/SequenceTest.java b/src/test/java/net/sf/jsqlparser/schema/SequenceTest.java new file mode 100644 index 0000000000..40b6497cc5 --- /dev/null +++ b/src/test/java/net/sf/jsqlparser/schema/SequenceTest.java @@ -0,0 +1,56 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2020 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.schema; + +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class SequenceTest { + + @Test + public void testSetName() { + Sequence sequence = new Sequence(); + sequence.setName("foo"); + + assertThat(sequence.getName()).isEqualTo("foo"); + assertThat(sequence.getFullyQualifiedName()).isEqualTo("foo"); + } + + @Test + public void testSetSchemaName() { + Sequence sequence = new Sequence(); + sequence.setName("foo"); + sequence.setSchemaName("bar"); + + assertThat(sequence.getSchemaName()).isEqualTo("bar"); + assertThat(sequence.getFullyQualifiedName()).isEqualTo("bar.foo"); + } + + @Test + public void testSetDatabase() { + Sequence sequence = new Sequence(); + sequence.setName("foo"); + sequence.setSchemaName("bar"); + sequence.setDatabase(new Database("default")); + + assertThat(sequence.getDatabase().getDatabaseName()).isEqualTo("default"); + assertThat(sequence.getFullyQualifiedName()).isEqualTo("default.bar.foo"); + } + + @Test + public void testSetPartialName() { + Sequence sequence = new Sequence(); + sequence.setName("foo"); + sequence.setDatabase(new Database("default")); + + assertThat(sequence.getFullyQualifiedName()).isEqualTo("default..foo"); + } +} diff --git a/src/test/java/net/sf/jsqlparser/statement/create/CreateSequenceTest.java b/src/test/java/net/sf/jsqlparser/statement/create/CreateSequenceTest.java new file mode 100644 index 0000000000..63de64350e --- /dev/null +++ b/src/test/java/net/sf/jsqlparser/statement/create/CreateSequenceTest.java @@ -0,0 +1,114 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2020 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ +package net.sf.jsqlparser.statement.create; + +import net.sf.jsqlparser.JSQLParserException; +import org.junit.Test; + +import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed; + +public class CreateSequenceTest { + + @Test + public void testCreateSequence_noParams() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq"); + } + + @Test + public void testCreateSequence_withIncrement() throws JSQLParserException{ + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq INCREMENT BY 1"); + } + + @Test + public void testCreateSequence_withStart() throws JSQLParserException{ + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq START WITH 10"); + } + + @Test + public void testCreateSequence_withMaxValue() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq MAXVALUE 5"); + } + + @Test + public void testCreateSequence_withNoMaxValue() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq NOMAXVALUE"); + } + + @Test + public void testCreateSequence_withMinValue() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq MINVALUE 5"); + } + + @Test + public void testCreateSequence_withNoMinValue() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq NOMINVALUE"); + } + + @Test + public void testCreateSequence_withCycle() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq CYCLE"); + } + + @Test + public void testCreateSequence_withNoCycle() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq NOCYCLE"); + } + + @Test + public void testCreateSequence_withCache() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq CACHE 10"); + } + + @Test + public void testCreateSequence_withNoCache() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq NOCACHE"); + } + + @Test + public void testCreateSequence_withOrder() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq ORDER"); + } + + @Test + public void testCreateSequence_withNoOrder() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq NOORDER"); + } + + @Test + public void testCreateSequence_withKeep() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq KEEP"); + } + + @Test + public void testCreateSequence_withNoKeep() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq NOKEEP"); + } + + @Test + public void testCreateSequence_withSession() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq SESSION"); + } + + @Test + public void testCreateSequence_withGlobal() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_seq GLOBAL"); + } + + /** + * Verifies that we declare the parameter options in the order we found them + */ + @Test + public void testCreateSequence_preservesParamOrder() throws JSQLParserException { + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_sec INCREMENT BY 2 START WITH 10"); + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_sec START WITH 2 INCREMENT BY 5 NOCACHE"); + assertSqlCanBeParsedAndDeparsed("CREATE SEQUENCE my_sec START WITH 2 INCREMENT BY 5 CACHE 200 CYCLE"); + } + +}