Skip to content

Commit abf440d

Browse files
committed
fixes #936
1 parent 775a09b commit abf440d

File tree

5 files changed

+123
-50
lines changed

5 files changed

+123
-50
lines changed

src/main/java/net/sf/jsqlparser/statement/create/index/CreateIndex.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@
1414
import net.sf.jsqlparser.statement.create.table.*;
1515

1616
import java.util.*;
17+
import static java.util.stream.Collectors.joining;
1718

1819
public class CreateIndex implements Statement {
1920

2021
private Table table;
2122
private Index index;
23+
private List<String> tailParameters;
2224

2325
@Override
2426
public void accept(StatementVisitor statementVisitor) {
@@ -41,6 +43,14 @@ public void setTable(Table table) {
4143
this.table = table;
4244
}
4345

46+
public List<String> getTailParameters() {
47+
return tailParameters;
48+
}
49+
50+
public void setTailParameters(List<String> tailParameters) {
51+
this.tailParameters = tailParameters;
52+
}
53+
4454
@Override
4555
public String toString() {
4656
StringBuilder buffer = new StringBuilder();
@@ -57,25 +67,26 @@ public String toString() {
5767
buffer.append(" ON ");
5868
buffer.append(table.getFullyQualifiedName());
5969

60-
if (index.getUsing() != null){
70+
if (index.getUsing() != null) {
6171
buffer.append(" USING ");
6272
buffer.append(index.getUsing());
6373
}
6474

6575
if (index.getColumnsNames() != null) {
6676
buffer.append(" (");
6777

68-
for (Iterator iter = index.getColumnsNames().iterator(); iter.hasNext();) {
69-
String columnName = (String) iter.next();
78+
buffer.append(
79+
index.getColumnWithParams().stream()
80+
.map(cp -> cp.columnName + (cp.getParams() != null ? " " + String.join(" ", cp.getParams()) : "")).collect(joining(", "))
81+
);
7082

71-
buffer.append(columnName);
83+
buffer.append(")");
7284

73-
if (iter.hasNext()) {
74-
buffer.append(", ");
85+
if (tailParameters != null) {
86+
for (String param : tailParameters) {
87+
buffer.append(" ").append(param);
7588
}
7689
}
77-
78-
buffer.append(")");
7990
}
8091

8192
return buffer.toString();

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

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

12+
import java.util.ArrayList;
13+
import java.util.Collections;
1214
import java.util.List;
15+
import static java.util.stream.Collectors.toList;
1316

1417
import net.sf.jsqlparser.statement.select.PlainSelect;
1518

1619
public class Index {
1720

1821
private String type;
1922
private String using;
20-
private List<String> columnsNames;
21-
private String name;
23+
private List<ColumnParams> columns;
24+
private final List<String> name = new ArrayList<>();
2225
private List<String> idxSpec;
2326

2427
public List<String> getColumnsNames() {
25-
return columnsNames;
28+
return columns.stream()
29+
.map(col -> col.columnName)
30+
.collect(toList());
31+
}
32+
33+
public List<ColumnParams> getColumnWithParams() {
34+
return columns;
2635
}
2736

2837
public String getName() {
29-
return name;
38+
return name.isEmpty()?null:String.join(".", name);
39+
}
40+
41+
public List<String> getNameParts() {
42+
return Collections.unmodifiableList(name);
3043
}
3144

3245
public String getType() {
@@ -45,11 +58,21 @@ public void setUsing(String string) {
4558
}
4659

4760
public void setColumnsNames(List<String> list) {
48-
columnsNames = list;
61+
columns = list.stream().map(col -> new ColumnParams(col, null)).collect(toList());
62+
}
63+
64+
public void setColumnNamesWithParams(List<ColumnParams> list) {
65+
this.columns = list;
4966
}
5067

51-
public void setName(String string) {
52-
name = string;
68+
public void setName(String name) {
69+
this.name.clear();
70+
this.name.add(name);
71+
}
72+
73+
public void setName(List<String> name) {
74+
this.name.clear();
75+
this.name.addAll(name);
5376
}
5477

5578
public void setType(String string) {
@@ -71,7 +94,30 @@ public void setIndexSpec(List<String> idxSpec) {
7194
@Override
7295
public String toString() {
7396
String idxSpecText = PlainSelect.getStringList(idxSpec, false, false);
74-
return type + (name != null ? " " + name : "") + " " + PlainSelect.
75-
getStringList(columnsNames, true, true) + (!"".equals(idxSpecText) ? " " + idxSpecText : "");
97+
return type + (!name.isEmpty() ? " " + getName() : "") + " " + PlainSelect.
98+
getStringList(columns, true, true) + (!"".equals(idxSpecText) ? " " + idxSpecText : "");
99+
}
100+
101+
public static class ColumnParams {
102+
public final String columnName;
103+
public final List<String> params;
104+
105+
public ColumnParams(String columnName, List<String> params) {
106+
this.columnName = columnName;
107+
this.params = params;
108+
}
109+
110+
public String getColumnName() {
111+
return columnName;
112+
}
113+
114+
public List<String> getParams() {
115+
return params;
116+
}
117+
118+
@Override
119+
public String toString() {
120+
return columnName + (params!=null?" " + String.join(" ", params):"");
121+
}
76122
}
77123
}

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

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
*/
1010
package net.sf.jsqlparser.util.deparser;
1111

12-
import java.util.Iterator;
12+
import static java.util.stream.Collectors.joining;
1313

1414
import net.sf.jsqlparser.statement.create.index.CreateIndex;
1515
import net.sf.jsqlparser.statement.create.table.Index;
@@ -38,22 +38,24 @@ public void deParse(CreateIndex createIndex) {
3838
buffer.append(createIndex.getTable().getFullyQualifiedName());
3939

4040
String using = index.getUsing();
41-
if (using != null){
41+
if (using != null) {
4242
buffer.append(" USING ");
4343
buffer.append(using);
4444
}
4545

4646
if (index.getColumnsNames() != null) {
4747
buffer.append(" (");
48-
for (Iterator iter = index.getColumnsNames().iterator(); iter.hasNext();) {
49-
String columnName = (String) iter.next();
50-
buffer.append(columnName);
48+
buffer.append(
49+
index.getColumnWithParams().stream()
50+
.map(cp -> cp.columnName + (cp.getParams() != null ? " " + String.join(" ", cp.getParams()) : "")).collect(joining(", "))
51+
);
52+
buffer.append(")");
53+
}
5154

52-
if (iter.hasNext()) {
53-
buffer.append(", ");
54-
}
55+
if (createIndex.getTailParameters() != null) {
56+
for (String param : createIndex.getTailParameters()) {
57+
buffer.append(" ").append(param);
5558
}
56-
buffer.append(")");
5759
}
5860
}
5961

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

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1207,11 +1207,9 @@ Table Table() #Table :
12071207
{
12081208
//String serverName = null, databaseName = null, schemaName = null, tableName = null;
12091209
List<String> data = new ArrayList<String>();
1210-
String token;
12111210
}
12121211
{
1213-
token = RelObjectName() { data.add(token); }
1214-
( LOOKAHEAD(2) "." ("." { data.add(null); })* token = RelObjectName() { data.add(token); } ) *
1212+
data = RelObjectNameList()
12151213

12161214
{
12171215
Table table = new Table(data);
@@ -3289,13 +3287,9 @@ Expression CaseWhenExpression() #CaseWhenExpression:
32893287
}
32903288
{
32913289
<K_CASE>
3292-
(
3293-
( clause=WhenThenSearchCondition() { whenClauses.add(clause); } )+
3294-
|
3295-
switchExp=Condition()
3296-
( clause=WhenThenValue() { whenClauses.add(clause); } )+
3297-
)
3298-
[<K_ELSE> elseExp=Condition()]
3290+
[ switchExp=Condition() ]
3291+
( clause=WhenThenSearchCondition() { whenClauses.add(clause); } )+
3292+
[<K_ELSE> elseExp=Condition()]
32993293
<K_END>
33003294
{
33013295
caseExp.setSwitchExpression(switchExp);
@@ -3321,7 +3315,7 @@ WhenClause WhenThenSearchCondition():
33213315
}
33223316
}
33233317

3324-
WhenClause WhenThenValue():
3318+
/*WhenClause WhenThenValue():
33253319
{
33263320
WhenClause whenThen = new WhenClause();
33273321
Expression whenExp = null;
@@ -3334,7 +3328,7 @@ WhenClause WhenThenValue():
33343328
whenThen.setThenExpression(thenExp);
33353329
return whenThen;
33363330
}
3337-
}
3331+
}*/
33383332

33393333
RowConstructor RowConstructor(): {
33403334
ExpressionList list = null;
@@ -3572,18 +3566,21 @@ CreateIndex CreateIndex():
35723566
{
35733567
CreateIndex createIndex = new CreateIndex();
35743568
Table table = null;
3575-
List<String> colNames = new ArrayList<String>();
3569+
List<Index.ColumnParams> colNames = new ArrayList<Index.ColumnParams>();
35763570
Token columnName;
35773571
Token using;
35783572
Index index = null;
3579-
String name = null;
3573+
//String name = null;
35803574
List<String> parameter = new ArrayList<String>();
3575+
List<String> tailParameter = null;
3576+
List<String> name;
35813577
}
35823578
{
35833579
<K_CREATE>
3584-
( parameter=CreateParameter() )*
3580+
[ parameter=CreateParameter() ]
3581+
3582+
<K_INDEX> name= RelObjectNameList()
35853583

3586-
<K_INDEX> name=RelObjectName()
35873584
{
35883585
index = new Index();
35893586
index.setName(name);
@@ -3599,9 +3596,10 @@ CreateIndex CreateIndex():
35993596
|
36003597
columnName=<S_QUOTED_IDENTIFIER>)
36013598

3602-
(CreateParameter() | <K_ASC> | <K_DESC>)*
3599+
{ parameter = null; }
3600+
[ parameter = CreateParameter() ]
36033601
{
3604-
colNames.add(columnName.image);
3602+
colNames.add(new Index.ColumnParams(columnName.image,parameter));
36053603
}
36063604

36073605
(
@@ -3610,19 +3608,21 @@ CreateIndex CreateIndex():
36103608
|
36113609
columnName=<S_QUOTED_IDENTIFIER>)
36123610

3613-
(CreateParameter() | <K_ASC> | <K_DESC>)*
3611+
{ parameter = null; }
3612+
[ parameter = CreateParameter() ]
36143613
{
3615-
colNames.add(columnName.image);
3614+
colNames.add(new Index.ColumnParams(columnName.image,parameter));
36163615
}
36173616
)*
36183617

36193618
")"
3620-
(CreateParameter() {})*
3619+
[ tailParameter = CreateParameter() {} ]
36213620

36223621
{
3623-
index.setColumnsNames(colNames);
3622+
index.setColumnNamesWithParams(colNames);
36243623
createIndex.setIndex(index);
36253624
createIndex.setTable(table);
3625+
createIndex.setTailParameters(tailParameter);
36263626
return createIndex;
36273627
}
36283628
}
@@ -4005,8 +4005,12 @@ List<String> CreateParameter():
40054005
tk=<K_USING> { param.add(tk.image); }
40064006
|
40074007
tk=<K_COLLATE> { param.add(tk.image); }
4008-
|
4009-
tk="::" colDataType = ColDataType() { param.add(tk.image); param.add(colDataType.toString()); }
4008+
|
4009+
tk=<K_ASC> { param.add(tk.image); }
4010+
|
4011+
tk=<K_DESC> { param.add(tk.image); }
4012+
|
4013+
tk="::" colDataType = ColDataType() { param.add(tk.image); param.add(colDataType.toString()); }
40104014
)
40114015
{return param;}
40124016
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,4 +111,14 @@ public void testCreateIndex7() throws JSQLParserException {
111111
public void testCreateIndexIssue633() throws JSQLParserException {
112112
assertSqlCanBeParsedAndDeparsed("CREATE INDEX idx_american_football_action_plays_1 ON american_football_action_plays USING btree (play_type)");
113113
}
114+
115+
@Test
116+
public void testFullIndexNameIssue936() throws JSQLParserException {
117+
assertSqlCanBeParsedAndDeparsed("CREATE INDEX \"TS\".\"IDX\" ON \"TEST\" (\"ID\" ASC) TABLESPACE \"TS\"");
118+
}
119+
120+
@Test
121+
public void testFullIndexNameIssue936_2() throws JSQLParserException {
122+
assertSqlCanBeParsedAndDeparsed("CREATE INDEX \"TS\".\"IDX\" ON \"TEST\" (\"ID\") TABLESPACE \"TS\"");
123+
}
114124
}

0 commit comments

Comments
 (0)