Skip to content

Commit 79b5fe9

Browse files
AnEmortalKidJan Monterrubio
andauthored
Implement row movement clause for table creation (#974)
* visual * implement row movement * support row + AS Co-authored-by: Jan Monterrubio <[email protected]>
1 parent a6a3c61 commit 79b5fe9

File tree

6 files changed

+138
-31
lines changed

6 files changed

+138
-31
lines changed

src/main/java/net/sf/jsqlparser/statement/create/table/CreateTable.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public class CreateTable implements Statement {
2828
private Select select;
2929
private boolean selectParenthesis;
3030
private boolean ifNotExists = false;
31+
private RowMovement rowMovement;
3132

3233
@Override
3334
public void accept(StatementVisitor statementVisitor) {
@@ -118,6 +119,14 @@ public void setSelectParenthesis(boolean selectParenthesis) {
118119
this.selectParenthesis = selectParenthesis;
119120
}
120121

122+
public RowMovement getRowMovement() {
123+
return rowMovement;
124+
}
125+
126+
public void setRowMovement(RowMovement rowMovement) {
127+
this.rowMovement = rowMovement;
128+
}
129+
121130
@Override
122131
public String toString() {
123132
String sql;
@@ -127,9 +136,7 @@ public String toString() {
127136
+ (!"".equals(createOps) ? createOps + " " : "")
128137
+ "TABLE " + (ifNotExists ? "IF NOT EXISTS " : "") + table;
129138

130-
if (select != null) {
131-
sql += " AS " + (selectParenthesis ? "(" : "") + select.toString() + (selectParenthesis ? ")" : "");
132-
} else {
139+
if (columnDefinitions != null && !columnDefinitions.isEmpty()) {
133140
sql += " (";
134141

135142
sql += PlainSelect.getStringList(columnDefinitions, true, false);
@@ -144,6 +151,12 @@ public String toString() {
144151
}
145152
}
146153

154+
if (rowMovement != null) {
155+
sql += " " + rowMovement.getMode().toString() + " ROW MOVEMENT";
156+
}
157+
if (select != null) {
158+
sql += " AS " + (selectParenthesis ? "(" : "") + select.toString() + (selectParenthesis ? ")" : "");
159+
}
147160
return sql;
148161
}
149162
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2020 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.statement.create.table;
11+
12+
/**
13+
* Holds data for the {@code row_movement} clause: https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_7002.htm#i2204697
14+
*/
15+
public class RowMovement {
16+
17+
private RowMovementMode mode;
18+
19+
public RowMovementMode getMode() {
20+
return mode;
21+
}
22+
23+
public void setMode(RowMovementMode mode) {
24+
this.mode = mode;
25+
}
26+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2020 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.statement.create.table;
11+
12+
public enum RowMovementMode {
13+
ENABLE, DISABLE;
14+
}
15+

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

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,7 @@ public void deParse(CreateTable createTable) {
4949
buffer.append("IF NOT EXISTS ");
5050
}
5151
buffer.append(createTable.getTable().getFullyQualifiedName());
52-
if (createTable.getSelect() != null) {
53-
buffer.append(" AS ");
54-
if (createTable.isSelectParenthesis()) {
55-
buffer.append("(");
56-
}
57-
Select sel = createTable.getSelect();
58-
sel.accept(this.statementDeParser);
59-
if (createTable.isSelectParenthesis()) {
60-
buffer.append(")");
61-
}
62-
} else {
52+
6353
if (createTable.getColumnDefinitions() != null) {
6454
buffer.append(" (");
6555
for (Iterator<ColumnDefinition> iter = createTable.getColumnDefinitions().iterator(); iter.
@@ -89,13 +79,27 @@ public void deParse(CreateTable createTable) {
8979
}
9080

9181
buffer.append(")");
92-
}
9382
}
9483

9584
params = PlainSelect.getStringList(createTable.getTableOptionsStrings(), false, false);
9685
if (!"".equals(params)) {
9786
buffer.append(' ').append(params);
9887
}
88+
89+
if (createTable.getRowMovement() != null) {
90+
buffer.append(' ').append(createTable.getRowMovement().getMode().toString()).append(" ROW MOVEMENT");
91+
}
92+
if (createTable.getSelect() != null) {
93+
buffer.append(" AS ");
94+
if (createTable.isSelectParenthesis()) {
95+
buffer.append("(");
96+
}
97+
Select sel = createTable.getSelect();
98+
sel.accept(this.statementDeParser);
99+
if (createTable.isSelectParenthesis()) {
100+
buffer.append(")");
101+
}
102+
}
99103
}
100104

101105
public StringBuilder getBuffer() {

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

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
237237
| <K_MINUS:"MINUS">
238238
| <K_MINVALUE:"MINVALUE">
239239
| <K_MODIFY: "MODIFY">
240+
| <K_MOVEMENT: "MOVEMENT">
240241
| <K_NATURAL:"NATURAL">
241242
| <K_NEXT:"NEXT">
242243
| <K_NEXTVAL:"NEXTVAL">
@@ -3801,6 +3802,7 @@ CreateTable CreateTable():
38013802
Select select = null;
38023803
CheckConstraint checkCs = null;
38033804
ExcludeConstraint excludeC = null;
3805+
RowMovement rowMovement = null;
38043806
}
38053807
{
38063808
<K_CREATE>
@@ -3949,13 +3951,14 @@ CreateTable CreateTable():
39493951
")"
39503952
( parameter=CreateParameter() { tableOptions.addAll(parameter); } )*
39513953
)
3952-
|
3953-
(
3954-
<K_AS> ( LOOKAHEAD("(" Select() ")") "(" select = Select() { createTable.setSelect(select, true); } ")"
3955-
| select = Select() { createTable.setSelect(select, false); } )
3956-
)
39573954
]
3958-
3955+
// see https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_7002.htm#i2126725
3956+
// table properties , all these are optional
3957+
[ rowMovement = RowMovement() { createTable.setRowMovement(rowMovement); }]
3958+
[
3959+
<K_AS> ( LOOKAHEAD("(" Select() ")") "(" select = Select() { createTable.setSelect(select, true); } ")"
3960+
| select = Select() { createTable.setSelect(select, false); } )
3961+
]
39593962
{
39603963
createTable.setTable(table);
39613964
if (indexes.size() > 0)
@@ -4140,14 +4143,28 @@ List<String> CreateParameter():
41404143
tk=<K_COLLATE> { param.add(tk.image); }
41414144
|
41424145
tk=<K_ASC> { param.add(tk.image); }
4143-
|
4146+
|
41444147
tk=<K_DESC> { param.add(tk.image); }
41454148
|
41464149
tk="::" colDataType = ColDataType() { param.add(tk.image); param.add(colDataType.toString()); }
41474150
)
41484151
{return param;}
41494152
}
41504153

4154+
// row_movement_clause https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_7002.htm#i2204697
4155+
RowMovement RowMovement():
4156+
{
4157+
RowMovement rowMovement = new RowMovement();
4158+
}
4159+
{
4160+
(
4161+
(<K_ENABLE> <K_ROW> <K_MOVEMENT>) { rowMovement.setMode(RowMovementMode.ENABLE); }
4162+
|
4163+
(<K_DISABLE> <K_ROW> <K_MOVEMENT>) { rowMovement.setMode(RowMovementMode.DISABLE); }
4164+
)
4165+
{ return rowMovement;}
4166+
}
4167+
41514168
String AList():
41524169
{
41534170
StringBuilder retval = new StringBuilder("(");

src/test/java/net/sf/jsqlparser/statement/create/CreateTableTest.java

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

12-
import java.io.BufferedReader;
13-
import java.io.InputStreamReader;
14-
import java.io.StringReader;
15-
import java.util.ArrayList;
16-
import java.util.Iterator;
17-
import java.util.List;
18-
import java.util.StringTokenizer;
1912
import net.sf.jsqlparser.JSQLParserException;
2013
import net.sf.jsqlparser.parser.CCJSqlParserManager;
2114
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
2215
import net.sf.jsqlparser.statement.create.table.ColumnDefinition;
2316
import net.sf.jsqlparser.statement.create.table.CreateTable;
2417
import net.sf.jsqlparser.statement.create.table.Index;
18+
import net.sf.jsqlparser.statement.create.table.RowMovementMode;
2519
import net.sf.jsqlparser.test.TestException;
26-
import static net.sf.jsqlparser.test.TestUtils.*;
20+
import org.assertj.core.api.Assertions;
21+
import org.junit.Test;
22+
23+
import java.io.BufferedReader;
24+
import java.io.InputStreamReader;
25+
import java.io.StringReader;
26+
import java.util.ArrayList;
27+
import java.util.Iterator;
28+
import java.util.List;
29+
import java.util.StringTokenizer;
30+
31+
import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
2732
import static org.junit.Assert.assertEquals;
2833
import static org.junit.Assert.assertFalse;
2934
import static org.junit.Assert.assertNotNull;
3035
import static org.junit.Assert.assertTrue;
31-
import org.junit.Test;
3236

3337
public class CreateTableTest {
3438

@@ -609,4 +613,32 @@ public void testCreateTableWithCommentIssue922() throws JSQLParserException {
609613
+ "KEY name_ind (name) COMMENT 'comment for the name index'\n"
610614
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8", true);
611615
}
616+
617+
@Test
618+
public void testEnableRowMovementOption() throws JSQLParserException {
619+
String sql = "CREATE TABLE test (startdate DATE) ENABLE ROW MOVEMENT";
620+
621+
CreateTable createTable = (CreateTable) CCJSqlParserUtil.parse(sql);
622+
Assertions.assertThat(createTable.getRowMovement()).isNotNull();
623+
Assertions.assertThat(createTable.getRowMovement().getMode()).isEqualTo(RowMovementMode.ENABLE);
624+
625+
assertSqlCanBeParsedAndDeparsed(sql);
626+
}
627+
628+
@Test
629+
public void testDisableRowMovementOption() throws JSQLParserException {
630+
String sql = "CREATE TABLE test (startdate DATE) DISABLE ROW MOVEMENT";
631+
632+
CreateTable createTable = (CreateTable) CCJSqlParserUtil.parse(sql);
633+
Assertions.assertThat(createTable.getRowMovement()).isNotNull();
634+
Assertions.assertThat(createTable.getRowMovement().getMode()).isEqualTo(RowMovementMode.DISABLE);
635+
636+
assertSqlCanBeParsedAndDeparsed(sql);
637+
}
638+
639+
@Test
640+
public void tableMovementWithAS() throws JSQLParserException {
641+
String sql = "CREATE TABLE test (startdate DATE) DISABLE ROW MOVEMENT AS SELECT 1 FROM dual";
642+
assertSqlCanBeParsedAndDeparsed(sql);
643+
}
612644
}

0 commit comments

Comments
 (0)