Skip to content

Commit a6a3c61

Browse files
authored
Support CREATE SEQUENCE (#977)
* wip * wip, some parsing * support sequence * implement feature * delete issue tests * compile it
1 parent ca76fed commit a6a3c61

File tree

10 files changed

+781
-216
lines changed

10 files changed

+781
-216
lines changed
Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
/*
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2020 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.schema;
11+
12+
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
13+
14+
import java.util.ArrayList;
15+
import java.util.Collections;
16+
import java.util.List;
17+
18+
/**
19+
* Represents the database type for a {@code SEQUENCE}
20+
*/
21+
public class Sequence extends ASTNodeAccessImpl implements MultiPartName {
22+
23+
private static final int NAME_IDX = 0;
24+
private static final int SCHEMA_IDX = 1;
25+
private static final int DATABASE_IDX = 2;
26+
private static final int SERVER_IDX = 3;
27+
private List<String> partItems = new ArrayList<>();
28+
29+
private List<Parameter> parameters;
30+
31+
public Sequence() {
32+
}
33+
34+
public Sequence(List<String> partItems) {
35+
this.partItems = new ArrayList<>(partItems);
36+
Collections.reverse(this.partItems);
37+
}
38+
39+
public void setParameters(List<Parameter> parameters) {
40+
this.parameters = parameters;
41+
}
42+
43+
public List<Parameter> getParameters() {
44+
return parameters;
45+
}
46+
47+
public Database getDatabase() {
48+
return new Database(getIndex(DATABASE_IDX));
49+
}
50+
51+
public void setDatabase(Database database) {
52+
setIndex(DATABASE_IDX, database.getDatabaseName());
53+
if (database.getServer() != null) {
54+
setIndex(SERVER_IDX, database.getServer().getFullyQualifiedName());
55+
}
56+
}
57+
58+
public String getSchemaName() {
59+
return getIndex(SCHEMA_IDX);
60+
}
61+
62+
public void setSchemaName(String string) {
63+
setIndex(SCHEMA_IDX, string);
64+
}
65+
66+
public String getName() {
67+
return getIndex(NAME_IDX);
68+
}
69+
70+
public void setName(String string) {
71+
setIndex(NAME_IDX, string);
72+
}
73+
74+
private void setIndex(int idx, String value) {
75+
int size = partItems.size();
76+
for (int i = 0; i < idx - size + 1; i++) {
77+
partItems.add(null);
78+
}
79+
partItems.set(idx, value);
80+
}
81+
82+
private String getIndex(int idx) {
83+
if (idx < partItems.size()) {
84+
return partItems.get(idx);
85+
} else {
86+
return null;
87+
}
88+
}
89+
90+
@Override
91+
public String getFullyQualifiedName() {
92+
StringBuilder fqn = new StringBuilder();
93+
94+
for (int i = partItems.size() - 1; i >= 0; i--) {
95+
String part = partItems.get(i);
96+
if (part == null) {
97+
part = "";
98+
}
99+
fqn.append(part);
100+
if (i != 0) {
101+
fqn.append(".");
102+
}
103+
}
104+
105+
return fqn.toString();
106+
}
107+
108+
@Override
109+
public String toString() {
110+
StringBuilder sql = new StringBuilder(getFullyQualifiedName());
111+
if (parameters != null) {
112+
for (Sequence.Parameter parameter : parameters) {
113+
sql.append(" ").append(parameter.formatParameter());
114+
}
115+
}
116+
return sql.toString();
117+
}
118+
119+
/**
120+
* The available parameters to a sequence
121+
*/
122+
public enum ParameterType {
123+
INCREMENT_BY,
124+
START_WITH,
125+
MAXVALUE,
126+
NOMAXVALUE,
127+
MINVALUE,
128+
NOMINVALUE,
129+
CYCLE,
130+
NOCYCLE,
131+
CACHE,
132+
NOCACHE,
133+
ORDER,
134+
NOORDER,
135+
KEEP,
136+
NOKEEP,
137+
SESSION,
138+
GLOBAL
139+
}
140+
141+
/**
142+
* Represents a parameter when declaring a sequence
143+
*/
144+
public static class Parameter {
145+
private final ParameterType option;
146+
private Long value;
147+
148+
public Parameter(ParameterType option) {
149+
this.option = option;
150+
}
151+
152+
public Long getValue() {
153+
return value;
154+
}
155+
156+
public void setValue(Long value) {
157+
this.value = value;
158+
}
159+
160+
public String formatParameter() {
161+
switch (option) {
162+
case INCREMENT_BY:
163+
return withValue("INCREMENT BY");
164+
case START_WITH:
165+
return withValue("START WITH");
166+
case MAXVALUE:
167+
case MINVALUE:
168+
case CACHE:
169+
return withValue(option.name());
170+
default:
171+
// fallthrough just return option name
172+
return option.name();
173+
}
174+
}
175+
176+
private String withValue(String prefix) {
177+
return prefix + " " + value;
178+
}
179+
}
180+
}

src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import net.sf.jsqlparser.statement.comment.Comment;
1414
import net.sf.jsqlparser.statement.create.index.CreateIndex;
1515
import net.sf.jsqlparser.statement.create.schema.CreateSchema;
16+
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
1617
import net.sf.jsqlparser.statement.create.table.CreateTable;
1718
import net.sf.jsqlparser.statement.create.view.AlterView;
1819
import net.sf.jsqlparser.statement.create.view.CreateView;
@@ -48,7 +49,7 @@ public interface StatementVisitor {
4849
void visit(Truncate truncate);
4950

5051
void visit(CreateIndex createIndex);
51-
52+
5253
void visit(CreateSchema aThis);
5354

5455
void visit(CreateTable createTable);
@@ -88,4 +89,6 @@ public interface StatementVisitor {
8889
public void visit(DeclareStatement aThis);
8990

9091
void visit(Grant grant);
92+
93+
void visit(CreateSequence createSequence);
9194
}

src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import net.sf.jsqlparser.statement.comment.Comment;
1414
import net.sf.jsqlparser.statement.create.index.CreateIndex;
1515
import net.sf.jsqlparser.statement.create.schema.CreateSchema;
16+
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
1617
import net.sf.jsqlparser.statement.create.table.CreateTable;
1718
import net.sf.jsqlparser.statement.create.view.AlterView;
1819
import net.sf.jsqlparser.statement.create.view.CreateView;
@@ -165,4 +166,8 @@ public void visit(DeclareStatement aThis) {
165166
@Override
166167
public void visit(Grant grant) {
167168
}
169+
170+
@Override
171+
public void visit(CreateSequence createSequence) {
172+
}
168173
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2020 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.statement.create.sequence;
11+
12+
import net.sf.jsqlparser.schema.Sequence;
13+
import net.sf.jsqlparser.statement.Statement;
14+
import net.sf.jsqlparser.statement.StatementVisitor;
15+
16+
/**
17+
* A {@code CREATE SEQUENCE} statement
18+
*/
19+
public class CreateSequence implements Statement {
20+
21+
public Sequence sequence;
22+
23+
public void setSequence(Sequence sequence) {
24+
this.sequence = sequence;
25+
}
26+
27+
public Sequence getSequence() {
28+
return sequence;
29+
}
30+
31+
@Override
32+
public void accept(StatementVisitor statementVisitor) {
33+
statementVisitor.visit(this);
34+
}
35+
36+
@Override
37+
public String toString() {
38+
String sql;
39+
sql = "CREATE SEQUENCE " + sequence;
40+
return sql;
41+
}
42+
}

src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
import net.sf.jsqlparser.statement.comment.Comment;
7373
import net.sf.jsqlparser.statement.create.index.CreateIndex;
7474
import net.sf.jsqlparser.statement.create.schema.CreateSchema;
75+
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
7576
import net.sf.jsqlparser.statement.create.table.CreateTable;
7677
import net.sf.jsqlparser.statement.create.view.AlterView;
7778
import net.sf.jsqlparser.statement.create.view.CreateView;
@@ -511,7 +512,7 @@ public void visit(ExtractExpression eexpr) {
511512
public void visit(LateralSubSelect lateralSubSelect) {
512513
lateralSubSelect.getSubSelect().getSelectBody().accept(this);
513514
}
514-
515+
515516
@Override
516517
public void visit(MultiExpressionList multiExprList) {
517518
for (ExpressionList exprList : multiExprList.getExprList()) {
@@ -691,7 +692,7 @@ public void visit(Truncate truncate) {
691692
public void visit(CreateIndex createIndex) {
692693
throw new UnsupportedOperationException(NOT_SUPPORTED_YET);
693694
}
694-
695+
695696
@Override
696697
public void visit(CreateSchema aThis) {
697698
throw new UnsupportedOperationException(NOT_SUPPORTED_YET);
@@ -873,4 +874,9 @@ public void visit(ArrayExpression array) {
873874
array.getObjExpression().accept(this);
874875
array.getIndexExpression().accept(this);
875876
}
877+
878+
@Override
879+
public void visit(CreateSequence createSequence) {
880+
881+
}
876882
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2020 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.util.deparser;
11+
12+
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
13+
14+
/**
15+
* A class to de-parse (that is, transform from JSqlParser hierarchy into a string) a
16+
* {@link net.sf.jsqlparser.statement.create.sequence.CreateSequence}
17+
*/
18+
public class CreateSequenceDeParser {
19+
20+
private StringBuilder buffer;
21+
22+
/**
23+
* @param buffer the buffer that will be filled with the select
24+
*/
25+
public CreateSequenceDeParser(StringBuilder buffer) {
26+
this.buffer = buffer;
27+
}
28+
29+
public void deParse(CreateSequence createSequence) {
30+
buffer.append("CREATE SEQUENCE ");
31+
buffer.append(createSequence.getSequence());
32+
}
33+
}

src/main/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import net.sf.jsqlparser.statement.comment.Comment;
2727
import net.sf.jsqlparser.statement.create.index.CreateIndex;
2828
import net.sf.jsqlparser.statement.create.schema.CreateSchema;
29+
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
2930
import net.sf.jsqlparser.statement.create.table.CreateTable;
3031
import net.sf.jsqlparser.statement.create.view.AlterView;
3132
import net.sf.jsqlparser.statement.create.view.CreateView;
@@ -287,4 +288,9 @@ public void visit(Grant grant) {
287288
public void visit(CreateSchema aThis) {
288289
buffer.append(aThis.toString());
289290
}
291+
292+
@Override
293+
public void visit(CreateSequence createSequence) {
294+
new CreateSequenceDeParser(buffer).deParse(createSequence);
295+
}
290296
}

0 commit comments

Comments
 (0)