Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions src/main/java/net/sf/jsqlparser/statement/CascadeBehavior.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/*-
* #%L
* JSQLParser library
* %%
* Copyright (C) 2004 - 2026 JSQLParser
* %%
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
* #L%
*/
package net.sf.jsqlparser.statement;

/**
* An explicit CASCADE or RESTRICT clause. A null field leaves the clause omitted and preserves the
* database's default behavior for that statement.
*/
public enum CascadeBehavior {
CASCADE, RESTRICT
}
10 changes: 4 additions & 6 deletions src/main/java/net/sf/jsqlparser/statement/alter/AlterDomain.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

import java.util.function.Consumer;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.statement.CascadeBehavior;
import net.sf.jsqlparser.statement.create.domain.DomainConstraint;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.StatementVisitor;
Expand All @@ -24,7 +25,7 @@ public class AlterDomain implements Statement {
private String newName;
private boolean notValid;
private boolean ifExists;
private Behavior behavior;
private CascadeBehavior behavior;

public String getName() {
return name;
Expand Down Expand Up @@ -90,11 +91,11 @@ public void setIfExists(boolean ifExists) {
this.ifExists = ifExists;
}

public Behavior getBehavior() {
public CascadeBehavior getBehavior() {
return behavior;
}

public void setBehavior(Behavior behavior) {
public void setBehavior(CascadeBehavior behavior) {
this.behavior = behavior;
}

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

public void appendTo(StringBuilder sql, Consumer<Expression> expressions) {
sql.append("ALTER DOMAIN ").append(name).append(' ');
Expand Down
16 changes: 7 additions & 9 deletions src/main/java/net/sf/jsqlparser/statement/alter/AlterType.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import java.util.List;
import java.util.stream.Collectors;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.statement.CascadeBehavior;
import net.sf.jsqlparser.statement.create.type.TypeAttribute;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.StatementVisitor;
Expand All @@ -27,7 +28,7 @@ public class AlterType implements Statement {
private StringValue neighborValue;
private Position position;
private boolean ifNotExists;
private Behavior behavior;
private CascadeBehavior behavior;
private List<AttributeChange> attributeChanges = new ArrayList<>();

public String getName() {
Expand Down Expand Up @@ -102,11 +103,11 @@ public void setIfNotExists(boolean ifNotExists) {
this.ifNotExists = ifNotExists;
}

public Behavior getBehavior() {
public CascadeBehavior getBehavior() {
return behavior;
}

public void setBehavior(Behavior behavior) {
public void setBehavior(CascadeBehavior behavior) {
this.behavior = behavior;
}

Expand All @@ -129,9 +130,6 @@ public enum Action {
public enum Position {
BEFORE, AFTER
}
public enum Behavior {
CASCADE, RESTRICT
}
public static class AttributeChange implements java.io.Serializable {
public enum Kind {
ADD, DROP, ALTER
Expand All @@ -141,7 +139,7 @@ public enum Kind {
private TypeAttribute attribute;
private boolean ifExists;
private boolean useSetData;
private Behavior behavior;
private CascadeBehavior behavior;

public Kind getKind() {
return kind;
Expand Down Expand Up @@ -175,11 +173,11 @@ public void setUseSetData(boolean useSetData) {
this.useSetData = useSetData;
}

public Behavior getBehavior() {
public CascadeBehavior getBehavior() {
return behavior;
}

public void setBehavior(Behavior behavior) {
public void setBehavior(CascadeBehavior behavior) {
this.behavior = behavior;
}

Expand Down
11 changes: 4 additions & 7 deletions src/main/java/net/sf/jsqlparser/statement/drop/DropPolicy.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,15 @@
*/
package net.sf.jsqlparser.statement.drop;

import net.sf.jsqlparser.statement.CascadeBehavior;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.StatementVisitor;

public class DropPolicy implements Statement {
private String policyName;
private net.sf.jsqlparser.schema.Table table;
private boolean ifExists = false;
private Behavior behavior;
private CascadeBehavior behavior;

public String getPolicyName() {
return policyName;
Expand Down Expand Up @@ -45,19 +46,15 @@ public DropPolicy setIfExists(boolean ifExists) {
return this;
}

public Behavior getBehavior() {
public CascadeBehavior getBehavior() {
return behavior;
}

public DropPolicy setBehavior(Behavior behavior) {
public DropPolicy setBehavior(CascadeBehavior behavior) {
this.behavior = behavior;
return this;
}

public enum Behavior {
CASCADE, RESTRICT
}

public StringBuilder appendTo(StringBuilder sql) {
sql.append("DROP POLICY ");
if (ifExists) {
Expand Down
11 changes: 4 additions & 7 deletions src/main/java/net/sf/jsqlparser/statement/grant/Revoke.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,14 @@

import java.util.function.Consumer;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.statement.CascadeBehavior;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.StatementVisitor;

public class Revoke implements Statement {
public enum Behavior {
CASCADE, RESTRICT
}

private PrivilegeClause clause = new PrivilegeClause();
private GrantOption.Kind optionFor;
private Behavior behavior;
private CascadeBehavior behavior;

public PrivilegeClause getClause() {
return clause;
Expand All @@ -39,11 +36,11 @@ public void setOptionFor(GrantOption.Kind optionFor) {
this.optionFor = optionFor;
}

public Behavior getBehavior() {
public CascadeBehavior getBehavior() {
return behavior;
}

public void setBehavior(Behavior behavior) {
public void setBehavior(CascadeBehavior behavior) {
this.behavior = behavior;
}

Expand Down
14 changes: 6 additions & 8 deletions src/main/java/net/sf/jsqlparser/statement/truncate/Truncate.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,22 +14,20 @@
import java.util.List;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.schema.TableReference;
import net.sf.jsqlparser.statement.CascadeBehavior;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.StatementVisitor;

public class Truncate implements Statement {
public enum IdentityOption {
RESTART, CONTINUE
}
public enum DropBehavior {
CASCADE, RESTRICT
}

private boolean tableToken;
private boolean only;
private final List<TableReference> targets = new ArrayList<>();
private IdentityOption identityOption;
private DropBehavior dropBehavior;
private CascadeBehavior dropBehavior;

@Override
public <T, S> T accept(StatementVisitor<T> statementVisitor, S context) {
Expand Down Expand Up @@ -109,20 +107,20 @@ public void setIdentityOption(IdentityOption option) {
identityOption = option;
}

public DropBehavior getDropBehavior() {
public CascadeBehavior getDropBehavior() {
return dropBehavior;
}

public void setDropBehavior(DropBehavior behavior) {
public void setDropBehavior(CascadeBehavior behavior) {
dropBehavior = behavior;
}

public boolean getCascade() {
return dropBehavior == DropBehavior.CASCADE;
return dropBehavior == CascadeBehavior.CASCADE;
}

public void setCascade(boolean cascade) {
dropBehavior = cascade ? DropBehavior.CASCADE : null;
dropBehavior = cascade ? CascadeBehavior.CASCADE : null;
}

public boolean isTableToken() {
Expand Down
24 changes: 12 additions & 12 deletions src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
Original file line number Diff line number Diff line change
Expand Up @@ -17064,8 +17064,8 @@ Truncate Truncate():
[ ( <K_RESTART> { truncate.setIdentityOption(Truncate.IdentityOption.RESTART); }
| ContextualKeyword("CONTINUE") { truncate.setIdentityOption(Truncate.IdentityOption.CONTINUE); } )
<K_IDENTITY> ]
[ <K_CASCADE> { truncate.setDropBehavior(Truncate.DropBehavior.CASCADE); }
| <K_RESTRICT> { truncate.setDropBehavior(Truncate.DropBehavior.RESTRICT); } ]
[ <K_CASCADE> { truncate.setDropBehavior(CascadeBehavior.CASCADE); }
| <K_RESTRICT> { truncate.setDropBehavior(CascadeBehavior.RESTRICT); } ]
{ return truncate; }
}

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

AlterType.Behavior TypeAlterBehavior():
{ AlterType.Behavior result; }
CascadeBehavior TypeAlterBehavior():
{ CascadeBehavior result; }
{
( <K_CASCADE> { result = AlterType.Behavior.CASCADE; }
| <K_RESTRICT> { result = AlterType.Behavior.RESTRICT; } )
( <K_CASCADE> { result = CascadeBehavior.CASCADE; }
| <K_RESTRICT> { result = CascadeBehavior.RESTRICT; } )
{ return result; }
}

AlterType.AttributeChange TypeAttributeChange():
{
AlterType.AttributeChange result = new AlterType.AttributeChange();
TypeAttribute attribute = new TypeAttribute();
String name; ColDataType type; AlterType.Behavior behavior;
String name; ColDataType type; CascadeBehavior behavior;
boolean useSetData;
}
{
Expand All @@ -20304,7 +20304,7 @@ AlterType.AttributeChange TypeAttributeChange():
AlterType AlterType():
{
AlterType result = new AlterType(); String name; Token label;
AlterType.AttributeChange change; AlterType.Behavior behavior;
AlterType.AttributeChange change; CascadeBehavior behavior;
}
{
<K_TYPE> name=TypeDdlName() { result.setName(name); }
Expand Down Expand Up @@ -20376,8 +20376,8 @@ AlterDomain AlterDomain():
| <K_NOT> <K_NULL> { result.setAction(AlterDomain.Action.DROP_NOT_NULL); }
| <K_CONSTRAINT> [ LOOKAHEAD(2) <K_IF> <K_EXISTS> { result.setIfExists(true); } ]
name=RelObjectName() { result.setAction(AlterDomain.Action.DROP_CONSTRAINT); result.setConstraintName(name); }
[ <K_CASCADE> { result.setBehavior(AlterDomain.Behavior.CASCADE); }
| <K_RESTRICT> { result.setBehavior(AlterDomain.Behavior.RESTRICT); } ]
[ <K_CASCADE> { result.setBehavior(CascadeBehavior.CASCADE); }
| <K_RESTRICT> { result.setBehavior(CascadeBehavior.RESTRICT); } ]
)
| <K_ADD> constraint=DomainConstraint(false) { result.setAction(AlterDomain.Action.ADD_CONSTRAINT); result.setConstraint(constraint); }
[ <K_NOT> TypeDdlKeyword("VALID") {
Expand Down Expand Up @@ -20794,7 +20794,7 @@ DropPolicy DropPolicy():
<K_DROP> <K_POLICY> [ LOOKAHEAD(2) <K_IF> <K_EXISTS> { statement.setIfExists(true); } ]
name=RelObjectName() { statement.setPolicyName(name); }
<K_ON> table=Table() { statement.setTable(table); }
[ (behavior=<K_CASCADE> | behavior=<K_RESTRICT>) { statement.setBehavior(DropPolicy.Behavior.valueOf(behavior.image.toUpperCase(Locale.ROOT))); } ]
[ (behavior=<K_CASCADE> | behavior=<K_RESTRICT>) { statement.setBehavior(CascadeBehavior.valueOf(behavior.image.toUpperCase(Locale.ROOT))); } ]
{ return statement; }
}

Expand Down
23 changes: 23 additions & 0 deletions src/site/sphinx/usage.rst
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,29 @@ These named targets do not populate the legacy ``getPkColumns()`` list.
AlterExpression checkDrop = new AlterExpression()
.withOperation(AlterOperation.DROP_CHECK).withConstraintName("positive_id");

Shared CASCADE and RESTRICT behavior
------------------------------------

``AlterDomain``, ``AlterType`` (including ``AttributeChange``), ``DropPolicy``,
``Truncate`` and ``Revoke`` use ``net.sf.jsqlparser.statement.CascadeBehavior``
for their explicit ``CASCADE`` and ``RESTRICT`` clauses. A null value preserves
an omitted clause; it does not insert an explicit ``RESTRICT``.

.. code-block:: java

import net.sf.jsqlparser.statement.CascadeBehavior;

truncate.setDropBehavior(CascadeBehavior.RESTRICT);
revoke.setBehavior(truncate.getDropBehavior());
revoke.setBehavior(null); // Omit the clause and leave the server default unchanged.

Migration: the nested enums ``AlterDomain.Behavior``, ``AlterType.Behavior``,
``DropPolicy.Behavior``, ``Truncate.DropBehavior`` and ``Revoke.Behavior`` have
been removed. Replace their imports and enum references with ``CascadeBehavior``.
The existing getter and setter names remain, but their return and parameter types
have changed, so clients must recompile. ``Truncate.setCascade(false)`` still
clears the clause. Foreign-key referential actions retain their separate enum.

Inspect PostgreSQL schema statements
------------------------------------

Expand Down
Loading
Loading