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