View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.shardingsphere.sql.parser.sqlserver.visitor.statement.type;
19  
20  import org.antlr.v4.runtime.ParserRuleContext;
21  import org.antlr.v4.runtime.misc.Interval;
22  import org.apache.shardingsphere.sql.parser.api.ASTNode;
23  import org.apache.shardingsphere.sql.parser.api.visitor.statement.type.DDLStatementVisitor;
24  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AddColumnSpecificationContext;
25  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterCheckConstraintContext;
26  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterColumnAddOptionContext;
27  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterDatabaseContext;
28  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterDefinitionClauseContext;
29  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterFunctionContext;
30  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterIndexContext;
31  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterProcedureContext;
32  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterSchemaContext;
33  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterSequenceContext;
34  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterServiceContext;
35  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterTableContext;
36  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterTableDropConstraintContext;
37  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterTriggerContext;
38  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterViewContext;
39  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ColumnConstraintContext;
40  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ColumnDefinitionContext;
41  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ColumnDefinitionOptionContext;
42  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ColumnNameContext;
43  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ColumnNameWithSortContext;
44  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateDatabaseContext;
45  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateFunctionContext;
46  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateIndexContext;
47  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateProcedureContext;
48  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateSchemaContext;
49  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateSequenceContext;
50  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateServiceContext;
51  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateTableClauseContext;
52  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateTableContext;
53  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateTableDefinitionContext;
54  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateTableDefinitionsContext;
55  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateTriggerContext;
56  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateViewContext;
57  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropColumnSpecificationContext;
58  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropConstraintNameContext;
59  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropDatabaseContext;
60  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropFunctionContext;
61  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropIndexContext;
62  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropProcedureContext;
63  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropSchemaContext;
64  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropSequenceContext;
65  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropServiceContext;
66  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropTableContext;
67  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropTriggerContext;
68  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropViewContext;
69  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ModifyColumnSpecificationContext;
70  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.TableConstraintContext;
71  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.TruncateTableContext;
72  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ViewNameContext;
73  import org.apache.shardingsphere.sql.parser.sqlserver.visitor.statement.SQLServerStatementVisitor;
74  import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.AlterDefinitionSegment;
75  import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.CreateDefinitionSegment;
76  import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.ColumnDefinitionSegment;
77  import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.alter.AddColumnDefinitionSegment;
78  import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.alter.DropColumnDefinitionSegment;
79  import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.alter.ModifyColumnDefinitionSegment;
80  import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.constraint.ConstraintDefinitionSegment;
81  import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.constraint.ConstraintSegment;
82  import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.constraint.alter.AddConstraintDefinitionSegment;
83  import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.constraint.alter.DropConstraintDefinitionSegment;
84  import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.constraint.alter.ModifyConstraintDefinitionSegment;
85  import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexSegment;
86  import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
87  import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.DataTypeSegment;
88  import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
89  import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.TruncateStatement;
90  import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.database.AlterDatabaseStatement;
91  import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.database.CreateDatabaseStatement;
92  import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.database.DropDatabaseStatement;
93  import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.function.AlterFunctionStatement;
94  import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.function.CreateFunctionStatement;
95  import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.function.DropFunctionStatement;
96  import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.index.AlterIndexStatement;
97  import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.index.CreateIndexStatement;
98  import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.index.DropIndexStatement;
99  import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.procedure.AlterProcedureStatement;
100 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.procedure.CreateProcedureStatement;
101 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.procedure.DropProcedureStatement;
102 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.schema.AlterSchemaStatement;
103 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.schema.CreateSchemaStatement;
104 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.schema.DropSchemaStatement;
105 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.sequence.AlterSequenceStatement;
106 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.sequence.CreateSequenceStatement;
107 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.sequence.DropSequenceStatement;
108 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.table.AlterTableStatement;
109 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.table.CreateTableStatement;
110 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.table.DropTableStatement;
111 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.trigger.AlterTriggerStatement;
112 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.trigger.CreateTriggerStatement;
113 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.trigger.DropTriggerStatement;
114 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.AlterViewStatement;
115 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.CreateViewStatement;
116 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.DropViewStatement;
117 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.SelectStatement;
118 import org.apache.shardingsphere.sql.parser.statement.core.value.collection.CollectionValue;
119 import org.apache.shardingsphere.sql.parser.statement.sqlserver.ddl.service.SQLServerAlterServiceStatement;
120 import org.apache.shardingsphere.sql.parser.statement.sqlserver.ddl.service.SQLServerCreateServiceStatement;
121 import org.apache.shardingsphere.sql.parser.statement.sqlserver.ddl.service.SQLServerDropServiceStatement;
122 
123 import java.util.Collection;
124 import java.util.Collections;
125 import java.util.LinkedList;
126 
127 /**
128  * DDL statement visitor for SQLServer.
129  */
130 public final class SQLServerDDLStatementVisitor extends SQLServerStatementVisitor implements DDLStatementVisitor {
131     
132     @Override
133     public ASTNode visitCreateTable(final CreateTableContext ctx) {
134         return null == ctx.createTableClause() ? visit(ctx.createTableAsSelectClause()) : visit(ctx.createTableClause());
135     }
136     
137     @SuppressWarnings("unchecked")
138     @Override
139     public ASTNode visitCreateTableClause(final CreateTableClauseContext ctx) {
140         CreateTableStatement result = new CreateTableStatement();
141         result.setTable((SimpleTableSegment) visit(ctx.tableName()));
142         CollectionValue<CreateDefinitionSegment> createDefinitions = (CollectionValue<CreateDefinitionSegment>) generateCreateDefinitionSegment(ctx.createDefinitionClause().createTableDefinitions());
143         for (CreateDefinitionSegment each : createDefinitions.getValue()) {
144             if (each instanceof ColumnDefinitionSegment) {
145                 result.getColumnDefinitions().add((ColumnDefinitionSegment) each);
146             } else if (each instanceof ConstraintDefinitionSegment) {
147                 result.getConstraintDefinitions().add((ConstraintDefinitionSegment) each);
148             }
149         }
150         return result;
151     }
152     
153     private ASTNode generateCreateDefinitionSegment(final CreateTableDefinitionsContext ctx) {
154         CollectionValue<CreateDefinitionSegment> result = new CollectionValue<>();
155         for (CreateTableDefinitionContext each : ctx.createTableDefinition()) {
156             if (null != each.columnDefinition()) {
157                 result.getValue().add((ColumnDefinitionSegment) visit(each.columnDefinition()));
158             }
159             if (null != each.tableConstraint()) {
160                 result.getValue().add((ConstraintDefinitionSegment) visit(each.tableConstraint()));
161             }
162         }
163         return result;
164     }
165     
166     @Override
167     public ASTNode visitColumnDefinition(final ColumnDefinitionContext ctx) {
168         ColumnSegment column = (ColumnSegment) visit(ctx.columnName());
169         DataTypeSegment dataType = (DataTypeSegment) visit(ctx.dataType());
170         boolean isPrimaryKey = isPrimaryKey(ctx);
171         // TODO parse not null
172         ColumnDefinitionSegment result = new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataType, isPrimaryKey, false, getText(ctx));
173         for (ColumnDefinitionOptionContext each : ctx.columnDefinitionOption()) {
174             for (ColumnConstraintContext columnConstraint : each.columnConstraint()) {
175                 if (null != columnConstraint.columnForeignKeyConstraint()) {
176                     result.getReferencedTables().add((SimpleTableSegment) visit(columnConstraint.columnForeignKeyConstraint().tableName()));
177                 }
178             }
179         }
180         for (ColumnConstraintContext each : ctx.columnConstraints().columnConstraint()) {
181             if (null != each.columnForeignKeyConstraint()) {
182                 result.getReferencedTables().add((SimpleTableSegment) visit(each.columnForeignKeyConstraint().tableName()));
183             }
184         }
185         return result;
186     }
187     
188     private String getText(final ParserRuleContext ctx) {
189         return ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
190     }
191     
192     private boolean isPrimaryKey(final ColumnDefinitionContext ctx) {
193         for (ColumnDefinitionOptionContext each : ctx.columnDefinitionOption()) {
194             for (ColumnConstraintContext columnConstraint : each.columnConstraint()) {
195                 if (null != columnConstraint.primaryKeyConstraint() && null != columnConstraint.primaryKeyConstraint().primaryKey()) {
196                     return true;
197                 }
198             }
199         }
200         for (ColumnConstraintContext each : ctx.columnConstraints().columnConstraint()) {
201             if (null != each.primaryKeyConstraint() && null != each.primaryKeyConstraint().primaryKey()) {
202                 return true;
203             }
204         }
205         return false;
206     }
207     
208     @SuppressWarnings("unchecked")
209     @Override
210     public ASTNode visitTableConstraint(final TableConstraintContext ctx) {
211         ConstraintDefinitionSegment result = new ConstraintDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex());
212         if (null != ctx.constraintName()) {
213             result.setConstraintName((ConstraintSegment) visit(ctx.constraintName()));
214         }
215         if (null != ctx.tablePrimaryConstraint() && null != ctx.tablePrimaryConstraint().primaryKeyUnique().primaryKey()) {
216             if (null != ctx.tablePrimaryConstraint().diskTablePrimaryConstraintOption()) {
217                 result.getPrimaryKeyColumns().addAll(((CollectionValue<ColumnSegment>) visit(ctx.tablePrimaryConstraint().diskTablePrimaryConstraintOption().columnNames())).getValue());
218             }
219             if (null != ctx.tablePrimaryConstraint().memoryTablePrimaryConstraintOption()) {
220                 result.getPrimaryKeyColumns().addAll(((CollectionValue<ColumnSegment>) visit(ctx.tablePrimaryConstraint().memoryTablePrimaryConstraintOption().columnNames())).getValue());
221             }
222         }
223         if (null != ctx.tableForeignKeyConstraint()) {
224             result.setReferencedTable((SimpleTableSegment) visit(ctx.tableForeignKeyConstraint().tableName()));
225         }
226         return result;
227     }
228     
229     @SuppressWarnings("unchecked")
230     @Override
231     public ASTNode visitAlterTable(final AlterTableContext ctx) {
232         AlterTableStatement result = new AlterTableStatement();
233         result.setTable((SimpleTableSegment) visit(ctx.tableName()));
234         for (AlterDefinitionClauseContext alterDefinitionClauseContext : ctx.alterDefinitionClause()) {
235             for (AlterDefinitionSegment each : ((CollectionValue<AlterDefinitionSegment>) visit(alterDefinitionClauseContext)).getValue()) {
236                 if (each instanceof AddColumnDefinitionSegment) {
237                     result.getAddColumnDefinitions().add((AddColumnDefinitionSegment) each);
238                 } else if (each instanceof ModifyColumnDefinitionSegment) {
239                     result.getModifyColumnDefinitions().add((ModifyColumnDefinitionSegment) each);
240                 } else if (each instanceof DropColumnDefinitionSegment) {
241                     result.getDropColumnDefinitions().add((DropColumnDefinitionSegment) each);
242                 } else if (each instanceof AddConstraintDefinitionSegment) {
243                     result.getAddConstraintDefinitions().add((AddConstraintDefinitionSegment) each);
244                 } else if (each instanceof ModifyConstraintDefinitionSegment) {
245                     result.getModifyConstraintDefinitions().add((ModifyConstraintDefinitionSegment) each);
246                 } else if (each instanceof DropConstraintDefinitionSegment) {
247                     result.getDropConstraintDefinitions().add((DropConstraintDefinitionSegment) each);
248                 }
249             }
250         }
251         return result;
252     }
253     
254     @SuppressWarnings("unchecked")
255     @Override
256     public ASTNode visitAlterDefinitionClause(final AlterDefinitionClauseContext ctx) {
257         CollectionValue<AlterDefinitionSegment> result = new CollectionValue<>();
258         if (null != ctx.addColumnSpecification()) {
259             result.getValue().addAll(((CollectionValue<AddColumnDefinitionSegment>) visit(ctx.addColumnSpecification())).getValue());
260         }
261         if (null != ctx.modifyColumnSpecification()) {
262             result.getValue().add((ModifyColumnDefinitionSegment) visit(ctx.modifyColumnSpecification()));
263         }
264         if (null != ctx.alterDrop() && null != ctx.alterDrop().dropColumnSpecification()) {
265             result.getValue().add((DropColumnDefinitionSegment) visit(ctx.alterDrop().dropColumnSpecification()));
266         }
267         if (null != ctx.alterDrop() && null != ctx.alterDrop().alterTableDropConstraint()) {
268             result.combine((CollectionValue<AlterDefinitionSegment>) visit(ctx.alterDrop().alterTableDropConstraint()));
269         }
270         if (null != ctx.alterCheckConstraint()) {
271             result.getValue().add((AlterDefinitionSegment) visit(ctx.alterCheckConstraint()));
272         }
273         return result;
274     }
275     
276     @Override
277     public ASTNode visitAddColumnSpecification(final AddColumnSpecificationContext ctx) {
278         CollectionValue<AddColumnDefinitionSegment> result = new CollectionValue<>();
279         if (null != ctx.alterColumnAddOptions()) {
280             for (AlterColumnAddOptionContext each : ctx.alterColumnAddOptions().alterColumnAddOption()) {
281                 if (null != each.columnDefinition()) {
282                     AddColumnDefinitionSegment addColumnDefinition = new AddColumnDefinitionSegment(
283                             each.columnDefinition().getStart().getStartIndex(), each.columnDefinition().getStop().getStopIndex(),
284                             Collections.singletonList((ColumnDefinitionSegment) visit(each.columnDefinition())));
285                     result.getValue().add(addColumnDefinition);
286                 }
287             }
288         }
289         return result;
290     }
291     
292     @Override
293     public ASTNode visitModifyColumnSpecification(final ModifyColumnSpecificationContext ctx) {
294         // TODO visit pk and table ref
295         ColumnSegment column = (ColumnSegment) visit(ctx.alterColumnOperation().columnName());
296         DataTypeSegment dataType = (DataTypeSegment) visit(ctx.dataType());
297         ColumnDefinitionSegment columnDefinition = new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataType, false, false, getText(ctx));
298         return new ModifyColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), columnDefinition);
299     }
300     
301     @Override
302     public ASTNode visitDropColumnSpecification(final DropColumnSpecificationContext ctx) {
303         Collection<ColumnSegment> columns = new LinkedList<>();
304         for (ColumnNameContext each : ctx.columnName()) {
305             columns.add((ColumnSegment) visit(each));
306         }
307         return new DropColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), columns);
308     }
309     
310     @SuppressWarnings("unchecked")
311     @Override
312     public ASTNode visitDropTable(final DropTableContext ctx) {
313         DropTableStatement result = new DropTableStatement();
314         result.setContainsCascade(null != ctx.ifExists());
315         result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.tableNames())).getValue());
316         return result;
317     }
318     
319     @Override
320     public ASTNode visitTruncateTable(final TruncateTableContext ctx) {
321         return new TruncateStatement(Collections.singleton((SimpleTableSegment) visit(ctx.tableName())));
322     }
323     
324     @SuppressWarnings({"rawtypes", "unchecked"})
325     @Override
326     public ASTNode visitCreateIndex(final CreateIndexContext ctx) {
327         CreateIndexStatement result = new CreateIndexStatement();
328         result.setTable((SimpleTableSegment) visit(ctx.tableName()));
329         result.setIndex((IndexSegment) visit(ctx.indexName()));
330         result.getColumns().addAll(((CollectionValue) visit(ctx.columnNamesWithSort())).getValue());
331         return result;
332     }
333     
334     @Override
335     public ASTNode visitColumnNameWithSort(final ColumnNameWithSortContext ctx) {
336         return visit(ctx.columnName());
337     }
338     
339     @Override
340     public ASTNode visitAlterIndex(final AlterIndexContext ctx) {
341         AlterIndexStatement result = new AlterIndexStatement();
342         if (null != ctx.indexName()) {
343             result.setIndex((IndexSegment) visit(ctx.indexName()));
344         }
345         result.setSimpleTable((SimpleTableSegment) visit(ctx.tableName()));
346         return result;
347     }
348     
349     @Override
350     public ASTNode visitDropIndex(final DropIndexContext ctx) {
351         DropIndexStatement result = new DropIndexStatement();
352         result.setIfExists(null != ctx.ifExists());
353         result.getIndexes().add((IndexSegment) visit(ctx.indexName()));
354         result.setSimpleTable((SimpleTableSegment) visit(ctx.tableName()));
355         return result;
356     }
357     
358     @Override
359     public ASTNode visitAlterCheckConstraint(final AlterCheckConstraintContext ctx) {
360         return new ModifyConstraintDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (ConstraintSegment) visit(ctx.constraintName()));
361     }
362     
363     @Override
364     public ASTNode visitAlterTableDropConstraint(final AlterTableDropConstraintContext ctx) {
365         CollectionValue<DropConstraintDefinitionSegment> result = new CollectionValue<>();
366         for (DropConstraintNameContext each : ctx.dropConstraintName()) {
367             result.getValue().add(new DropConstraintDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (ConstraintSegment) visit(each.constraintName())));
368         }
369         return result;
370     }
371     
372     @Override
373     public ASTNode visitCreateDatabase(final CreateDatabaseContext ctx) {
374         return new CreateDatabaseStatement(ctx.databaseName().getText(), false);
375     }
376     
377     @Override
378     public ASTNode visitCreateFunction(final CreateFunctionContext ctx) {
379         return new CreateFunctionStatement();
380     }
381     
382     @Override
383     public ASTNode visitCreateProcedure(final CreateProcedureContext ctx) {
384         return new CreateProcedureStatement();
385     }
386     
387     @Override
388     public ASTNode visitCreateView(final CreateViewContext ctx) {
389         CreateViewStatement result = new CreateViewStatement();
390         result.setReplaceView(null != ctx.ALTER());
391         result.setView((SimpleTableSegment) visit(ctx.viewName()));
392         result.setViewDefinition(getOriginalText(ctx.createOrAlterViewClause().select()));
393         result.setSelect((SelectStatement) visit(ctx.createOrAlterViewClause().select()));
394         return result;
395     }
396     
397     @Override
398     public ASTNode visitCreateTrigger(final CreateTriggerContext ctx) {
399         return new CreateTriggerStatement();
400     }
401     
402     @Override
403     public ASTNode visitCreateSequence(final CreateSequenceContext ctx) {
404         return new CreateSequenceStatement(ctx.sequenceName().name().getText());
405     }
406     
407     @Override
408     public ASTNode visitCreateSchema(final CreateSchemaContext ctx) {
409         return new CreateSchemaStatement();
410     }
411     
412     @Override
413     public ASTNode visitCreateService(final CreateServiceContext ctx) {
414         return new SQLServerCreateServiceStatement();
415     }
416     
417     @Override
418     public ASTNode visitAlterSchema(final AlterSchemaContext ctx) {
419         return new AlterSchemaStatement();
420     }
421     
422     @Override
423     public ASTNode visitAlterService(final AlterServiceContext ctx) {
424         return new SQLServerAlterServiceStatement();
425     }
426     
427     @Override
428     public ASTNode visitDropSchema(final DropSchemaContext ctx) {
429         return new DropSchemaStatement();
430     }
431     
432     @Override
433     public ASTNode visitDropService(final DropServiceContext ctx) {
434         return new SQLServerDropServiceStatement();
435     }
436     
437     @Override
438     public ASTNode visitAlterTrigger(final AlterTriggerContext ctx) {
439         return new AlterTriggerStatement();
440     }
441     
442     @Override
443     public ASTNode visitAlterSequence(final AlterSequenceContext ctx) {
444         return new AlterSequenceStatement(null);
445     }
446     
447     @Override
448     public ASTNode visitAlterProcedure(final AlterProcedureContext ctx) {
449         return new AlterProcedureStatement();
450     }
451     
452     @Override
453     public ASTNode visitAlterFunction(final AlterFunctionContext ctx) {
454         return new AlterFunctionStatement();
455     }
456     
457     @Override
458     public ASTNode visitAlterView(final AlterViewContext ctx) {
459         AlterViewStatement result = new AlterViewStatement();
460         result.setView((SimpleTableSegment) visit(ctx.viewName()));
461         result.setViewDefinition(getOriginalText(ctx.createOrAlterViewClause().select()));
462         result.setSelect((SelectStatement) visit(ctx.createOrAlterViewClause().select()));
463         return result;
464     }
465     
466     @Override
467     public ASTNode visitAlterDatabase(final AlterDatabaseContext ctx) {
468         return new AlterDatabaseStatement();
469     }
470     
471     @Override
472     public ASTNode visitDropDatabase(final DropDatabaseContext ctx) {
473         return new DropDatabaseStatement(null, false);
474     }
475     
476     @Override
477     public ASTNode visitDropFunction(final DropFunctionContext ctx) {
478         return new DropFunctionStatement();
479     }
480     
481     @Override
482     public ASTNode visitDropProcedure(final DropProcedureContext ctx) {
483         return new DropProcedureStatement();
484     }
485     
486     @Override
487     public ASTNode visitDropView(final DropViewContext ctx) {
488         DropViewStatement result = new DropViewStatement();
489         result.setIfExists(null != ctx.ifExists());
490         for (ViewNameContext each : ctx.viewName()) {
491             result.getViews().add((SimpleTableSegment) visit(each));
492         }
493         return result;
494     }
495     
496     @Override
497     public ASTNode visitDropTrigger(final DropTriggerContext ctx) {
498         return new DropTriggerStatement();
499     }
500     
501     @Override
502     public ASTNode visitDropSequence(final DropSequenceContext ctx) {
503         return new DropSequenceStatement(Collections.emptyList());
504     }
505 }