Skip to content

Commit a864973

Browse files
committed
Support structured PostgreSQL role privilege and trigger DDL
1 parent 6c726d8 commit a864973

29 files changed

Lines changed: 2596 additions & 118 deletions

‎.codacy.yml‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
11
---
2+
engines:
3+
tsqllint:
4+
exclude_paths:
5+
# These fixtures use PostgreSQL grammar, not Transact-SQL.
6+
- "src/test/resources/postgresql/**"
27
exclude_paths:
38
- "site/**"

‎src/main/java/net/sf/jsqlparser/parser/feature/Feature.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -637,7 +637,7 @@ public enum Feature {
637637
/**
638638
* @see Grant
639639
*/
640-
grant,
640+
grant, revoke, createRole, alterRole, alterDefaultPrivileges,
641641
/**
642642
* @see Function
643643
*/
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
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+
import java.util.List;
13+
import java.util.stream.Collectors;
14+
import net.sf.jsqlparser.statement.create.table.ColDataType;
15+
import java.io.Serializable;
16+
17+
public class RoutineReference implements Serializable {
18+
private String name;
19+
private List<Argument> arguments;
20+
private boolean allArguments;
21+
private List<Argument> orderByArguments;
22+
23+
public String getName() {
24+
return name;
25+
}
26+
27+
public void setName(String name) {
28+
this.name = name;
29+
}
30+
31+
public List<Argument> getArguments() {
32+
return arguments;
33+
}
34+
35+
public void setArguments(List<Argument> arguments) {
36+
this.arguments = arguments;
37+
}
38+
39+
public boolean isAllArguments() {
40+
return allArguments;
41+
}
42+
43+
public void setAllArguments(boolean allArguments) {
44+
this.allArguments = allArguments;
45+
}
46+
47+
public List<Argument> getOrderByArguments() {
48+
return orderByArguments;
49+
}
50+
51+
public void setOrderByArguments(List<Argument> orderByArguments) {
52+
this.orderByArguments = orderByArguments;
53+
}
54+
55+
/** A signature argument is a data type, not an invocation expression. */
56+
public static class Argument implements Serializable {
57+
public enum Mode {
58+
IN, OUT, INOUT, VARIADIC
59+
}
60+
61+
private Mode mode;
62+
private String name;
63+
private ColDataType dataType;
64+
65+
public Mode getMode() {
66+
return mode;
67+
}
68+
69+
public void setMode(Mode mode) {
70+
this.mode = mode;
71+
}
72+
73+
public String getName() {
74+
return name;
75+
}
76+
77+
public void setName(String name) {
78+
this.name = name;
79+
}
80+
81+
public ColDataType getDataType() {
82+
return dataType;
83+
}
84+
85+
public void setDataType(ColDataType dataType) {
86+
this.dataType = dataType;
87+
}
88+
89+
@Override
90+
public String toString() {
91+
return (mode == null ? "" : mode + " ") + (name == null ? "" : name + " ") + dataType;
92+
}
93+
}
94+
95+
@Override
96+
public String toString() {
97+
if (arguments == null && !allArguments && orderByArguments == null) {
98+
return name;
99+
}
100+
StringBuilder sql = new StringBuilder(name).append('(');
101+
if (allArguments) {
102+
sql.append('*');
103+
} else if (arguments != null) {
104+
sql.append(arguments.stream().map(Object::toString).collect(Collectors.joining(", ")));
105+
}
106+
if (orderByArguments != null) {
107+
if (arguments != null && !arguments.isEmpty()) {
108+
sql.append(' ');
109+
}
110+
sql.append("ORDER BY ").append(orderByArguments.stream().map(Object::toString)
111+
.collect(Collectors.joining(", ")));
112+
}
113+
return sql.append(')').toString();
114+
}
115+
}

‎src/main/java/net/sf/jsqlparser/statement/StatementFeatureVisitor.java‎

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@
99
*/
1010
package net.sf.jsqlparser.statement;
1111

12+
import net.sf.jsqlparser.statement.role.CreateRole;
13+
import net.sf.jsqlparser.statement.role.AlterRole;
14+
import net.sf.jsqlparser.statement.grant.Revoke;
15+
import net.sf.jsqlparser.statement.grant.AlterDefaultPrivileges;
16+
import net.sf.jsqlparser.statement.create.trigger.CreateTrigger;
17+
1218
import net.sf.jsqlparser.JSQLParserException;
1319
import net.sf.jsqlparser.expression.Expression;
1420
import net.sf.jsqlparser.expression.ExpressionVisitor;
@@ -846,4 +852,29 @@ public <S> Void visit(TableFunction tableFunction, S context) {
846852
return super.visit(tableFunction, context);
847853
}
848854
}
855+
856+
@Override
857+
public <S> Void visit(CreateRole statement, S context) {
858+
return schemaOnly();
859+
}
860+
861+
@Override
862+
public <S> Void visit(AlterRole statement, S context) {
863+
return schemaOnly();
864+
}
865+
866+
@Override
867+
public <S> Void visit(Revoke statement, S context) {
868+
return schemaOnly();
869+
}
870+
871+
@Override
872+
public <S> Void visit(AlterDefaultPrivileges statement, S context) {
873+
return schemaOnly();
874+
}
875+
876+
@Override
877+
public <S> Void visit(CreateTrigger statement, S context) {
878+
return schemaOnly();
879+
}
849880
}

‎src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java‎

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@
99
*/
1010
package net.sf.jsqlparser.statement;
1111

12+
import net.sf.jsqlparser.statement.role.CreateRole;
13+
import net.sf.jsqlparser.statement.role.AlterRole;
14+
import net.sf.jsqlparser.statement.grant.Revoke;
15+
import net.sf.jsqlparser.statement.grant.AlterDefaultPrivileges;
16+
1217
import net.sf.jsqlparser.statement.alter.Alter;
1318
import net.sf.jsqlparser.statement.alter.AlterSession;
1419
import net.sf.jsqlparser.statement.alter.AlterSystemStatement;
@@ -393,4 +398,36 @@ default void visit(CreatePolicy createPolicy) {
393398
this.visit(createPolicy, null);
394399
}
395400

401+
402+
default <S> T visit(CreateRole statement, S context) {
403+
return null;
404+
}
405+
406+
default void visit(CreateRole statement) {
407+
visit(statement, null);
408+
}
409+
410+
default <S> T visit(AlterRole statement, S context) {
411+
return null;
412+
}
413+
414+
default void visit(AlterRole statement) {
415+
visit(statement, null);
416+
}
417+
418+
default <S> T visit(Revoke statement, S context) {
419+
return null;
420+
}
421+
422+
default void visit(Revoke statement) {
423+
visit(statement, null);
424+
}
425+
426+
default <S> T visit(AlterDefaultPrivileges statement, S context) {
427+
return null;
428+
}
429+
430+
default void visit(AlterDefaultPrivileges statement) {
431+
visit(statement, null);
432+
}
396433
}

‎src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java‎

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@
99
*/
1010
package net.sf.jsqlparser.statement;
1111

12+
import net.sf.jsqlparser.statement.role.CreateRole;
13+
import net.sf.jsqlparser.statement.role.AlterRole;
14+
import net.sf.jsqlparser.statement.role.RoleOption;
15+
import net.sf.jsqlparser.statement.grant.Revoke;
16+
import net.sf.jsqlparser.statement.grant.AlterDefaultPrivileges;
17+
1218
import net.sf.jsqlparser.expression.ExpressionVisitor;
1319
import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
1420
import net.sf.jsqlparser.schema.Column;
@@ -351,6 +357,11 @@ public <S> T visit(CreateTable createTable, S context) {
351357

352358
@Override
353359
public <S> T visit(CreateTrigger createTrigger, S context) {
360+
createTrigger.visit(t -> t.accept(fromItemVisitor, context),
361+
e -> e.accept(expressionVisitor, context));
362+
if (createTrigger.getBody() != null) {
363+
createTrigger.getBody().accept(this, context);
364+
}
354365
return null;
355366
}
356367

@@ -495,6 +506,8 @@ public <S> T visit(DeclareStatement declareStatement, S context) {
495506

496507
@Override
497508
public <S> T visit(Grant grant, S context) {
509+
grant.getClause().visit(t -> t.accept(fromItemVisitor, context),
510+
e -> e.accept(expressionVisitor, context));
498511
return null;
499512
}
500513

@@ -596,4 +609,45 @@ public <S> T visit(Import imprt, S context) {
596609
public <S> T visit(Export export, S context) {
597610
return null;
598611
}
612+
613+
@Override
614+
public <S> T visit(CreateRole statement, S context) {
615+
for (RoleOption option : statement.getOptions()) {
616+
if (option.getValue() != null) {
617+
option.getValue().accept(expressionVisitor, context);
618+
}
619+
}
620+
return null;
621+
}
622+
623+
@Override
624+
public <S> T visit(AlterRole statement, S context) {
625+
for (RoleOption option : statement.getOptions()) {
626+
if (option.getValue() != null) {
627+
option.getValue().accept(expressionVisitor, context);
628+
}
629+
}
630+
if (statement.getValues() != null) {
631+
statement.getValues().forEach(e -> e.accept(expressionVisitor, context));
632+
}
633+
return null;
634+
}
635+
636+
@Override
637+
public <S> T visit(Revoke statement, S context) {
638+
statement.getClause().visit(t -> t.accept(fromItemVisitor, context),
639+
e -> e.accept(expressionVisitor, context));
640+
return null;
641+
}
642+
643+
@Override
644+
public <S> T visit(AlterDefaultPrivileges statement, S context) {
645+
if (statement.getGrant() != null) {
646+
statement.getGrant().accept(this, context);
647+
}
648+
if (statement.getRevoke() != null) {
649+
statement.getRevoke().accept(this, context);
650+
}
651+
return null;
652+
}
599653
}

0 commit comments

Comments
 (0)