Skip to content

Commit b46bf67

Browse files
committed
Consolidate CASCADE and RESTRICT behavior enums
Replace five nested public enums with statement.CascadeBehavior, including AlterType attribute changes. Preserve omitted clauses and existing render/parser behavior, and document the breaking API migration. Signed-off-by: minleejae <mmj9808@gmail.com>
1 parent bb55bb9 commit b46bf67

13 files changed

Lines changed: 231 additions & 55 deletions

File tree

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2026 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.statement;
11+
12+
/**
13+
* An explicit CASCADE or RESTRICT clause. A null field leaves the clause omitted and preserves the
14+
* database's default behavior for that statement.
15+
*/
16+
public enum CascadeBehavior {
17+
CASCADE, RESTRICT
18+
}

‎src/main/java/net/sf/jsqlparser/statement/alter/AlterDomain.java‎

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import java.util.function.Consumer;
1313
import net.sf.jsqlparser.expression.Expression;
14+
import net.sf.jsqlparser.statement.CascadeBehavior;
1415
import net.sf.jsqlparser.statement.create.domain.DomainConstraint;
1516
import net.sf.jsqlparser.statement.Statement;
1617
import net.sf.jsqlparser.statement.StatementVisitor;
@@ -24,7 +25,7 @@ public class AlterDomain implements Statement {
2425
private String newName;
2526
private boolean notValid;
2627
private boolean ifExists;
27-
private Behavior behavior;
28+
private CascadeBehavior behavior;
2829

2930
public String getName() {
3031
return name;
@@ -90,11 +91,11 @@ public void setIfExists(boolean ifExists) {
9091
this.ifExists = ifExists;
9192
}
9293

93-
public Behavior getBehavior() {
94+
public CascadeBehavior getBehavior() {
9495
return behavior;
9596
}
9697

97-
public void setBehavior(Behavior behavior) {
98+
public void setBehavior(CascadeBehavior behavior) {
9899
this.behavior = behavior;
99100
}
100101

@@ -106,9 +107,6 @@ public <T, S> T accept(StatementVisitor<T> visitor, S context) {
106107
public enum Action {
107108
SET_DEFAULT, DROP_DEFAULT, SET_NOT_NULL, DROP_NOT_NULL, ADD_CONSTRAINT, DROP_CONSTRAINT, RENAME_CONSTRAINT, VALIDATE_CONSTRAINT, OWNER, RENAME, SET_SCHEMA
108109
}
109-
public enum Behavior {
110-
CASCADE, RESTRICT
111-
}
112110

113111
public void appendTo(StringBuilder sql, Consumer<Expression> expressions) {
114112
sql.append("ALTER DOMAIN ").append(name).append(' ');

‎src/main/java/net/sf/jsqlparser/statement/alter/AlterType.java‎

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.util.List;
1414
import java.util.stream.Collectors;
1515
import net.sf.jsqlparser.expression.StringValue;
16+
import net.sf.jsqlparser.statement.CascadeBehavior;
1617
import net.sf.jsqlparser.statement.create.type.TypeAttribute;
1718
import net.sf.jsqlparser.statement.Statement;
1819
import net.sf.jsqlparser.statement.StatementVisitor;
@@ -27,7 +28,7 @@ public class AlterType implements Statement {
2728
private StringValue neighborValue;
2829
private Position position;
2930
private boolean ifNotExists;
30-
private Behavior behavior;
31+
private CascadeBehavior behavior;
3132
private List<AttributeChange> attributeChanges = new ArrayList<>();
3233

3334
public String getName() {
@@ -102,11 +103,11 @@ public void setIfNotExists(boolean ifNotExists) {
102103
this.ifNotExists = ifNotExists;
103104
}
104105

105-
public Behavior getBehavior() {
106+
public CascadeBehavior getBehavior() {
106107
return behavior;
107108
}
108109

109-
public void setBehavior(Behavior behavior) {
110+
public void setBehavior(CascadeBehavior behavior) {
110111
this.behavior = behavior;
111112
}
112113

@@ -129,9 +130,6 @@ public enum Action {
129130
public enum Position {
130131
BEFORE, AFTER
131132
}
132-
public enum Behavior {
133-
CASCADE, RESTRICT
134-
}
135133
public static class AttributeChange implements java.io.Serializable {
136134
public enum Kind {
137135
ADD, DROP, ALTER
@@ -141,7 +139,7 @@ public enum Kind {
141139
private TypeAttribute attribute;
142140
private boolean ifExists;
143141
private boolean useSetData;
144-
private Behavior behavior;
142+
private CascadeBehavior behavior;
145143

146144
public Kind getKind() {
147145
return kind;
@@ -175,11 +173,11 @@ public void setUseSetData(boolean useSetData) {
175173
this.useSetData = useSetData;
176174
}
177175

178-
public Behavior getBehavior() {
176+
public CascadeBehavior getBehavior() {
179177
return behavior;
180178
}
181179

182-
public void setBehavior(Behavior behavior) {
180+
public void setBehavior(CascadeBehavior behavior) {
183181
this.behavior = behavior;
184182
}
185183

‎src/main/java/net/sf/jsqlparser/statement/drop/DropPolicy.java‎

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,15 @@
99
*/
1010
package net.sf.jsqlparser.statement.drop;
1111

12+
import net.sf.jsqlparser.statement.CascadeBehavior;
1213
import net.sf.jsqlparser.statement.Statement;
1314
import net.sf.jsqlparser.statement.StatementVisitor;
1415

1516
public class DropPolicy implements Statement {
1617
private String policyName;
1718
private net.sf.jsqlparser.schema.Table table;
1819
private boolean ifExists = false;
19-
private Behavior behavior;
20+
private CascadeBehavior behavior;
2021

2122
public String getPolicyName() {
2223
return policyName;
@@ -45,19 +46,15 @@ public DropPolicy setIfExists(boolean ifExists) {
4546
return this;
4647
}
4748

48-
public Behavior getBehavior() {
49+
public CascadeBehavior getBehavior() {
4950
return behavior;
5051
}
5152

52-
public DropPolicy setBehavior(Behavior behavior) {
53+
public DropPolicy setBehavior(CascadeBehavior behavior) {
5354
this.behavior = behavior;
5455
return this;
5556
}
5657

57-
public enum Behavior {
58-
CASCADE, RESTRICT
59-
}
60-
6158
public StringBuilder appendTo(StringBuilder sql) {
6259
sql.append("DROP POLICY ");
6360
if (ifExists) {

‎src/main/java/net/sf/jsqlparser/statement/grant/Revoke.java‎

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,14 @@
1111

1212
import java.util.function.Consumer;
1313
import net.sf.jsqlparser.expression.Expression;
14+
import net.sf.jsqlparser.statement.CascadeBehavior;
1415
import net.sf.jsqlparser.statement.Statement;
1516
import net.sf.jsqlparser.statement.StatementVisitor;
1617

1718
public class Revoke implements Statement {
18-
public enum Behavior {
19-
CASCADE, RESTRICT
20-
}
21-
2219
private PrivilegeClause clause = new PrivilegeClause();
2320
private GrantOption.Kind optionFor;
24-
private Behavior behavior;
21+
private CascadeBehavior behavior;
2522

2623
public PrivilegeClause getClause() {
2724
return clause;
@@ -39,11 +36,11 @@ public void setOptionFor(GrantOption.Kind optionFor) {
3936
this.optionFor = optionFor;
4037
}
4138

42-
public Behavior getBehavior() {
39+
public CascadeBehavior getBehavior() {
4340
return behavior;
4441
}
4542

46-
public void setBehavior(Behavior behavior) {
43+
public void setBehavior(CascadeBehavior behavior) {
4744
this.behavior = behavior;
4845
}
4946

‎src/main/java/net/sf/jsqlparser/statement/truncate/Truncate.java‎

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,20 @@
1414
import java.util.List;
1515
import net.sf.jsqlparser.schema.Table;
1616
import net.sf.jsqlparser.schema.TableReference;
17+
import net.sf.jsqlparser.statement.CascadeBehavior;
1718
import net.sf.jsqlparser.statement.Statement;
1819
import net.sf.jsqlparser.statement.StatementVisitor;
1920

2021
public class Truncate implements Statement {
2122
public enum IdentityOption {
2223
RESTART, CONTINUE
2324
}
24-
public enum DropBehavior {
25-
CASCADE, RESTRICT
26-
}
2725

2826
private boolean tableToken;
2927
private boolean only;
3028
private final List<TableReference> targets = new ArrayList<>();
3129
private IdentityOption identityOption;
32-
private DropBehavior dropBehavior;
30+
private CascadeBehavior dropBehavior;
3331

3432
@Override
3533
public <T, S> T accept(StatementVisitor<T> statementVisitor, S context) {
@@ -109,20 +107,20 @@ public void setIdentityOption(IdentityOption option) {
109107
identityOption = option;
110108
}
111109

112-
public DropBehavior getDropBehavior() {
110+
public CascadeBehavior getDropBehavior() {
113111
return dropBehavior;
114112
}
115113

116-
public void setDropBehavior(DropBehavior behavior) {
114+
public void setDropBehavior(CascadeBehavior behavior) {
117115
dropBehavior = behavior;
118116
}
119117

120118
public boolean getCascade() {
121-
return dropBehavior == DropBehavior.CASCADE;
119+
return dropBehavior == CascadeBehavior.CASCADE;
122120
}
123121

124122
public void setCascade(boolean cascade) {
125-
dropBehavior = cascade ? DropBehavior.CASCADE : null;
123+
dropBehavior = cascade ? CascadeBehavior.CASCADE : null;
126124
}
127125

128126
public boolean isTableToken() {

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17064,8 +17064,8 @@ Truncate Truncate():
1706417064
[ ( <K_RESTART> { truncate.setIdentityOption(Truncate.IdentityOption.RESTART); }
1706517065
| ContextualKeyword("CONTINUE") { truncate.setIdentityOption(Truncate.IdentityOption.CONTINUE); } )
1706617066
<K_IDENTITY> ]
17067-
[ <K_CASCADE> { truncate.setDropBehavior(Truncate.DropBehavior.CASCADE); }
17068-
| <K_RESTRICT> { truncate.setDropBehavior(Truncate.DropBehavior.RESTRICT); } ]
17067+
[ <K_CASCADE> { truncate.setDropBehavior(CascadeBehavior.CASCADE); }
17068+
| <K_RESTRICT> { truncate.setDropBehavior(CascadeBehavior.RESTRICT); } ]
1706917069
{ return truncate; }
1707017070
}
1707117071

@@ -19651,7 +19651,7 @@ Revoke Revoke(boolean defaults):
1965119651
clause=AccessClause(true, defaults) { revoke.setClause(clause); }
1965219652
[ LOOKAHEAD({ isAccessKeywordAhead("GRANTED") }) AccessKeyword("GRANTED") <K_BY> name=RelObjectName()
1965319653
{ requireAccessSyntax(!defaults, "GRANTED BY is not part of default privileges"); clause.setGrantedBy(name); } ]
19654-
[ ( <K_CASCADE> { revoke.setBehavior(Revoke.Behavior.CASCADE); } | <K_RESTRICT> { revoke.setBehavior(Revoke.Behavior.RESTRICT); } ) ]
19654+
[ ( <K_CASCADE> { revoke.setBehavior(CascadeBehavior.CASCADE); } | <K_RESTRICT> { revoke.setBehavior(CascadeBehavior.RESTRICT); } ) ]
1965519655
{ requireAccessSyntax(revoke.getOptionFor() == null || (clause.getPrivileges() == null
1965619656
? revoke.getOptionFor() != GrantOption.Kind.GRANT : revoke.getOptionFor() == GrantOption.Kind.GRANT), "Invalid REVOKE option");
1965719657
return revoke; }
@@ -20271,19 +20271,19 @@ RangeTypeDefinition.Option RangeTypeOption():
2027120271
)
2027220272
}
2027320273

20274-
AlterType.Behavior TypeAlterBehavior():
20275-
{ AlterType.Behavior result; }
20274+
CascadeBehavior TypeAlterBehavior():
20275+
{ CascadeBehavior result; }
2027620276
{
20277-
( <K_CASCADE> { result = AlterType.Behavior.CASCADE; }
20278-
| <K_RESTRICT> { result = AlterType.Behavior.RESTRICT; } )
20277+
( <K_CASCADE> { result = CascadeBehavior.CASCADE; }
20278+
| <K_RESTRICT> { result = CascadeBehavior.RESTRICT; } )
2027920279
{ return result; }
2028020280
}
2028120281

2028220282
AlterType.AttributeChange TypeAttributeChange():
2028320283
{
2028420284
AlterType.AttributeChange result = new AlterType.AttributeChange();
2028520285
TypeAttribute attribute = new TypeAttribute();
20286-
String name; ColDataType type; AlterType.Behavior behavior;
20286+
String name; ColDataType type; CascadeBehavior behavior;
2028720287
boolean useSetData;
2028820288
}
2028920289
{
@@ -20304,7 +20304,7 @@ AlterType.AttributeChange TypeAttributeChange():
2030420304
AlterType AlterType():
2030520305
{
2030620306
AlterType result = new AlterType(); String name; Token label;
20307-
AlterType.AttributeChange change; AlterType.Behavior behavior;
20307+
AlterType.AttributeChange change; CascadeBehavior behavior;
2030820308
}
2030920309
{
2031020310
<K_TYPE> name=TypeDdlName() { result.setName(name); }
@@ -20376,8 +20376,8 @@ AlterDomain AlterDomain():
2037620376
| <K_NOT> <K_NULL> { result.setAction(AlterDomain.Action.DROP_NOT_NULL); }
2037720377
| <K_CONSTRAINT> [ LOOKAHEAD(2) <K_IF> <K_EXISTS> { result.setIfExists(true); } ]
2037820378
name=RelObjectName() { result.setAction(AlterDomain.Action.DROP_CONSTRAINT); result.setConstraintName(name); }
20379-
[ <K_CASCADE> { result.setBehavior(AlterDomain.Behavior.CASCADE); }
20380-
| <K_RESTRICT> { result.setBehavior(AlterDomain.Behavior.RESTRICT); } ]
20379+
[ <K_CASCADE> { result.setBehavior(CascadeBehavior.CASCADE); }
20380+
| <K_RESTRICT> { result.setBehavior(CascadeBehavior.RESTRICT); } ]
2038120381
)
2038220382
| <K_ADD> constraint=DomainConstraint(false) { result.setAction(AlterDomain.Action.ADD_CONSTRAINT); result.setConstraint(constraint); }
2038320383
[ <K_NOT> TypeDdlKeyword("VALID") {
@@ -20794,7 +20794,7 @@ DropPolicy DropPolicy():
2079420794
<K_DROP> <K_POLICY> [ LOOKAHEAD(2) <K_IF> <K_EXISTS> { statement.setIfExists(true); } ]
2079520795
name=RelObjectName() { statement.setPolicyName(name); }
2079620796
<K_ON> table=Table() { statement.setTable(table); }
20797-
[ (behavior=<K_CASCADE> | behavior=<K_RESTRICT>) { statement.setBehavior(DropPolicy.Behavior.valueOf(behavior.image.toUpperCase(Locale.ROOT))); } ]
20797+
[ (behavior=<K_CASCADE> | behavior=<K_RESTRICT>) { statement.setBehavior(CascadeBehavior.valueOf(behavior.image.toUpperCase(Locale.ROOT))); } ]
2079820798
{ return statement; }
2079920799
}
2080020800

‎src/site/sphinx/usage.rst‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,29 @@ These named targets do not populate the legacy ``getPkColumns()`` list.
288288
AlterExpression checkDrop = new AlterExpression()
289289
.withOperation(AlterOperation.DROP_CHECK).withConstraintName("positive_id");
290290
291+
Shared CASCADE and RESTRICT behavior
292+
------------------------------------
293+
294+
``AlterDomain``, ``AlterType`` (including ``AttributeChange``), ``DropPolicy``,
295+
``Truncate`` and ``Revoke`` use ``net.sf.jsqlparser.statement.CascadeBehavior``
296+
for their explicit ``CASCADE`` and ``RESTRICT`` clauses. A null value preserves
297+
an omitted clause; it does not insert an explicit ``RESTRICT``.
298+
299+
.. code-block:: java
300+
301+
import net.sf.jsqlparser.statement.CascadeBehavior;
302+
303+
truncate.setDropBehavior(CascadeBehavior.RESTRICT);
304+
revoke.setBehavior(truncate.getDropBehavior());
305+
revoke.setBehavior(null); // Omit the clause and leave the server default unchanged.
306+
307+
Migration: the nested enums ``AlterDomain.Behavior``, ``AlterType.Behavior``,
308+
``DropPolicy.Behavior``, ``Truncate.DropBehavior`` and ``Revoke.Behavior`` have
309+
been removed. Replace their imports and enum references with ``CascadeBehavior``.
310+
The existing getter and setter names remain, but their return and parameter types
311+
have changed, so clients must recompile. ``Truncate.setCascade(false)`` still
312+
clears the clause. Foreign-key referential actions retain their separate enum.
313+
291314
Inspect PostgreSQL schema statements
292315
------------------------------------
293316

0 commit comments

Comments
 (0)