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