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.apache.shardingsphere.sql.parser.api.ASTNode;
21  import org.apache.shardingsphere.sql.parser.api.visitor.statement.type.DDLStatementVisitor;
22  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AddColumnSpecificationContext;
23  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterCheckConstraintContext;
24  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterColumnAddOptionContext;
25  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterDatabaseContext;
26  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterDefinitionClauseContext;
27  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterFunctionContext;
28  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterIndexContext;
29  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterProcedureContext;
30  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterSchemaContext;
31  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterSequenceContext;
32  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterServiceContext;
33  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterTableContext;
34  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterTableDropConstraintContext;
35  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterTriggerContext;
36  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterViewContext;
37  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ColumnConstraintContext;
38  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ColumnDefinitionContext;
39  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ColumnDefinitionOptionContext;
40  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ColumnNameContext;
41  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ColumnNameWithSortContext;
42  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateDatabaseContext;
43  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateFunctionContext;
44  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateIndexContext;
45  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateProcedureContext;
46  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateSchemaContext;
47  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateSequenceContext;
48  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateServiceContext;
49  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateTableClauseContext;
50  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateTableContext;
51  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateTableDefinitionContext;
52  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateTableDefinitionsContext;
53  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateTriggerContext;
54  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateViewContext;
55  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropColumnSpecificationContext;
56  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropConstraintNameContext;
57  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropDatabaseContext;
58  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropFunctionContext;
59  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropIndexContext;
60  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropProcedureContext;
61  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropSchemaContext;
62  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropSequenceContext;
63  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropServiceContext;
64  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropTableContext;
65  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropTriggerContext;
66  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropViewContext;
67  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ModifyColumnSpecificationContext;
68  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.TableConstraintContext;
69  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.TruncateTableContext;
70  import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ViewNameContext;
71  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.AlterDefinitionSegment;
72  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.CreateDefinitionSegment;
73  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.ColumnDefinitionSegment;
74  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.AddColumnDefinitionSegment;
75  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.DropColumnDefinitionSegment;
76  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.ModifyColumnDefinitionSegment;
77  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.ConstraintDefinitionSegment;
78  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.ConstraintSegment;
79  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.alter.AddConstraintDefinitionSegment;
80  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.alter.DropConstraintDefinitionSegment;
81  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.alter.ModifyConstraintDefinitionSegment;
82  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.IndexSegment;
83  import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
84  import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.DataTypeSegment;
85  import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
86  import org.apache.shardingsphere.sql.parser.sql.common.value.collection.CollectionValue;
87  import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerAlterDatabaseStatement;
88  import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerAlterFunctionStatement;
89  import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerAlterIndexStatement;
90  import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerAlterProcedureStatement;
91  import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerAlterSchemaStatement;
92  import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerAlterSequenceStatement;
93  import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerAlterServiceStatement;
94  import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerAlterTableStatement;
95  import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerAlterTriggerStatement;
96  import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerAlterViewStatement;
97  import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerCreateDatabaseStatement;
98  import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerCreateFunctionStatement;
99  import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerCreateIndexStatement;
100 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerCreateProcedureStatement;
101 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerCreateSchemaStatement;
102 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerCreateSequenceStatement;
103 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerCreateServiceStatement;
104 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerCreateTableStatement;
105 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerCreateTriggerStatement;
106 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerCreateViewStatement;
107 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerDropDatabaseStatement;
108 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerDropFunctionStatement;
109 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerDropIndexStatement;
110 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerDropProcedureStatement;
111 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerDropSchemaStatement;
112 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerDropSequenceStatement;
113 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerDropServiceStatement;
114 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerDropTableStatement;
115 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerDropTriggerStatement;
116 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerDropViewStatement;
117 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.ddl.SQLServerTruncateStatement;
118 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dml.SQLServerSelectStatement;
119 import org.apache.shardingsphere.sql.parser.sqlserver.visitor.statement.SQLServerStatementVisitor;
120 
121 import java.util.Collection;
122 import java.util.Collections;
123 import java.util.LinkedList;
124 
125 /**
126  * DDL statement visitor for SQLServer.
127  */
128 public final class SQLServerDDLStatementVisitor extends SQLServerStatementVisitor implements DDLStatementVisitor {
129     
130     @Override
131     public ASTNode visitCreateTable(final CreateTableContext ctx) {
132         return null == ctx.createTableClause() ? visit(ctx.createTableAsSelectClause()) : visit(ctx.createTableClause());
133     }
134     
135     @Override
136     public ASTNode visitCreateTableClause(final CreateTableClauseContext ctx) {
137         SQLServerCreateTableStatement result = new SQLServerCreateTableStatement();
138         result.setTable((SimpleTableSegment) visit(ctx.tableName()));
139         CollectionValue<CreateDefinitionSegment> createDefinitions = (CollectionValue<CreateDefinitionSegment>) generateCreateDefinitionSegment(ctx.createDefinitionClause().createTableDefinitions());
140         for (CreateDefinitionSegment each : createDefinitions.getValue()) {
141             if (each instanceof ColumnDefinitionSegment) {
142                 result.getColumnDefinitions().add((ColumnDefinitionSegment) each);
143             } else if (each instanceof ConstraintDefinitionSegment) {
144                 result.getConstraintDefinitions().add((ConstraintDefinitionSegment) each);
145             }
146         }
147         return result;
148     }
149     
150     private ASTNode generateCreateDefinitionSegment(final CreateTableDefinitionsContext ctx) {
151         CollectionValue<CreateDefinitionSegment> result = new CollectionValue<>();
152         for (CreateTableDefinitionContext each : ctx.createTableDefinition()) {
153             if (null != each.columnDefinition()) {
154                 result.getValue().add((ColumnDefinitionSegment) visit(each.columnDefinition()));
155             }
156             if (null != each.tableConstraint()) {
157                 result.getValue().add((ConstraintDefinitionSegment) visit(each.tableConstraint()));
158             }
159         }
160         return result;
161     }
162     
163     @Override
164     public ASTNode visitColumnDefinition(final ColumnDefinitionContext ctx) {
165         ColumnSegment column = (ColumnSegment) visit(ctx.columnName());
166         DataTypeSegment dataType = (DataTypeSegment) visit(ctx.dataType());
167         boolean isPrimaryKey = isPrimaryKey(ctx);
168         // TODO parse not null
169         ColumnDefinitionSegment result = new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataType, isPrimaryKey, false);
170         for (ColumnDefinitionOptionContext each : ctx.columnDefinitionOption()) {
171             for (ColumnConstraintContext columnConstraint : each.columnConstraint()) {
172                 if (null != columnConstraint.columnForeignKeyConstraint()) {
173                     result.getReferencedTables().add((SimpleTableSegment) visit(columnConstraint.columnForeignKeyConstraint().tableName()));
174                 }
175             }
176         }
177         for (ColumnConstraintContext each : ctx.columnConstraints().columnConstraint()) {
178             if (null != each.columnForeignKeyConstraint()) {
179                 result.getReferencedTables().add((SimpleTableSegment) visit(each.columnForeignKeyConstraint().tableName()));
180             }
181         }
182         return result;
183     }
184     
185     private boolean isPrimaryKey(final ColumnDefinitionContext ctx) {
186         for (ColumnDefinitionOptionContext each : ctx.columnDefinitionOption()) {
187             for (ColumnConstraintContext columnConstraint : each.columnConstraint()) {
188                 if (null != columnConstraint.primaryKeyConstraint() && null != columnConstraint.primaryKeyConstraint().primaryKey()) {
189                     return true;
190                 }
191             }
192         }
193         for (ColumnConstraintContext each : ctx.columnConstraints().columnConstraint()) {
194             if (null != each.primaryKeyConstraint() && null != each.primaryKeyConstraint().primaryKey()) {
195                 return true;
196             }
197         }
198         return false;
199     }
200     
201     @SuppressWarnings("unchecked")
202     @Override
203     public ASTNode visitTableConstraint(final TableConstraintContext ctx) {
204         ConstraintDefinitionSegment result = new ConstraintDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex());
205         if (null != ctx.constraintName()) {
206             result.setConstraintName((ConstraintSegment) visit(ctx.constraintName()));
207         }
208         if (null != ctx.tablePrimaryConstraint() && null != ctx.tablePrimaryConstraint().primaryKeyUnique().primaryKey()) {
209             if (null != ctx.tablePrimaryConstraint().diskTablePrimaryConstraintOption()) {
210                 result.getPrimaryKeyColumns().addAll(((CollectionValue<ColumnSegment>) visit(ctx.tablePrimaryConstraint().diskTablePrimaryConstraintOption().columnNames())).getValue());
211             }
212             if (null != ctx.tablePrimaryConstraint().memoryTablePrimaryConstraintOption()) {
213                 result.getPrimaryKeyColumns().addAll(((CollectionValue<ColumnSegment>) visit(ctx.tablePrimaryConstraint().memoryTablePrimaryConstraintOption().columnNames())).getValue());
214             }
215         }
216         if (null != ctx.tableForeignKeyConstraint()) {
217             result.setReferencedTable((SimpleTableSegment) visit(ctx.tableForeignKeyConstraint().tableName()));
218         }
219         return result;
220     }
221     
222     @SuppressWarnings("unchecked")
223     @Override
224     public ASTNode visitAlterTable(final AlterTableContext ctx) {
225         SQLServerAlterTableStatement result = new SQLServerAlterTableStatement();
226         result.setTable((SimpleTableSegment) visit(ctx.tableName()));
227         for (AlterDefinitionClauseContext alterDefinitionClauseContext : ctx.alterDefinitionClause()) {
228             for (AlterDefinitionSegment each : ((CollectionValue<AlterDefinitionSegment>) visit(alterDefinitionClauseContext)).getValue()) {
229                 if (each instanceof AddColumnDefinitionSegment) {
230                     result.getAddColumnDefinitions().add((AddColumnDefinitionSegment) each);
231                 } else if (each instanceof ModifyColumnDefinitionSegment) {
232                     result.getModifyColumnDefinitions().add((ModifyColumnDefinitionSegment) each);
233                 } else if (each instanceof DropColumnDefinitionSegment) {
234                     result.getDropColumnDefinitions().add((DropColumnDefinitionSegment) each);
235                 } else if (each instanceof AddConstraintDefinitionSegment) {
236                     result.getAddConstraintDefinitions().add((AddConstraintDefinitionSegment) each);
237                 } else if (each instanceof ModifyConstraintDefinitionSegment) {
238                     result.getModifyConstraintDefinitions().add((ModifyConstraintDefinitionSegment) each);
239                 } else if (each instanceof DropConstraintDefinitionSegment) {
240                     result.getDropConstraintDefinitions().add((DropConstraintDefinitionSegment) each);
241                 }
242             }
243         }
244         return result;
245     }
246     
247     @SuppressWarnings("unchecked")
248     @Override
249     public ASTNode visitAlterDefinitionClause(final AlterDefinitionClauseContext ctx) {
250         CollectionValue<AlterDefinitionSegment> result = new CollectionValue<>();
251         if (null != ctx.addColumnSpecification()) {
252             result.getValue().addAll(((CollectionValue<AddColumnDefinitionSegment>) visit(ctx.addColumnSpecification())).getValue());
253         }
254         if (null != ctx.modifyColumnSpecification()) {
255             result.getValue().add((ModifyColumnDefinitionSegment) visit(ctx.modifyColumnSpecification()));
256         }
257         if (null != ctx.alterDrop() && null != ctx.alterDrop().dropColumnSpecification()) {
258             result.getValue().add((DropColumnDefinitionSegment) visit(ctx.alterDrop().dropColumnSpecification()));
259         }
260         if (null != ctx.alterDrop() && null != ctx.alterDrop().alterTableDropConstraint()) {
261             result.combine((CollectionValue<AlterDefinitionSegment>) visit(ctx.alterDrop().alterTableDropConstraint()));
262         }
263         if (null != ctx.alterCheckConstraint()) {
264             result.getValue().add((AlterDefinitionSegment) visit(ctx.alterCheckConstraint()));
265         }
266         return result;
267     }
268     
269     @Override
270     public ASTNode visitAddColumnSpecification(final AddColumnSpecificationContext ctx) {
271         CollectionValue<AddColumnDefinitionSegment> result = new CollectionValue<>();
272         if (null != ctx.alterColumnAddOptions()) {
273             for (AlterColumnAddOptionContext each : ctx.alterColumnAddOptions().alterColumnAddOption()) {
274                 if (null != each.columnDefinition()) {
275                     AddColumnDefinitionSegment addColumnDefinition = new AddColumnDefinitionSegment(
276                             each.columnDefinition().getStart().getStartIndex(), each.columnDefinition().getStop().getStopIndex(),
277                             Collections.singletonList((ColumnDefinitionSegment) visit(each.columnDefinition())));
278                     result.getValue().add(addColumnDefinition);
279                 }
280             }
281         }
282         return result;
283     }
284     
285     @Override
286     public ASTNode visitModifyColumnSpecification(final ModifyColumnSpecificationContext ctx) {
287         // TODO visit pk and table ref
288         ColumnSegment column = (ColumnSegment) visit(ctx.alterColumnOperation().columnName());
289         DataTypeSegment dataType = (DataTypeSegment) visit(ctx.dataType());
290         ColumnDefinitionSegment columnDefinition = new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataType, false, false);
291         return new ModifyColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), columnDefinition);
292     }
293     
294     @Override
295     public ASTNode visitDropColumnSpecification(final DropColumnSpecificationContext ctx) {
296         Collection<ColumnSegment> columns = new LinkedList<>();
297         for (ColumnNameContext each : ctx.columnName()) {
298             columns.add((ColumnSegment) visit(each));
299         }
300         return new DropColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), columns);
301     }
302     
303     @SuppressWarnings("unchecked")
304     @Override
305     public ASTNode visitDropTable(final DropTableContext ctx) {
306         SQLServerDropTableStatement result = new SQLServerDropTableStatement(null != ctx.ifExists());
307         result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.tableNames())).getValue());
308         return result;
309     }
310     
311     @Override
312     public ASTNode visitTruncateTable(final TruncateTableContext ctx) {
313         SQLServerTruncateStatement result = new SQLServerTruncateStatement();
314         result.getTables().add((SimpleTableSegment) visit(ctx.tableName()));
315         return result;
316     }
317     
318     @Override
319     public ASTNode visitCreateIndex(final CreateIndexContext ctx) {
320         SQLServerCreateIndexStatement result = new SQLServerCreateIndexStatement();
321         result.setTable((SimpleTableSegment) visit(ctx.tableName()));
322         result.setIndex((IndexSegment) visit(ctx.indexName()));
323         result.getColumns().addAll(((CollectionValue) visit(ctx.columnNamesWithSort())).getValue());
324         return result;
325     }
326     
327     @Override
328     public ASTNode visitColumnNameWithSort(final ColumnNameWithSortContext ctx) {
329         return visit(ctx.columnName());
330     }
331     
332     @Override
333     public ASTNode visitAlterIndex(final AlterIndexContext ctx) {
334         SQLServerAlterIndexStatement result = new SQLServerAlterIndexStatement();
335         if (null != ctx.indexName()) {
336             result.setIndex((IndexSegment) visit(ctx.indexName()));
337         }
338         result.setTable((SimpleTableSegment) visit(ctx.tableName()));
339         return result;
340     }
341     
342     @Override
343     public ASTNode visitDropIndex(final DropIndexContext ctx) {
344         SQLServerDropIndexStatement result = new SQLServerDropIndexStatement(null != ctx.ifExists());
345         result.getIndexes().add((IndexSegment) visit(ctx.indexName()));
346         result.setTable((SimpleTableSegment) visit(ctx.tableName()));
347         return result;
348     }
349     
350     @Override
351     public ASTNode visitAlterCheckConstraint(final AlterCheckConstraintContext ctx) {
352         return new ModifyConstraintDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (ConstraintSegment) visit(ctx.constraintName()));
353     }
354     
355     @Override
356     public ASTNode visitAlterTableDropConstraint(final AlterTableDropConstraintContext ctx) {
357         CollectionValue<DropConstraintDefinitionSegment> result = new CollectionValue<>();
358         for (DropConstraintNameContext each : ctx.dropConstraintName()) {
359             result.getValue().add(new DropConstraintDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (ConstraintSegment) visit(each.constraintName())));
360         }
361         return result;
362     }
363     
364     @Override
365     public ASTNode visitCreateDatabase(final CreateDatabaseContext ctx) {
366         SQLServerCreateDatabaseStatement result = new SQLServerCreateDatabaseStatement();
367         result.setDatabaseName(ctx.databaseName().getText());
368         return result;
369     }
370     
371     @Override
372     public ASTNode visitCreateFunction(final CreateFunctionContext ctx) {
373         return new SQLServerCreateFunctionStatement();
374     }
375     
376     @Override
377     public ASTNode visitCreateProcedure(final CreateProcedureContext ctx) {
378         return new SQLServerCreateProcedureStatement();
379     }
380     
381     @Override
382     public ASTNode visitCreateView(final CreateViewContext ctx) {
383         SQLServerCreateViewStatement result = new SQLServerCreateViewStatement();
384         result.setView((SimpleTableSegment) visit(ctx.viewName()));
385         result.setViewDefinition(getOriginalText(ctx.createOrAlterViewClause().select()));
386         result.setSelect((SQLServerSelectStatement) visit(ctx.createOrAlterViewClause().select()));
387         return result;
388     }
389     
390     @Override
391     public ASTNode visitCreateTrigger(final CreateTriggerContext ctx) {
392         return new SQLServerCreateTriggerStatement();
393     }
394     
395     @Override
396     public ASTNode visitCreateSequence(final CreateSequenceContext ctx) {
397         SQLServerCreateSequenceStatement result = new SQLServerCreateSequenceStatement();
398         result.setSequenceName(ctx.sequenceName().name().getText());
399         return result;
400     }
401     
402     @Override
403     public ASTNode visitCreateSchema(final CreateSchemaContext ctx) {
404         return new SQLServerCreateSchemaStatement();
405     }
406     
407     @Override
408     public ASTNode visitCreateService(final CreateServiceContext ctx) {
409         return new SQLServerCreateServiceStatement();
410     }
411     
412     @Override
413     public ASTNode visitAlterSchema(final AlterSchemaContext ctx) {
414         return new SQLServerAlterSchemaStatement();
415     }
416     
417     @Override
418     public ASTNode visitAlterService(final AlterServiceContext ctx) {
419         return new SQLServerAlterServiceStatement();
420     }
421     
422     @Override
423     public ASTNode visitDropSchema(final DropSchemaContext ctx) {
424         return new SQLServerDropSchemaStatement();
425     }
426     
427     @Override
428     public ASTNode visitDropService(final DropServiceContext ctx) {
429         return new SQLServerDropServiceStatement();
430     }
431     
432     @Override
433     public ASTNode visitAlterTrigger(final AlterTriggerContext ctx) {
434         return new SQLServerAlterTriggerStatement();
435     }
436     
437     @Override
438     public ASTNode visitAlterSequence(final AlterSequenceContext ctx) {
439         return new SQLServerAlterSequenceStatement();
440     }
441     
442     @Override
443     public ASTNode visitAlterProcedure(final AlterProcedureContext ctx) {
444         return new SQLServerAlterProcedureStatement();
445     }
446     
447     @Override
448     public ASTNode visitAlterFunction(final AlterFunctionContext ctx) {
449         return new SQLServerAlterFunctionStatement();
450     }
451     
452     @Override
453     public ASTNode visitAlterView(final AlterViewContext ctx) {
454         SQLServerAlterViewStatement result = new SQLServerAlterViewStatement();
455         result.setView((SimpleTableSegment) visit(ctx.viewName()));
456         result.setViewDefinition(getOriginalText(ctx.createOrAlterViewClause().select()));
457         result.setSelect((SQLServerSelectStatement) visit(ctx.createOrAlterViewClause().select()));
458         return result;
459     }
460     
461     @Override
462     public ASTNode visitAlterDatabase(final AlterDatabaseContext ctx) {
463         return new SQLServerAlterDatabaseStatement();
464     }
465     
466     @Override
467     public ASTNode visitDropDatabase(final DropDatabaseContext ctx) {
468         return new SQLServerDropDatabaseStatement();
469     }
470     
471     @Override
472     public ASTNode visitDropFunction(final DropFunctionContext ctx) {
473         return new SQLServerDropFunctionStatement();
474     }
475     
476     @Override
477     public ASTNode visitDropProcedure(final DropProcedureContext ctx) {
478         return new SQLServerDropProcedureStatement();
479     }
480     
481     @Override
482     public ASTNode visitDropView(final DropViewContext ctx) {
483         SQLServerDropViewStatement result = new SQLServerDropViewStatement();
484         for (ViewNameContext each : ctx.viewName()) {
485             result.getViews().add((SimpleTableSegment) visit(each));
486         }
487         return result;
488     }
489     
490     @Override
491     public ASTNode visitDropTrigger(final DropTriggerContext ctx) {
492         return new SQLServerDropTriggerStatement();
493     }
494     
495     @Override
496     public ASTNode visitDropSequence(final DropSequenceContext ctx) {
497         return new SQLServerDropSequenceStatement();
498     }
499 }