View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.shardingsphere.sql.parser.mysql.visitor.statement.type;
19  
20  import com.google.common.base.Preconditions;
21  import org.antlr.v4.runtime.ParserRuleContext;
22  import org.antlr.v4.runtime.misc.Interval;
23  import org.apache.shardingsphere.sql.parser.api.ASTNode;
24  import org.apache.shardingsphere.sql.parser.api.visitor.statement.type.DDLStatementVisitor;
25  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AddColumnContext;
26  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AddTableConstraintContext;
27  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterAlgorithmOptionContext;
28  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterCheckContext;
29  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterCommandsModifierContext;
30  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterConstraintContext;
31  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterConvertContext;
32  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterDatabaseContext;
33  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterEventContext;
34  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterFunctionContext;
35  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterInstanceContext;
36  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterListContext;
37  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterListItemContext;
38  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterLockOptionContext;
39  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterLogfileGroupContext;
40  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterProcedureContext;
41  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterRenameTableContext;
42  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterServerContext;
43  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterTableContext;
44  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterTableDropContext;
45  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterTablespaceContext;
46  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterTablespaceInnodbContext;
47  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterTablespaceNdbContext;
48  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterViewContext;
49  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.BeginStatementContext;
50  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CaseStatementContext;
51  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ChangeColumnContext;
52  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CharsetNameContext;
53  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CollationNameContext;
54  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ColumnDefinitionContext;
55  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CompoundStatementContext;
56  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateDatabaseContext;
57  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateDefinitionClauseContext;
58  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateEventContext;
59  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateFunctionContext;
60  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateIndexContext;
61  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateLikeClauseContext;
62  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateLogfileGroupContext;
63  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateProcedureContext;
64  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateServerContext;
65  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateTableContext;
66  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateTableOptionContext;
67  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateTableOptionsContext;
68  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateTablespaceContext;
69  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateTriggerContext;
70  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateViewContext;
71  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DeallocateContext;
72  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DropDatabaseContext;
73  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DropEventContext;
74  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DropFunctionContext;
75  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DropIndexContext;
76  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DropLogfileGroupContext;
77  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DropProcedureContext;
78  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DropServerContext;
79  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DropTableContext;
80  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DropTablespaceContext;
81  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DropTriggerContext;
82  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DropViewContext;
83  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ExecuteStmtContext;
84  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.FieldDefinitionContext;
85  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.FlowControlStatementContext;
86  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.FunctionNameContext;
87  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.IdentifierContext;
88  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.IfStatementContext;
89  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.KeyListWithExpressionContext;
90  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.KeyPartContext;
91  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.KeyPartWithExpressionContext;
92  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.KeyPartsContext;
93  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.LoopStatementContext;
94  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ModifyColumnContext;
95  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.PlaceContext;
96  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.PrepareContext;
97  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ReferenceDefinitionContext;
98  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.RenameColumnContext;
99  import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.RenameIndexContext;
100 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.RenameTableContext;
101 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.RepeatStatementContext;
102 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.RoutineBodyContext;
103 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.SimpleStatementContext;
104 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.TableConstraintDefContext;
105 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.TableElementContext;
106 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.TableNameContext;
107 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.TextOrIdentifierContext;
108 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.TruncateTableContext;
109 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ValidStatementContext;
110 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.WhileStatementContext;
111 import org.apache.shardingsphere.sql.parser.mysql.visitor.statement.MySQLStatementVisitor;
112 import org.apache.shardingsphere.sql.parser.statement.core.enums.AlgorithmOption;
113 import org.apache.shardingsphere.sql.parser.statement.core.enums.LockTableOption;
114 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.AlterDefinitionSegment;
115 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.CreateDefinitionSegment;
116 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.charset.CharsetNameSegment;
117 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.ColumnDefinitionSegment;
118 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.alter.AddColumnDefinitionSegment;
119 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.alter.ChangeColumnDefinitionSegment;
120 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.alter.DropColumnDefinitionSegment;
121 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.alter.ModifyColumnDefinitionSegment;
122 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.alter.RenameColumnSegment;
123 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.position.ColumnAfterPositionSegment;
124 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.position.ColumnFirstPositionSegment;
125 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.position.ColumnPositionSegment;
126 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.constraint.ConstraintDefinitionSegment;
127 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.constraint.ConstraintSegment;
128 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.constraint.alter.AddConstraintDefinitionSegment;
129 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.constraint.alter.DropConstraintDefinitionSegment;
130 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.constraint.alter.ModifyConstraintDefinitionSegment;
131 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.engine.EngineSegment;
132 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.DropIndexDefinitionSegment;
133 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexNameSegment;
134 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexSegment;
135 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.RenameIndexDefinitionSegment;
136 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.routine.FunctionNameSegment;
137 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.routine.RoutineBodySegment;
138 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.routine.ValidStatementSegment;
139 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table.AlgorithmTypeSegment;
140 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table.ConvertTableDefinitionSegment;
141 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table.CreateTableOptionSegment;
142 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table.LockTableSegment;
143 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table.RenameTableDefinitionSegment;
144 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.tablespace.TablespaceSegment;
145 import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
146 import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.simple.SimpleExpressionSegment;
147 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.CommentSegment;
148 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.DataTypeSegment;
149 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.OwnerSegment;
150 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
151 import org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
152 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.DeallocateStatement;
153 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.ExecuteStatement;
154 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.PrepareStatement;
155 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.RenameTableStatement;
156 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.TruncateStatement;
157 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.database.AlterDatabaseStatement;
158 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.database.CreateDatabaseStatement;
159 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.database.DropDatabaseStatement;
160 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.function.AlterFunctionStatement;
161 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.function.CreateFunctionStatement;
162 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.function.DropFunctionStatement;
163 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.index.CreateIndexStatement;
164 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.index.DropIndexStatement;
165 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.procedure.AlterProcedureStatement;
166 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.procedure.CreateProcedureStatement;
167 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.procedure.DropProcedureStatement;
168 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.server.AlterServerStatement;
169 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.server.DropServerStatement;
170 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.table.AlterTableStatement;
171 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.table.CreateTableStatement;
172 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.table.DropTableStatement;
173 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.tablespace.AlterTablespaceStatement;
174 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.tablespace.CreateTablespaceStatement;
175 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.tablespace.DropTablespaceStatement;
176 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.trigger.CreateTriggerStatement;
177 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.trigger.DropTriggerStatement;
178 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.AlterViewStatement;
179 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.CreateViewStatement;
180 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.DropViewStatement;
181 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.DeleteStatement;
182 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.InsertStatement;
183 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.SelectStatement;
184 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.UpdateStatement;
185 import org.apache.shardingsphere.sql.parser.statement.core.value.collection.CollectionValue;
186 import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
187 import org.apache.shardingsphere.sql.parser.statement.mysql.ddl.MySQLAlterInstanceStatement;
188 import org.apache.shardingsphere.sql.parser.statement.mysql.ddl.MySQLCreateServerStatement;
189 import org.apache.shardingsphere.sql.parser.statement.mysql.ddl.event.MySQLAlterEventStatement;
190 import org.apache.shardingsphere.sql.parser.statement.mysql.ddl.event.MySQLCreateEventStatement;
191 import org.apache.shardingsphere.sql.parser.statement.mysql.ddl.event.MySQLDropEventStatement;
192 import org.apache.shardingsphere.sql.parser.statement.mysql.ddl.logfile.MySQLAlterLogfileGroupStatement;
193 import org.apache.shardingsphere.sql.parser.statement.mysql.ddl.logfile.MySQLCreateLogfileGroupStatement;
194 import org.apache.shardingsphere.sql.parser.statement.mysql.ddl.logfile.MySQLDropLogfileGroupStatement;
195 
196 import java.util.Collection;
197 import java.util.Collections;
198 import java.util.LinkedList;
199 import java.util.List;
200 import java.util.Optional;
201 
202 /**
203  * DDL statement visitor for MySQL.
204  */
205 public final class MySQLDDLStatementVisitor extends MySQLStatementVisitor implements DDLStatementVisitor {
206     
207     @Override
208     public ASTNode visitCreateView(final CreateViewContext ctx) {
209         CreateViewStatement result = new CreateViewStatement();
210         result.setReplaceView(null != ctx.REPLACE());
211         result.setView((SimpleTableSegment) visit(ctx.viewName()));
212         result.setViewDefinition(getOriginalText(ctx.select()));
213         result.setSelect((SelectStatement) visit(ctx.select()));
214         return result;
215     }
216     
217     @Override
218     public ASTNode visitAlterView(final AlterViewContext ctx) {
219         AlterViewStatement result = new AlterViewStatement();
220         result.setView((SimpleTableSegment) visit(ctx.viewName()));
221         result.setViewDefinition(getOriginalText(ctx.select()));
222         result.setSelect((SelectStatement) visit(ctx.select()));
223         return result;
224     }
225     
226     @SuppressWarnings("unchecked")
227     @Override
228     public ASTNode visitDropView(final DropViewContext ctx) {
229         DropViewStatement result = new DropViewStatement();
230         result.setIfExists(null != ctx.ifExists());
231         result.getViews().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.viewNames())).getValue());
232         return result;
233     }
234     
235     @Override
236     public ASTNode visitCreateDatabase(final CreateDatabaseContext ctx) {
237         return new CreateDatabaseStatement(new IdentifierValue(ctx.databaseName().getText()).getValue(), null != ctx.ifNotExists());
238     }
239     
240     @Override
241     public ASTNode visitAlterDatabase(final AlterDatabaseContext ctx) {
242         return new AlterDatabaseStatement();
243     }
244     
245     @Override
246     public ASTNode visitDropDatabase(final DropDatabaseContext ctx) {
247         return new DropDatabaseStatement(new IdentifierValue(ctx.databaseName().getText()).getValue(), null != ctx.ifExists());
248     }
249     
250     @SuppressWarnings("unchecked")
251     @Override
252     public ASTNode visitCreateTable(final CreateTableContext ctx) {
253         CreateTableStatement result = new CreateTableStatement();
254         result.setTable((SimpleTableSegment) visit(ctx.tableName()));
255         result.setIfNotExists(null != ctx.ifNotExists());
256         if (null != ctx.createDefinitionClause()) {
257             CollectionValue<CreateDefinitionSegment> createDefinitions = (CollectionValue<CreateDefinitionSegment>) visit(ctx.createDefinitionClause());
258             for (CreateDefinitionSegment each : createDefinitions.getValue()) {
259                 if (each instanceof ColumnDefinitionSegment) {
260                     result.getColumnDefinitions().add((ColumnDefinitionSegment) each);
261                 } else if (each instanceof ConstraintDefinitionSegment) {
262                     result.getConstraintDefinitions().add((ConstraintDefinitionSegment) each);
263                 }
264             }
265         }
266         if (null != ctx.createLikeClause()) {
267             result.setLikeTable((SimpleTableSegment) visit(ctx.createLikeClause()));
268         }
269         if (null != ctx.createTableOptions()) {
270             result.setCreateTableOption((CreateTableOptionSegment) visit(ctx.createTableOptions()));
271         }
272         return result;
273     }
274     
275     @Override
276     public ASTNode visitCreateTableOptions(final CreateTableOptionsContext ctx) {
277         CreateTableOptionSegment result = new CreateTableOptionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex());
278         for (CreateTableOptionContext each : ctx.createTableOption()) {
279             if (null != each.engineRef()) {
280                 result.setEngine((EngineSegment) visit(each.engineRef()));
281             } else if (null != each.COMMENT()) {
282                 result.setCommentSegment(new CommentSegment(each.string_().getText(), each.string_().getStart().getStartIndex(), each.string_().getStop().getStopIndex()));
283             } else if (null != each.defaultCharset()) {
284                 Optional.ofNullable(each.defaultCharset().charsetName()).map(CharsetNameContext::textOrIdentifier).map(TextOrIdentifierContext::identifier)
285                         .ifPresent(optional -> result.setCharsetName(optional.getText()));
286             } else if (null != each.defaultCollation()) {
287                 Optional.ofNullable(each.defaultCollation().collationName()).map(CollationNameContext::textOrIdentifier).map(TextOrIdentifierContext::identifier)
288                         .ifPresent(optional -> result.setCollateName(optional.getText()));
289             }
290         }
291         return result;
292     }
293     
294     @Override
295     public ASTNode visitCreateDefinitionClause(final CreateDefinitionClauseContext ctx) {
296         CollectionValue<CreateDefinitionSegment> result = new CollectionValue<>();
297         for (TableElementContext each : ctx.tableElementList().tableElement()) {
298             if (null != each.columnDefinition()) {
299                 result.getValue().add((ColumnDefinitionSegment) visit(each.columnDefinition()));
300             }
301             if (null != each.tableConstraintDef()) {
302                 result.getValue().add((ConstraintDefinitionSegment) visit(each.tableConstraintDef()));
303             }
304         }
305         return result;
306     }
307     
308     @Override
309     public ASTNode visitCreateLikeClause(final CreateLikeClauseContext ctx) {
310         return visit(ctx.tableName());
311     }
312     
313     @SuppressWarnings("unchecked")
314     @Override
315     public ASTNode visitAlterTable(final AlterTableContext ctx) {
316         AlterTableStatement result = new AlterTableStatement();
317         result.setTable((SimpleTableSegment) visit(ctx.tableName()));
318         if (null == ctx.alterTableActions() || null == ctx.alterTableActions().alterCommandList() || null == ctx.alterTableActions().alterCommandList().alterList()) {
319             return result;
320         }
321         for (AlterDefinitionSegment each : ((CollectionValue<AlterDefinitionSegment>) visit(ctx.alterTableActions().alterCommandList().alterList())).getValue()) {
322             setAlterDefinition(result, each);
323         }
324         return result;
325     }
326     
327     private void setAlterDefinition(final AlterTableStatement alterTableStatement, final AlterDefinitionSegment alterDefinitionSegment) {
328         if (alterDefinitionSegment instanceof AddColumnDefinitionSegment) {
329             alterTableStatement.getAddColumnDefinitions().add((AddColumnDefinitionSegment) alterDefinitionSegment);
330         } else if (alterDefinitionSegment instanceof ModifyColumnDefinitionSegment) {
331             alterTableStatement.getModifyColumnDefinitions().add((ModifyColumnDefinitionSegment) alterDefinitionSegment);
332         } else if (alterDefinitionSegment instanceof ChangeColumnDefinitionSegment) {
333             alterTableStatement.getChangeColumnDefinitions().add((ChangeColumnDefinitionSegment) alterDefinitionSegment);
334         } else if (alterDefinitionSegment instanceof DropColumnDefinitionSegment) {
335             alterTableStatement.getDropColumnDefinitions().add((DropColumnDefinitionSegment) alterDefinitionSegment);
336         } else if (alterDefinitionSegment instanceof AddConstraintDefinitionSegment) {
337             alterTableStatement.getAddConstraintDefinitions().add((AddConstraintDefinitionSegment) alterDefinitionSegment);
338         } else if (alterDefinitionSegment instanceof DropConstraintDefinitionSegment) {
339             alterTableStatement.getDropConstraintDefinitions().add((DropConstraintDefinitionSegment) alterDefinitionSegment);
340         } else if (alterDefinitionSegment instanceof RenameTableDefinitionSegment) {
341             alterTableStatement.setRenameTable(((RenameTableDefinitionSegment) alterDefinitionSegment).getRenameTable());
342         } else if (alterDefinitionSegment instanceof ConvertTableDefinitionSegment) {
343             alterTableStatement.setConvertTableDefinition((ConvertTableDefinitionSegment) alterDefinitionSegment);
344         } else if (alterDefinitionSegment instanceof DropIndexDefinitionSegment) {
345             alterTableStatement.getDropIndexDefinitions().add((DropIndexDefinitionSegment) alterDefinitionSegment);
346         } else if (alterDefinitionSegment instanceof RenameIndexDefinitionSegment) {
347             alterTableStatement.getRenameIndexDefinitions().add((RenameIndexDefinitionSegment) alterDefinitionSegment);
348         } else if (alterDefinitionSegment instanceof RenameColumnSegment) {
349             alterTableStatement.getRenameColumnDefinitions().add((RenameColumnSegment) alterDefinitionSegment);
350         } else if (alterDefinitionSegment instanceof AlgorithmTypeSegment) {
351             alterTableStatement.setAlgorithmSegment((AlgorithmTypeSegment) alterDefinitionSegment);
352         } else if (alterDefinitionSegment instanceof LockTableSegment) {
353             alterTableStatement.setLockTableSegment((LockTableSegment) alterDefinitionSegment);
354         }
355     }
356     
357     private ColumnDefinitionSegment generateColumnDefinitionSegment(final ColumnSegment column, final FieldDefinitionContext ctx) {
358         DataTypeSegment dataTypeSegment = (DataTypeSegment) visit(ctx.dataType());
359         boolean isPrimaryKey = ctx.columnAttribute().stream().anyMatch(each -> null != each.KEY() && null == each.UNIQUE());
360         boolean isAutoIncrement = ctx.columnAttribute().stream().anyMatch(each -> null != each.AUTO_INCREMENT());
361         // TODO parse not null
362         ColumnDefinitionSegment result = new ColumnDefinitionSegment(column.getStartIndex(), ctx.getStop().getStopIndex(), column, dataTypeSegment, isPrimaryKey, false, getText(ctx));
363         result.setAutoIncrement(isAutoIncrement);
364         return result;
365     }
366     
367     private String getText(final ParserRuleContext ctx) {
368         return ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
369     }
370     
371     @Override
372     public ASTNode visitAlterConstraint(final AlterConstraintContext ctx) {
373         return new ModifyConstraintDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (ConstraintSegment) visit(ctx.constraintName()));
374     }
375     
376     @Override
377     public ASTNode visitAlterList(final AlterListContext ctx) {
378         CollectionValue<AlterDefinitionSegment> result = new CollectionValue<>();
379         if (ctx.alterListItem().isEmpty()) {
380             return result;
381         }
382         result.getValue().addAll(getAlterDefinitionSegments(ctx));
383         for (AlterCommandsModifierContext each : ctx.alterCommandsModifier()) {
384             if (null != each.alterAlgorithmOption()) {
385                 result.getValue().add((AlgorithmTypeSegment) visit(each));
386             } else if (null != each.alterLockOption()) {
387                 result.getValue().add((LockTableSegment) visit(each));
388             }
389         }
390         return result;
391     }
392     
393     private Collection<AlterDefinitionSegment> getAlterDefinitionSegments(final AlterListContext ctx) {
394         Collection<AlterDefinitionSegment> result = new LinkedList<>();
395         for (AlterListItemContext each : ctx.alterListItem()) {
396             getAlterDefinitionSegment(ctx, each).ifPresent(result::add);
397         }
398         return result;
399     }
400     
401     private Optional<AlterDefinitionSegment> getAlterDefinitionSegment(final AlterListContext alterListContext, final AlterListItemContext alterListItemContext) {
402         if (alterListItemContext instanceof AddColumnContext) {
403             return Optional.of((AddColumnDefinitionSegment) visit(alterListItemContext));
404         }
405         if (alterListItemContext instanceof AlterConstraintContext || alterListItemContext instanceof AlterCheckContext) {
406             return Optional.of((AlterDefinitionSegment) visit(alterListItemContext));
407         }
408         if (alterListItemContext instanceof ChangeColumnContext) {
409             return Optional.of(generateModifyColumnDefinitionSegment((ChangeColumnContext) alterListItemContext));
410         }
411         if (alterListItemContext instanceof ModifyColumnContext) {
412             return Optional.of(generateModifyColumnDefinitionSegment((ModifyColumnContext) alterListItemContext));
413         }
414         if (alterListItemContext instanceof AlterTableDropContext) {
415             return getDropItemDefinitionSegment(alterListContext, (AlterTableDropContext) alterListItemContext);
416         }
417         if (alterListItemContext instanceof AddTableConstraintContext) {
418             return Optional.of((AddConstraintDefinitionSegment) visit(alterListItemContext));
419         }
420         if (alterListItemContext instanceof AlterRenameTableContext) {
421             return Optional.of((RenameTableDefinitionSegment) visit(alterListItemContext));
422         }
423         if (alterListItemContext instanceof AlterConvertContext) {
424             return Optional.of((ConvertTableDefinitionSegment) visit(alterListItemContext));
425         }
426         if (alterListItemContext instanceof RenameColumnContext) {
427             return Optional.of((RenameColumnSegment) visit(alterListItemContext));
428         }
429         if (alterListItemContext instanceof RenameIndexContext) {
430             return Optional.of((RenameIndexDefinitionSegment) visit(alterListItemContext));
431         }
432         return Optional.empty();
433     }
434     
435     private Optional<AlterDefinitionSegment> getDropItemDefinitionSegment(final AlterListContext alterListContext, final AlterTableDropContext alterTableDrop) {
436         if (null != alterTableDrop.CHECK() || null != alterTableDrop.CONSTRAINT()) {
437             ConstraintSegment constraint = new ConstraintSegment(alterTableDrop.identifier().getStart().getStartIndex(), alterTableDrop.identifier().getStop().getStopIndex(),
438                     (IdentifierValue) visit(alterTableDrop.identifier()));
439             return Optional.of(new DropConstraintDefinitionSegment(alterListContext.getStart().getStartIndex(), alterListContext.getStop().getStopIndex(), constraint));
440         }
441         if (null == alterTableDrop.KEY() && null == alterTableDrop.keyOrIndex()) {
442             ColumnSegment column = new ColumnSegment(alterTableDrop.columnInternalRef.start.getStartIndex(), alterTableDrop.columnInternalRef.stop.getStopIndex(),
443                     (IdentifierValue) visit(alterTableDrop.columnInternalRef));
444             return Optional.of(new DropColumnDefinitionSegment(alterTableDrop.getStart().getStartIndex(), alterTableDrop.getStop().getStopIndex(), Collections.singleton(column)));
445         }
446         if (null != alterTableDrop.keyOrIndex()) {
447             return Optional.of(
448                     new DropIndexDefinitionSegment(alterListContext.getStart().getStartIndex(), alterListContext.getStop().getStopIndex(), (IndexSegment) visit(alterTableDrop.indexName())));
449         }
450         return Optional.empty();
451     }
452     
453     @Override
454     public ASTNode visitAlterAlgorithmOption(final AlterAlgorithmOptionContext ctx) {
455         AlgorithmOption algorithmOption = null;
456         if (null != ctx.INSTANT()) {
457             algorithmOption = AlgorithmOption.INSTANT;
458         } else if (null != ctx.DEFAULT()) {
459             algorithmOption = AlgorithmOption.DEFAULT;
460         } else if (null != ctx.INPLACE()) {
461             algorithmOption = AlgorithmOption.INPLACE;
462         } else if (null != ctx.COPY()) {
463             algorithmOption = AlgorithmOption.COPY;
464         }
465         return new AlgorithmTypeSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), algorithmOption);
466     }
467     
468     @Override
469     public ASTNode visitAlterLockOption(final AlterLockOptionContext ctx) {
470         LockTableOption lockOption = null;
471         if (null != ctx.DEFAULT()) {
472             lockOption = LockTableOption.DEFAULT;
473         } else if (null != ctx.NONE()) {
474             lockOption = LockTableOption.NONE;
475         } else if (null != ctx.SHARED()) {
476             lockOption = LockTableOption.SHARED;
477         } else if (null != ctx.EXCLUSIVE()) {
478             lockOption = LockTableOption.EXCLUSIVE;
479         }
480         return new LockTableSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), lockOption);
481     }
482     
483     @Override
484     public ASTNode visitAlterConvert(final AlterConvertContext ctx) {
485         ConvertTableDefinitionSegment result = new ConvertTableDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (CharsetNameSegment) visit(ctx.charsetName()));
486         if (null != ctx.collateClause()) {
487             result.setCollateValue((SimpleExpressionSegment) visit(ctx.collateClause()));
488         }
489         return result;
490     }
491     
492     @Override
493     public ASTNode visitCharsetName(final CharsetNameContext ctx) {
494         return new CharsetNameSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.getText());
495     }
496     
497     @Override
498     public ASTNode visitAddTableConstraint(final AddTableConstraintContext ctx) {
499         return new AddConstraintDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (ConstraintDefinitionSegment) visit(ctx.tableConstraintDef()));
500     }
501     
502     @Override
503     public ASTNode visitAlterCheck(final AlterCheckContext ctx) {
504         return new ModifyConstraintDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (ConstraintSegment) visit(ctx.constraintName()));
505     }
506     
507     @Override
508     public ASTNode visitAlterRenameTable(final AlterRenameTableContext ctx) {
509         RenameTableDefinitionSegment result = new RenameTableDefinitionSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex());
510         result.setRenameTable((SimpleTableSegment) visit(ctx.tableName()));
511         return result;
512     }
513     
514     @Override
515     public ASTNode visitRenameTable(final RenameTableContext ctx) {
516         Collection<RenameTableDefinitionSegment> renameTables = new LinkedList<>();
517         for (int i = 0, len = ctx.tableName().size(); i < len; i += 2) {
518             TableNameContext tableName = ctx.tableName(i);
519             TableNameContext renameTableName = ctx.tableName(i + 1);
520             renameTables.add(createRenameTableDefinitionSegment(tableName, renameTableName));
521         }
522         return new RenameTableStatement(renameTables);
523     }
524     
525     private RenameTableDefinitionSegment createRenameTableDefinitionSegment(final TableNameContext tableName, final TableNameContext renameTableName) {
526         RenameTableDefinitionSegment result = new RenameTableDefinitionSegment(tableName.start.getStartIndex(), renameTableName.stop.getStopIndex());
527         result.setTable((SimpleTableSegment) visit(tableName));
528         result.setRenameTable((SimpleTableSegment) visit(renameTableName));
529         return result;
530     }
531     
532     private ModifyColumnDefinitionSegment generateModifyColumnDefinitionSegment(final ModifyColumnContext ctx) {
533         ColumnSegment column = new ColumnSegment(ctx.columnInternalRef.start.getStartIndex(), ctx.columnInternalRef.stop.getStopIndex(), (IdentifierValue) visit(ctx.columnInternalRef));
534         ModifyColumnDefinitionSegment result = new ModifyColumnDefinitionSegment(
535                 ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), generateColumnDefinitionSegment(column, ctx.fieldDefinition()));
536         if (null != ctx.place()) {
537             result.setColumnPosition((ColumnPositionSegment) visit(ctx.place()));
538         }
539         return result;
540     }
541     
542     private ChangeColumnDefinitionSegment generateModifyColumnDefinitionSegment(final ChangeColumnContext ctx) {
543         ChangeColumnDefinitionSegment result = new ChangeColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (ColumnDefinitionSegment) visit(ctx.columnDefinition()));
544         result.setPreviousColumn(new ColumnSegment(ctx.columnInternalRef.getStart().getStartIndex(), ctx.columnInternalRef.getStop().getStopIndex(),
545                 new IdentifierValue(ctx.columnInternalRef.getText())));
546         if (null != ctx.place()) {
547             result.setColumnPosition((ColumnPositionSegment) visit(ctx.place()));
548         }
549         return result;
550     }
551     
552     @Override
553     public ASTNode visitAddColumn(final AddColumnContext ctx) {
554         Collection<ColumnDefinitionSegment> columnDefinitions = new LinkedList<>();
555         if (null != ctx.columnDefinition()) {
556             columnDefinitions.add((ColumnDefinitionSegment) visit(ctx.columnDefinition()));
557         }
558         if (null != ctx.tableElementList()) {
559             for (TableElementContext each : ctx.tableElementList().tableElement()) {
560                 if (null != each.columnDefinition()) {
561                     columnDefinitions.add((ColumnDefinitionSegment) visit(each.columnDefinition()));
562                 }
563             }
564         }
565         AddColumnDefinitionSegment result = new AddColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), columnDefinitions);
566         if (null != ctx.place()) {
567             Preconditions.checkState(1 == columnDefinitions.size());
568             result.setColumnPosition((ColumnPositionSegment) visit(ctx.place()));
569         }
570         return result;
571     }
572     
573     @Override
574     public ASTNode visitRenameColumn(final RenameColumnContext ctx) {
575         ColumnSegment oldColumnSegment = (ColumnSegment) visit(ctx.oldColumn());
576         ColumnSegment newColumnSegment = (ColumnSegment) visit(ctx.newColumn());
577         return new RenameColumnSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), oldColumnSegment, newColumnSegment);
578     }
579     
580     @Override
581     public ASTNode visitColumnDefinition(final ColumnDefinitionContext ctx) {
582         ColumnSegment column = new ColumnSegment(ctx.column_name.start.getStartIndex(), ctx.column_name.stop.getStopIndex(), (IdentifierValue) visit(ctx.column_name));
583         DataTypeSegment dataTypeSegment = (DataTypeSegment) visit(ctx.fieldDefinition().dataType());
584         boolean isPrimaryKey = ctx.fieldDefinition().columnAttribute().stream().anyMatch(each -> null != each.KEY() && null == each.UNIQUE());
585         boolean isAutoIncrement = ctx.fieldDefinition().columnAttribute().stream().anyMatch(each -> null != each.AUTO_INCREMENT());
586         boolean isNotNull = ctx.fieldDefinition().columnAttribute().stream().anyMatch(each -> null != each.NOT() && null != each.NULL());
587         ColumnDefinitionSegment result = new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataTypeSegment, isPrimaryKey, isNotNull, getText(ctx));
588         result.getReferencedTables().addAll(getReferencedTables(ctx));
589         result.setAutoIncrement(isAutoIncrement);
590         if (null != ctx.fieldDefinition().dataType().charsetWithOptBinary()) {
591             result.setCharsetName(ctx.fieldDefinition().dataType().charsetWithOptBinary().charsetName().textOrIdentifier().identifier().IDENTIFIER_().getText());
592         }
593         ctx.fieldDefinition().columnAttribute().stream().filter(each -> each.collateClause() != null).findFirst()
594                 .ifPresent(optional -> result.setCollateName(optional.collateClause().collationName().textOrIdentifier().identifier().IDENTIFIER_().getText()));
595         return result;
596     }
597     
598     private Collection<SimpleTableSegment> getReferencedTables(final ColumnDefinitionContext ctx) {
599         Collection<SimpleTableSegment> result = new LinkedList<>();
600         if (null != ctx.referenceDefinition()) {
601             result.add((SimpleTableSegment) visit(ctx.referenceDefinition()));
602         }
603         return result;
604     }
605     
606     @SuppressWarnings({"unchecked", "rawtypes"})
607     @Override
608     public ASTNode visitTableConstraintDef(final TableConstraintDefContext ctx) {
609         ConstraintDefinitionSegment result = new ConstraintDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex());
610         if (null != ctx.constraintClause() && null != ctx.constraintClause().constraintName()) {
611             result.setConstraintName((ConstraintSegment) visit(ctx.constraintClause().constraintName()));
612         }
613         if (null != ctx.KEY() && null != ctx.PRIMARY()) {
614             result.setPrimaryKey(true);
615             result.getPrimaryKeyColumns().addAll(((CollectionValue) visit(ctx.keyListWithExpression())).getValue());
616             return result;
617         }
618         if (null != ctx.FOREIGN()) {
619             result.setReferencedTable((SimpleTableSegment) visit(ctx.referenceDefinition()));
620             return result;
621         }
622         if (null != ctx.UNIQUE()) {
623             result.setUniqueKey(true);
624             result.getIndexColumns().addAll(((CollectionValue) visit(ctx.keyListWithExpression())).getValue());
625             if (null != ctx.indexName()) {
626                 result.setIndexName((IndexSegment) visit(ctx.indexName()));
627             }
628             return result;
629         }
630         if (null != ctx.checkConstraint()) {
631             return result;
632         }
633         result.getIndexColumns().addAll(((CollectionValue) visit(ctx.keyListWithExpression())).getValue());
634         if (null != ctx.indexName()) {
635             result.setIndexName((IndexSegment) visit(ctx.indexName()));
636         }
637         return result;
638     }
639     
640     @Override
641     public ASTNode visitKeyListWithExpression(final KeyListWithExpressionContext ctx) {
642         CollectionValue<ColumnSegment> result = new CollectionValue<>();
643         for (KeyPartWithExpressionContext each : ctx.keyPartWithExpression()) {
644             if (null != each.keyPart()) {
645                 result.getValue().add((ColumnSegment) visit(each.keyPart().columnName()));
646             }
647         }
648         return result;
649     }
650     
651     @Override
652     public ASTNode visitReferenceDefinition(final ReferenceDefinitionContext ctx) {
653         return visit(ctx.tableName());
654     }
655     
656     @Override
657     public ASTNode visitPlace(final PlaceContext ctx) {
658         ColumnSegment columnName = null;
659         if (null != ctx.columnName()) {
660             columnName = (ColumnSegment) visit(ctx.columnName());
661         }
662         return null == ctx.columnName()
663                 ? new ColumnFirstPositionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), columnName)
664                 : new ColumnAfterPositionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), columnName);
665     }
666     
667     @SuppressWarnings("unchecked")
668     @Override
669     public ASTNode visitDropTable(final DropTableContext ctx) {
670         DropTableStatement result = new DropTableStatement();
671         result.setIfExists(null != ctx.ifExists());
672         result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.tableList())).getValue());
673         return result;
674     }
675     
676     @Override
677     public ASTNode visitTruncateTable(final TruncateTableContext ctx) {
678         return new TruncateStatement(Collections.singleton((SimpleTableSegment) visit(ctx.tableName())));
679     }
680     
681     @SuppressWarnings({"unchecked", "rawtypes"})
682     @Override
683     public ASTNode visitCreateIndex(final CreateIndexContext ctx) {
684         CreateIndexStatement result = new CreateIndexStatement();
685         result.setTable((SimpleTableSegment) visit(ctx.tableName()));
686         IndexNameSegment indexName = new IndexNameSegment(ctx.indexName().start.getStartIndex(), ctx.indexName().stop.getStopIndex(), new IdentifierValue(ctx.indexName().getText()));
687         result.setIndex(new IndexSegment(ctx.indexName().start.getStartIndex(), ctx.indexName().stop.getStopIndex(), indexName));
688         result.getColumns().addAll(((CollectionValue) visit(ctx.keyListWithExpression())).getValue());
689         if (null != ctx.algorithmOptionAndLockOption()) {
690             if (null != ctx.algorithmOptionAndLockOption().alterAlgorithmOption()) {
691                 result.setAlgorithmType((AlgorithmTypeSegment) visit(ctx.algorithmOptionAndLockOption().alterAlgorithmOption()));
692             }
693             if (null != ctx.algorithmOptionAndLockOption().alterLockOption()) {
694                 result.setLockTable((LockTableSegment) visit(ctx.algorithmOptionAndLockOption().alterLockOption()));
695             }
696         }
697         return result;
698     }
699     
700     @Override
701     public ASTNode visitDropIndex(final DropIndexContext ctx) {
702         DropIndexStatement result = new DropIndexStatement();
703         result.setSimpleTable((SimpleTableSegment) visit(ctx.tableName()));
704         IndexNameSegment indexName = new IndexNameSegment(ctx.indexName().start.getStartIndex(), ctx.indexName().stop.getStopIndex(), new IdentifierValue(ctx.indexName().getText()));
705         result.getIndexes().add(new IndexSegment(ctx.indexName().start.getStartIndex(), ctx.indexName().stop.getStopIndex(), indexName));
706         if (null != ctx.algorithmOptionAndLockOption()) {
707             if (null != ctx.algorithmOptionAndLockOption().alterAlgorithmOption()) {
708                 result.setAlgorithmType((AlgorithmTypeSegment) visit(ctx.algorithmOptionAndLockOption().alterAlgorithmOption()));
709             }
710             if (null != ctx.algorithmOptionAndLockOption().alterLockOption()) {
711                 result.setLockTable((LockTableSegment) visit(ctx.algorithmOptionAndLockOption().alterLockOption()));
712             }
713         }
714         return result;
715     }
716     
717     @Override
718     public ASTNode visitRenameIndex(final RenameIndexContext ctx) {
719         IndexSegment indexNameSegment = (IndexSegment) visitIndexName(ctx.indexName(0));
720         IndexSegment renameIndexName = (IndexSegment) visitIndexName(ctx.indexName(1));
721         return new RenameIndexDefinitionSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), indexNameSegment, renameIndexName);
722     }
723     
724     @Override
725     public ASTNode visitKeyParts(final KeyPartsContext ctx) {
726         CollectionValue<ColumnSegment> result = new CollectionValue<>();
727         List<KeyPartContext> keyParts = ctx.keyPart();
728         for (KeyPartContext each : keyParts) {
729             if (null != each.columnName()) {
730                 result.getValue().add((ColumnSegment) visit(each.columnName()));
731             }
732         }
733         return result;
734     }
735     
736     @Override
737     public ASTNode visitCreateProcedure(final CreateProcedureContext ctx) {
738         CreateProcedureStatement result = new CreateProcedureStatement();
739         result.setProcedureName((FunctionNameSegment) visit(ctx.functionName()));
740         result.setRoutineBody((RoutineBodySegment) visit(ctx.routineBody()));
741         return result;
742     }
743     
744     @Override
745     public ASTNode visitFunctionName(final FunctionNameContext ctx) {
746         FunctionNameSegment result = new FunctionNameSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), (IdentifierValue) visit(ctx.identifier()));
747         if (null != ctx.owner()) {
748             result.setOwner((OwnerSegment) visit(ctx.owner()));
749         }
750         return result;
751     }
752     
753     @Override
754     public ASTNode visitAlterProcedure(final AlterProcedureContext ctx) {
755         return new AlterProcedureStatement();
756     }
757     
758     @Override
759     public ASTNode visitDropProcedure(final DropProcedureContext ctx) {
760         return new DropProcedureStatement();
761     }
762     
763     @Override
764     public ASTNode visitCreateFunction(final CreateFunctionContext ctx) {
765         CreateFunctionStatement result = new CreateFunctionStatement();
766         result.setFunctionName((FunctionNameSegment) visit(ctx.functionName()));
767         result.setRoutineBody((RoutineBodySegment) visit(ctx.routineBody()));
768         return result;
769     }
770     
771     @SuppressWarnings("unchecked")
772     @Override
773     public ASTNode visitRoutineBody(final RoutineBodyContext ctx) {
774         RoutineBodySegment result = new RoutineBodySegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex());
775         CollectionValue<ValidStatementSegment> validStatements = null == ctx.simpleStatement()
776                 ? (CollectionValue<ValidStatementSegment>) visit(ctx.compoundStatement())
777                 : (CollectionValue<ValidStatementSegment>) visit(ctx.simpleStatement());
778         result.getValidStatements().addAll(validStatements.getValue());
779         return result;
780     }
781     
782     @Override
783     public ASTNode visitSimpleStatement(final SimpleStatementContext ctx) {
784         return visit(ctx.validStatement());
785     }
786     
787     @Override
788     public ASTNode visitCompoundStatement(final CompoundStatementContext ctx) {
789         return visit(ctx.beginStatement());
790     }
791     
792     @SuppressWarnings("unchecked")
793     @Override
794     public ASTNode visitBeginStatement(final BeginStatementContext ctx) {
795         CollectionValue<ValidStatementSegment> result = new CollectionValue<>();
796         for (ValidStatementContext each : ctx.validStatement()) {
797             result.combine((CollectionValue<ValidStatementSegment>) visit(each));
798         }
799         return result;
800     }
801     
802     @SuppressWarnings("unchecked")
803     @Override
804     public ASTNode visitValidStatement(final ValidStatementContext ctx) {
805         CollectionValue<ValidStatementSegment> result = new CollectionValue<>();
806         ValidStatementSegment validStatement = createValidStatementSegment(ctx);
807         if (null != validStatement.getSqlStatement()) {
808             result.getValue().add(validStatement);
809         }
810         if (null != ctx.beginStatement()) {
811             result.combine((CollectionValue<ValidStatementSegment>) visit(ctx.beginStatement()));
812         }
813         if (null != ctx.flowControlStatement()) {
814             result.combine((CollectionValue<ValidStatementSegment>) visit(ctx.flowControlStatement()));
815         }
816         return result;
817     }
818     
819     private ValidStatementSegment createValidStatementSegment(final ValidStatementContext ctx) {
820         ValidStatementSegment result = new ValidStatementSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex());
821         SQLStatement sqlStatement = null;
822         if (null != ctx.createTable()) {
823             sqlStatement = (CreateTableStatement) visit(ctx.createTable());
824         } else if (null != ctx.alterTable()) {
825             sqlStatement = (AlterTableStatement) visit(ctx.alterTable());
826         } else if (null != ctx.dropTable()) {
827             sqlStatement = (DropTableStatement) visit(ctx.dropTable());
828         } else if (null != ctx.truncateTable()) {
829             sqlStatement = (TruncateStatement) visit(ctx.truncateTable());
830         } else if (null != ctx.insert()) {
831             sqlStatement = (InsertStatement) visit(ctx.insert());
832         } else if (null != ctx.replace()) {
833             sqlStatement = (InsertStatement) visit(ctx.replace());
834         } else if (null != ctx.update()) {
835             sqlStatement = (UpdateStatement) visit(ctx.update());
836         } else if (null != ctx.delete()) {
837             sqlStatement = (DeleteStatement) visit(ctx.delete());
838         } else if (null != ctx.select()) {
839             sqlStatement = (SelectStatement) visit(ctx.select());
840         }
841         result.setSqlStatement(sqlStatement);
842         return result;
843     }
844     
845     @SuppressWarnings("unchecked")
846     @Override
847     public ASTNode visitFlowControlStatement(final FlowControlStatementContext ctx) {
848         CollectionValue<ValidStatementSegment> result = new CollectionValue<>();
849         if (null != ctx.caseStatement()) {
850             result.combine((CollectionValue<ValidStatementSegment>) visit(ctx.caseStatement()));
851         }
852         if (null != ctx.ifStatement()) {
853             result.combine((CollectionValue<ValidStatementSegment>) visit(ctx.ifStatement()));
854         }
855         if (null != ctx.loopStatement()) {
856             result.combine((CollectionValue<ValidStatementSegment>) visit(ctx.loopStatement()));
857         }
858         if (null != ctx.repeatStatement()) {
859             result.combine((CollectionValue<ValidStatementSegment>) visit(ctx.repeatStatement()));
860         }
861         if (null != ctx.whileStatement()) {
862             result.combine((CollectionValue<ValidStatementSegment>) visit(ctx.whileStatement()));
863         }
864         return result;
865     }
866     
867     @SuppressWarnings("unchecked")
868     @Override
869     public ASTNode visitCaseStatement(final CaseStatementContext ctx) {
870         CollectionValue<ValidStatementSegment> result = new CollectionValue<>();
871         for (ValidStatementContext each : ctx.validStatement()) {
872             result.combine((CollectionValue<ValidStatementSegment>) visit(each));
873         }
874         return result;
875     }
876     
877     @SuppressWarnings("unchecked")
878     @Override
879     public ASTNode visitIfStatement(final IfStatementContext ctx) {
880         CollectionValue<ValidStatementSegment> result = new CollectionValue<>();
881         for (ValidStatementContext each : ctx.validStatement()) {
882             result.combine((CollectionValue<ValidStatementSegment>) visit(each));
883         }
884         return result;
885     }
886     
887     @SuppressWarnings("unchecked")
888     @Override
889     public ASTNode visitLoopStatement(final LoopStatementContext ctx) {
890         CollectionValue<ValidStatementSegment> result = new CollectionValue<>();
891         for (ValidStatementContext each : ctx.validStatement()) {
892             result.combine((CollectionValue<ValidStatementSegment>) visit(each));
893         }
894         return result;
895     }
896     
897     @SuppressWarnings("unchecked")
898     @Override
899     public ASTNode visitRepeatStatement(final RepeatStatementContext ctx) {
900         CollectionValue<ValidStatementSegment> result = new CollectionValue<>();
901         for (ValidStatementContext each : ctx.validStatement()) {
902             result.combine((CollectionValue<ValidStatementSegment>) visit(each));
903         }
904         return result;
905     }
906     
907     @SuppressWarnings("unchecked")
908     @Override
909     public ASTNode visitWhileStatement(final WhileStatementContext ctx) {
910         CollectionValue<ValidStatementSegment> result = new CollectionValue<>();
911         for (ValidStatementContext each : ctx.validStatement()) {
912             result.combine((CollectionValue<ValidStatementSegment>) visit(each));
913         }
914         return result;
915     }
916     
917     @Override
918     public ASTNode visitAlterFunction(final AlterFunctionContext ctx) {
919         return new AlterFunctionStatement();
920     }
921     
922     @Override
923     public ASTNode visitDropFunction(final DropFunctionContext ctx) {
924         return new DropFunctionStatement();
925     }
926     
927     @Override
928     public ASTNode visitCreateEvent(final CreateEventContext ctx) {
929         return new MySQLCreateEventStatement();
930     }
931     
932     @Override
933     public ASTNode visitAlterEvent(final AlterEventContext ctx) {
934         return new MySQLAlterEventStatement();
935     }
936     
937     @Override
938     public ASTNode visitDropEvent(final DropEventContext ctx) {
939         return new MySQLDropEventStatement();
940     }
941     
942     @Override
943     public ASTNode visitAlterInstance(final AlterInstanceContext ctx) {
944         return new MySQLAlterInstanceStatement();
945     }
946     
947     @Override
948     public ASTNode visitCreateLogfileGroup(final CreateLogfileGroupContext ctx) {
949         return new MySQLCreateLogfileGroupStatement();
950     }
951     
952     @Override
953     public ASTNode visitAlterLogfileGroup(final AlterLogfileGroupContext ctx) {
954         return new MySQLAlterLogfileGroupStatement();
955     }
956     
957     @Override
958     public ASTNode visitDropLogfileGroup(final DropLogfileGroupContext ctx) {
959         return new MySQLDropLogfileGroupStatement();
960     }
961     
962     @Override
963     public ASTNode visitCreateServer(final CreateServerContext ctx) {
964         return new MySQLCreateServerStatement();
965     }
966     
967     @Override
968     public ASTNode visitAlterServer(final AlterServerContext ctx) {
969         return new AlterServerStatement();
970     }
971     
972     @Override
973     public ASTNode visitDropServer(final DropServerContext ctx) {
974         return new DropServerStatement();
975     }
976     
977     @Override
978     public ASTNode visitCreateTrigger(final CreateTriggerContext ctx) {
979         return new CreateTriggerStatement();
980     }
981     
982     @Override
983     public ASTNode visitDropTrigger(final DropTriggerContext ctx) {
984         return new DropTriggerStatement();
985     }
986     
987     @Override
988     public ASTNode visitCreateTablespace(final CreateTablespaceContext ctx) {
989         return new CreateTablespaceStatement();
990     }
991     
992     @Override
993     public ASTNode visitAlterTablespace(final AlterTablespaceContext ctx) {
994         if (null != ctx.alterTablespaceInnodb()) {
995             return visit(ctx.alterTablespaceInnodb());
996         } else {
997             return visit(ctx.alterTablespaceNdb());
998         }
999     }
1000     
1001     @Override
1002     public ASTNode visitAlterTablespaceInnodb(final AlterTablespaceInnodbContext ctx) {
1003         return new AlterTablespaceStatement(
1004                 null == ctx.tablespace ? null : createTablespaceSegment(ctx.tablespace), null == ctx.renameTablespace ? null : createTablespaceSegment(ctx.renameTablespace));
1005     }
1006     
1007     @Override
1008     public ASTNode visitAlterTablespaceNdb(final AlterTablespaceNdbContext ctx) {
1009         return new AlterTablespaceStatement(
1010                 null == ctx.tablespace ? null : createTablespaceSegment(ctx.tablespace), null == ctx.renameTableSpace ? null : createTablespaceSegment(ctx.renameTableSpace));
1011     }
1012     
1013     private TablespaceSegment createTablespaceSegment(final IdentifierContext ctx) {
1014         return new TablespaceSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (IdentifierValue) visit(ctx));
1015     }
1016     
1017     @Override
1018     public ASTNode visitDropTablespace(final DropTablespaceContext ctx) {
1019         return new DropTablespaceStatement();
1020     }
1021     
1022     @Override
1023     public ASTNode visitPrepare(final PrepareContext ctx) {
1024         return new PrepareStatement();
1025     }
1026     
1027     @Override
1028     public ASTNode visitExecuteStmt(final ExecuteStmtContext ctx) {
1029         return new ExecuteStatement();
1030     }
1031     
1032     @Override
1033     public ASTNode visitDeallocate(final DeallocateContext ctx) {
1034         return new DeallocateStatement();
1035     }
1036 }