1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
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
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
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 }