Skip to content

Commit b0aff31

Browse files
Closed #1814, mysql and mariadb can use index type before ON (#1918)
1 parent 2ce72a3 commit b0aff31

File tree

4 files changed

+57
-18
lines changed

4 files changed

+57
-18
lines changed

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

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,27 @@
99
*/
1010
package net.sf.jsqlparser.statement.create.index;
1111

12+
import static java.util.stream.Collectors.joining;
13+
14+
import java.util.*;
1215
import net.sf.jsqlparser.schema.*;
1316
import net.sf.jsqlparser.statement.*;
1417
import net.sf.jsqlparser.statement.create.table.*;
1518

16-
import java.util.*;
17-
import static java.util.stream.Collectors.joining;
18-
1919
public class CreateIndex implements Statement {
2020

2121
private Table table;
2222
private Index index;
2323
private List<String> tailParameters;
24+
private boolean indexTypeBeforeOn = false;
25+
26+
public boolean isIndexTypeBeforeOn() {
27+
return indexTypeBeforeOn;
28+
}
29+
30+
public void setIndexTypeBeforeOn(boolean indexTypeBeforeOn) {
31+
this.indexTypeBeforeOn = indexTypeBeforeOn;
32+
}
2433

2534
public boolean isUsingIfNotExists() {
2635
return usingIfNotExists;
@@ -78,10 +87,16 @@ public String toString() {
7887
buffer.append("IF NOT EXISTS ");
7988
}
8089
buffer.append(index.getName());
90+
91+
if (index.getUsing() != null && isIndexTypeBeforeOn()) {
92+
buffer.append(" USING ");
93+
buffer.append(index.getUsing());
94+
}
95+
8196
buffer.append(" ON ");
8297
buffer.append(table.getFullyQualifiedName());
8398

84-
if (index.getUsing() != null) {
99+
if (index.getUsing() != null && !isIndexTypeBeforeOn()) {
85100
buffer.append(" USING ");
86101
buffer.append(index.getUsing());
87102
}

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

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

12+
import static java.util.stream.Collectors.joining;
13+
1214
import net.sf.jsqlparser.statement.create.index.CreateIndex;
1315
import net.sf.jsqlparser.statement.create.table.Index;
1416

15-
import static java.util.stream.Collectors.joining;
16-
1717
public class CreateIndexDeParser extends AbstractDeParser<CreateIndex> {
1818

1919
public CreateIndexDeParser(StringBuilder buffer) {
@@ -36,11 +36,17 @@ public void deParse(CreateIndex createIndex) {
3636
buffer.append("IF NOT EXISTS ");
3737
}
3838
buffer.append(index.getName());
39+
40+
String using = index.getUsing();
41+
if (using != null && createIndex.isIndexTypeBeforeOn()) {
42+
buffer.append(" USING ");
43+
buffer.append(using);
44+
}
45+
3946
buffer.append(" ON ");
4047
buffer.append(createIndex.getTable().getFullyQualifiedName());
4148

42-
String using = index.getUsing();
43-
if (using != null) {
49+
if (using != null && !createIndex.isIndexTypeBeforeOn()) {
4450
buffer.append(" USING ");
4551
buffer.append(using);
4652
}

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

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5302,9 +5302,21 @@ CreateIndex CreateIndex():
53025302
<K_INDEX>
53035303
[ LOOKAHEAD(2) <K_IF> <K_NOT> <K_EXISTS> { createIndex.setUsingIfNotExists(true);} ]
53045304
index = Index() { index.setType(parameter.isEmpty() ? null : parameter.get(0)); }
5305-
5306-
<K_ON> table=Table()
5307-
[ <K_USING> using=<S_IDENTIFIER> {index.setUsing(using.image);} ]
5305+
(
5306+
LOOKAHEAD(3)(
5307+
<K_ON> table=Table()
5308+
[ <K_USING> using=<S_IDENTIFIER> { index.setUsing(using.image); } ]
5309+
)
5310+
|
5311+
(
5312+
[ <K_USING> using=<S_IDENTIFIER> {
5313+
index.setUsing(using.image);
5314+
createIndex.setIndexTypeBeforeOn(true);
5315+
}
5316+
]
5317+
<K_ON> table=Table()
5318+
)
5319+
)
53085320
colNames = ColumnNamesWithParamsList()
53095321
( parameter=CreateParameter() { tailParameters.addAll(parameter); } )*
53105322
{

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

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

12+
import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
13+
import static org.junit.jupiter.api.Assertions.assertEquals;
14+
import static org.junit.jupiter.api.Assertions.assertNull;
15+
16+
import java.io.StringReader;
17+
import java.util.List;
1218
import net.sf.jsqlparser.JSQLParserException;
1319
import net.sf.jsqlparser.parser.CCJSqlParserManager;
1420
import net.sf.jsqlparser.statement.create.index.CreateIndex;
1521
import org.junit.jupiter.api.Test;
1622

17-
import java.io.StringReader;
18-
import java.util.List;
19-
20-
import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
21-
import static org.junit.jupiter.api.Assertions.assertEquals;
22-
import static org.junit.jupiter.api.Assertions.assertNull;
23-
2423
public class CreateIndexTest {
2524

2625
private final CCJSqlParserManager parserManager = new CCJSqlParserManager();
@@ -142,4 +141,11 @@ void testIfNotExistsIssue1861() throws JSQLParserException {
142141
"CREATE INDEX IF NOT EXISTS test_test_idx ON test.test USING btree (\"time\")";
143142
assertSqlCanBeParsedAndDeparsed(sqlStr, true);
144143
}
144+
145+
@Test
146+
void testCreateIndexIssue1814() throws JSQLParserException {
147+
String sqlStr =
148+
"CREATE INDEX idx_operationlog_operatetime_regioncode USING BTREE ON operation_log (operate_time,region_biz_code)";
149+
assertSqlCanBeParsedAndDeparsed(sqlStr, true);
150+
}
145151
}

0 commit comments

Comments
 (0)