Skip to content

Commit f978564

Browse files
committed
feat: share PostgreSQL sequence options and model alteration actions
Signed-off-by: minleejae <mmj9808@gmail.com>
1 parent dac8159 commit f978564

6 files changed

Lines changed: 306 additions & 34 deletions

File tree

‎src/main/java/net/sf/jsqlparser/statement/alter/sequence/AlterSequence.java‎

Lines changed: 73 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,79 @@
1818
*/
1919
public class AlterSequence implements Statement {
2020

21+
public enum Action {
22+
PARAMETERS, RENAME, OWNER, SET_SCHEMA, SET_LOGGED, SET_UNLOGGED
23+
}
24+
2125
public Sequence sequence;
26+
private boolean ifExists;
27+
private Action action = Action.PARAMETERS;
28+
private String newName;
29+
private String owner;
30+
private String schemaName;
31+
32+
public boolean isIfExists() {
33+
return ifExists;
34+
}
35+
36+
public void setIfExists(boolean ifExists) {
37+
this.ifExists = ifExists;
38+
}
39+
40+
public Action getAction() {
41+
return action;
42+
}
43+
44+
public void setAction(Action action) {
45+
this.action = java.util.Objects.requireNonNull(action, "action");
46+
}
47+
48+
public String getNewName() {
49+
return newName;
50+
}
51+
52+
public void setNewName(String newName) {
53+
this.newName = newName;
54+
}
55+
56+
public String getOwner() {
57+
return owner;
58+
}
59+
60+
public void setOwner(String owner) {
61+
this.owner = owner;
62+
}
63+
64+
public String getSchemaName() {
65+
return schemaName;
66+
}
67+
68+
public void setSchemaName(String schemaName) {
69+
this.schemaName = schemaName;
70+
}
71+
72+
public StringBuilder appendTo(StringBuilder builder) {
73+
builder.append("ALTER SEQUENCE ");
74+
if (ifExists) {
75+
builder.append("IF EXISTS ");
76+
}
77+
builder.append(action == Action.PARAMETERS ? sequence : sequence.getFullyQualifiedName());
78+
switch (action) {
79+
case RENAME:
80+
return builder.append(" RENAME TO ").append(newName);
81+
case OWNER:
82+
return builder.append(" OWNER TO ").append(owner);
83+
case SET_SCHEMA:
84+
return builder.append(" SET SCHEMA ").append(schemaName);
85+
case SET_LOGGED:
86+
return builder.append(" SET LOGGED");
87+
case SET_UNLOGGED:
88+
return builder.append(" SET UNLOGGED");
89+
default:
90+
return builder;
91+
}
92+
}
93+
2294

2395
public Sequence getSequence() {
2496
return sequence;
@@ -35,9 +107,7 @@ public <T, S> T accept(StatementVisitor<T> statementVisitor, S context) {
35107

36108
@Override
37109
public String toString() {
38-
String sql;
39-
sql = "ALTER SEQUENCE " + sequence;
40-
return sql;
110+
return appendTo(new StringBuilder()).toString();
41111
}
42112

43113
public AlterSequence withSequence(Sequence sequence) {

‎src/main/java/net/sf/jsqlparser/statement/create/sequence/CreateSequence.java‎

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,42 @@
1818
*/
1919
public class CreateSequence implements Statement {
2020

21+
public enum Persistence {
22+
TEMP, TEMPORARY, UNLOGGED, LOCAL_TEMP, LOCAL_TEMPORARY, GLOBAL_TEMP, GLOBAL_TEMPORARY
23+
}
24+
2125
public Sequence sequence;
26+
private Persistence persistence;
27+
private boolean ifNotExists;
28+
29+
public Persistence getPersistence() {
30+
return persistence;
31+
}
32+
33+
public void setPersistence(Persistence persistence) {
34+
this.persistence = persistence;
35+
}
36+
37+
public boolean isIfNotExists() {
38+
return ifNotExists;
39+
}
40+
41+
public void setIfNotExists(boolean ifNotExists) {
42+
this.ifNotExists = ifNotExists;
43+
}
44+
45+
public StringBuilder appendTo(StringBuilder builder) {
46+
builder.append("CREATE ");
47+
if (persistence != null) {
48+
builder.append(persistence.name().replace('_', ' ')).append(' ');
49+
}
50+
builder.append("SEQUENCE ");
51+
if (ifNotExists) {
52+
builder.append("IF NOT EXISTS ");
53+
}
54+
return builder.append(sequence);
55+
}
56+
2257

2358
public Sequence getSequence() {
2459
return sequence;
@@ -35,9 +70,7 @@ public <T, S> T accept(StatementVisitor<T> statementVisitor, S context) {
3570

3671
@Override
3772
public String toString() {
38-
String sql;
39-
sql = "CREATE SEQUENCE " + sequence;
40-
return sql;
73+
return appendTo(new StringBuilder()).toString();
4174
}
4275

4376
public CreateSequence withSequence(Sequence sequence) {

‎src/main/java/net/sf/jsqlparser/util/deparser/AlterSequenceDeParser.java‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ public AlterSequenceDeParser(StringBuilder buffer) {
2626

2727
@Override
2828
public void deParse(AlterSequence statement) {
29-
builder.append("ALTER SEQUENCE ");
30-
builder.append(statement.getSequence());
29+
statement.appendTo(builder);
3130
}
3231
}

‎src/main/java/net/sf/jsqlparser/util/deparser/CreateSequenceDeParser.java‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ public CreateSequenceDeParser(StringBuilder buffer) {
2626

2727
@Override
2828
public void deParse(CreateSequence statement) {
29-
builder.append("CREATE SEQUENCE ");
30-
builder.append(statement.getSequence());
29+
statement.appendTo(builder);
3130
}
3231
}

‎src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt‎

Lines changed: 71 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -18812,40 +18812,86 @@ SequenceOwnership SequenceOwnership():
1881218812
{ return ownership; }
1881318813
}
1881418814

18815+
/** AS, ownership and numeric parameters share the same sequence-option boundary. */
18816+
void SequenceDefinitionOptions(Sequence sequence):
18817+
{
18818+
List<Sequence.Parameter> parameters = new ArrayList<Sequence.Parameter>();
18819+
Sequence.Parameter parameter;
18820+
SequenceOwnership ownership;
18821+
Token dataType;
18822+
}
18823+
{
18824+
(
18825+
LOOKAHEAD(2)
18826+
(
18827+
<K_AS> ( dataType=<S_IDENTIFIER> | dataType=<DATA_TYPE> ) {
18828+
requireDdlSyntax(sequence.getDataType() == null, "Duplicate sequence AS clause");
18829+
sequence.setDataType(dataType.image);
18830+
}
18831+
|
18832+
LOOKAHEAD({ isKeywordAhead("OWNED") }) ownership=SequenceOwnership() {
18833+
requireDdlSyntax(sequence.getOwnership() == null, "Duplicate sequence OWNED BY clause");
18834+
sequence.setOwnership(ownership);
18835+
}
18836+
|
18837+
parameter=SequenceParameter() { parameters.add(parameter); }
18838+
)
18839+
)*
18840+
{ sequence.setParameters(parameters); }
18841+
}
18842+
1881518843
CreateSequence CreateSequence():
1881618844
{
18817-
CreateSequence createSequence = new CreateSequence();
18818-
Sequence sequence;
18819-
List<Sequence.Parameter> sequenceParameters;
18820-
Token dataType = null;
18821-
SequenceOwnership ownership;
18845+
CreateSequence result = new CreateSequence();
18846+
Sequence sequence;
18847+
Token persistence;
18848+
Token scope = null;
1882218849
}
1882318850
{
18824-
<K_SEQUENCE> sequence=Sequence() { createSequence.setSequence(sequence); }
18825-
[ <K_AS> ( dataType=<S_IDENTIFIER> | dataType=<DATA_TYPE> ) { sequence.setDataType(dataType.image); } ]
18826-
sequenceParameters = SequenceParameters()
18827-
[ LOOKAHEAD({ isKeywordAhead("OWNED") }) ownership=SequenceOwnership() { sequence.setOwnership(ownership); } ]
18828-
{
18829-
sequence.setParameters(sequenceParameters);
18830-
return createSequence;
18831-
}
18851+
[
18852+
( <K_UNLOGGED> { result.setPersistence(CreateSequence.Persistence.UNLOGGED); }
18853+
|
18854+
[ ( scope=<K_LOCAL> | scope=<K_GLOBAL> ) ]
18855+
( persistence=<K_TEMP> | persistence=<K_TEMPORARY> ) {
18856+
result.setPersistence(CreateSequence.Persistence.valueOf(
18857+
(scope == null ? "" : scope.image.toUpperCase(Locale.ROOT) + "_")
18858+
+ persistence.image.toUpperCase(Locale.ROOT)));
18859+
} )
18860+
]
18861+
<K_SEQUENCE>
18862+
[ LOOKAHEAD(3) <K_IF> <K_NOT> <K_EXISTS> { result.setIfNotExists(true); } ]
18863+
sequence=Sequence() { result.setSequence(sequence); }
18864+
SequenceDefinitionOptions(sequence)
18865+
{ return result; }
1883218866
}
1883318867

1883418868
AlterSequence AlterSequence():
1883518869
{
18836-
AlterSequence alterSequence = new AlterSequence();
18837-
Sequence sequence;
18838-
List<Sequence.Parameter> sequenceParameters;
18839-
SequenceOwnership ownership;
18870+
AlterSequence result = new AlterSequence();
18871+
Sequence sequence;
18872+
String name;
1884018873
}
1884118874
{
18842-
<K_SEQUENCE> sequence=Sequence() { alterSequence.setSequence(sequence); }
18843-
sequenceParameters = SequenceParameters()
18844-
[ LOOKAHEAD({ isKeywordAhead("OWNED") }) ownership=SequenceOwnership() { sequence.setOwnership(ownership); } ]
18845-
{
18846-
sequence.setParameters(sequenceParameters);
18847-
return alterSequence;
18848-
}
18875+
<K_SEQUENCE> [ LOOKAHEAD(2) <K_IF> <K_EXISTS> { result.setIfExists(true); } ]
18876+
sequence=Sequence() { result.setSequence(sequence); }
18877+
(
18878+
<K_RENAME> <K_TO> name=RelObjectName()
18879+
{ result.setAction(AlterSequence.Action.RENAME); result.setNewName(name); }
18880+
|
18881+
LOOKAHEAD({ isKeywordAhead("OWNER") }) ContextualKeyword("OWNER") <K_TO> name=RelObjectName()
18882+
{ result.setAction(AlterSequence.Action.OWNER); result.setOwner(name); }
18883+
|
18884+
<K_SET>
18885+
(
18886+
<K_SCHEMA> name=RelObjectName()
18887+
{ result.setAction(AlterSequence.Action.SET_SCHEMA); result.setSchemaName(name); }
18888+
| <K_UNLOGGED> { result.setAction(AlterSequence.Action.SET_UNLOGGED); }
18889+
| ContextualKeyword("LOGGED") { result.setAction(AlterSequence.Action.SET_LOGGED); }
18890+
)
18891+
|
18892+
SequenceDefinitionOptions(sequence)
18893+
)
18894+
{ return result; }
1884918895
}
1885018896

1885118897
Statement Create():
@@ -18897,6 +18943,7 @@ Statement Create():
1889718943
|
1889818944
statement = CreateDatabase()
1889918945
|
18946+
LOOKAHEAD([ <K_UNLOGGED> | [ <K_LOCAL> | <K_GLOBAL> ] ( <K_TEMP> | <K_TEMPORARY> ) ] <K_SEQUENCE>)
1890018947
statement = CreateSequence()
1890118948
|
1890218949
statement = CreateSynonym(isUsingOrReplace)

0 commit comments

Comments
 (0)