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
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ and missing syntax gets added on demand — [open an issue](https://github.com/J
| **DDL** | `CREATE …` · `ALTER …` · `DROP …` |
| **MySQL table maintenance** | `ANALYZE` · `CHECK` · `OPTIMIZE` · `REPAIR TABLE` |
| **PostgreSQL RLS** | `CREATE POLICY` · `ALTER TABLE … ENABLE`/`DISABLE`/`FORCE`/`NO FORCE ROW LEVEL SECURITY` |
| **PostgreSQL administration** | `CREATE`/`ALTER EVENT TRIGGER` · `REINDEX` · `SECURITY LABEL` |
| **Informix constraints** | `ALTER TABLE … ADD CONSTRAINT` with trailing constraint names for primary, unique, foreign and check constraints; enable with `parser.withDialect(Dialect.INFORMIX)` |
| **Salesforce SOQL** | `INCLUDES` · `EXCLUDES` |

Expand Down
24 changes: 24 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 @@ -29,6 +29,7 @@
import net.sf.jsqlparser.statement.TableMaintenanceStatement;
import net.sf.jsqlparser.statement.UseStatement;
import net.sf.jsqlparser.statement.alter.Alter;
import net.sf.jsqlparser.statement.alter.AlterEventTrigger;
import net.sf.jsqlparser.statement.alter.sequence.AlterSequence;
import net.sf.jsqlparser.statement.analyze.Analyze;
import net.sf.jsqlparser.statement.comment.Comment;
Expand All @@ -40,6 +41,7 @@
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
import net.sf.jsqlparser.statement.create.table.CreateTable;
import net.sf.jsqlparser.statement.create.trigger.CreateEventTrigger;
import net.sf.jsqlparser.statement.create.view.AlterView;
import net.sf.jsqlparser.statement.create.view.CreateView;
import net.sf.jsqlparser.statement.delete.Delete;
Expand All @@ -48,6 +50,7 @@
import net.sf.jsqlparser.statement.grant.Grant;
import net.sf.jsqlparser.statement.merge.Merge;
import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
import net.sf.jsqlparser.statement.reindex.Reindex;
import net.sf.jsqlparser.statement.select.Fetch;
import net.sf.jsqlparser.statement.select.First;
import net.sf.jsqlparser.statement.select.KSQLWindow;
Expand All @@ -60,6 +63,7 @@
import net.sf.jsqlparser.statement.select.TableFunction;
import net.sf.jsqlparser.statement.select.Top;
import net.sf.jsqlparser.statement.select.UnPivot;
import net.sf.jsqlparser.statement.securitylabel.SecurityLabel;
import net.sf.jsqlparser.statement.show.*;
import net.sf.jsqlparser.statement.truncate.Truncate;
import net.sf.jsqlparser.statement.update.Update;
Expand Down Expand Up @@ -607,6 +611,26 @@ public enum Feature {
* SQL "CREATE TRIGGER" statement is allowed
*/
createTrigger,
/**
* PostgreSQL "CREATE EVENT TRIGGER" and "ALTER EVENT TRIGGER" statements are allowed
*
* @see CreateEventTrigger
* @see AlterEventTrigger
*/
createEventTrigger, alterEventTrigger,
/**
* PostgreSQL "REINDEX" statement is allowed; "REINDEX … CONCURRENTLY" additionally requires
* {@link #reindexConcurrently}
*
* @see Reindex
*/
reindex, reindexConcurrently,
/**
* PostgreSQL "SECURITY LABEL" statement is allowed
*
* @see SecurityLabel
*/
securityLabel,
/**
* SQL "COMMIT" statement is allowed
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
import net.sf.jsqlparser.statement.alter.AlterSession;
import net.sf.jsqlparser.statement.alter.AlterStatistics;
import net.sf.jsqlparser.statement.alter.AlterSubscription;
import net.sf.jsqlparser.statement.alter.AlterEventTrigger;
import net.sf.jsqlparser.statement.alter.AlterSystemStatement;
import net.sf.jsqlparser.statement.alter.AlterTablespaceMove;
import net.sf.jsqlparser.statement.alter.AlterTextSearchConfiguration;
Expand Down Expand Up @@ -68,6 +69,7 @@
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
import net.sf.jsqlparser.statement.create.table.CreateTable;
import net.sf.jsqlparser.statement.create.textsearch.CreateTextSearchConfiguration;
import net.sf.jsqlparser.statement.create.trigger.CreateEventTrigger;
import net.sf.jsqlparser.statement.create.trigger.CreateTrigger;
import net.sf.jsqlparser.statement.create.type.CreateType;
import net.sf.jsqlparser.statement.create.user.CreateUser;
Expand All @@ -93,6 +95,8 @@
import net.sf.jsqlparser.statement.oracle.OracleBlock;
import net.sf.jsqlparser.statement.oracle.OracleNullStatement;
import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
import net.sf.jsqlparser.statement.reindex.Reindex;
import net.sf.jsqlparser.statement.securitylabel.SecurityLabel;
import net.sf.jsqlparser.statement.role.AlterRole;
import net.sf.jsqlparser.statement.role.CreateRole;
import net.sf.jsqlparser.statement.select.FromItemVisitor;
Expand Down Expand Up @@ -1065,6 +1069,29 @@ public <S> Void visit(CreateTrigger statement, S context) {
return schemaOnly();
}

@Override
public <S> Void visit(CreateEventTrigger statement, S context) {
return schemaOnly();
}

@Override
public <S> Void visit(AlterEventTrigger statement, S context) {
return schemaOnly();
}

@Override
public <S> Void visit(Reindex statement, S context) {
analysis.claimTopLevel();
// rebuilds index storage from the indexed rows
analysis.certain(StmtFeature.MODIFIES_SCHEMA, StmtFeature.READS_DATA);
return null;
}

@Override
public <S> Void visit(SecurityLabel statement, S context) {
return schemaOnly();
}

@Override
public <S> Void visit(CreateType statement, S context) {
analysis.claimTopLevel();
Expand Down
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 @@ -52,6 +52,7 @@

import net.sf.jsqlparser.statement.alter.Alter;
import net.sf.jsqlparser.statement.alter.AlterSession;
import net.sf.jsqlparser.statement.alter.AlterEventTrigger;
import net.sf.jsqlparser.statement.alter.AlterSystemStatement;
import net.sf.jsqlparser.statement.alter.RenameTableStatement;
import net.sf.jsqlparser.statement.alter.sequence.AlterSequence;
Expand All @@ -66,6 +67,7 @@
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
import net.sf.jsqlparser.statement.create.table.CreateTable;
import net.sf.jsqlparser.statement.create.trigger.CreateEventTrigger;
import net.sf.jsqlparser.statement.create.trigger.CreateTrigger;
import net.sf.jsqlparser.statement.create.user.CreateUser;
import net.sf.jsqlparser.statement.create.view.AlterView;
Expand All @@ -83,6 +85,8 @@
import net.sf.jsqlparser.statement.lock.LockStatement;
import net.sf.jsqlparser.statement.merge.Merge;
import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
import net.sf.jsqlparser.statement.reindex.Reindex;
import net.sf.jsqlparser.statement.securitylabel.SecurityLabel;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.show.ShowIndexStatement;
import net.sf.jsqlparser.statement.show.ShowTablesStatement;
Expand Down Expand Up @@ -223,6 +227,38 @@ default void visit(CreateTrigger createTrigger) {
this.visit(createTrigger, null);
}

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

default void visit(CreateEventTrigger statement) {
this.visit(statement, null);
}

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

default void visit(AlterEventTrigger statement) {
this.visit(statement, null);
}

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

default void visit(Reindex statement) {
this.visit(statement, null);
}

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

default void visit(SecurityLabel statement) {
this.visit(statement, null);
}

<S> T visit(CreateView createView, S context);

default void visit(CreateView createView) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
import net.sf.jsqlparser.statement.alter.Alter;
import net.sf.jsqlparser.statement.alter.AlterExpression;
import net.sf.jsqlparser.statement.alter.AlterSession;
import net.sf.jsqlparser.statement.alter.AlterEventTrigger;
import net.sf.jsqlparser.statement.alter.AlterSystemStatement;
import net.sf.jsqlparser.statement.alter.RenameTableStatement;
import net.sf.jsqlparser.statement.alter.sequence.AlterSequence;
Expand All @@ -68,6 +69,7 @@
import net.sf.jsqlparser.statement.create.sequence.CreateSequence;
import net.sf.jsqlparser.statement.create.synonym.CreateSynonym;
import net.sf.jsqlparser.statement.create.table.CreateTable;
import net.sf.jsqlparser.statement.create.trigger.CreateEventTrigger;
import net.sf.jsqlparser.statement.create.trigger.CreateTrigger;
import net.sf.jsqlparser.statement.create.user.CreateUser;
import net.sf.jsqlparser.statement.create.view.AlterView;
Expand All @@ -88,6 +90,8 @@
import net.sf.jsqlparser.statement.merge.MergeOperationVisitor;
import net.sf.jsqlparser.statement.merge.MergeOperationVisitorAdapter;
import net.sf.jsqlparser.statement.refresh.RefreshMaterializedViewStatement;
import net.sf.jsqlparser.statement.reindex.Reindex;
import net.sf.jsqlparser.statement.securitylabel.SecurityLabel;
import net.sf.jsqlparser.statement.select.FromItemVisitor;
import net.sf.jsqlparser.statement.select.FromItemVisitorAdapter;
import net.sf.jsqlparser.statement.select.PivotVisitor;
Expand Down Expand Up @@ -383,6 +387,7 @@ public <S> T visit(CreateIndex createIndex, S context) {

@Override
public <S> T visit(CreateSchema createSchema, S context) {
createSchema.getStatements().forEach(element -> element.accept(this, context));
return null;
}

Expand Down Expand Up @@ -422,6 +427,32 @@ public <S> T visit(CreateTrigger createTrigger, S context) {
return null;
}

@Override
public <S> T visit(CreateEventTrigger statement, S context) {
statement.visitExpressions(expression -> expression.accept(expressionVisitor, context));
return null;
}

@Override
public <S> T visit(AlterEventTrigger statement, S context) {
return null;
}

@Override
public <S> T visit(Reindex statement, S context) {
if (statement.getTable() != null) {
statement.getTable().accept(fromItemVisitor, context);
}
return null;
}

@Override
public <S> T visit(SecurityLabel statement, S context) {
statement.visitRelations(table -> table.accept(fromItemVisitor, context));
expressionVisitor.visitExpression(statement.getLabel(), context);
return null;
}

@Override
public <S> T visit(CreateView createView, S context) {
createView.getView().accept(fromItemVisitor, context);
Expand Down
131 changes: 131 additions & 0 deletions src/main/java/net/sf/jsqlparser/statement/alter/AlterEventTrigger.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
/*-
* #%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 net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.StatementVisitor;

/**
* A PostgreSQL {@code ALTER EVENT TRIGGER} statement. The enable states are shared with the trigger
* and rule actions of {@link RelationAlterAction}. Each non-null setter selects its action and
* discards the values of the other actions.
*/
public class AlterEventTrigger implements Statement {
public enum Action {
STATE, OWNER, RENAME
}

private String name;
private Action action;
private RelationAlterAction.EnableState enableState;
private String owner;
private String newName;

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

public String getName() {
return name;
}

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

public Action getAction() {
return action;
}

/** {@code ENABLE}, {@code ENABLE REPLICA}, {@code ENABLE ALWAYS} or {@code DISABLE}. */
public RelationAlterAction.EnableState getEnableState() {
return enableState;
}

public void setEnableState(RelationAlterAction.EnableState enableState) {
if (enableState != null) {
select(Action.STATE);
}
this.enableState = enableState;
}

public String getOwner() {
return owner;
}

public void setOwner(String owner) {
if (owner != null) {
select(Action.OWNER);
}
this.owner = owner;
}

public String getNewName() {
return newName;
}

public void setNewName(String newName) {
if (newName != null) {
select(Action.RENAME);
}
this.newName = newName;
}

private void select(Action action) {
this.action = action;
enableState = null;
owner = null;
newName = null;
}

public StringBuilder appendTo(StringBuilder sql) {
sql.append("ALTER EVENT TRIGGER ").append(name);
switch (action) {
case STATE:
sql.append(' ').append(enableState.name().replace('_', ' '));
break;
case OWNER:
sql.append(" OWNER TO ").append(owner);
break;
case RENAME:
sql.append(" RENAME TO ").append(newName);
break;
default:
throw new IllegalStateException("Unknown event trigger action: " + action);
}
return sql;
}

@Override
public String toString() {
return appendTo(new StringBuilder()).toString();
}

public AlterEventTrigger withName(String name) {
setName(name);
return this;
}

public AlterEventTrigger withEnableState(RelationAlterAction.EnableState enableState) {
setEnableState(enableState);
return this;
}

public AlterEventTrigger withOwner(String owner) {
setOwner(owner);
return this;
}

public AlterEventTrigger withNewName(String newName) {
setNewName(newName);
return this;
}
}
Loading
Loading