Skip to content

Commit d70e151

Browse files
Delete queries without from, with a schema identifier fails (#1224)
* Delete queries without from, with a schema identifier fails * Better tests * Fix style issue * Deparse should match for DELETE WITHOUT FROM queries Co-authored-by: François Sécherre <[email protected]>
1 parent b62f19f commit d70e151

File tree

4 files changed

+40
-8
lines changed

4 files changed

+40
-8
lines changed

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

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public class Delete implements Statement {
3737
private Expression where;
3838
private Limit limit;
3939
private List<OrderByElement> orderByElements;
40+
private boolean hasFrom = true;
4041
public List<WithItem> getWithItemsList() {
4142
return withItemsList;
4243
}
@@ -123,6 +124,14 @@ public void setJoins(List<Join> joins) {
123124
this.joins = joins;
124125
}
125126

127+
public boolean isHasFrom() {
128+
return this.hasFrom;
129+
}
130+
131+
public void setHasFrom(boolean hasFrom) {
132+
this.hasFrom = hasFrom;
133+
}
134+
126135
@Override
127136
@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
128137
public String toString() {
@@ -148,8 +157,10 @@ public String toString() {
148157
.collect(joining(", ")));
149158
}
150159

151-
b.append(" FROM ");
152-
b.append(table);
160+
if (hasFrom) {
161+
b.append(" FROM");
162+
}
163+
b.append(" ").append(table);
153164

154165
if (joins != null) {
155166
for (Join join : joins) {
@@ -205,6 +216,11 @@ public Delete withWhere(Expression where) {
205216
return this;
206217
}
207218

219+
public Delete withHasFrom(boolean hasFrom) {
220+
this.setHasFrom(hasFrom);
221+
return this;
222+
}
223+
208224
public Delete addTables(Table... tables) {
209225
List<Table> collection = Optional.ofNullable(getTables()).orElseGet(ArrayList::new);
210226
Collections.addAll(collection, tables);

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,10 @@ public void deParse(Delete delete) {
5151
buffer.append(
5252
delete.getTables().stream().map(Table::getFullyQualifiedName).collect(joining(", ", " ", "")));
5353
}
54-
buffer.append(" FROM ").append(delete.getTable().toString());
54+
if (delete.isHasFrom()) {
55+
buffer.append(" FROM");
56+
}
57+
buffer.append(" ").append(delete.getTable().toString());
5558

5659
if (delete.getJoins() != null) {
5760
for (Join join : delete.getJoins()) {

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1206,11 +1206,12 @@ Delete Delete( List<WithItem> with ):
12061206
Expression where = null;
12071207
Limit limit = null;
12081208
List<OrderByElement> orderByElements;
1209+
boolean hasFrom = false;
12091210
}
12101211
{
1211-
<K_DELETE> { delete.setOracleHint(getOracleHint()); } [LOOKAHEAD(2) (table=TableWithAlias() { tables.add(table); }
1212+
<K_DELETE> { delete.setOracleHint(getOracleHint()); } [LOOKAHEAD(4) (table=TableWithAlias() { tables.add(table); }
12121213
("," table=TableWithAlias() { tables.add(table); } )*
1213-
<K_FROM> | <K_FROM>)]
1214+
<K_FROM> | <K_FROM>) { hasFrom = true; }]
12141215

12151216
[ LOOKAHEAD(3) table=TableWithAlias() joins=JoinsList() ]
12161217
[where=WhereClause() { delete.setWhere(where); } ]
@@ -1221,7 +1222,7 @@ Delete Delete( List<WithItem> with ):
12211222
delete.setJoins(joins);
12221223
}
12231224
return delete.withWithItemsList(with)
1224-
.withTables(tables).withTable(table);
1225+
.withTables(tables).withTable(table).withHasFrom(hasFrom);
12251226
}
12261227
}
12271228

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
package net.sf.jsqlparser.statement.delete;
1111

1212
import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
13-
13+
import static net.sf.jsqlparser.test.TestUtils.assertOracleHintExists;
1414
import static org.junit.Assert.assertEquals;
1515

1616
import java.io.StringReader;
@@ -21,7 +21,7 @@
2121
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
2222
import net.sf.jsqlparser.parser.CCJSqlParserManager;
2323
import net.sf.jsqlparser.schema.Column;
24-
import static net.sf.jsqlparser.test.TestUtils.assertOracleHintExists;
24+
2525
import org.junit.Test;
2626

2727
public class DeleteTest {
@@ -119,4 +119,16 @@ public void testWith() throws JSQLParserException {
119119

120120
assertSqlCanBeParsedAndDeparsed(statement, true);
121121
}
122+
123+
@Test
124+
public void testNoFrom() throws JSQLParserException {
125+
String statement = "DELETE A WHERE Z = 1";
126+
assertSqlCanBeParsedAndDeparsed(statement);
127+
}
128+
129+
@Test
130+
public void testNoFromWithSchema() throws JSQLParserException {
131+
String statement = "DELETE A.B WHERE Z = 1";
132+
assertSqlCanBeParsedAndDeparsed(statement);
133+
}
122134
}

0 commit comments

Comments
 (0)