Skip to content

Commit 7e15aae

Browse files
authored
feat(parser): model PostgreSQL type domain and extension DDL (#2553)
* feat(parser): model PostgreSQL type domain and extension DDL * test: handle licensed SQL fixtures in type DDL corpus
1 parent cb7cdee commit 7e15aae

27 files changed

Lines changed: 2284 additions & 8 deletions

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,10 @@ public enum Feature {
559559
* @see CreateSequence
560560
*/
561561
createSequence,
562+
/**
563+
* Structured type, domain and extension statements.
564+
*/
565+
createType, alterType, createDomain, alterDomain, createExtension, alterExtension,
562566
/**
563567
* SQL "CREATE SYNONYM" statement is allowed
564568
*
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: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@
99
*/
1010
package net.sf.jsqlparser.statement;
1111

12+
import net.sf.jsqlparser.statement.create.type.CreateType;
13+
import net.sf.jsqlparser.statement.alter.AlterType;
14+
import net.sf.jsqlparser.statement.create.domain.CreateDomain;
15+
import net.sf.jsqlparser.statement.alter.AlterDomain;
16+
import net.sf.jsqlparser.statement.create.extension.CreateExtension;
17+
import net.sf.jsqlparser.statement.alter.AlterExtension;
18+
1219
import net.sf.jsqlparser.JSQLParserException;
1320
import net.sf.jsqlparser.expression.Expression;
1421
import net.sf.jsqlparser.expression.ExpressionVisitor;
@@ -846,4 +853,46 @@ public <S> Void visit(TableFunction tableFunction, S context) {
846853
return super.visit(tableFunction, context);
847854
}
848855
}
856+
857+
@Override
858+
public <S> Void visit(CreateType statement, S context) {
859+
analysis.claimTopLevel();
860+
analysis.certain(StmtFeature.MODIFIES_SCHEMA);
861+
return null;
862+
}
863+
864+
@Override
865+
public <S> Void visit(AlterType statement, S context) {
866+
analysis.claimTopLevel();
867+
analysis.certain(StmtFeature.MODIFIES_SCHEMA);
868+
return null;
869+
}
870+
871+
@Override
872+
public <S> Void visit(CreateDomain statement, S context) {
873+
analysis.claimTopLevel();
874+
analysis.certain(StmtFeature.MODIFIES_SCHEMA);
875+
return null;
876+
}
877+
878+
@Override
879+
public <S> Void visit(AlterDomain statement, S context) {
880+
analysis.claimTopLevel();
881+
analysis.certain(StmtFeature.MODIFIES_SCHEMA);
882+
return null;
883+
}
884+
885+
@Override
886+
public <S> Void visit(CreateExtension statement, S context) {
887+
analysis.claimTopLevel();
888+
analysis.certain(StmtFeature.MODIFIES_SCHEMA);
889+
return null;
890+
}
891+
892+
@Override
893+
public <S> Void visit(AlterExtension statement, S context) {
894+
analysis.claimTopLevel();
895+
analysis.certain(StmtFeature.MODIFIES_SCHEMA);
896+
return null;
897+
}
849898
}

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

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

12+
import net.sf.jsqlparser.statement.create.type.CreateType;
13+
import net.sf.jsqlparser.statement.alter.AlterType;
14+
import net.sf.jsqlparser.statement.create.domain.CreateDomain;
15+
import net.sf.jsqlparser.statement.alter.AlterDomain;
16+
import net.sf.jsqlparser.statement.create.extension.CreateExtension;
17+
import net.sf.jsqlparser.statement.alter.AlterExtension;
18+
1219
import net.sf.jsqlparser.statement.alter.Alter;
1320
import net.sf.jsqlparser.statement.alter.AlterSession;
1421
import net.sf.jsqlparser.statement.alter.AlterSystemStatement;
@@ -393,4 +400,51 @@ default void visit(CreatePolicy createPolicy) {
393400
this.visit(createPolicy, null);
394401
}
395402

403+
default <S> T visit(CreateType statement, S context) {
404+
return null;
405+
}
406+
407+
default void visit(CreateType statement) {
408+
visit(statement, null);
409+
}
410+
411+
default <S> T visit(AlterType statement, S context) {
412+
return null;
413+
}
414+
415+
default void visit(AlterType statement) {
416+
visit(statement, null);
417+
}
418+
419+
default <S> T visit(CreateDomain statement, S context) {
420+
return null;
421+
}
422+
423+
default void visit(CreateDomain statement) {
424+
visit(statement, null);
425+
}
426+
427+
default <S> T visit(AlterDomain statement, S context) {
428+
return null;
429+
}
430+
431+
default void visit(AlterDomain statement) {
432+
visit(statement, null);
433+
}
434+
435+
default <S> T visit(CreateExtension statement, S context) {
436+
return null;
437+
}
438+
439+
default void visit(CreateExtension statement) {
440+
visit(statement, null);
441+
}
442+
443+
default <S> T visit(AlterExtension statement, S context) {
444+
return null;
445+
}
446+
447+
default void visit(AlterExtension statement) {
448+
visit(statement, null);
449+
}
396450
}

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

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

12+
import net.sf.jsqlparser.statement.create.type.CreateType;
13+
import net.sf.jsqlparser.statement.alter.AlterType;
14+
import net.sf.jsqlparser.statement.create.domain.CreateDomain;
15+
import net.sf.jsqlparser.statement.alter.AlterDomain;
16+
import net.sf.jsqlparser.statement.create.extension.CreateExtension;
17+
import net.sf.jsqlparser.statement.alter.AlterExtension;
18+
1219
import net.sf.jsqlparser.expression.ExpressionVisitor;
1320
import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
1421
import net.sf.jsqlparser.schema.Column;
22+
import net.sf.jsqlparser.schema.Table;
1523
import net.sf.jsqlparser.schema.Partition;
1624
import net.sf.jsqlparser.statement.alter.Alter;
1725
import net.sf.jsqlparser.statement.alter.AlterExpression;
@@ -596,4 +604,56 @@ public <S> T visit(Import imprt, S context) {
596604
public <S> T visit(Export export, S context) {
597605
return null;
598606
}
607+
608+
@Override
609+
public <S> T visit(CreateType statement, S context) {
610+
611+
return null;
612+
}
613+
614+
@Override
615+
public <S> T visit(AlterType statement, S context) {
616+
617+
return null;
618+
}
619+
620+
@Override
621+
public <S> T visit(CreateDomain statement, S context) {
622+
if (statement.getDefaultExpression() != null) {
623+
statement.getDefaultExpression().accept(expressionVisitor, context);
624+
}
625+
statement.getConstraints().forEach(constraint -> {
626+
if (constraint.getExpression() != null) {
627+
constraint.getExpression().accept(expressionVisitor, context);
628+
}
629+
});
630+
return null;
631+
}
632+
633+
@Override
634+
public <S> T visit(AlterDomain statement, S context) {
635+
if (statement.getDefaultExpression() != null) {
636+
statement.getDefaultExpression().accept(expressionVisitor, context);
637+
}
638+
if (statement.getConstraint() != null
639+
&& statement.getConstraint().getExpression() != null) {
640+
statement.getConstraint().getExpression().accept(expressionVisitor, context);
641+
}
642+
return null;
643+
}
644+
645+
@Override
646+
public <S> T visit(CreateExtension statement, S context) {
647+
648+
return null;
649+
}
650+
651+
@Override
652+
public <S> T visit(AlterExtension statement, S context) {
653+
if (statement.getMember() != null && statement.getMember().isTable()) {
654+
new Table(statement.getMember().getName())
655+
.accept(fromItemVisitor, context);
656+
}
657+
return null;
658+
}
599659
}

0 commit comments

Comments
 (0)