Skip to content

Commit b6eb57b

Browse files
committed
Support for parse delete from table using join to another table like:
DELETE posts FROM posts INNER JOIN projects ON projects.project_id = posts.project_id WHERE projects.client_id = :client_id This necessitated some changes to the DeleteTest class, specifically: JSqlParserCC.jjt - changes on grammar of Delete statements. Delete toString and DeleteDeParser.
1 parent 1b1655c commit b6eb57b

File tree

5 files changed

+120
-23
lines changed

5 files changed

+120
-23
lines changed

src/main/java/net/sf/jsqlparser/statement/delete/Delete.java

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import net.sf.jsqlparser.schema.Table;
2626
import net.sf.jsqlparser.statement.Statement;
2727
import net.sf.jsqlparser.statement.StatementVisitor;
28+
import net.sf.jsqlparser.statement.select.FromItem;
29+
import net.sf.jsqlparser.statement.select.Join;
2830
import net.sf.jsqlparser.statement.select.Limit;
2931
import net.sf.jsqlparser.statement.select.OrderByElement;
3032
import net.sf.jsqlparser.statement.select.PlainSelect;
@@ -34,6 +36,8 @@
3436
public class Delete implements Statement {
3537

3638
private Table table;
39+
private List<Table> tables;
40+
private List<Join> joins;
3741
private Expression where;
3842
private Limit limit;
3943
private List<OrderByElement> orderByElements;
@@ -75,11 +79,58 @@ public void setLimit(Limit limit) {
7579
this.limit = limit;
7680
}
7781

82+
83+
public List<Table> getTables() {
84+
return tables;
85+
}
86+
87+
public void setTables(List<Table> tables) {
88+
this.tables = tables;
89+
}
90+
91+
public List<Join> getJoins() {
92+
return joins;
93+
}
94+
95+
public void setJoins(List<Join> joins) {
96+
this.joins = joins;
97+
}
98+
7899
@Override
79100
public String toString() {
80-
return "DELETE FROM " + table +
81-
((where != null) ? " WHERE " + where : "") +
82-
(orderByElements!=null? PlainSelect.orderByToString(orderByElements):"") +
83-
(limit != null ? limit : "");
101+
StringBuilder b = new StringBuilder("DELETE");
102+
103+
if( tables != null && tables.size() > 0){
104+
b.append(" ");
105+
for(Table t : tables){
106+
b.append(t.toString());
107+
}
108+
}
109+
110+
b.append(" FROM ");
111+
b.append(table);
112+
113+
if (joins != null) {
114+
for (Join join : joins) {
115+
if (join.isSimple()) {
116+
b.append(", ").append(join);
117+
} else {
118+
b.append(" ").append(join);
119+
}
120+
}
121+
}
122+
123+
if( where != null ){
124+
b.append(" WHERE ").append(where);
125+
}
126+
127+
if(orderByElements!=null){
128+
b.append(PlainSelect.orderByToString(orderByElements));
129+
}
130+
131+
if(limit != null){
132+
b.append(limit);
133+
}
134+
return b.toString();
84135
}
85136
}

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

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323

2424
import net.sf.jsqlparser.expression.ExpressionVisitor;
2525
import net.sf.jsqlparser.expression.ExpressionVisitorAdapter;
26+
import net.sf.jsqlparser.schema.Table;
2627
import net.sf.jsqlparser.statement.delete.Delete;
28+
import net.sf.jsqlparser.statement.select.Join;
2729

2830
/**
2931
* A class to de-parse (that is, tranform from JSqlParser hierarchy into a
@@ -57,7 +59,24 @@ public void setBuffer(StringBuilder buffer) {
5759
}
5860

5961
public void deParse(Delete delete) {
60-
buffer.append("DELETE FROM ").append(delete.getTable().getFullyQualifiedName());
62+
buffer.append("DELETE");
63+
if(delete.getTables() != null && delete.getTables().size() > 0){
64+
for( Table table : delete.getTables() ){
65+
buffer.append(" ").append(table.getFullyQualifiedName());
66+
}
67+
}
68+
buffer.append(" FROM ").append(delete.getTable().toString());
69+
70+
if (delete.getJoins() != null) {
71+
for (Join join : delete.getJoins()) {
72+
if (join.isSimple()) {
73+
buffer.append(", ").append(join);
74+
} else {
75+
buffer.append(" ").append(join);
76+
}
77+
}
78+
}
79+
6180
if (delete.getWhere() != null) {
6281
buffer.append(" WHERE ");
6382
delete.getWhere().accept(expressionVisitor);

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -631,16 +631,23 @@ Delete Delete():
631631
{
632632
Delete delete = new Delete();
633633
Table table = null;
634+
List<Table> tables = new ArrayList<Table>();
635+
List<Join> joins = null;
634636
Expression where = null;
635637
Limit limit = null;
636638
List<OrderByElement> orderByElements;
637639
}
638640
{
639-
<K_DELETE> [<K_FROM>] table=TableWithAlias()
641+
<K_DELETE> [table=TableWithAlias() { tables.add(table); }
642+
("," table=TableWithAlias() { tables.add(table); } )*] [<K_FROM>]
643+
[ table=TableWithAlias() joins=JoinsList() ]
640644
[where=WhereClause() { delete.setWhere(where); } ]
641645
[orderByElements = OrderByElements() { delete.setOrderByElements(orderByElements); } ]
642646
[limit=PlainLimit() {delete.setLimit(limit); } ]
643647
{
648+
delete.setTables(tables);
649+
if (joins != null && joins.size() > 0)
650+
delete.setJoins(joins);
644651
delete.setTable(table);
645652
return delete;
646653
}

src/test/java/net/sf/jsqlparser/test/TestUtils.java

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,26 @@
1818
*/
1919
package net.sf.jsqlparser.test;
2020

21-
import net.sf.jsqlparser.*;
22-
import net.sf.jsqlparser.expression.*;
23-
import net.sf.jsqlparser.parser.*;
24-
import net.sf.jsqlparser.statement.*;
25-
import net.sf.jsqlparser.util.deparser.*;
21+
import static junit.framework.TestCase.assertEquals;
22+
import static junit.framework.TestCase.assertNotNull;
2623

27-
import java.io.*;
24+
import java.io.StringReader;
2825
import java.util.regex.Pattern;
2926

30-
import static junit.framework.Assert.assertEquals;
31-
import static junit.framework.TestCase.assertEquals;
32-
import static junit.framework.TestCase.assertNotNull;
27+
import org.junit.Assert;
28+
import org.junit.Test;
29+
30+
import net.sf.jsqlparser.JSQLParserException;
31+
import net.sf.jsqlparser.expression.Expression;
32+
import net.sf.jsqlparser.expression.OracleHint;
33+
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
34+
import net.sf.jsqlparser.statement.Statement;
3335
import net.sf.jsqlparser.statement.select.PlainSelect;
3436
import net.sf.jsqlparser.statement.select.Select;
35-
import net.sf.jsqlparser.statement.select.SelectBody;
3637
import net.sf.jsqlparser.statement.select.SetOperationList;
37-
import org.junit.Assert;
38-
import org.junit.Test;
38+
import net.sf.jsqlparser.util.deparser.ExpressionDeParser;
39+
import net.sf.jsqlparser.util.deparser.SelectDeParser;
40+
import net.sf.jsqlparser.util.deparser.StatementDeParser;
3941

4042
/**
4143
*

src/test/java/net/sf/jsqlparser/test/delete/DeleteTest.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
package net.sf.jsqlparser.test.delete;
22

3-
import java.io.StringReader;
43
import static junit.framework.Assert.assertEquals;
4+
import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
5+
6+
import java.io.StringReader;
7+
8+
import org.junit.Test;
59

610
import net.sf.jsqlparser.JSQLParserException;
711
import net.sf.jsqlparser.parser.CCJSqlParserManager;
812
import net.sf.jsqlparser.statement.delete.Delete;
9-
import org.junit.Test;
10-
11-
import static net.sf.jsqlparser.test.TestUtils.*;
1213

1314
public class DeleteTest {
1415

@@ -52,5 +53,22 @@ public void testDeleteWithOrderByAndLimit() throws JSQLParserException {
5253
String stmt = "DELETE FROM tablename WHERE a = 1 AND b = 1 ORDER BY col LIMIT 10";
5354
assertSqlCanBeParsedAndDeparsed(stmt);
5455
}
55-
56+
57+
@Test
58+
public void testDeleteFromTableUsingInnerJoinToAnotherTable() throws JSQLParserException {
59+
String stmt = "DELETE Table1 FROM Table1 INNER JOIN Table2 ON Table1.ID = Table2.ID";
60+
assertSqlCanBeParsedAndDeparsed(stmt);
61+
}
62+
63+
@Test
64+
public void testDeleteFromTableUsingLeftJoinToAnotherTable() throws JSQLParserException {
65+
String stmt = "DELETE g FROM Table1 AS g LEFT JOIN Table2 ON Table1.ID = Table2.ID";
66+
assertSqlCanBeParsedAndDeparsed(stmt);
67+
}
68+
69+
@Test
70+
public void testDeleteFromTableUsingInnerJoinToAnotherTableWithAlias() throws JSQLParserException {
71+
String stmt = "DELETE gc FROM guide_category AS gc LEFT JOIN guide AS g ON g.id_guide = gc.id_guide WHERE g.title IS NULL LIMIT 5";
72+
assertSqlCanBeParsedAndDeparsed(stmt);
73+
}
5674
}

0 commit comments

Comments
 (0)