Skip to content

Commit 4ed33b8

Browse files
committed
Add MySQL CREATE TABLE partition parsing
1 parent 9a32ff5 commit 4ed33b8

6 files changed

Lines changed: 960 additions & 32 deletions

File tree

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public class CreateTable implements Statement {
3636
private boolean selectParenthesis;
3737
private boolean ifNotExists = false;
3838
private boolean orReplace = false;
39+
private TablePartitioning partitioning;
3940

4041
private RowMovement rowMovement;
4142

@@ -148,6 +149,14 @@ public void setOrReplace(boolean orReplace) {
148149
this.orReplace = orReplace;
149150
}
150151

152+
public TablePartitioning getPartitioning() {
153+
return partitioning;
154+
}
155+
156+
public void setPartitioning(TablePartitioning partitioning) {
157+
this.partitioning = partitioning;
158+
}
159+
151160
public boolean isSelectParenthesis() {
152161
return selectParenthesis;
153162
}
@@ -216,6 +225,9 @@ private void appendTableOptions(StringBuilder b) {
216225
if (options != null && options.length() > 0) {
217226
b.append(" ").append(options);
218227
}
228+
if (partitioning != null) {
229+
b.append(" ").append(partitioning);
230+
}
219231
}
220232

221233
private void appendTableProperties(StringBuilder b) {
@@ -272,6 +284,11 @@ public CreateTable withIfNotExists(boolean ifNotExists) {
272284
return this;
273285
}
274286

287+
public CreateTable withPartitioning(TablePartitioning partitioning) {
288+
this.setPartitioning(partitioning);
289+
return this;
290+
}
291+
275292
public CreateTable withRowMovement(RowMovement rowMovement) {
276293
this.setRowMovement(rowMovement);
277294
return this;

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

Lines changed: 219 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,51 @@
1414
import net.sf.jsqlparser.statement.select.PlainSelect;
1515

1616
public class PartitionDefinition implements Serializable {
17+
18+
public enum ValueOperator {
19+
LESS_THAN("VALUES LESS THAN"), IN("VALUES IN");
20+
21+
private final String sql;
22+
23+
ValueOperator(String sql) {
24+
this.sql = sql;
25+
}
26+
27+
@Override
28+
public String toString() {
29+
return sql;
30+
}
31+
}
32+
1733
private String partitionName;
1834
private String partitionOperation;
1935
private List<String> values;
2036
private String storageEngine;
37+
private ValueOperator valueOperator;
38+
private boolean maxValue;
39+
private boolean subPartition;
40+
private boolean storageKeyword;
41+
private boolean storageEngineUseEquals = true;
42+
private String comment;
43+
private boolean commentUseEquals;
44+
private String dataDirectory;
45+
private boolean dataDirectoryUseEquals;
46+
private String indexDirectory;
47+
private boolean indexDirectoryUseEquals;
48+
private String maxRows;
49+
private boolean maxRowsUseEquals;
50+
private String minRows;
51+
private boolean minRowsUseEquals;
52+
private String tablespace;
53+
private boolean tablespaceUseEquals;
54+
private List<PartitionDefinition> subPartitionDefinitions;
55+
56+
public PartitionDefinition() {}
2157

2258
public PartitionDefinition(String partitionName, String partitionOperation,
2359
List<String> values, String storageEngine) {
2460
this.partitionName = partitionName;
25-
this.partitionOperation = partitionOperation;
61+
setPartitionOperation(partitionOperation);
2662
this.values = values;
2763
this.storageEngine = storageEngine;
2864
}
@@ -41,6 +77,13 @@ public String getPartitionOperation() {
4177

4278
public void setPartitionOperation(String partitionOperation) {
4379
this.partitionOperation = partitionOperation;
80+
if (ValueOperator.LESS_THAN.toString().equalsIgnoreCase(partitionOperation)) {
81+
valueOperator = ValueOperator.LESS_THAN;
82+
} else if (ValueOperator.IN.toString().equalsIgnoreCase(partitionOperation)) {
83+
valueOperator = ValueOperator.IN;
84+
} else {
85+
valueOperator = null;
86+
}
4487
}
4588

4689
public List<String> getValues() {
@@ -59,16 +102,186 @@ public void setStorageEngine(String storageEngine) {
59102
this.storageEngine = storageEngine;
60103
}
61104

105+
public ValueOperator getValueOperator() {
106+
return valueOperator;
107+
}
108+
109+
public void setValueOperator(ValueOperator valueOperator) {
110+
this.valueOperator = valueOperator;
111+
this.partitionOperation = valueOperator != null ? valueOperator.toString() : null;
112+
}
113+
114+
public boolean isMaxValue() {
115+
return maxValue;
116+
}
117+
118+
public void setMaxValue(boolean maxValue) {
119+
this.maxValue = maxValue;
120+
}
121+
122+
public boolean isSubPartition() {
123+
return subPartition;
124+
}
125+
126+
public void setSubPartition(boolean subPartition) {
127+
this.subPartition = subPartition;
128+
}
129+
130+
public boolean isStorageKeyword() {
131+
return storageKeyword;
132+
}
133+
134+
public void setStorageKeyword(boolean storageKeyword) {
135+
this.storageKeyword = storageKeyword;
136+
}
137+
138+
public boolean isStorageEngineUseEquals() {
139+
return storageEngineUseEquals;
140+
}
141+
142+
public void setStorageEngineUseEquals(boolean storageEngineUseEquals) {
143+
this.storageEngineUseEquals = storageEngineUseEquals;
144+
}
145+
146+
public String getComment() {
147+
return comment;
148+
}
149+
150+
public void setComment(String comment) {
151+
this.comment = comment;
152+
}
153+
154+
public boolean isCommentUseEquals() {
155+
return commentUseEquals;
156+
}
157+
158+
public void setCommentUseEquals(boolean commentUseEquals) {
159+
this.commentUseEquals = commentUseEquals;
160+
}
161+
162+
public String getDataDirectory() {
163+
return dataDirectory;
164+
}
165+
166+
public void setDataDirectory(String dataDirectory) {
167+
this.dataDirectory = dataDirectory;
168+
}
169+
170+
public boolean isDataDirectoryUseEquals() {
171+
return dataDirectoryUseEquals;
172+
}
173+
174+
public void setDataDirectoryUseEquals(boolean dataDirectoryUseEquals) {
175+
this.dataDirectoryUseEquals = dataDirectoryUseEquals;
176+
}
177+
178+
public String getIndexDirectory() {
179+
return indexDirectory;
180+
}
181+
182+
public void setIndexDirectory(String indexDirectory) {
183+
this.indexDirectory = indexDirectory;
184+
}
185+
186+
public boolean isIndexDirectoryUseEquals() {
187+
return indexDirectoryUseEquals;
188+
}
189+
190+
public void setIndexDirectoryUseEquals(boolean indexDirectoryUseEquals) {
191+
this.indexDirectoryUseEquals = indexDirectoryUseEquals;
192+
}
193+
194+
public String getMaxRows() {
195+
return maxRows;
196+
}
197+
198+
public void setMaxRows(String maxRows) {
199+
this.maxRows = maxRows;
200+
}
201+
202+
public boolean isMaxRowsUseEquals() {
203+
return maxRowsUseEquals;
204+
}
205+
206+
public void setMaxRowsUseEquals(boolean maxRowsUseEquals) {
207+
this.maxRowsUseEquals = maxRowsUseEquals;
208+
}
209+
210+
public String getMinRows() {
211+
return minRows;
212+
}
213+
214+
public void setMinRows(String minRows) {
215+
this.minRows = minRows;
216+
}
217+
218+
public boolean isMinRowsUseEquals() {
219+
return minRowsUseEquals;
220+
}
221+
222+
public void setMinRowsUseEquals(boolean minRowsUseEquals) {
223+
this.minRowsUseEquals = minRowsUseEquals;
224+
}
225+
226+
public String getTablespace() {
227+
return tablespace;
228+
}
229+
230+
public void setTablespace(String tablespace) {
231+
this.tablespace = tablespace;
232+
}
233+
234+
public boolean isTablespaceUseEquals() {
235+
return tablespaceUseEquals;
236+
}
237+
238+
public void setTablespaceUseEquals(boolean tablespaceUseEquals) {
239+
this.tablespaceUseEquals = tablespaceUseEquals;
240+
}
241+
242+
public List<PartitionDefinition> getSubPartitionDefinitions() {
243+
return subPartitionDefinitions;
244+
}
245+
246+
public void setSubPartitionDefinitions(
247+
List<PartitionDefinition> subPartitionDefinitions) {
248+
this.subPartitionDefinitions = subPartitionDefinitions;
249+
}
250+
62251
@Override
63252
public String toString() {
64253
StringBuilder b = new StringBuilder();
65-
b.append("PARTITION ").append(partitionName)
66-
.append(" ").append(partitionOperation)
67-
.append(" (").append(PlainSelect.getStringList(values))
68-
.append(")");
254+
b.append(subPartition ? "SUBPARTITION " : "PARTITION ").append(partitionName);
255+
if (partitionOperation != null) {
256+
b.append(" ").append(partitionOperation);
257+
if (maxValue) {
258+
b.append(" MAXVALUE");
259+
} else {
260+
b.append(" (").append(PlainSelect.getStringList(values)).append(")");
261+
}
262+
}
69263
if (storageEngine != null) {
70-
b.append(" ENGINE = ").append(storageEngine);
264+
if (storageKeyword) {
265+
b.append(" STORAGE");
266+
}
267+
appendOption(b, "ENGINE", storageEngine, storageEngineUseEquals);
268+
}
269+
appendOption(b, "COMMENT", comment, commentUseEquals);
270+
appendOption(b, "DATA DIRECTORY", dataDirectory, dataDirectoryUseEquals);
271+
appendOption(b, "INDEX DIRECTORY", indexDirectory, indexDirectoryUseEquals);
272+
appendOption(b, "MAX_ROWS", maxRows, maxRowsUseEquals);
273+
appendOption(b, "MIN_ROWS", minRows, minRowsUseEquals);
274+
appendOption(b, "TABLESPACE", tablespace, tablespaceUseEquals);
275+
if (subPartitionDefinitions != null && !subPartitionDefinitions.isEmpty()) {
276+
b.append(" ").append(PlainSelect.getStringList(subPartitionDefinitions, true, true));
71277
}
72278
return b.toString();
73279
}
280+
281+
private static void appendOption(StringBuilder builder, String name, String value,
282+
boolean useEquals) {
283+
if (value != null) {
284+
builder.append(" ").append(name).append(useEquals ? " = " : " ").append(value);
285+
}
286+
}
74287
}

0 commit comments

Comments
 (0)