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
5 changes: 5 additions & 0 deletions .codacy.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
---
engines:
tsqllint:
exclude_paths:
# These fixtures use PostgreSQL grammar, not Transact-SQL.
- "src/test/resources/postgresql/**"
exclude_paths:
- "site/**"
2 changes: 2 additions & 0 deletions src/main/java/net/sf/jsqlparser/parser/feature/Feature.java
Original file line number Diff line number Diff line change
Expand Up @@ -559,6 +559,8 @@ public enum Feature {
* @see CreateSequence
*/
createSequence,
/** Publication and subscription definitions. */
createPublication, alterPublication, createSubscription, alterSubscription,
/**
* SQL "CREATE SYNONYM" statement is allowed
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@
*/
package net.sf.jsqlparser.statement;

import net.sf.jsqlparser.statement.create.publication.CreatePublication;
import net.sf.jsqlparser.statement.alter.AlterPublication;
import net.sf.jsqlparser.statement.create.subscription.CreateSubscription;
import net.sf.jsqlparser.statement.create.subscription.SubscriptionOption;
import net.sf.jsqlparser.statement.alter.AlterSubscription;

import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.ExpressionVisitor;
Expand Down Expand Up @@ -846,4 +852,48 @@ public <S> Void visit(TableFunction tableFunction, S context) {
return super.visit(tableFunction, context);
}
}

@Override
public <S> Void visit(CreatePublication statement, S context) {
analysis.claimTopLevel();
analysis.certain(StmtFeature.MODIFIES_SCHEMA);

return null;
}

@Override
public <S> Void visit(AlterPublication statement, S context) {
analysis.claimTopLevel();
analysis.certain(StmtFeature.MODIFIES_SCHEMA);

return null;
}

@Override
public <S> Void visit(CreateSubscription statement, S context) {
analysis.claimTopLevel();
analysis.certain(StmtFeature.MODIFIES_SCHEMA);
if (statement.getOptions().stream()
.noneMatch(option -> (option.getKind() == SubscriptionOption.Kind.CONNECT
|| option.getKind() == SubscriptionOption.Kind.ENABLED)
&& Boolean.FALSE.equals(option.getBooleanValue()))) {
// A subscription may start asynchronous replication; the remote contents are unknown.
analysis.possible(StmtFeature.MODIFIES_DATA);
}
return null;
}

@Override
public <S> Void visit(AlterSubscription statement, S context) {
analysis.claimTopLevel();
analysis.certain(StmtFeature.MODIFIES_SCHEMA);
if (statement.getAction() == AlterSubscription.Action.ENABLE
|| statement.getAction() == AlterSubscription.Action.REFRESH_PUBLICATION
|| statement.getAction() == AlterSubscription.Action.SET_PUBLICATION
|| statement.getAction() == AlterSubscription.Action.ADD_PUBLICATION
|| statement.getAction() == AlterSubscription.Action.DROP_PUBLICATION) {
analysis.possible(StmtFeature.MODIFIES_DATA);
}
return null;
}
}
36 changes: 36 additions & 0 deletions src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@
*/
package net.sf.jsqlparser.statement;

import net.sf.jsqlparser.statement.create.publication.CreatePublication;
import net.sf.jsqlparser.statement.alter.AlterPublication;
import net.sf.jsqlparser.statement.create.subscription.CreateSubscription;
import net.sf.jsqlparser.statement.alter.AlterSubscription;

import net.sf.jsqlparser.statement.alter.Alter;
import net.sf.jsqlparser.statement.alter.AlterSession;
import net.sf.jsqlparser.statement.alter.AlterSystemStatement;
Expand Down Expand Up @@ -393,4 +398,35 @@ default void visit(CreatePolicy createPolicy) {
this.visit(createPolicy, null);
}

default <S> T visit(CreatePublication statement, S context) {
return null;
}

default void visit(CreatePublication statement) {
visit(statement, null);
}

default <S> T visit(AlterPublication statement, S context) {
return null;
}

default void visit(AlterPublication statement) {
visit(statement, null);
}

default <S> T visit(CreateSubscription statement, S context) {
return null;
}

default void visit(CreateSubscription statement) {
visit(statement, null);
}

default <S> T visit(AlterSubscription statement, S context) {
return null;
}

default void visit(AlterSubscription statement) {
visit(statement, null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@
*/
package net.sf.jsqlparser.statement;

import net.sf.jsqlparser.statement.create.publication.CreatePublication;
import net.sf.jsqlparser.statement.alter.AlterPublication;
import net.sf.jsqlparser.statement.create.subscription.CreateSubscription;
import net.sf.jsqlparser.statement.alter.AlterSubscription;

import net.sf.jsqlparser.expression.ExpressionVisitor;
import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
import net.sf.jsqlparser.schema.Column;
Expand Down Expand Up @@ -596,4 +601,56 @@ public <S> T visit(Import imprt, S context) {
public <S> T visit(Export export, S context) {
return null;
}

@Override
public <S> T visit(CreatePublication statement, S context) {
statement.getTargets().forEach(target -> target.visit(
table -> table.accept(fromItemVisitor, context),
expression -> expression.accept(expressionVisitor, context)));
statement.getOptions().forEach(option -> {
if (option.getValue() != null) {
option.getValue().accept(expressionVisitor, context);
}
});
return null;
}

@Override
public <S> T visit(AlterPublication statement, S context) {
statement.getTargets().forEach(target -> target.visit(
table -> table.accept(fromItemVisitor, context),
expression -> expression.accept(expressionVisitor, context)));
statement.getOptions().forEach(option -> {
if (option.getValue() != null) {
option.getValue().accept(expressionVisitor, context);
}
});
return null;
}

@Override
public <S> T visit(CreateSubscription statement, S context) {
if (statement.getConnection() != null) {
statement.getConnection().accept(expressionVisitor, context);
}
statement.getOptions().forEach(option -> {
if (option.getValue() != null) {
option.getValue().accept(expressionVisitor, context);
}
});
return null;
}

@Override
public <S> T visit(AlterSubscription statement, S context) {
if (statement.getConnection() != null) {
statement.getConnection().accept(expressionVisitor, context);
}
statement.getOptions().forEach(option -> {
if (option.getValue() != null) {
option.getValue().accept(expressionVisitor, context);
}
});
return null;
}
}
118 changes: 118 additions & 0 deletions src/main/java/net/sf/jsqlparser/statement/alter/AlterPublication.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
/*-
* #%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.alter;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.statement.create.publication.PublicationTarget;
import net.sf.jsqlparser.statement.create.publication.PublicationOption;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.StatementVisitor;

public class AlterPublication implements Statement {
private String name;
private Action action;
private List<PublicationTarget> targets = new ArrayList<>();
private List<PublicationOption> options = new ArrayList<>();
private String newName;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Action getAction() {
return action;
}

public void setAction(Action action) {
this.action = action;
}

public List<PublicationTarget> getTargets() {
return targets;
}

public void setTargets(List<PublicationTarget> targets) {
this.targets = targets;
}

public List<PublicationOption> getOptions() {
return options;
}

public void setOptions(List<PublicationOption> options) {
this.options = options;
}

public String getNewName() {
return newName;
}

public void setNewName(String newName) {
this.newName = newName;
}

@Override
public <T, S> T accept(StatementVisitor<T> visitor, S context) {
return visitor.visit(this, context);
}

public enum Action {
ADD, SET, DROP, SET_OPTIONS, OWNER, RENAME
}

public void appendTo(StringBuilder sql, Consumer<Expression> expressions) {
sql.append("ALTER PUBLICATION ").append(name).append(' ');
switch (action) {
case OWNER:
sql.append("OWNER TO ").append(newName);
break;
case RENAME:
sql.append("RENAME TO ").append(newName);
break;
case SET_OPTIONS:
sql.append("SET (");
for (int i = 0; i < options.size(); i++) {
if (i > 0) {
sql.append(", ");
}
options.get(i).appendTo(sql, expressions);
}
sql.append(')');
break;
case ADD:
case SET:
case DROP:
sql.append(action).append(' ');
for (int i = 0; i < targets.size(); i++) {
if (i > 0) {
sql.append(", ");
}
targets.get(i).appendTo(sql, expressions);
}
break;
default:
throw new IllegalStateException("Unknown publication alteration: " + action);
}
}

@Override
public String toString() {
StringBuilder sql = new StringBuilder();
appendTo(sql, sql::append);
return sql.toString();
}
}
Loading
Loading