Skip to content

Commit 964fa49

Browse files
authored
add support for postgres drop function statement (#1557)
1 parent 03c58de commit 964fa49

File tree

4 files changed

+107
-1
lines changed

4 files changed

+107
-1
lines changed

src/main/java/net/sf/jsqlparser/statement/drop/Drop.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
import java.util.ArrayList;
1313
import java.util.Collection;
1414
import java.util.Collections;
15+
import java.util.HashMap;
1516
import java.util.List;
17+
import java.util.Map;
1618
import java.util.Optional;
1719
import net.sf.jsqlparser.schema.Table;
1820
import net.sf.jsqlparser.statement.Statement;
@@ -24,6 +26,7 @@ public class Drop implements Statement {
2426
private String type;
2527
private Table name;
2628
private List<String> parameters;
29+
private Map<String, List<String>> typeToParameters = new HashMap<>();
2730
private boolean ifExists = false;
2831

2932
@Override
@@ -63,18 +66,41 @@ public void setIfExists(boolean ifExists) {
6366
this.ifExists = ifExists;
6467
}
6568

69+
public Map<String, List<String>> getTypeToParameters() {
70+
return typeToParameters;
71+
}
72+
73+
public void setTypeToParameters(Map<String, List<String>> typeToParameters) {
74+
this.typeToParameters = typeToParameters;
75+
}
76+
6677
@Override
6778
public String toString() {
6879
String sql = "DROP " + type + " "
6980
+ (ifExists ? "IF EXISTS " : "") + name.toString();
7081

82+
if (type.equals("FUNCTION")) {
83+
sql += formatFuncParams(getParamsByType("FUNCTION"));
84+
}
85+
7186
if (parameters != null && !parameters.isEmpty()) {
7287
sql += " " + PlainSelect.getStringList(parameters);
7388
}
7489

7590
return sql;
7691
}
7792

93+
public static String formatFuncParams(List<String> params) {
94+
if (params == null) {
95+
return "";
96+
}
97+
return params.isEmpty() ? "()" : PlainSelect.getStringList(params, true, true);
98+
}
99+
100+
public List<String> getParamsByType(String type) {
101+
return typeToParameters.get(type);
102+
}
103+
78104
public Drop withIfExists(boolean ifExists) {
79105
this.setIfExists(ifExists);
80106
return this;

src/main/java/net/sf/jsqlparser/util/deparser/DropDeParser.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ public void deParse(Drop drop) {
2828

2929
buffer.append(" ").append(drop.getName());
3030

31+
if (drop.getType().equals("FUNCTION")) {
32+
buffer.append(Drop.formatFuncParams(drop.getParamsByType("FUNCTION")));
33+
}
34+
3135
if (drop.getParameters() != null && !drop.getParameters().isEmpty()) {
3236
buffer.append(" ").append(PlainSelect.getStringList(drop.getParameters()));
3337
}

src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5435,12 +5435,55 @@ List<String> ColumnsNamesList():
54355435
}
54365436
}
54375437

5438+
String FuncArgsListItem():
5439+
{
5440+
Token tk = null;
5441+
String argName = null;
5442+
String argType = null;
5443+
}
5444+
{
5445+
(
5446+
LOOKAHEAD(2) (
5447+
argName = RelObjectName()
5448+
argType = RelObjectName()
5449+
[ "(" tk = <S_LONG> ")" { argType = argType + "(" + tk.image + ")"; } ]
5450+
)
5451+
|
5452+
(
5453+
argType = RelObjectName()
5454+
[ "(" tk = <S_LONG> ")" { argType = argType + "(" + tk.image + ")"; } ]
5455+
)
5456+
)
5457+
{
5458+
return argName != null ? String.format("%s %s", argName, argType) : argType;
5459+
}
5460+
}
5461+
5462+
List<String> FuncArgsList():
5463+
{
5464+
List<String> retval = null;
5465+
String img = null;
5466+
}
5467+
{
5468+
"("
5469+
{ retval = new ArrayList<String>(); }
5470+
[
5471+
img=FuncArgsListItem() { retval.add(img); }
5472+
( "," img=FuncArgsListItem() { retval.add(img); } )*
5473+
]
5474+
")"
5475+
{
5476+
return retval;
5477+
}
5478+
}
5479+
54385480
Drop Drop():
54395481
{
54405482
Drop drop = new Drop();
54415483
Token tk = null;
54425484
Table name;
54435485
List<String> dropArgs = new ArrayList<String>();
5486+
List<String> funcArgs = null;
54445487
}
54455488
{
54465489
<K_DROP>
@@ -5456,17 +5499,25 @@ Drop Drop():
54565499
tk=<K_SCHEMA>
54575500
|
54585501
tk=<K_SEQUENCE>
5502+
|
5503+
tk=<K_FUNCTION>
54595504
)
54605505
{ drop.setType(tk.image); }
54615506

54625507
[ LOOKAHEAD(2) <K_IF> <K_EXISTS> {drop.setIfExists(true);} ]
54635508

54645509
name = Table() { drop.setName(name); }
5510+
[ funcArgs = FuncArgsList() ]
54655511
((tk=<S_IDENTIFIER> | tk=<K_CASCADE> | tk=<K_RESTRICT> ) { dropArgs.add(tk.image); })*
54665512

54675513
{
5468-
if (dropArgs.size() > 0)
5514+
if (dropArgs.size() > 0) {
54695515
drop.setParameters(dropArgs);
5516+
}
5517+
if (drop.getType().equals("FUNCTION")) {
5518+
drop.getTypeToParameters().put("FUNCTION", funcArgs);
5519+
}
5520+
54705521
return drop;
54715522
}
54725523
}

src/test/java/net/sf/jsqlparser/statement/drop/DropTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,4 +97,29 @@ public void testOracleMultiColumnDrop() throws JSQLParserException {
9797
//assertSqlCanBeParsedAndDeparsed("ALTER TABLE foo DROP (bar, baz)");
9898
assertSqlCanBeParsedAndDeparsed("ALTER TABLE foo DROP (bar, baz) CASCADE");
9999
}
100+
101+
@Test
102+
public void testUniqueFunctionDrop() throws JSQLParserException {
103+
assertSqlCanBeParsedAndDeparsed("DROP FUNCTION myFunc");
104+
}
105+
106+
@Test
107+
public void testZeroArgDropFunction() throws JSQLParserException {
108+
assertSqlCanBeParsedAndDeparsed("DROP FUNCTION myFunc()");
109+
}
110+
111+
@Test
112+
public void testDropFunctionWithSimpleType() throws JSQLParserException {
113+
assertSqlCanBeParsedAndDeparsed("DROP FUNCTION myFunc(integer, varchar)");
114+
}
115+
116+
@Test
117+
public void testDropFunctionWithNameAndType() throws JSQLParserException {
118+
assertSqlCanBeParsedAndDeparsed("DROP FUNCTION myFunc(amount integer, name varchar)");
119+
}
120+
121+
@Test
122+
public void testDropFunctionWithNameAndParameterizedType() throws JSQLParserException {
123+
assertSqlCanBeParsedAndDeparsed("DROP FUNCTION myFunc(amount integer, name varchar(255))");
124+
}
100125
}

0 commit comments

Comments
 (0)