Skip to content

Commit 5d8dfa0

Browse files
committed
Merge origin/master
2 parents b08f205 + 2624826 commit 5d8dfa0

File tree

4 files changed

+104
-7
lines changed

4 files changed

+104
-7
lines changed

src/main/java/net/sf/jsqlparser/statement/truncate/Truncate.java

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ public class Truncate implements Statement {
1818
private Table table;
1919
boolean cascade; // to support TRUNCATE TABLE ... CASCADE
2020

21+
boolean tableToken; // to support TRUNCATE without TABLE
22+
boolean only; // to support TRUNCATE with ONLY
23+
2124
@Override
2225
public void accept(StatementVisitor statementVisitor) {
2326
statementVisitor.visit(this);
@@ -41,10 +44,42 @@ public void setCascade(boolean c) {
4144

4245
@Override
4346
public String toString() {
47+
StringBuilder sb = new StringBuilder();
48+
sb.append("TRUNCATE");
49+
if (tableToken) {
50+
sb.append(" TABLE");
51+
}
52+
if (only) {
53+
sb.append(" ONLY");
54+
}
55+
sb.append(" ");
56+
sb.append(table);
57+
4458
if (cascade) {
45-
return "TRUNCATE TABLE " + table + " CASCADE";
59+
sb.append( " CASCADE");
4660
}
47-
return "TRUNCATE TABLE " + table;
61+
return sb.toString();
62+
}
63+
64+
public boolean isTableToken() {
65+
return tableToken;
66+
}
67+
68+
public void setTableToken(boolean hasTable) {
69+
this.tableToken = hasTable;
70+
}
71+
72+
public boolean isOnly() {
73+
return only;
74+
}
75+
76+
public void setOnly(boolean only) {
77+
this.only = only;
78+
}
79+
80+
public Truncate withTableToken(boolean hasTableToken){
81+
this.setTableToken(hasTableToken);
82+
return this;
4883
}
4984

5085
public Truncate withTable(Table table) {
@@ -56,4 +91,9 @@ public Truncate withCascade(boolean cascade) {
5691
this.setCascade(cascade);
5792
return this;
5893
}
94+
public Truncate withOnly(boolean only) {
95+
this.setOnly(only);
96+
return this;
97+
}
5998
}
99+

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,11 +164,20 @@ public void visit(Select select) {
164164

165165
@Override
166166
public void visit(Truncate truncate) {
167-
buffer.append("TRUNCATE TABLE ");
167+
buffer.append("TRUNCATE");
168+
if (truncate.isTableToken()) {
169+
buffer.append(" TABLE");
170+
}
171+
if (truncate.isOnly()) {
172+
buffer.append(" ONLY");
173+
}
174+
buffer.append(" ");
168175
buffer.append(truncate.getTable());
176+
169177
if (truncate.getCascade()) {
170-
buffer.append(" CASCADE");
178+
buffer.append( " CASCADE");
171179
}
180+
172181
}
173182

174183
@Override

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5534,7 +5534,15 @@ Truncate Truncate():
55345534
Table table;
55355535
}
55365536
{
5537-
<K_TRUNCATE> <K_TABLE>
5537+
/**
5538+
* TRUNCATE can be followed directly by the table name in Postgresql
5539+
* See: https://www.postgresql.org/docs/current/sql-truncate.html
5540+
*
5541+
* TRUNCATE [ TABLE ] [ ONLY ] name [ * ] [, ... ]
5542+
* [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]
5543+
*
5544+
*/
5545+
<K_TRUNCATE> [<K_TABLE> {truncate.setTableToken(true);}] [<K_ONLY> {truncate.setOnly(true);}]
55385546
table=Table() { truncate.setTable(table); truncate.setCascade(false); } [ <K_CASCADE> {truncate.setCascade(true);} ]
55395547
{
55405548
return truncate;

src/test/java/net/sf/jsqlparser/statement/truncate/TruncateTest.java

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,15 @@
1010
package net.sf.jsqlparser.statement.truncate;
1111

1212
import java.io.StringReader;
13+
1314
import net.sf.jsqlparser.JSQLParserException;
1415
import net.sf.jsqlparser.parser.CCJSqlParserManager;
1516
import net.sf.jsqlparser.schema.Table;
17+
1618
import static net.sf.jsqlparser.test.TestUtils.assertDeparse;
1719
import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
1820
import static org.junit.jupiter.api.Assertions.assertEquals;
21+
1922
import org.junit.jupiter.api.Test;
2023

2124
public class TruncateTest {
@@ -39,20 +42,57 @@ public void testTruncate() throws Exception {
3942
statement = "TRUNCATE TABLE mytab CASCADE";
4043
truncate = (Truncate) parserManager.parse(new StringReader(statement));
4144
assertEquals(statement, truncate.toString());
45+
46+
statement = "TRUNCATE TABLE ONLY mytab CASCADE";
47+
truncate = (Truncate) parserManager.parse(new StringReader(statement));
48+
assertEquals(statement, truncate.toString());
49+
}
50+
51+
@Test
52+
public void testTruncatePostgresqlWithoutTableName() throws Exception {
53+
String statement = "TRUncATE myschema.mytab";
54+
Truncate truncate = (Truncate) parserManager.parse(new StringReader(statement));
55+
assertEquals("myschema", truncate.getTable().getSchemaName());
56+
assertEquals("myschema.mytab", truncate.getTable().getFullyQualifiedName());
57+
assertEquals("TRUNCATE MYSCHEMA.MYTAB", truncate.toString().toUpperCase());
58+
59+
statement = "TRUncATE mytab";
60+
truncate = (Truncate) parserManager.parse(new StringReader(statement));
61+
assertEquals("mytab", truncate.getTable().getName());
62+
assertEquals("TRUNCATE MYTAB", truncate.toString().toUpperCase());
63+
64+
statement = "TRUNCATE mytab CASCADE";
65+
truncate = (Truncate) parserManager.parse(new StringReader(statement));
66+
assertEquals("TRUNCATE MYTAB CASCADE", truncate.toString().toUpperCase());
4267
}
4368

4469
@Test
4570
public void testTruncateDeparse() throws JSQLParserException {
4671
String statement = "TRUNCATE TABLE foo";
4772
assertSqlCanBeParsedAndDeparsed(statement);
48-
assertDeparse(new Truncate().withTable(new Table("foo")), statement);
73+
assertDeparse(new Truncate()
74+
.withTable(new Table("foo"))
75+
.withTableToken(true), statement);
4976
}
5077

5178
@Test
5279
public void testTruncateCascadeDeparse() throws JSQLParserException {
5380
String statement = "TRUNCATE TABLE foo CASCADE";
5481
assertSqlCanBeParsedAndDeparsed(statement);
55-
assertDeparse(new Truncate().withTable(new Table("foo")).withCascade(true), statement);
82+
assertDeparse(new Truncate()
83+
.withTable(new Table("foo"))
84+
.withTableToken(true)
85+
.withCascade(true), statement);
5686
}
5787

88+
@Test
89+
public void testTruncateOnlyDeparse() throws JSQLParserException {
90+
String statement = "TRUNCATE TABLE ONLY foo CASCADE";
91+
assertSqlCanBeParsedAndDeparsed(statement);
92+
assertDeparse(new Truncate()
93+
.withTable(new Table("foo"))
94+
.withCascade(true)
95+
.withTableToken(true)
96+
.withOnly(true), statement);
97+
}
5898
}

0 commit comments

Comments
 (0)