Skip to content

Commit 69287d7

Browse files
committed
quoted columns in create table statement included
CreateTableDeParser corrected (NPE with no indexes, toString delivers now same) CreateTableTest expanded
1 parent 7e39e9e commit 69287d7

File tree

4 files changed

+67
-37
lines changed

4 files changed

+67
-37
lines changed

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ public void setColumnDefinitions(List<ColumnDefinition> list) {
4444
}
4545

4646
/**
47-
* A list of options (as simple strings) of this table definition, as ("TYPE", "=", "MYISAM")
47+
* A list of options (as simple strings) of this table definition, as
48+
* ("TYPE", "=", "MYISAM")
4849
*/
4950
public List<?> getTableOptionsStrings() {
5051
return tableOptionsStrings;
@@ -56,7 +57,8 @@ public void setTableOptionsStrings(List<String> list) {
5657

5758
/**
5859
* A list of {@link Index}es (for example "PRIMARY KEY") of this table.<br>
59-
* Indexes created with column definitions (as in mycol INT PRIMARY KEY) are not inserted into this list.
60+
* Indexes created with column definitions (as in mycol INT PRIMARY KEY) are
61+
* not inserted into this list.
6062
*/
6163
public List<Index> getIndexes() {
6264
return indexes;
@@ -76,8 +78,11 @@ public String toString() {
7678
sql += ", ";
7779
sql += PlainSelect.getStringList(indexes);
7880
}
79-
sql += ") ";
80-
sql += PlainSelect.getStringList(tableOptionsStrings, false, false);
81+
sql += ")";
82+
String options = PlainSelect.getStringList(tableOptionsStrings, false, false);
83+
if (options != null && options.length() > 0) {
84+
sql += " " + options;
85+
}
8186

8287
return sql;
8388
}

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

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@
77
import net.sf.jsqlparser.statement.create.table.Index;
88

99
/**
10-
* A class to de-parse (that is, tranform from JSqlParser hierarchy into a string) a
11-
* {@link net.sf.jsqlparser.statement.create.table.CreateTable}
10+
* A class to de-parse (that is, tranform from JSqlParser hierarchy into a
11+
* string) a {@link net.sf.jsqlparser.statement.create.table.CreateTable}
1212
*/
1313
public class CreateTableDeParser {
14+
1415
protected StringBuilder buffer;
1516

1617
/**
17-
* @param buffer
18-
* the buffer that will be filled with the select
18+
* @param buffer the buffer that will be filled with the select
1919
*/
2020
public CreateTableDeParser(StringBuilder buffer) {
2121
this.buffer = buffer;
@@ -24,49 +24,46 @@ public CreateTableDeParser(StringBuilder buffer) {
2424
public void deParse(CreateTable createTable) {
2525
buffer.append("CREATE TABLE " + createTable.getTable().getWholeTableName());
2626
if (createTable.getColumnDefinitions() != null) {
27-
buffer.append(" { ");
27+
buffer.append(" (");
2828
for (Iterator<ColumnDefinition> iter = createTable.getColumnDefinitions().iterator(); iter.hasNext();) {
2929
ColumnDefinition columnDefinition = (ColumnDefinition) iter.next();
3030
buffer.append(columnDefinition.getColumnName());
3131
buffer.append(" ");
32-
buffer.append(columnDefinition.getColDataType().getDataType());
33-
if (columnDefinition.getColDataType().getArgumentsStringList() != null) {
34-
for (Iterator<String> iterator = columnDefinition.getColDataType().getArgumentsStringList().iterator(); iterator
35-
.hasNext();) {
36-
buffer.append(" ");
37-
buffer.append((String) iterator.next());
38-
}
39-
}
32+
buffer.append(columnDefinition.getColDataType().toString());
4033
if (columnDefinition.getColumnSpecStrings() != null) {
4134
for (Iterator<String> iterator = columnDefinition.getColumnSpecStrings().iterator(); iterator.hasNext();) {
4235
buffer.append(" ");
4336
buffer.append((String) iterator.next());
4437
}
4538
}
4639

47-
if (iter.hasNext())
48-
buffer.append(",\n");
40+
if (iter.hasNext()) {
41+
buffer.append(" , ");
42+
}
4943

5044
}
5145

52-
for (Iterator<Index> iter = createTable.getIndexes().iterator(); iter.hasNext();) {
53-
buffer.append(",\n");
54-
Index index = (Index) iter.next();
55-
buffer.append(index.getType() + " " + index.getName());
56-
buffer.append("(");
57-
for (Iterator<String> iterator = index.getColumnsNames().iterator(); iterator.hasNext();) {
58-
buffer.append((String) iterator.next());
59-
if (iterator.hasNext()) {
60-
buffer.append(", ");
46+
if (createTable.getIndexes() != null) {
47+
for (Iterator<Index> iter = createTable.getIndexes().iterator(); iter.hasNext();) {
48+
buffer.append(",");
49+
Index index = (Index) iter.next();
50+
buffer.append(index.getType() + " " + index.getName());
51+
buffer.append("(");
52+
for (Iterator<String> iterator = index.getColumnsNames().iterator(); iterator.hasNext();) {
53+
buffer.append((String) iterator.next());
54+
if (iterator.hasNext()) {
55+
buffer.append(", ");
56+
}
6157
}
62-
}
63-
buffer.append(")");
58+
buffer.append(")");
6459

65-
if (iter.hasNext())
66-
buffer.append(",\n");
60+
if (iter.hasNext()) {
61+
buffer.append(",");
62+
}
63+
}
6764
}
6865

69-
buffer.append(" \n} ");
66+
buffer.append(" )");
7067
}
7168
}
7269

@@ -77,5 +74,4 @@ public StringBuilder getBuffer() {
7774
public void setBuffer(StringBuilder buffer) {
7875
this.buffer = buffer;
7976
}
80-
8177
}

src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1627,8 +1627,10 @@ CreateTable CreateTable():
16271627
<K_TABLE> table=Table()
16281628
[
16291629
"("
1630-
1631-
columnName=<S_IDENTIFIER>
1630+
(columnName=<S_IDENTIFIER>
1631+
|
1632+
columnName=<S_QUOTED_IDENTIFIER>)
1633+
16321634
colDataType = ColDataType()
16331635
{
16341636
columnSpecs = new ArrayList();
@@ -1687,7 +1689,9 @@ CreateTable CreateTable():
16871689
)
16881690
|
16891691
(
1690-
columnName=<S_IDENTIFIER>
1692+
(columnName=<S_IDENTIFIER>
1693+
|
1694+
columnName=<S_QUOTED_IDENTIFIER>)
16911695
colDataType = ColDataType()
16921696
{
16931697
columnSpecs = new ArrayList();

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@
1111
import junit.framework.TestCase;
1212
import net.sf.jsqlparser.JSQLParserException;
1313
import net.sf.jsqlparser.parser.CCJSqlParserManager;
14+
import net.sf.jsqlparser.statement.Statement;
1415
import net.sf.jsqlparser.statement.create.table.ColumnDefinition;
1516
import net.sf.jsqlparser.statement.create.table.CreateTable;
1617
import net.sf.jsqlparser.statement.create.table.Index;
1718
import net.sf.jsqlparser.test.TestException;
1819
import net.sf.jsqlparser.test.tablesfinder.TablesNamesFinder;
20+
import net.sf.jsqlparser.util.deparser.StatementDeParser;
1921

2022
public class CreateTableTest extends TestCase {
2123
CCJSqlParserManager parserManager = new CCJSqlParserManager();
@@ -24,6 +26,16 @@ public CreateTableTest(String arg0) {
2426
super(arg0);
2527
}
2628

29+
public void testCreateTable2() throws JSQLParserException {
30+
String statement = "CREATE TABLE testtab (\"test\" varchar (255) )";
31+
assertSqlCanBeParsedAndDeparsed(statement);
32+
}
33+
34+
public void testCreateTable3() throws JSQLParserException {
35+
String statement = "CREATE TABLE testtab (\"test\" varchar (255) , \"test\" varchar (255) )";
36+
assertSqlCanBeParsedAndDeparsed(statement);
37+
}
38+
2739
public void testCreateTable() throws JSQLParserException {
2840
String statement = "CREATE TABLE mytab (mycol a (10, 20) c nm g, mycol2 mypar1 mypar2 (23,323,3) asdf ('23','123') dasd, "
2941
+ "PRIMARY KEY (mycol2, mycol)) type = myisam";
@@ -158,4 +170,17 @@ private String getLine(BufferedReader in) throws Exception {
158170

159171
return line;
160172
}
173+
174+
private void assertSqlCanBeParsedAndDeparsed(String statement) throws JSQLParserException {
175+
Statement parsed = parserManager.parse(new StringReader(statement));
176+
assertStatementCanBeDeparsedAs(parsed, statement);
177+
}
178+
179+
private void assertStatementCanBeDeparsedAs(Statement parsed, String statement) {
180+
assertEquals(statement, parsed.toString());
181+
182+
StatementDeParser deParser = new StatementDeParser(new StringBuilder());
183+
parsed.accept(deParser);
184+
assertEquals(statement, deParser.getBuffer().toString());
185+
}
161186
}

0 commit comments

Comments
 (0)