Skip to content

Add MySQL Index Parsing Support for ALTER TABLE Statements #2215

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Apr 4, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -101,4 +101,8 @@ public CheckConstraint withIndexSpec(List<String> idxSpec) {
return (CheckConstraint) super.withIndexSpec(idxSpec);
}

@Override
public CheckConstraint withIndexKeyword(String indexKeyword) {
return (CheckConstraint) super.withIndexKeyword(indexKeyword);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -90,4 +90,8 @@ public ExcludeConstraint withName(String name) {
return (ExcludeConstraint) super.withName(name);
}

@Override
public ExcludeConstraint withIndexKeyword(String indexKeyword) {
return (ExcludeConstraint) super.withIndexKeyword(indexKeyword);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -204,4 +204,8 @@ public ForeignKeyIndex withIndexSpec(List<String> idxSpec) {
return (ForeignKeyIndex) super.withIndexSpec(idxSpec);
}

@Override
public ForeignKeyIndex withIndexKeyword(String indexKeyword) {
return (ForeignKeyIndex) super.withIndexKeyword(indexKeyword);
}
}
34 changes: 26 additions & 8 deletions src/main/java/net/sf/jsqlparser/statement/create/table/Index.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public class Index implements Serializable {
private List<ColumnParams> columns;
private List<String> idxSpec;
private String commentText;
private String indexKeyword;

public List<String> getColumnsNames() {
return columns.stream()
Expand Down Expand Up @@ -80,7 +81,9 @@ public String getName() {

public void setName(String name) {
this.name.clear();
this.name.add(name);
if (name != null) {
this.name.add(name);
}
}

public void setName(List<String> name) {
Expand Down Expand Up @@ -133,18 +136,33 @@ public Index withIndexSpec(List<String> idxSpec) {
return this;
}

public void setIndexKeyword(String indexKeyword) {
this.indexKeyword = indexKeyword;
}

public String getIndexKeyword() {
return indexKeyword;
}

public Index withIndexKeyword(String indexKeyword) {
this.setIndexKeyword(indexKeyword);
return this;
}

@Override
public String toString() {
String idxSpecText = PlainSelect.getStringList(idxSpec, false, false);
String head = (type != null ? type : "") + (!name.isEmpty() ? " " + getName() : "");
String tail = PlainSelect.getStringList(columns, true, true)
+ (!"".equals(idxSpecText) ? " " + idxSpecText : "");
String keyword = (indexKeyword != null) ? " " + indexKeyword : "";
String head =
(type != null ? type : "") +
keyword +
(!name.isEmpty() ? " " + getName() : "") +
(using != null ? " USING " + using : "");

if ("".equals(tail)) {
return head;
}
String tail = PlainSelect.getStringList(columns, true, true)
+ (!idxSpecText.isEmpty() ? " " + idxSpecText : "");

return head + " " + tail;
return tail.isEmpty() ? head : head + " " + tail;
}

public Index withType(String type) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,4 +70,8 @@ public NamedConstraint withIndexSpec(List<String> idxSpec) {
return (NamedConstraint) super.withIndexSpec(idxSpec);
}

@Override
public NamedConstraint withIndexKeyword(String indexKeyword) {
return (NamedConstraint) super.withIndexKeyword(indexKeyword);
}
}
124 changes: 114 additions & 10 deletions src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
| <K_INTO:"INTO">
| <K_INVALIDATE:"INVALIDATE">
| <K_INVERSE:"INVERSE">
| <K_INVISIBLE:"INVISIBLE">
| <K_IS:"IS">
| <K_ISNULL:"ISNULL">
| <K_JOIN:"JOIN">
Expand Down Expand Up @@ -400,6 +401,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
| <K_OPTIMIZE: "OPTIMIZE" >
| <K_PARALLEL:"PARALLEL">
| <K_PARENT:"PARENT">
| <K_PARSER: "PARSER">
| <K_PARTITION:"PARTITION">
| <K_PARTITIONING:"PARTITIONING">
| <K_PATH:"PATH">
Expand Down Expand Up @@ -474,6 +476,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
| <K_SIZE:"SIZE">
| <K_SKIP: "SKIP">
| <K_SOME:"SOME">
| <K_SPATIAL:"SPATIAL">
| <K_START:"START">
| <K_STORED: "STORED">
| <K_STRICT: "STRICT">
Expand Down Expand Up @@ -534,6 +537,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
| <K_VALUES:"VALUES">
| <K_VERBOSE: "VERBOSE">
| <K_VIEW:"VIEW">
| <K_VISIBLE: "VISIBLE">
| <K_VOLATILE:"VOLATILE">
| <K_CONCURRENTLY:"CONCURRENTLY">
| <K_WAIT : "WAIT">
Expand Down Expand Up @@ -2148,7 +2152,7 @@ String RelObjectNameWithoutValue() :
{ Token tk = null; }
{
( tk=<DATA_TYPE> | tk=<S_IDENTIFIER> | tk=<S_QUOTED_IDENTIFIER> | tk=<K_DATE_LITERAL> | tk=<K_DATETIMELITERAL> | tk=<K_STRING_FUNCTION_NAME> | tk=<K_ISOLATION> | tk=<K_TIME_KEY_EXPR> | tk=<K_TEXT_LITERAL>
| tk="ACTION" | tk="ACTIVE" | tk="ADD" | tk="ADVANCE" | tk="ADVISE" | tk="AGAINST" | tk="AGGREGATE" | tk="ALGORITHM" | tk="ALTER" | tk="ANALYZE" | tk="APPLY" | tk="APPROXIMATE" | tk="ARCHIVE" | tk="ARRAY" | tk="ASC" | tk="AT" | tk="AUTHORIZATION" | tk="AUTO" | tk="AUTO_INCREMENT" | tk="BASE64" | tk="BEGIN" | tk="BERNOULLI" | tk="BINARY" | tk="BIT" | tk="BLOCK" | tk="BROWSE" | tk="BUFFERS" | tk="BY" | tk="BYTE" | tk="BYTES" | tk="CACHE" | tk="CALL" | tk="CASCADE" | tk="CASE" | tk="CAST" | tk="CHANGE" | tk="CHANGES" | tk="CHAR" | tk="CHARACTER" | tk="CHECKPOINT" | tk="CLOSE" | tk="COALESCE" | tk="COLLATE" | tk="COLUMN" | tk="COLUMNS" | tk="COMMENT" | tk="COMMIT" | tk="CONCURRENTLY" | tk="CONFLICT" | tk="CONSTRAINTS" | tk="CONVERT" | tk="CORRESPONDING" | tk="COSTS" | tk="COUNT" | tk="CS" | tk="CYCLE" | tk="DATA" | tk="DATABASE" | tk="DATETIME" | tk="DBA_RECYCLEBIN" | tk="DDL" | tk="DECLARE" | tk="DEFERRABLE" | tk="DELAYED" | tk="DELETE" | tk="DESC" | tk="DESCRIBE" | tk="DISABLE" | tk="DISCARD" | tk="DISCONNECT" | tk="DIV" | tk="DML" | tk="DO" | tk="DOMAIN" | tk="DROP" | tk="DUMP" | tk="DUPLICATE" | tk="ELEMENTS" | tk="EMIT" | tk="ENABLE" | tk="ENCRYPTION" | tk="END" | tk="ENGINE" | tk="ERROR" | tk="ESCAPE" | tk="EXCHANGE" | tk="EXCLUDE" | tk="EXEC" | tk="EXECUTE" | tk="EXPLAIN" | tk="EXPLICIT" | tk="EXTENDED" | tk="EXTRACT" | tk="FILTER" | tk="FIRST" | tk="FLUSH" | tk="FN" | tk="FOLLOWING" | tk="FORMAT" | tk="FULLTEXT" | tk="FUNCTION" | tk="GRANT" | tk="GROUP_CONCAT" | tk="GUARD" | tk="HASH" | tk="HIGH" | tk="HIGH_PRIORITY" | tk="HISTORY" | tk="HOPPING" | tk="IMPORT" | tk="INCLUDE" | tk="INCLUDE_NULL_VALUES" | tk="INCREMENT" | tk="INDEX" | tk="INSERT" | tk="INTERLEAVE" | tk="INTERPRET" | tk="INVALIDATE" | tk="INVERSE" | tk="ISNULL" | tk="JSON" | tk="JSON_ARRAY" | tk="JSON_ARRAYAGG" | tk="JSON_OBJECT" | tk="JSON_OBJECTAGG" | tk="KEEP" | tk="KEY" | tk="KEYS" | tk="KEY_BLOCK_SIZE" | tk="LAST" | tk="LEADING" | tk="LESS" | tk="LINK" | tk="LOCAL" | tk="LOCK" | tk="LOCKED" | tk="LOG" | tk="LONGTEXT" | tk="LOOP" | tk="LOW" | tk="LOW_PRIORITY" | tk="MATCH" | tk="MATCHED" | tk="MATCH_ALL" | tk="MATCH_ANY" | tk="MATCH_PHRASE" | tk="MATCH_PHRASE_PREFIX" | tk="MATCH_REGEXP" | tk="MATERIALIZED" | tk="MAX" | tk="MAXVALUE" | tk="MEDIUMTEXT" | tk="MEMBER" | tk="MERGE" | tk="MIN" | tk="MINVALUE" | tk="MODIFY" | tk="MOVEMENT" | tk="NAME" | tk="NEXT" | tk="NO" | tk="NOCACHE" | tk="NOKEEP" | tk="NOLOCK" | tk="NOMAXVALUE" | tk="NOMINVALUE" | tk="NOORDER" | tk="NOTHING" | tk="NOTNULL" | tk="NOVALIDATE" | tk="NOWAIT" | tk="NULLS" | tk="OF" | tk="OFF" | tk="OPEN" | tk="OVER" | tk="OVERFLOW" | tk="OVERLAPS" | tk="OVERRIDING" | tk="OVERWRITE" | tk="PARALLEL" | tk="PARENT" | tk="PARTITION" | tk="PARTITIONING" | tk="PATH" | tk="PERCENT" | tk="PLACING" | tk="PLAN" | tk="PLUS" | tk="PRECEDING" | tk="PRIMARY" | tk="PURGE" | tk="QUERY" | tk="QUICK" | tk="QUIESCE" | tk="RANGE" | tk="RAW" | tk="READ" | tk="REBUILD" | tk="RECURSIVE" | tk="RECYCLEBIN" | tk="REFERENCES" | tk="REFRESH" | tk="REGEXP" | tk="REGEXP_LIKE" | tk="REGISTER" | tk="REMOTE" | tk="REMOVE" | tk="RENAME" | tk="REORGANIZE" | tk="REPAIR" | tk="REPEATABLE" | tk="REPLACE" | tk="RESET" | tk="RESPECT" | tk="RESTART" | tk="RESTRICT" | tk="RESTRICTED" | tk="RESUMABLE" | tk="RESUME" | tk="RETURN" | tk="RLIKE" | tk="ROLLBACK" | tk="ROLLUP" | tk="ROOT" | tk="ROW" | tk="ROWS" | tk="RR" | tk="RS" | tk="SAFE_CAST" | tk="SAVEPOINT" | tk="SCHEMA" | tk="SECURE" | tk="SEED" | tk="SEPARATOR" | tk="SEQUENCE" | tk="SESSION" | tk="SETS" | tk="SHARE" | tk="SHOW" | tk="SHUTDOWN" | tk="SIBLINGS" | tk="SIGNED" | tk="SIMILAR" | tk="SIZE" | tk="SKIP" | tk="STORED" | tk="STRICT" | tk="STRING" | tk="STRUCT" | tk="SUMMARIZE" | tk="SUSPEND" | tk="SWITCH" | tk="SYNONYM" | tk="SYSTEM" | tk="TABLE" | tk="TABLESPACE" | tk="TEMP" | tk="TEMPORARY" | tk="TEXT" | tk="THAN" | tk="THEN" | tk="TIMEOUT" | tk="TIMESTAMPTZ" | tk="TIMEZONE" | tk="TINYTEXT" | tk="TO" | tk="TRIGGER" | tk="TRUNCATE" | tk="TRY_CAST" | tk="TUMBLING" | tk="TYPE" | tk="UNLOGGED" | tk="UNQIESCE" | tk="UNSIGNED" | tk="UPDATE" | tk="UPSERT" | tk="UR" | tk="USER" | tk="VALIDATE" | tk="VALIDATION" | tk="VERBOSE" | tk="VIEW" | tk="VOLATILE" | tk="WAIT" | tk="WITHIN" | tk="WITHOUT" | tk="WITHOUT_ARRAY_WRAPPER" | tk="WORK" | tk="XML" | tk="XMLAGG" | tk="XMLDATA" | tk="XMLSCHEMA" | tk="XMLTEXT" | tk="XSINIL" | tk="YAML" | tk="YES" | tk="ZONE" )
| tk="ACTION" | tk="ACTIVE" | tk="ADD" | tk="ADVANCE" | tk="ADVISE" | tk="AGAINST" | tk="AGGREGATE" | tk="ALGORITHM" | tk="ALTER" | tk="ANALYZE" | tk="APPLY" | tk="APPROXIMATE" | tk="ARCHIVE" | tk="ARRAY" | tk="ASC" | tk="AT" | tk="AUTHORIZATION" | tk="AUTO" | tk="AUTO_INCREMENT" | tk="BASE64" | tk="BEGIN" | tk="BERNOULLI" | tk="BINARY" | tk="BIT" | tk="BLOCK" | tk="BROWSE" | tk="BUFFERS" | tk="BY" | tk="BYTE" | tk="BYTES" | tk="CACHE" | tk="CALL" | tk="CASCADE" | tk="CASE" | tk="CAST" | tk="CHANGE" | tk="CHANGES" | tk="CHAR" | tk="CHARACTER" | tk="CHECKPOINT" | tk="CLOSE" | tk="COALESCE" | tk="COLLATE" | tk="COLUMN" | tk="COLUMNS" | tk="COMMENT" | tk="COMMIT" | tk="CONCURRENTLY" | tk="CONFLICT" | tk="CONSTRAINTS" | tk="CONVERT" | tk="CORRESPONDING" | tk="COSTS" | tk="COUNT" | tk="CS" | tk="CYCLE" | tk="DATA" | tk="DATABASE" | tk="DATETIME" | tk="DBA_RECYCLEBIN" | tk="DDL" | tk="DECLARE" | tk="DEFERRABLE" | tk="DELAYED" | tk="DELETE" | tk="DESC" | tk="DESCRIBE" | tk="DISABLE" | tk="DISCARD" | tk="DISCONNECT" | tk="DIV" | tk="DML" | tk="DO" | tk="DOMAIN" | tk="DROP" | tk="DUMP" | tk="DUPLICATE" | tk="ELEMENTS" | tk="EMIT" | tk="ENABLE" | tk="ENCRYPTION" | tk="END" | tk="ENGINE" | tk="ERROR" | tk="ESCAPE" | tk="EXCHANGE" | tk="EXCLUDE" | tk="EXEC" | tk="EXECUTE" | tk="EXPLAIN" | tk="EXPLICIT" | tk="EXTENDED" | tk="EXTRACT" | tk="FILTER" | tk="FIRST" | tk="FLUSH" | tk="FN" | tk="FOLLOWING" | tk="FORMAT" | tk="FULLTEXT" | tk="FUNCTION" | tk="GRANT" | tk="GROUP_CONCAT" | tk="GUARD" | tk="HASH" | tk="HIGH" | tk="HIGH_PRIORITY" | tk="HISTORY" | tk="HOPPING" | tk="IMPORT" | tk="INCLUDE" | tk="INCLUDE_NULL_VALUES" | tk="INCREMENT" | tk="INDEX" | tk="INSERT" | tk="INTERLEAVE" | tk="INTERPRET" | tk="INVALIDATE" | tk="INVERSE" | tk="INVISIBLE" | tk="ISNULL" | tk="JSON" | tk="JSON_ARRAY" | tk="JSON_ARRAYAGG" | tk="JSON_OBJECT" | tk="JSON_OBJECTAGG" | tk="KEEP" | tk="KEY" | tk="KEYS" | tk="KEY_BLOCK_SIZE" | tk="LAST" | tk="LEADING" | tk="LESS" | tk="LINK" | tk="LOCAL" | tk="LOCK" | tk="LOCKED" | tk="LOG" | tk="LONGTEXT" | tk="LOOP" | tk="LOW" | tk="LOW_PRIORITY" | tk="MATCH" | tk="MATCHED" | tk="MATCH_ALL" | tk="MATCH_ANY" | tk="MATCH_PHRASE" | tk="MATCH_PHRASE_PREFIX" | tk="MATCH_REGEXP" | tk="MATERIALIZED" | tk="MAX" | tk="MAXVALUE" | tk="MEDIUMTEXT" | tk="MEMBER" | tk="MERGE" | tk="MIN" | tk="MINVALUE" | tk="MODIFY" | tk="MOVEMENT" | tk="NAME" | tk="NEXT" | tk="NO" | tk="NOCACHE" | tk="NOKEEP" | tk="NOLOCK" | tk="NOMAXVALUE" | tk="NOMINVALUE" | tk="NOORDER" | tk="NOTHING" | tk="NOTNULL" | tk="NOVALIDATE" | tk="NOWAIT" | tk="NULLS" | tk="OF" | tk="OFF" | tk="OPEN" | tk="OVER" | tk="OVERFLOW" | tk="OVERLAPS" | tk="OVERRIDING" | tk="OVERWRITE" | tk="PARALLEL" | tk="PARENT" | tk="PARSER" | tk="PARTITION" | tk="PARTITIONING" | tk="PATH" | tk="PERCENT" | tk="PLACING" | tk="PLAN" | tk="PLUS" | tk="PRECEDING" | tk="PRIMARY" | tk="PURGE" | tk="QUERY" | tk="QUICK" | tk="QUIESCE" | tk="RANGE" | tk="RAW" | tk="READ" | tk="REBUILD" | tk="RECURSIVE" | tk="RECYCLEBIN" | tk="REFERENCES" | tk="REFRESH" | tk="REGEXP" | tk="REGEXP_LIKE" | tk="REGISTER" | tk="REMOTE" | tk="REMOVE" | tk="RENAME" | tk="REORGANIZE" | tk="REPAIR" | tk="REPEATABLE" | tk="REPLACE" | tk="RESET" | tk="RESPECT" | tk="RESTART" | tk="RESTRICT" | tk="RESTRICTED" | tk="RESUMABLE" | tk="RESUME" | tk="RETURN" | tk="RLIKE" | tk="ROLLBACK" | tk="ROLLUP" | tk="ROOT" | tk="ROW" | tk="ROWS" | tk="RR" | tk="RS" | tk="SAFE_CAST" | tk="SAVEPOINT" | tk="SCHEMA" | tk="SECURE" | tk="SEED" | tk="SEPARATOR" | tk="SEQUENCE" | tk="SESSION" | tk="SETS" | tk="SHARE" | tk="SHOW" | tk="SHUTDOWN" | tk="SIBLINGS" | tk="SIGNED" | tk="SIMILAR" | tk="SIZE" | tk="SKIP" | tk="SPATIAL" | tk="STORED" | tk="STRICT" | tk="STRING" | tk="STRUCT" | tk="SUMMARIZE" | tk="SUSPEND" | tk="SWITCH" | tk="SYNONYM" | tk="SYSTEM" | tk="TABLE" | tk="TABLESPACE" | tk="TEMP" | tk="TEMPORARY" | tk="TEXT" | tk="THAN" | tk="THEN" | tk="TIMEOUT" | tk="TIMESTAMPTZ" | tk="TIMEZONE" | tk="TINYTEXT" | tk="TO" | tk="TRIGGER" | tk="TRUNCATE" | tk="TRY_CAST" | tk="TUMBLING" | tk="TYPE" | tk="UNLOGGED" | tk="UNQIESCE" | tk="UNSIGNED" | tk="UPDATE" | tk="UPSERT" | tk="UR" | tk="USER" | tk="VALIDATE" | tk="VALIDATION" | tk="VERBOSE" | tk="VIEW" | tk="VISIBLE" | tk="VOLATILE" | tk="WAIT" | tk="WITHIN" | tk="WITHOUT" | tk="WITHOUT_ARRAY_WRAPPER" | tk="WORK" | tk="XML" | tk="XMLAGG" | tk="XMLDATA" | tk="XMLSCHEMA" | tk="XMLTEXT" | tk="XSINIL" | tk="YAML" | tk="YES" | tk="ZONE" )
{ return tk.image; }
}

Expand Down Expand Up @@ -6686,7 +6690,7 @@ CreateIndex CreateIndex():
CreateIndex createIndex = new CreateIndex();
Table table = null;
List<Index.ColumnParams> colNames;
Token using;
String indexType;
Index index = null;
List<String> parameter = new ArrayList<String>();
List<String> tailParameters = new ArrayList<String>();
Expand All @@ -6701,12 +6705,12 @@ CreateIndex CreateIndex():
(
LOOKAHEAD(3)(
<K_ON> table=Table()
[ <K_USING> using=<S_IDENTIFIER> { index.setUsing(using.image); } ]
[ indexType=UsingIndexType() { index.setUsing(indexType); } ]
)
|
(
[ <K_USING> using=<S_IDENTIFIER> {
index.setUsing(using.image);
[ indexType=UsingIndexType() {
index.setUsing(indexType);
createIndex.setIndexTypeBeforeOn(true);
}
]
Expand Down Expand Up @@ -7651,6 +7655,65 @@ Index IndexWithComment(Index index):
}
}

void IndexOptionList(List<String> list) :
{}
{
(
IndexOption(list)
)*
}

String UsingIndexType() :
{
String sk = null;
}
{
<K_USING> ( sk = RelObjectName() )
{
return sk;
}
}

void IndexOption(List<String> list) :
{
Token tk1 = null;
Token tk2 = null;
String sk1 = null;
boolean useEqual = false;
}
{
(
tk1=<K_KEY_BLOCK_SIZE> ["=" { useEqual = true; } ] tk2=<S_LONG>
{
list.add("KEY_BLOCK_SIZE" + (useEqual ? " = " : "") + tk2.image);
}
|
tk1=<K_WITH> <K_PARSER> tk2=<S_IDENTIFIER>
{
list.add("WITH PARSER " + tk2.image);
}
|
tk1=<K_COMMENT> tk2=<S_CHAR_LITERAL>
{
list.add("COMMENT " + tk2.image);
}
|
tk1=<K_VISIBLE>
{
list.add("VISIBLE");
}
|
tk1=<K_INVISIBLE>
{
list.add("INVISIBLE");
}
|
sk1 = UsingIndexType(){
list.add("USING " + sk1);
}
)
}

List<PartitionDefinition> PartitionDefinitions():
{
Token tk;
Expand Down Expand Up @@ -7745,6 +7808,7 @@ AlterExpression AlterExpression():
String truncatePartitionName = null;

String identifier = null;
List<String> indexSpec = new ArrayList<String>();

// for captureRest()
List<String> tokens = new LinkedList<String>();
Expand All @@ -7770,15 +7834,55 @@ AlterExpression AlterExpression():
|
LOOKAHEAD(2) (
(tk=<K_KEY> { alterExp.setUk(true); } | tk=<K_INDEX>)
sk3 = RelObjectName()
columnNames = ColumnsNamesList()
(
LOOKAHEAD(3)
sk3 = RelObjectName()
[ sk4 = UsingIndexType() ]
columnNames = ColumnsNamesList()
|
[ sk4 = UsingIndexType() ]
columnNames = ColumnsNamesList()
)
IndexOptionList(indexSpec = new ArrayList<String>())
{
index = new Index().withType(tk.image).withName(sk3).withColumnsNames(columnNames);
index = new Index()
.withIndexKeyword(tk.image)
.withName(sk3)
.withUsing(sk4)
.withColumnsNames(columnNames)
.withIndexSpec(indexSpec);

alterExp.setIndex(index);
}
constraints=AlterExpressionConstraintState() { alterExp.setConstraints(constraints); }
[ <K_USING> sk4=RelObjectName() { alterExp.addParameters("USING", sk4); }]
[ LOOKAHEAD(2) index = IndexWithComment(index) { alterExp.setIndex(index); } ]
)
|
(
( tk=<K_SPATIAL> | tk=<K_FULLTEXT> )
[ tk2=<K_INDEX> | tk2=<K_KEY> ]
(
LOOKAHEAD(2)
sk3 = RelObjectName()
columnNames = ColumnsNamesList()
|
columnNames = ColumnsNamesList()
)
IndexOptionList(indexSpec = new ArrayList<String>())
{
String type = tk.image;
String keyword = tk2 != null ? tk2.image : null;
index = new Index()
.withType(type)
.withIndexKeyword(keyword)
.withColumnsNames(columnNames)
.withIndexSpec(indexSpec);

if (sk3 != null) {
index.setName(sk3);
}

alterExp.setIndex(index);
}
)
|
LOOKAHEAD(2) (
Expand Down
Loading
Loading