Skip to content

Commit c12c3aa

Browse files
authored
feat: share PostgreSQL sequence options and model alteration actions (#2701)
Signed-off-by: minleejae <mmj9808@gmail.com>
1 parent d264065 commit c12c3aa

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
@@ -18883,40 +18883,86 @@ SequenceOwnership SequenceOwnership():
1888318883
{ return ownership; }
1888418884
}
1888518885

18886+
/** AS, ownership and numeric parameters share the same sequence-option boundary. */
18887+
void SequenceDefinitionOptions(Sequence sequence):
18888+
{
18889+
List<Sequence.Parameter> parameters = new ArrayList<Sequence.Parameter>();
18890+
Sequence.Parameter parameter;
18891+
SequenceOwnership ownership;
18892+
Token dataType;
18893+
}
18894+
{
18895+
(
18896+
LOOKAHEAD(2)
18897+
(
18898+
<K_AS> ( dataType=<S_IDENTIFIER> | dataType=<DATA_TYPE> ) {
18899+
requireDdlSyntax(sequence.getDataType() == null, "Duplicate sequence AS clause");
18900+
sequence.setDataType(dataType.image);
18901+
}
18902+
|
18903+
LOOKAHEAD({ isKeywordAhead("OWNED") }) ownership=SequenceOwnership() {
18904+
requireDdlSyntax(sequence.getOwnership() == null, "Duplicate sequence OWNED BY clause");
18905+
sequence.setOwnership(ownership);
18906+
}
18907+
|
18908+
parameter=SequenceParameter() { parameters.add(parameter); }
18909+
)
18910+
)*
18911+
{ sequence.setParameters(parameters); }
18912+
}
18913+
1888618914
CreateSequence CreateSequence():
1888718915
{
18888-
CreateSequence createSequence = new CreateSequence();
18889-
Sequence sequence;
18890-
List<Sequence.Parameter> sequenceParameters;
18891-
Token dataType = null;
18892-
SequenceOwnership ownership;
18916+
CreateSequence result = new CreateSequence();
18917+
Sequence sequence;
18918+
Token persistence;
18919+
Token scope = null;
1889318920
}
1889418921
{
18895-
<K_SEQUENCE> sequence=Sequence() { createSequence.setSequence(sequence); }
18896-
[ <K_AS> ( dataType=<S_IDENTIFIER> | dataType=<DATA_TYPE> ) { sequence.setDataType(dataType.image); } ]
18897-
sequenceParameters = SequenceParameters()
18898-
[ LOOKAHEAD({ isKeywordAhead("OWNED") }) ownership=SequenceOwnership() { sequence.setOwnership(ownership); } ]
18899-
{
18900-
sequence.setParameters(sequenceParameters);
18901-
return createSequence;
18902-
}
18922+
[
18923+
( <K_UNLOGGED> { result.setPersistence(CreateSequence.Persistence.UNLOGGED); }
18924+
|
18925+
[ ( scope=<K_LOCAL> | scope=<K_GLOBAL> ) ]
18926+
( persistence=<K_TEMP> | persistence=<K_TEMPORARY> ) {
18927+
result.setPersistence(CreateSequence.Persistence.valueOf(
18928+
(scope == null ? "" : scope.image.toUpperCase(Locale.ROOT) + "_")
18929+
+ persistence.image.toUpperCase(Locale.ROOT)));
18930+
} )
18931+
]
18932+
<K_SEQUENCE>
18933+
[ LOOKAHEAD(3) <K_IF> <K_NOT> <K_EXISTS> { result.setIfNotExists(true); } ]
18934+
sequence=Sequence() { result.setSequence(sequence); }
18935+
SequenceDefinitionOptions(sequence)
18936+
{ return result; }
1890318937
}
1890418938

1890518939
AlterSequence AlterSequence():
1890618940
{
18907-
AlterSequence alterSequence = new AlterSequence();
18908-
Sequence sequence;
18909-
List<Sequence.Parameter> sequenceParameters;
18910-
SequenceOwnership ownership;
18941+
AlterSequence result = new AlterSequence();
18942+
Sequence sequence;
18943+
String name;
1891118944
}
1891218945
{
18913-
<K_SEQUENCE> sequence=Sequence() { alterSequence.setSequence(sequence); }
18914-
sequenceParameters = SequenceParameters()
18915-
[ LOOKAHEAD({ isKeywordAhead("OWNED") }) ownership=SequenceOwnership() { sequence.setOwnership(ownership); } ]
18916-
{
18917-
sequence.setParameters(sequenceParameters);
18918-
return alterSequence;
18919-
}
18946+
<K_SEQUENCE> [ LOOKAHEAD(2) <K_IF> <K_EXISTS> { result.setIfExists(true); } ]
18947+
sequence=Sequence() { result.setSequence(sequence); }
18948+
(
18949+
<K_RENAME> <K_TO> name=RelObjectName()
18950+
{ result.setAction(AlterSequence.Action.RENAME); result.setNewName(name); }
18951+
|
18952+
LOOKAHEAD({ isKeywordAhead("OWNER") }) ContextualKeyword("OWNER") <K_TO> name=RelObjectName()
18953+
{ result.setAction(AlterSequence.Action.OWNER); result.setOwner(name); }
18954+
|
18955+
<K_SET>
18956+
(
18957+
<K_SCHEMA> name=RelObjectName()
18958+
{ result.setAction(AlterSequence.Action.SET_SCHEMA); result.setSchemaName(name); }
18959+
| <K_UNLOGGED> { result.setAction(AlterSequence.Action.SET_UNLOGGED); }
18960+
| ContextualKeyword("LOGGED") { result.setAction(AlterSequence.Action.SET_LOGGED); }
18961+
)
18962+
|
18963+
SequenceDefinitionOptions(sequence)
18964+
)
18965+
{ return result; }
1892018966
}
1892118967

1892218968
Statement Create():
@@ -18968,6 +19014,7 @@ Statement Create():
1896819014
|
1896919015
statement = CreateDatabase()
1897019016
|
19017+
LOOKAHEAD([ <K_UNLOGGED> | [ <K_LOCAL> | <K_GLOBAL> ] ( <K_TEMP> | <K_TEMPORARY> ) ] <K_SEQUENCE>)
1897119018
statement = CreateSequence()
1897219019
|
1897319020
statement = CreateSynonym(isUsingOrReplace)

0 commit comments

Comments
 (0)