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.oracle.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.OracleStatementParser.AddColumnSpecificationContext;
25  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AddConstraintSpecificationContext;
26  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterAnalyticViewContext;
27  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterAttributeDimensionContext;
28  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterAuditPolicyContext;
29  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterClusterContext;
30  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterDatabaseContext;
31  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterDatabaseDictionaryContext;
32  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterDatabaseLinkContext;
33  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterDefinitionClauseContext;
34  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterDimensionContext;
35  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterDiskgroupContext;
36  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterFlashbackArchiveContext;
37  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterFunctionContext;
38  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterHierarchyContext;
39  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterIndexContext;
40  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterIndexTypeContext;
41  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterInmemoryJoinGroupContext;
42  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterJavaContext;
43  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterLibraryContext;
44  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterLockdownProfileContext;
45  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterMaterializedViewContext;
46  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterMaterializedViewLogContext;
47  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterMaterializedZonemapContext;
48  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterOperatorContext;
49  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterOutlineContext;
50  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterPackageContext;
51  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterPluggableDatabaseContext;
52  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterProcedureContext;
53  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterProfileContext;
54  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterRollbackSegmentContext;
55  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterSequenceContext;
56  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterSessionContext;
57  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterSynonymContext;
58  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterSystemContext;
59  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterTableContext;
60  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterTablespaceContext;
61  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterTriggerContext;
62  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterTypeContext;
63  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterViewContext;
64  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AnalyzeContext;
65  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AssociateStatisticsContext;
66  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AuditContext;
67  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AuditTraditionalContext;
68  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AuditUnifiedContext;
69  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.BodyContext;
70  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CollectionVariableDeclContext;
71  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ColumnClausesContext;
72  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ColumnDefinitionContext;
73  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ColumnNameContext;
74  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ColumnOrVirtualDefinitionContext;
75  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CommentContext;
76  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ConstraintClausesContext;
77  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateClusterContext;
78  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateContextContext;
79  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateControlFileContext;
80  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateDatabaseContext;
81  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateDatabaseLinkContext;
82  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateDefinitionClauseContext;
83  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateDimensionContext;
84  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateDirectoryContext;
85  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateDiskgroupContext;
86  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateEditionContext;
87  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateFlashbackArchiveContext;
88  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateFunctionContext;
89  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateIndexContext;
90  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateInmemoryJoinGroupContext;
91  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateJavaContext;
92  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateLibraryContext;
93  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateLockdownProfileContext;
94  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateMaterializedViewContext;
95  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateMaterializedViewLogContext;
96  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateOperatorContext;
97  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateOutlineContext;
98  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreatePFileContext;
99  import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateProcedureContext;
100 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateProfileContext;
101 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateRelationalTableClauseContext;
102 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateRestorePointContext;
103 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateRollbackSegmentContext;
104 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateSPFileContext;
105 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateSequenceContext;
106 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateSynonymContext;
107 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateTableContext;
108 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateTablespaceContext;
109 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateTriggerContext;
110 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateTypeContext;
111 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateViewContext;
112 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CursorDefinitionContext;
113 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CursorForLoopStatementContext;
114 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DataTypeDefinitionContext;
115 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DisassociateStatisticsContext;
116 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DmlStatementContext;
117 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropClusterContext;
118 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropColumnClauseContext;
119 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropColumnSpecificationContext;
120 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropConstraintClauseContext;
121 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropContextContext;
122 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropDatabaseContext;
123 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropDatabaseLinkContext;
124 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropDimensionContext;
125 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropDirectoryContext;
126 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropDiskgroupContext;
127 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropEditionContext;
128 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropFlashbackArchiveContext;
129 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropFunctionContext;
130 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropIndexContext;
131 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropIndexTypeContext;
132 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropInmemoryJoinGroupContext;
133 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropJavaContext;
134 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropLibraryContext;
135 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropLockdownProfileContext;
136 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropMaterializedViewContext;
137 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropMaterializedViewLogContext;
138 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropMaterializedZonemapContext;
139 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropOperatorContext;
140 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropOutlineContext;
141 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropPackageContext;
142 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropPluggableDatabaseContext;
143 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropProcedureContext;
144 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropProfileContext;
145 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropRestorePointContext;
146 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropRollbackSegmentContext;
147 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropSequenceContext;
148 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropSynonymContext;
149 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropTableContext;
150 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropTableSpaceContext;
151 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropTriggerContext;
152 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropTypeContext;
153 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropViewContext;
154 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DynamicSqlStmtContext;
155 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ExceptionHandlerContext;
156 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.FlashbackDatabaseContext;
157 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.FlashbackTableContext;
158 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.FunctionContext;
159 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.IndexExpressionContext;
160 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.IndexExpressionsContext;
161 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.IndexNameContext;
162 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.IndexTypeNameContext;
163 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.InlineConstraintContext;
164 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ItemDeclarationContext;
165 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ModifyColPropertiesContext;
166 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ModifyCollectionRetrievalContext;
167 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ModifyColumnSpecificationContext;
168 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ModifyConstraintClauseContext;
169 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.NestedTableTypeSpecContext;
170 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.NoAuditContext;
171 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ObjectBaseTypeDefContext;
172 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ObjectSubTypeDefContext;
173 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ObjectTypeDefContext;
174 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.OpenForStatementContext;
175 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.OperateColumnClauseContext;
176 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.OutOfLineConstraintContext;
177 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.OutOfLineRefConstraintContext;
178 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.OwnerContext;
179 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.PackageNameContext;
180 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ParameterDeclarationContext;
181 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.PlsqlBlockContext;
182 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.PlsqlFunctionSourceContext;
183 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.PlsqlProcedureSourceContext;
184 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ProcedureCallContext;
185 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.PurgeContext;
186 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.RelationalPropertyContext;
187 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.RenameContext;
188 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.SchemaNameContext;
189 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.SelectContext;
190 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.SelectIntoStatementContext;
191 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.SqlStatementInPlsqlContext;
192 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.StatementContext;
193 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.SwitchContext;
194 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.SystemActionContext;
195 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.TableNameContext;
196 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.TruncateTableContext;
197 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.TypeNameContext;
198 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.VariableNameContext;
199 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.VarrayTypeSpecContext;
200 import org.apache.shardingsphere.sql.parser.oracle.visitor.statement.OracleStatementVisitor;
201 import org.apache.shardingsphere.sql.parser.statement.core.segment.dal.VariableSegment;
202 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.AlterDefinitionSegment;
203 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.CreateDefinitionSegment;
204 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.ColumnDefinitionSegment;
205 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.alter.AddColumnDefinitionSegment;
206 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.alter.DropColumnDefinitionSegment;
207 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.alter.ModifyCollectionRetrievalSegment;
208 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.alter.ModifyColumnDefinitionSegment;
209 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.constraint.ConstraintDefinitionSegment;
210 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.constraint.ConstraintSegment;
211 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.constraint.alter.AddConstraintDefinitionSegment;
212 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.constraint.alter.DropConstraintDefinitionSegment;
213 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.constraint.alter.ModifyConstraintDefinitionSegment;
214 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexSegment;
215 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexTypeSegment;
216 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.packages.PackageSegment;
217 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.routine.FunctionNameSegment;
218 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.tablespace.TablespaceSegment;
219 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.type.TypeDefinitionSegment;
220 import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.type.TypeSegment;
221 import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
222 import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
223 import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment;
224 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.DataTypeSegment;
225 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.OwnerSegment;
226 import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
227 import org.apache.shardingsphere.sql.parser.statement.core.segment.procedure.CursorForLoopStatementSegment;
228 import org.apache.shardingsphere.sql.parser.statement.core.segment.procedure.ProcedureBodyEndNameSegment;
229 import org.apache.shardingsphere.sql.parser.statement.core.segment.procedure.ProcedureCallNameSegment;
230 import org.apache.shardingsphere.sql.parser.statement.core.segment.procedure.SQLStatementSegment;
231 import org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
232 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.AlterPackageStatement;
233 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.AnalyzeStatement;
234 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.CommentStatement;
235 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.TruncateStatement;
236 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.database.AlterDatabaseStatement;
237 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.database.CreateDatabaseStatement;
238 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.database.DropDatabaseStatement;
239 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.directory.CreateDirectoryStatement;
240 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.directory.DropDirectoryStatement;
241 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.function.AlterFunctionStatement;
242 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.function.DropFunctionStatement;
243 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.index.AlterIndexStatement;
244 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.index.CreateIndexStatement;
245 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.index.DropIndexStatement;
246 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.operator.AlterOperatorStatement;
247 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.operator.CreateOperatorStatement;
248 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.operator.DropOperatorStatement;
249 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.procedure.AlterProcedureStatement;
250 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.procedure.DropProcedureStatement;
251 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.sequence.AlterSequenceStatement;
252 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.sequence.CreateSequenceStatement;
253 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.sequence.DropSequenceStatement;
254 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.synonym.AlterSynonymStatement;
255 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.synonym.CreateSynonymStatement;
256 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.synonym.DropSynonymStatement;
257 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.table.AlterTableStatement;
258 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.table.CreateTableStatement;
259 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.table.DropTableStatement;
260 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.tablespace.AlterTablespaceStatement;
261 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.tablespace.CreateTablespaceStatement;
262 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.tablespace.DropTablespaceStatement;
263 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.trigger.AlterTriggerStatement;
264 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.trigger.CreateTriggerStatement;
265 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.trigger.DropTriggerStatement;
266 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.type.AlterTypeStatement;
267 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.AlterMaterializedViewStatement;
268 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.AlterViewStatement;
269 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.CreateMaterializedViewStatement;
270 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.CreateViewStatement;
271 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.DropMaterializedViewStatement;
272 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.DropViewStatement;
273 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.SelectStatement;
274 import org.apache.shardingsphere.sql.parser.statement.core.value.collection.CollectionValue;
275 import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
276 import org.apache.shardingsphere.sql.parser.statement.core.value.literal.impl.StringLiteralValue;
277 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleAlterAuditPolicyStatement;
278 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleAlterHierarchyStatement;
279 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleAlterSessionStatement;
280 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleAlterSystemStatement;
281 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleAuditStatement;
282 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleCreateNestedTableTypeStatement;
283 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleCreateObjectTypeStatement;
284 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleCreateSubTypeStatement;
285 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleCreateVarrayTypeStatement;
286 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleDropPackageStatement;
287 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleNoAuditStatement;
288 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OraclePLSQLBlockStatement;
289 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OraclePurgeStatement;
290 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleRenameStatement;
291 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleSwitchStatement;
292 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.OracleSystemActionStatement;
293 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.cluster.OracleAlterClusterStatement;
294 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.cluster.OracleCreateClusterStatement;
295 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.cluster.OracleDropClusterStatement;
296 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.context.OracleCreateContextStatement;
297 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.context.OracleDropContextStatement;
298 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.database.OracleAlterDatabaseDictionaryStatement;
299 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.database.OracleAlterDatabaseLinkStatement;
300 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.database.OracleAlterPluggableDatabaseStatement;
301 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.database.OracleCreateDatabaseLinkStatement;
302 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.database.OracleDropDatabaseLinkStatement;
303 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.database.OracleDropPluggableDatabaseStatement;
304 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.dimension.OracleAlterAttributeDimensionStatement;
305 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.dimension.OracleAlterDimensionStatement;
306 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.dimension.OracleCreateDimensionStatement;
307 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.dimension.OracleDropDimensionStatement;
308 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.diskgroup.OracleAlterDiskgroupStatement;
309 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.diskgroup.OracleCreateDiskgroupStatement;
310 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.diskgroup.OracleDropDiskgroupStatement;
311 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.edition.OracleCreateEditionStatement;
312 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.edition.OracleDropEditionStatement;
313 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.file.OracleCreateControlFileStatement;
314 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.file.OracleCreatePFileStatement;
315 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.file.OracleCreateSPFileStatement;
316 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.flashback.OracleAlterFlashbackArchiveStatement;
317 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.flashback.OracleCreateFlashbackArchiveStatement;
318 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.flashback.OracleDropFlashbackArchiveStatement;
319 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.flashback.OracleFlashbackDatabaseStatement;
320 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.flashback.OracleFlashbackTableStatement;
321 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.function.OracleCreateFunctionStatement;
322 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.index.OracleAlterIndexTypeStatement;
323 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.index.OracleDropIndexTypeStatement;
324 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.java.OracleAlterJavaStatement;
325 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.java.OracleCreateJavaStatement;
326 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.java.OracleDropJavaStatement;
327 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.join.OracleAlterInMemoryJoinGroupStatement;
328 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.join.OracleCreateInMemoryJoinGroupStatement;
329 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.join.OracleDropInMemoryJoinGroupStatement;
330 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.library.OracleAlterLibraryStatement;
331 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.library.OracleCreateLibraryStatement;
332 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.library.OracleDropLibraryStatement;
333 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.lockdown.OracleAlterLockdownProfileStatement;
334 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.lockdown.OracleCreateLockdownProfileStatement;
335 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.lockdown.OracleDropLockdownProfileStatement;
336 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.outline.OracleAlterOutlineStatement;
337 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.outline.OracleCreateOutlineStatement;
338 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.outline.OracleDropOutlineStatement;
339 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.procedure.OracleCreateProcedureStatement;
340 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.profile.OracleAlterProfileStatement;
341 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.profile.OracleCreateProfileStatement;
342 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.profile.OracleDropProfileStatement;
343 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.restore.OracleCreateRestorePointStatement;
344 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.restore.OracleDropRestorePointStatement;
345 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.rollback.OracleAlterRollbackSegmentStatement;
346 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.rollback.OracleCreateRollbackSegmentStatement;
347 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.rollback.OracleDropRollbackSegmentStatement;
348 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.statistics.OracleAssociateStatisticsStatement;
349 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.statistics.OracleDisassociateStatisticsStatement;
350 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.view.OracleAlterAnalyticViewStatement;
351 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.view.OracleAlterMaterializedViewLogStatement;
352 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.view.OracleCreateMaterializedViewLogStatement;
353 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.view.OracleDropMaterializedViewLogStatement;
354 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.zone.OracleAlterMaterializedZoneMapStatement;
355 import org.apache.shardingsphere.sql.parser.statement.oracle.ddl.zone.OracleDropMaterializedZoneMapStatement;
356 
357 import java.util.Collection;
358 import java.util.Collections;
359 import java.util.Comparator;
360 import java.util.LinkedHashSet;
361 import java.util.LinkedList;
362 import java.util.Optional;
363 import java.util.Set;
364 import java.util.stream.Collectors;
365 
366 /**
367  * DDL statement visitor for Oracle.
368  */
369 public final class OracleDDLStatementVisitor extends OracleStatementVisitor implements DDLStatementVisitor {
370     
371     @Override
372     public ASTNode visitCreateView(final CreateViewContext ctx) {
373         CreateViewStatement result = new CreateViewStatement();
374         result.setReplaceView(null != ctx.REPLACE());
375         OracleDMLStatementVisitor visitor = new OracleDMLStatementVisitor();
376         getGlobalParameterMarkerSegments().addAll(visitor.getGlobalParameterMarkerSegments());
377         getStatementParameterMarkerSegments().addAll(visitor.getStatementParameterMarkerSegments());
378         result.setView((SimpleTableSegment) visit(ctx.viewName()));
379         result.setSelect((SelectStatement) visitor.visit(ctx.select()));
380         result.setViewDefinition(getOriginalText(ctx.select()));
381         result.addParameterMarkers(getGlobalParameterMarkerSegments());
382         return result;
383     }
384     
385     @SuppressWarnings("unchecked")
386     @Override
387     public ASTNode visitCreateTable(final CreateTableContext ctx) {
388         CreateTableStatement result = new CreateTableStatement();
389         result.setTable((SimpleTableSegment) visit(ctx.tableName()));
390         if (null != ctx.createDefinitionClause()) {
391             CollectionValue<CreateDefinitionSegment> createDefinitions = (CollectionValue<CreateDefinitionSegment>) visit(ctx.createDefinitionClause());
392             for (CreateDefinitionSegment each : createDefinitions.getValue()) {
393                 if (each instanceof ColumnDefinitionSegment) {
394                     result.getColumnDefinitions().add((ColumnDefinitionSegment) each);
395                 } else if (each instanceof ConstraintDefinitionSegment) {
396                     result.getConstraintDefinitions().add((ConstraintDefinitionSegment) each);
397                 }
398             }
399         }
400         return result;
401     }
402     
403     @Override
404     public ASTNode visitCreateType(final CreateTypeContext ctx) {
405         boolean isReplace = null != ctx.REPLACE();
406         boolean isEditionable = null == ctx.NONEDITIONABLE();
407         TypeSegment typeSegment = (TypeSegment) visit(ctx.plsqlTypeSource().typeName());
408         if (null != ctx.plsqlTypeSource().objectSubTypeDef()) {
409             ObjectSubTypeDefContext objectSubTypeDefContext = ctx.plsqlTypeSource().objectSubTypeDef();
410             return new OracleCreateSubTypeStatement(isReplace, isEditionable,
411                     null == objectSubTypeDefContext.finalClause() || null == objectSubTypeDefContext.finalClause().NOT(),
412                     null == objectSubTypeDefContext.instantiableClause() || null == objectSubTypeDefContext.instantiableClause().NOT(),
413                     typeSegment,
414                     objectSubTypeDefContext.dataTypeDefinition().stream().map(definition -> (TypeDefinitionSegment) visit(definition)).collect(Collectors.toList()));
415         } else {
416             return visitCreateTypeObjectBaseTypeDef(ctx.plsqlTypeSource().objectBaseTypeDef(), isReplace, isEditionable, typeSegment);
417         }
418     }
419     
420     private ASTNode visitCreateTypeObjectBaseTypeDef(final ObjectBaseTypeDefContext ctx, final boolean isReplace, final boolean isEditionable, final TypeSegment typeSegment) {
421         if (null != ctx.objectTypeDef()) {
422             ObjectTypeDefContext objectTypeDefContext = ctx.objectTypeDef();
423             return new OracleCreateObjectTypeStatement(isReplace, isEditionable, null == objectTypeDefContext.finalClause() || null == objectTypeDefContext.finalClause().NOT(),
424                     null == objectTypeDefContext.instantiableClause() || null == objectTypeDefContext.instantiableClause().NOT(),
425                     null == objectTypeDefContext.persistableClause() || null == objectTypeDefContext.persistableClause().NOT(),
426                     typeSegment, objectTypeDefContext.dataTypeDefinition().stream().map(definition -> (TypeDefinitionSegment) visit(definition)).collect(Collectors.toList()));
427         } else if (null != ctx.varrayTypeSpec()) {
428             VarrayTypeSpecContext varrayTypeSpecContext = ctx.varrayTypeSpec();
429             return new OracleCreateVarrayTypeStatement(isReplace, isEditionable,
430                     null == varrayTypeSpecContext.INTEGER_() ? -1 : Integer.parseInt(varrayTypeSpecContext.INTEGER_().getText()),
431                     null != varrayTypeSpecContext.typeSpec().NULL(),
432                     null == varrayTypeSpecContext.typeSpec().persistableClause() || null == varrayTypeSpecContext.typeSpec().persistableClause().NOT(),
433                     typeSegment,
434                     (DataTypeSegment) visit(varrayTypeSpecContext.typeSpec().dataType()));
435         } else {
436             NestedTableTypeSpecContext nestedTableTypeSpecContext = ctx.nestedTableTypeSpec();
437             return new OracleCreateNestedTableTypeStatement(isReplace, isEditionable,
438                     null != nestedTableTypeSpecContext.typeSpec().NULL(),
439                     null == nestedTableTypeSpecContext.typeSpec().persistableClause() || null == nestedTableTypeSpecContext.typeSpec().persistableClause().NOT(),
440                     typeSegment,
441                     (DataTypeSegment) visit(nestedTableTypeSpecContext.typeSpec().dataType()));
442         }
443     }
444     
445     @Override
446     public ASTNode visitDataTypeDefinition(final DataTypeDefinitionContext ctx) {
447         return new TypeDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.name().getText(), (DataTypeSegment) visit(ctx.dataType()));
448     }
449     
450     @SuppressWarnings("unchecked")
451     @Override
452     public ASTNode visitCreateDefinitionClause(final CreateDefinitionClauseContext ctx) {
453         CollectionValue<CreateDefinitionSegment> result = new CollectionValue<>();
454         if (null != ctx.createRelationalTableClause()) {
455             result.combine((CollectionValue<CreateDefinitionSegment>) visit(ctx.createRelationalTableClause()));
456         }
457         return result;
458     }
459     
460     @Override
461     public ASTNode visitCreateRelationalTableClause(final CreateRelationalTableClauseContext ctx) {
462         CollectionValue<CreateDefinitionSegment> result = new CollectionValue<>();
463         if (null == ctx.relationalProperties()) {
464             return result;
465         }
466         for (RelationalPropertyContext each : ctx.relationalProperties().relationalProperty()) {
467             if (null != each.columnDefinition()) {
468                 result.getValue().add((ColumnDefinitionSegment) visit(each.columnDefinition()));
469             }
470             if (null != each.outOfLineConstraint()) {
471                 result.getValue().add((ConstraintDefinitionSegment) visit(each.outOfLineConstraint()));
472             }
473             if (null != each.outOfLineRefConstraint()) {
474                 result.getValue().add((ConstraintDefinitionSegment) visit(each.outOfLineRefConstraint()));
475             }
476         }
477         return result;
478     }
479     
480     @Override
481     public ASTNode visitColumnDefinition(final ColumnDefinitionContext ctx) {
482         ColumnSegment column = (ColumnSegment) visit(ctx.columnName());
483         DataTypeSegment dataType = null == ctx.dataType() ? null : (DataTypeSegment) visit(ctx.dataType());
484         boolean isPrimaryKey = ctx.inlineConstraint().stream().anyMatch(each -> null != each.primaryKey());
485         boolean isNotNull = ctx.inlineConstraint().stream().anyMatch(each -> null != each.NOT() && null != each.NULL());
486         ColumnDefinitionSegment result = new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataType, isPrimaryKey, isNotNull, getText(ctx));
487         if (null != ctx.REF() && null != ctx.dataType()) {
488             result.setRef(true);
489         }
490         for (InlineConstraintContext each : ctx.inlineConstraint()) {
491             if (null != each.referencesClause()) {
492                 result.getReferencedTables().add((SimpleTableSegment) visit(each.referencesClause().tableName()));
493             }
494         }
495         if (null != ctx.inlineRefConstraint()) {
496             result.getReferencedTables().add((SimpleTableSegment) visit(ctx.inlineRefConstraint().tableName()));
497         }
498         return result;
499     }
500     
501     private String getText(final ParserRuleContext ctx) {
502         return ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
503     }
504     
505     @SuppressWarnings("unchecked")
506     @Override
507     public ASTNode visitOutOfLineConstraint(final OutOfLineConstraintContext ctx) {
508         ConstraintDefinitionSegment result = new ConstraintDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex());
509         if (null != ctx.constraintName()) {
510             result.setConstraintName((ConstraintSegment) visit(ctx.constraintName()));
511         }
512         if (null != ctx.primaryKey()) {
513             result.getPrimaryKeyColumns().addAll(((CollectionValue<ColumnSegment>) visit(ctx.columnNames())).getValue());
514         }
515         if (null != ctx.UNIQUE()) {
516             result.getIndexColumns().addAll(((CollectionValue<ColumnSegment>) visit(ctx.columnNames())).getValue());
517         }
518         if (null != ctx.referencesClause()) {
519             result.setReferencedTable((SimpleTableSegment) visit(ctx.referencesClause().tableName()));
520         }
521         return result;
522     }
523     
524     @Override
525     public ASTNode visitOutOfLineRefConstraint(final OutOfLineRefConstraintContext ctx) {
526         ConstraintDefinitionSegment result = new ConstraintDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex());
527         if (null != ctx.constraintName()) {
528             result.setConstraintName((ConstraintSegment) visit(ctx.constraintName()));
529         }
530         if (null != ctx.referencesClause()) {
531             result.setReferencedTable((SimpleTableSegment) visit(ctx.referencesClause().tableName()));
532         }
533         return result;
534     }
535     
536     @SuppressWarnings("unchecked")
537     @Override
538     public ASTNode visitAlterTable(final AlterTableContext ctx) {
539         AlterTableStatement result = new AlterTableStatement();
540         result.setTable((SimpleTableSegment) visit(ctx.tableName()));
541         if (null != ctx.alterDefinitionClause()) {
542             for (AlterDefinitionSegment each : ((CollectionValue<AlterDefinitionSegment>) visit(ctx.alterDefinitionClause())).getValue()) {
543                 if (each instanceof AddColumnDefinitionSegment) {
544                     result.getAddColumnDefinitions().add((AddColumnDefinitionSegment) each);
545                 } else if (each instanceof ModifyColumnDefinitionSegment) {
546                     result.getModifyColumnDefinitions().add((ModifyColumnDefinitionSegment) each);
547                 } else if (each instanceof DropColumnDefinitionSegment) {
548                     result.getDropColumnDefinitions().add((DropColumnDefinitionSegment) each);
549                 } else if (each instanceof AddConstraintDefinitionSegment) {
550                     result.getAddConstraintDefinitions().add((AddConstraintDefinitionSegment) each);
551                 } else if (each instanceof ModifyConstraintDefinitionSegment) {
552                     result.getModifyConstraintDefinitions().add((ModifyConstraintDefinitionSegment) each);
553                 } else if (each instanceof DropConstraintDefinitionSegment) {
554                     result.getDropConstraintDefinitions().add((DropConstraintDefinitionSegment) each);
555                 } else if (each instanceof ModifyCollectionRetrievalSegment) {
556                     result.setModifyCollectionRetrieval((ModifyCollectionRetrievalSegment) each);
557                 }
558             }
559         }
560         return result;
561     }
562     
563     @Override
564     public ASTNode visitAlterTablespace(final AlterTablespaceContext ctx) {
565         return new AlterTablespaceStatement(
566                 null == ctx.tablespaceName() ? null
567                         : new TablespaceSegment(
568                                 ctx.tablespaceName().getStart().getStartIndex(), ctx.tablespaceName().getStop().getStopIndex(), (IdentifierValue) visit(ctx.tablespaceName())),
569                 null == ctx.newTablespaceName() ? null
570                         : new TablespaceSegment(
571                                 ctx.newTablespaceName().getStart().getStartIndex(), ctx.newTablespaceName().getStop().getStopIndex(), (IdentifierValue) visit(ctx.newTablespaceName())));
572     }
573     
574     @SuppressWarnings("unchecked")
575     @Override
576     public ASTNode visitAlterDefinitionClause(final AlterDefinitionClauseContext ctx) {
577         CollectionValue<AlterDefinitionSegment> result = new CollectionValue<>();
578         if (null != ctx.columnClauses()) {
579             result.getValue().addAll(((CollectionValue<AddColumnDefinitionSegment>) visit(ctx.columnClauses())).getValue());
580         }
581         if (null != ctx.constraintClauses()) {
582             result.getValue().addAll(((CollectionValue<AddColumnDefinitionSegment>) visit(ctx.constraintClauses())).getValue());
583         }
584         // TODO More alter definition parse
585         return result;
586     }
587     
588     @SuppressWarnings("unchecked")
589     @Override
590     public ASTNode visitColumnClauses(final ColumnClausesContext ctx) {
591         CollectionValue<AlterDefinitionSegment> result = new CollectionValue<>();
592         for (OperateColumnClauseContext each : ctx.operateColumnClause()) {
593             if (null != each.addColumnSpecification()) {
594                 result.getValue().addAll(((CollectionValue<AddColumnDefinitionSegment>) visit(each.addColumnSpecification())).getValue());
595             }
596             if (null != each.modifyColumnSpecification()) {
597                 result.getValue().add((ModifyColumnDefinitionSegment) visit(each.modifyColumnSpecification()));
598             }
599             if (null != each.dropColumnClause()) {
600                 result.getValue().add((DropColumnDefinitionSegment) visit(each.dropColumnClause()));
601             }
602         }
603         if (null != ctx.modifyCollectionRetrieval()) {
604             result.getValue().add((ModifyCollectionRetrievalSegment) visit(ctx.modifyCollectionRetrieval()));
605         }
606         return result;
607     }
608     
609     @SuppressWarnings("unchecked")
610     @Override
611     public ASTNode visitConstraintClauses(final ConstraintClausesContext ctx) {
612         // TODO Support rename constraint
613         CollectionValue<AlterDefinitionSegment> result = new CollectionValue<>();
614         if (null != ctx.addConstraintSpecification()) {
615             result.combine((CollectionValue<AlterDefinitionSegment>) visit(ctx.addConstraintSpecification()));
616         }
617         if (null != ctx.modifyConstraintClause()) {
618             result.getValue().add((AlterDefinitionSegment) visit(ctx.modifyConstraintClause()));
619         }
620         for (DropConstraintClauseContext each : ctx.dropConstraintClause()) {
621             if (null != each.constraintName()) {
622                 result.getValue().add((AlterDefinitionSegment) visit(each));
623             }
624         }
625         return result;
626     }
627     
628     @Override
629     public ASTNode visitModifyCollectionRetrieval(final ModifyCollectionRetrievalContext ctx) {
630         return new ModifyCollectionRetrievalSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (SimpleTableSegment) visit(ctx.tableName()));
631     }
632     
633     @Override
634     public ASTNode visitAddColumnSpecification(final AddColumnSpecificationContext ctx) {
635         CollectionValue<AddColumnDefinitionSegment> result = new CollectionValue<>();
636         for (ColumnOrVirtualDefinitionContext each : ctx.columnOrVirtualDefinitions().columnOrVirtualDefinition()) {
637             if (null != each.columnDefinition()) {
638                 AddColumnDefinitionSegment addColumnDefinition = new AddColumnDefinitionSegment(
639                         each.columnDefinition().getStart().getStartIndex(), each.columnDefinition().getStop().getStopIndex(),
640                         Collections.singletonList((ColumnDefinitionSegment) visit(each.columnDefinition())));
641                 result.getValue().add(addColumnDefinition);
642             }
643         }
644         return result;
645     }
646     
647     @Override
648     public ASTNode visitModifyColumnSpecification(final ModifyColumnSpecificationContext ctx) {
649         // TODO handle no columnDefinition and multiple columnDefinitions
650         ColumnDefinitionSegment columnDefinition = null;
651         for (ModifyColPropertiesContext each : ctx.modifyColProperties()) {
652             columnDefinition = (ColumnDefinitionSegment) visit(each);
653         }
654         return new ModifyColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), columnDefinition);
655     }
656     
657     @Override
658     public ASTNode visitDropColumnClause(final DropColumnClauseContext ctx) {
659         if (null != ctx.dropColumnSpecification()) {
660             return visit(ctx.dropColumnSpecification());
661         }
662         Collection<ColumnSegment> columns = new LinkedList<>();
663         if (null != ctx.columnOrColumnList().columnName()) {
664             columns.add((ColumnSegment) visit(ctx.columnOrColumnList().columnName()));
665         } else {
666             for (ColumnNameContext each : ctx.columnOrColumnList().columnNames().columnName()) {
667                 columns.add((ColumnSegment) visit(each));
668             }
669         }
670         return new DropColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), columns);
671     }
672     
673     @Override
674     public ASTNode visitModifyColProperties(final ModifyColPropertiesContext ctx) {
675         ColumnSegment column = (ColumnSegment) visit(ctx.columnName());
676         DataTypeSegment dataType = null == ctx.dataType() ? null : (DataTypeSegment) visit(ctx.dataType());
677         // TODO visit pk and reference table
678         return new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataType, false, false, getText(ctx));
679     }
680     
681     @Override
682     public ASTNode visitDropColumnSpecification(final DropColumnSpecificationContext ctx) {
683         Collection<ColumnSegment> columns = new LinkedList<>();
684         if (null != ctx.columnOrColumnList().columnName()) {
685             columns.add((ColumnSegment) visit(ctx.columnOrColumnList().columnName()));
686         } else {
687             for (ColumnNameContext each : ctx.columnOrColumnList().columnNames().columnName()) {
688                 columns.add((ColumnSegment) visit(each));
689             }
690         }
691         return new DropColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), columns);
692     }
693     
694     @Override
695     public ASTNode visitAddConstraintSpecification(final AddConstraintSpecificationContext ctx) {
696         CollectionValue<AddConstraintDefinitionSegment> result = new CollectionValue<>();
697         for (OutOfLineConstraintContext each : ctx.outOfLineConstraint()) {
698             result.getValue().add(new AddConstraintDefinitionSegment(each.getStart().getStartIndex(), each.getStop().getStopIndex(), (ConstraintDefinitionSegment) visit(each)));
699         }
700         if (null != ctx.outOfLineRefConstraint()) {
701             result.getValue().add(new AddConstraintDefinitionSegment(ctx.outOfLineRefConstraint().getStart().getStartIndex(), ctx.outOfLineRefConstraint().getStop().getStopIndex(),
702                     (ConstraintDefinitionSegment) visit(ctx.outOfLineRefConstraint())));
703         }
704         return result;
705     }
706     
707     @Override
708     public ASTNode visitModifyConstraintClause(final ModifyConstraintClauseContext ctx) {
709         if (null != ctx.constraintOption().constraintWithName()) {
710             return new ModifyConstraintDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
711                     (ConstraintSegment) visit(ctx.constraintOption().constraintWithName().constraintName()));
712         } else {
713             return new ModifyConstraintDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), null);
714         }
715     }
716     
717     @Override
718     public ASTNode visitDropConstraintClause(final DropConstraintClauseContext ctx) {
719         return new DropConstraintDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (ConstraintSegment) visit(ctx.constraintName()));
720     }
721     
722     @Override
723     public ASTNode visitDropContext(final DropContextContext ctx) {
724         return new OracleDropContextStatement();
725     }
726     
727     @Override
728     public ASTNode visitDropTable(final DropTableContext ctx) {
729         DropTableStatement result = new DropTableStatement();
730         result.getTables().add((SimpleTableSegment) visit(ctx.tableName()));
731         return result;
732     }
733     
734     @Override
735     public ASTNode visitDropDatabaseLink(final DropDatabaseLinkContext ctx) {
736         return new OracleDropDatabaseLinkStatement();
737     }
738     
739     @Override
740     public ASTNode visitAlterDatabaseLink(final AlterDatabaseLinkContext ctx) {
741         return new OracleAlterDatabaseLinkStatement();
742     }
743     
744     @Override
745     public ASTNode visitAlterDatabaseDictionary(final AlterDatabaseDictionaryContext ctx) {
746         return new OracleAlterDatabaseDictionaryStatement();
747     }
748     
749     @Override
750     public ASTNode visitAlterView(final AlterViewContext ctx) {
751         AlterViewStatement result = new AlterViewStatement();
752         result.setView((SimpleTableSegment) visit(ctx.viewName()));
753         result.setConstraintDefinition((ConstraintDefinitionSegment) getAlterViewConstraintDefinition(ctx));
754         return result;
755     }
756     
757     private ASTNode getAlterViewConstraintDefinition(final AlterViewContext ctx) {
758         ConstraintDefinitionSegment result = null;
759         if (null != ctx.outOfLineConstraint()) {
760             result = (ConstraintDefinitionSegment) visit(ctx.outOfLineConstraint());
761         } else if (null != ctx.constraintName()) {
762             result = new ConstraintDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex());
763             result.setConstraintName((ConstraintSegment) visit(ctx.constraintName()));
764         }
765         return result;
766     }
767     
768     @Override
769     public ASTNode visitDropPackage(final DropPackageContext ctx) {
770         return new OracleDropPackageStatement();
771     }
772     
773     @Override
774     public ASTNode visitAlterPackage(final AlterPackageContext ctx) {
775         return new AlterPackageStatement();
776     }
777     
778     @Override
779     public ASTNode visitCreateSynonym(final CreateSynonymContext ctx) {
780         return new CreateSynonymStatement();
781     }
782     
783     @Override
784     public ASTNode visitDropSynonym(final DropSynonymContext ctx) {
785         return new DropSynonymStatement();
786     }
787     
788     @Override
789     public ASTNode visitCreateDirectory(final CreateDirectoryContext ctx) {
790         return new CreateDirectoryStatement();
791     }
792     
793     @Override
794     public ASTNode visitDropView(final DropViewContext ctx) {
795         DropViewStatement result = new DropViewStatement();
796         result.getViews().add((SimpleTableSegment) visit(ctx.viewName()));
797         return result;
798     }
799     
800     @Override
801     public ASTNode visitCreateEdition(final CreateEditionContext ctx) {
802         return new OracleCreateEditionStatement();
803     }
804     
805     @Override
806     public ASTNode visitDropTrigger(final DropTriggerContext ctx) {
807         return new DropTriggerStatement();
808     }
809     
810     @Override
811     public ASTNode visitCreateTrigger(final CreateTriggerContext ctx) {
812         return new CreateTriggerStatement();
813     }
814     
815     @Override
816     public ASTNode visitAlterTrigger(final AlterTriggerContext ctx) {
817         return new AlterTriggerStatement();
818     }
819     
820     @Override
821     public ASTNode visitTruncateTable(final TruncateTableContext ctx) {
822         return new TruncateStatement(Collections.singleton((SimpleTableSegment) visit(ctx.tableName())));
823     }
824     
825     @SuppressWarnings({"rawtypes", "unchecked"})
826     @Override
827     public ASTNode visitCreateIndex(final CreateIndexContext ctx) {
828         CreateIndexStatement result = new CreateIndexStatement();
829         if (null != ctx.createIndexDefinitionClause().tableIndexClause()) {
830             result.setTable((SimpleTableSegment) visit(ctx.createIndexDefinitionClause().tableIndexClause().tableName()));
831             result.getColumns().addAll(((CollectionValue) visit(ctx.createIndexDefinitionClause().tableIndexClause().indexExpressions())).getValue());
832         }
833         result.setIndex((IndexSegment) visit(ctx.indexName()));
834         return result;
835     }
836     
837     @Override
838     public ASTNode visitIndexExpressions(final IndexExpressionsContext ctx) {
839         CollectionValue<ColumnSegment> result = new CollectionValue<>();
840         for (IndexExpressionContext each : ctx.indexExpression()) {
841             ASTNode astNode = visit(each);
842             if (astNode instanceof ColumnSegment) {
843                 result.getValue().add((ColumnSegment) astNode);
844             }
845             if (astNode instanceof FunctionSegment) {
846                 ((FunctionSegment) astNode).getParameters().forEach(parameter -> {
847                     if (parameter instanceof ColumnSegment) {
848                         result.getValue().add((ColumnSegment) parameter);
849                     }
850                 });
851             }
852         }
853         return result;
854     }
855     
856     @Override
857     public ASTNode visitIndexExpression(final IndexExpressionContext ctx) {
858         return null == ctx.expr() ? visit(ctx.columnName()) : visit(ctx.expr());
859     }
860     
861     @Override
862     public ASTNode visitAlterIndex(final AlterIndexContext ctx) {
863         AlterIndexStatement result = new AlterIndexStatement();
864         result.setIndex((IndexSegment) visit(ctx.indexName()));
865         return result;
866     }
867     
868     @Override
869     public ASTNode visitDropIndex(final DropIndexContext ctx) {
870         DropIndexStatement result = new DropIndexStatement();
871         result.getIndexes().add((IndexSegment) visit(ctx.indexName()));
872         return result;
873     }
874     
875     @Override
876     public ASTNode visitAlterSynonym(final AlterSynonymContext ctx) {
877         return new AlterSynonymStatement();
878     }
879     
880     @Override
881     public ASTNode visitAlterSession(final AlterSessionContext ctx) {
882         return new OracleAlterSessionStatement();
883     }
884     
885     @Override
886     public ASTNode visitAlterDatabase(final AlterDatabaseContext ctx) {
887         return new AlterDatabaseStatement();
888     }
889     
890     @Override
891     public ASTNode visitAlterSystem(final AlterSystemContext ctx) {
892         return new OracleAlterSystemStatement();
893     }
894     
895     @Override
896     public ASTNode visitAnalyze(final AnalyzeContext ctx) {
897         return new AnalyzeStatement(null == ctx.tableName() ? null : (SimpleTableSegment) visit(ctx.tableName()), null == ctx.indexName() ? null : (IndexSegment) visit(ctx.indexName()));
898     }
899     
900     @Override
901     public ASTNode visitAssociateStatistics(final AssociateStatisticsContext ctx) {
902         OracleAssociateStatisticsStatement result = new OracleAssociateStatisticsStatement();
903         if (null != ctx.columnAssociation()) {
904             for (TableNameContext each : ctx.columnAssociation().tableName()) {
905                 result.getTables().add((SimpleTableSegment) visit(each));
906             }
907             for (ColumnNameContext each : ctx.columnAssociation().columnName()) {
908                 result.getColumns().add((ColumnSegment) visit(each));
909             }
910         }
911         if (null != ctx.functionAssociation()) {
912             for (IndexNameContext each : ctx.functionAssociation().indexName()) {
913                 result.getIndexes().add((IndexSegment) visit(each));
914             }
915             for (FunctionContext each : ctx.functionAssociation().function()) {
916                 result.getFunctions().add((FunctionSegment) visit(each));
917             }
918             for (PackageNameContext each : ctx.functionAssociation().packageName()) {
919                 result.getPackages().add((PackageSegment) visit(each));
920             }
921             for (TypeNameContext each : ctx.functionAssociation().typeName()) {
922                 result.getTypes().add((TypeSegment) visit(each));
923             }
924             for (IndexTypeNameContext each : ctx.functionAssociation().indexTypeName()) {
925                 result.getIndexTypes().add((IndexTypeSegment) visit(each));
926             }
927         }
928         return result;
929     }
930     
931     @Override
932     public ASTNode visitDisassociateStatistics(final DisassociateStatisticsContext ctx) {
933         OracleDisassociateStatisticsStatement result = new OracleDisassociateStatisticsStatement();
934         if (null != ctx.tableName()) {
935             for (TableNameContext each : ctx.tableName()) {
936                 result.getTables().add((SimpleTableSegment) visit(each));
937             }
938             for (ColumnNameContext each : ctx.columnName()) {
939                 result.getColumns().add((ColumnSegment) visit(each));
940             }
941         }
942         if (null != ctx.indexName()) {
943             for (IndexNameContext each : ctx.indexName()) {
944                 result.getIndexes().add((IndexSegment) visit(each));
945             }
946         }
947         if (null != ctx.function()) {
948             for (FunctionContext each : ctx.function()) {
949                 result.getFunctions().add((FunctionSegment) visit(each));
950             }
951         }
952         if (null != ctx.packageName()) {
953             for (PackageNameContext each : ctx.packageName()) {
954                 result.getPackages().add((PackageSegment) visit(each));
955             }
956         }
957         if (null != ctx.typeName()) {
958             for (TypeNameContext each : ctx.typeName()) {
959                 result.getTypes().add((TypeSegment) visit(each));
960             }
961         }
962         if (null != ctx.indexTypeName()) {
963             for (IndexTypeNameContext each : ctx.indexTypeName()) {
964                 result.getIndexTypes().add((IndexTypeSegment) visit(each));
965             }
966         }
967         return result;
968     }
969     
970     @Override
971     public ASTNode visitAudit(final AuditContext ctx) {
972         return null == ctx.auditTraditional() ? visit(ctx.auditUnified()) : visit(ctx.auditTraditional());
973     }
974     
975     @Override
976     public ASTNode visitAuditTraditional(final AuditTraditionalContext ctx) {
977         return new OracleAuditStatement();
978     }
979     
980     @Override
981     public ASTNode visitAuditUnified(final AuditUnifiedContext ctx) {
982         return new OracleAuditStatement();
983     }
984     
985     @Override
986     public ASTNode visitNoAudit(final NoAuditContext ctx) {
987         return new OracleNoAuditStatement();
988     }
989     
990     @Override
991     public ASTNode visitComment(final CommentContext ctx) {
992         CommentStatement result = new CommentStatement();
993         if (null != ctx.tableName()) {
994             result.setTable((SimpleTableSegment) visit(ctx.tableName()));
995         }
996         if (null != ctx.columnName()) {
997             result.setColumn((ColumnSegment) visit(ctx.columnName()));
998         }
999         if (null != ctx.indexTypeName()) {
1000             result.setIndexType((IndexTypeSegment) visit(ctx.indexTypeName()));
1001         }
1002         result.setComment(new IdentifierValue(ctx.STRING_().getText()));
1003         return result;
1004     }
1005     
1006     @Override
1007     public ASTNode visitFlashbackDatabase(final FlashbackDatabaseContext ctx) {
1008         return new OracleFlashbackDatabaseStatement();
1009     }
1010     
1011     @Override
1012     public ASTNode visitFlashbackTable(final FlashbackTableContext ctx) {
1013         return new OracleFlashbackTableStatement((SimpleTableSegment) visit(ctx.tableName()), null == ctx.renameToTable() ? null : (SimpleTableSegment) visit(ctx.renameToTable().tableName()));
1014     }
1015     
1016     @Override
1017     public ASTNode visitPurge(final PurgeContext ctx) {
1018         return new OraclePurgeStatement(null == ctx.tableName() ? null : (SimpleTableSegment) visit(ctx.tableName()), null == ctx.indexName() ? null : (IndexSegment) visit(ctx.indexName()));
1019     }
1020     
1021     @Override
1022     public ASTNode visitRename(final RenameContext ctx) {
1023         return new OracleRenameStatement();
1024     }
1025     
1026     @Override
1027     public ASTNode visitCreateDatabase(final CreateDatabaseContext ctx) {
1028         return new CreateDatabaseStatement(null, false);
1029     }
1030     
1031     @Override
1032     public ASTNode visitCreateDatabaseLink(final CreateDatabaseLinkContext ctx) {
1033         return new OracleCreateDatabaseLinkStatement();
1034     }
1035     
1036     @Override
1037     public ASTNode visitCreateDimension(final CreateDimensionContext ctx) {
1038         return new OracleCreateDimensionStatement();
1039     }
1040     
1041     @Override
1042     public ASTNode visitAlterDimension(final AlterDimensionContext ctx) {
1043         return new OracleAlterDimensionStatement();
1044     }
1045     
1046     @Override
1047     public ASTNode visitDropDimension(final DropDimensionContext ctx) {
1048         return new OracleDropDimensionStatement();
1049     }
1050     
1051     @Override
1052     public ASTNode visitDropDirectory(final DropDirectoryContext ctx) {
1053         return new DropDirectoryStatement();
1054     }
1055     
1056     @Override
1057     public ASTNode visitCreateFunction(final CreateFunctionContext ctx) {
1058         return visitCreateFunction0(ctx);
1059     }
1060     
1061     private ASTNode visitCreateFunction0(final CreateFunctionContext ctx) {
1062         if (null != ctx.plsqlFunctionSource().declareSection()) {
1063             visit(ctx.plsqlFunctionSource().declareSection());
1064         }
1065         if (null != ctx.plsqlFunctionSource().body()) {
1066             visit(ctx.plsqlFunctionSource().body());
1067         }
1068         getSqlStatementsInPlsql().sort(Comparator.comparingInt(SQLStatementSegment::getStartIndex));
1069         getProcedureCallNames().sort(Comparator.comparingInt(ProcedureCallNameSegment::getStartIndex));
1070         getDynamicSqlStatementExpressions().sort(Comparator.comparingInt(ExpressionSegment::getStartIndex));
1071         OracleCreateFunctionStatement result = new OracleCreateFunctionStatement(getSqlStatementsInPlsql(), getProcedureCallNames());
1072         result.setFunctionName(visitFunctionName(ctx.plsqlFunctionSource()));
1073         result.getDynamicSqlStatementExpressions().addAll(getDynamicSqlStatementExpressions());
1074         return result;
1075     }
1076     
1077     private FunctionNameSegment visitFunctionName(final PlsqlFunctionSourceContext ctx) {
1078         OwnerContext schema = ctx.function().owner();
1079         IdentifierValue functionName = (IdentifierValue) visit(ctx.function().name().identifier());
1080         if (null == schema) {
1081             return new FunctionNameSegment(ctx.function().name().start.getStartIndex(), ctx.function().name().stop.getStopIndex(), functionName);
1082         }
1083         OwnerSegment owner = new OwnerSegment(schema.start.getStartIndex(), schema.stop.getStopIndex(), (IdentifierValue) visit(schema.identifier()));
1084         FunctionNameSegment result = new FunctionNameSegment(ctx.function().start.getStartIndex(), ctx.function().stop.getStopIndex(), functionName);
1085         result.setOwner(owner);
1086         return result;
1087     }
1088     
1089     @Override
1090     public ASTNode visitDropEdition(final DropEditionContext ctx) {
1091         return new OracleDropEditionStatement();
1092     }
1093     
1094     @Override
1095     public ASTNode visitDropOutline(final DropOutlineContext ctx) {
1096         return new OracleDropOutlineStatement();
1097     }
1098     
1099     @Override
1100     public ASTNode visitAlterOutline(final AlterOutlineContext ctx) {
1101         return new OracleAlterOutlineStatement();
1102     }
1103     
1104     @Override
1105     public ASTNode visitAlterAnalyticView(final AlterAnalyticViewContext ctx) {
1106         return new OracleAlterAnalyticViewStatement();
1107     }
1108     
1109     @Override
1110     public ASTNode visitAlterAttributeDimension(final AlterAttributeDimensionContext ctx) {
1111         return new OracleAlterAttributeDimensionStatement();
1112     }
1113     
1114     @Override
1115     public ASTNode visitCreateSequence(final CreateSequenceContext ctx) {
1116         return new CreateSequenceStatement(ctx.sequenceName().getText());
1117     }
1118     
1119     @Override
1120     public ASTNode visitAlterSequence(final AlterSequenceContext ctx) {
1121         return new AlterSequenceStatement(null);
1122     }
1123     
1124     @Override
1125     public ASTNode visitCreateContext(final CreateContextContext ctx) {
1126         return new OracleCreateContextStatement();
1127     }
1128     
1129     @Override
1130     public ASTNode visitCreateSPFile(final CreateSPFileContext ctx) {
1131         return new OracleCreateSPFileStatement();
1132     }
1133     
1134     @Override
1135     public ASTNode visitCreatePFile(final CreatePFileContext ctx) {
1136         return new OracleCreatePFileStatement();
1137     }
1138     
1139     @Override
1140     public ASTNode visitCreateControlFile(final CreateControlFileContext ctx) {
1141         return new OracleCreateControlFileStatement();
1142     }
1143     
1144     @Override
1145     public ASTNode visitCreateFlashbackArchive(final CreateFlashbackArchiveContext ctx) {
1146         return new OracleCreateFlashbackArchiveStatement();
1147     }
1148     
1149     @Override
1150     public ASTNode visitAlterFlashbackArchive(final AlterFlashbackArchiveContext ctx) {
1151         return new OracleAlterFlashbackArchiveStatement();
1152     }
1153     
1154     @Override
1155     public ASTNode visitDropFlashbackArchive(final DropFlashbackArchiveContext ctx) {
1156         return new OracleDropFlashbackArchiveStatement();
1157     }
1158     
1159     @Override
1160     public ASTNode visitCreateDiskgroup(final CreateDiskgroupContext ctx) {
1161         return new OracleCreateDiskgroupStatement();
1162     }
1163     
1164     @Override
1165     public ASTNode visitDropDiskgroup(final DropDiskgroupContext ctx) {
1166         return new OracleDropDiskgroupStatement();
1167     }
1168     
1169     @Override
1170     public ASTNode visitCreateRollbackSegment(final CreateRollbackSegmentContext ctx) {
1171         return new OracleCreateRollbackSegmentStatement();
1172     }
1173     
1174     @Override
1175     public ASTNode visitDropRollbackSegment(final DropRollbackSegmentContext ctx) {
1176         return new OracleDropRollbackSegmentStatement();
1177     }
1178     
1179     @Override
1180     public ASTNode visitDropTableSpace(final DropTableSpaceContext ctx) {
1181         return new DropTablespaceStatement();
1182     }
1183     
1184     @Override
1185     public ASTNode visitCreateLockdownProfile(final CreateLockdownProfileContext ctx) {
1186         return new OracleCreateLockdownProfileStatement();
1187     }
1188     
1189     @Override
1190     public ASTNode visitDropLockdownProfile(final DropLockdownProfileContext ctx) {
1191         return new OracleDropLockdownProfileStatement();
1192     }
1193     
1194     @Override
1195     public ASTNode visitCreateInmemoryJoinGroup(final CreateInmemoryJoinGroupContext ctx) {
1196         return new OracleCreateInMemoryJoinGroupStatement();
1197     }
1198     
1199     @Override
1200     public ASTNode visitAlterInmemoryJoinGroup(final AlterInmemoryJoinGroupContext ctx) {
1201         return new OracleAlterInMemoryJoinGroupStatement();
1202     }
1203     
1204     @Override
1205     public ASTNode visitDropInmemoryJoinGroup(final DropInmemoryJoinGroupContext ctx) {
1206         return new OracleDropInMemoryJoinGroupStatement();
1207     }
1208     
1209     @Override
1210     public ASTNode visitCreateRestorePoint(final CreateRestorePointContext ctx) {
1211         return new OracleCreateRestorePointStatement();
1212     }
1213     
1214     @Override
1215     public ASTNode visitDropRestorePoint(final DropRestorePointContext ctx) {
1216         return new OracleDropRestorePointStatement();
1217     }
1218     
1219     @Override
1220     public ASTNode visitAlterOperator(final AlterOperatorContext ctx) {
1221         return new AlterOperatorStatement();
1222     }
1223     
1224     @Override
1225     public ASTNode visitAlterProfile(final AlterProfileContext ctx) {
1226         return new OracleAlterProfileStatement();
1227     }
1228     
1229     @Override
1230     public ASTNode visitAlterRollbackSegment(final AlterRollbackSegmentContext ctx) {
1231         return new OracleAlterRollbackSegmentStatement();
1232     }
1233     
1234     @Override
1235     public ASTNode visitDropOperator(final DropOperatorContext ctx) {
1236         return new DropOperatorStatement();
1237     }
1238     
1239     @Override
1240     public ASTNode visitDropSequence(final DropSequenceContext ctx) {
1241         return new DropSequenceStatement(Collections.emptyList());
1242     }
1243     
1244     @Override
1245     public ASTNode visitAlterLibrary(final AlterLibraryContext ctx) {
1246         return new OracleAlterLibraryStatement();
1247     }
1248     
1249     @Override
1250     public ASTNode visitDropType(final DropTypeContext ctx) {
1251         return new OracleDropPackageStatement();
1252     }
1253     
1254     @Override
1255     public ASTNode visitAlterMaterializedZonemap(final AlterMaterializedZonemapContext ctx) {
1256         return new OracleAlterMaterializedZoneMapStatement();
1257     }
1258     
1259     @Override
1260     public ASTNode visitAlterJava(final AlterJavaContext ctx) {
1261         return new OracleAlterJavaStatement();
1262     }
1263     
1264     @Override
1265     public ASTNode visitAlterAuditPolicy(final AlterAuditPolicyContext ctx) {
1266         return new OracleAlterAuditPolicyStatement();
1267     }
1268     
1269     @Override
1270     public ASTNode visitAlterCluster(final AlterClusterContext ctx) {
1271         return new OracleAlterClusterStatement();
1272     }
1273     
1274     @Override
1275     public ASTNode visitAlterDiskgroup(final AlterDiskgroupContext ctx) {
1276         return new OracleAlterDiskgroupStatement();
1277     }
1278     
1279     @Override
1280     public ASTNode visitAlterIndexType(final AlterIndexTypeContext ctx) {
1281         return new OracleAlterIndexTypeStatement();
1282     }
1283     
1284     @Override
1285     public ASTNode visitAlterMaterializedView(final AlterMaterializedViewContext ctx) {
1286         return new AlterMaterializedViewStatement();
1287     }
1288     
1289     @Override
1290     public ASTNode visitAlterMaterializedViewLog(final AlterMaterializedViewLogContext ctx) {
1291         return new OracleAlterMaterializedViewLogStatement();
1292     }
1293     
1294     @Override
1295     public ASTNode visitAlterFunction(final AlterFunctionContext ctx) {
1296         return new AlterFunctionStatement();
1297     }
1298     
1299     @Override
1300     public ASTNode visitAlterHierarchy(final AlterHierarchyContext ctx) {
1301         return new OracleAlterHierarchyStatement();
1302     }
1303     
1304     @Override
1305     public ASTNode visitAlterLockdownProfile(final AlterLockdownProfileContext ctx) {
1306         return new OracleAlterLockdownProfileStatement();
1307     }
1308     
1309     @Override
1310     public ASTNode visitAlterPluggableDatabase(final AlterPluggableDatabaseContext ctx) {
1311         return new OracleAlterPluggableDatabaseStatement();
1312     }
1313     
1314     @Override
1315     public ASTNode visitCreateProcedure(final CreateProcedureContext ctx) {
1316         return visitCreateProcedure0(ctx);
1317     }
1318     
1319     private ASTNode visitCreateProcedure0(final CreateProcedureContext ctx) {
1320         if (null != ctx.plsqlProcedureSource().parameterDeclaration()) {
1321             for (ParameterDeclarationContext each : ctx.plsqlProcedureSource().parameterDeclaration()) {
1322                 visit(each);
1323             }
1324         }
1325         if (null != ctx.plsqlProcedureSource().declareSection()) {
1326             visit(ctx.plsqlProcedureSource().declareSection());
1327         }
1328         if (null != ctx.plsqlProcedureSource().body()) {
1329             visit(ctx.plsqlProcedureSource().body());
1330         }
1331         getSqlStatementsInPlsql().sort(Comparator.comparingInt(SQLStatementSegment::getStartIndex));
1332         getProcedureCallNames().sort(Comparator.comparingInt(ProcedureCallNameSegment::getStartIndex));
1333         getDynamicSqlStatementExpressions().sort(Comparator.comparingInt(ExpressionSegment::getStartIndex));
1334         OracleCreateProcedureStatement result = new OracleCreateProcedureStatement();
1335         result.getProcedureCallNames().addAll(getProcedureCallNames());
1336         result.getProcedureBodyEndNameSegments().addAll(getProcedureBodyEndNameSegments());
1337         result.getDynamicSqlStatementExpressions().addAll(getDynamicSqlStatementExpressions());
1338         result.setProcedureName(visitProcedureName(ctx.plsqlProcedureSource()));
1339         result.getSqlStatements().addAll(getSqlStatementsInPlsql());
1340         result.getVariableNames().addAll(getVariableNames());
1341         getSqlStatementsInPlsql().forEach(each -> each.getSqlStatement().getVariableNames().addAll(getVariableNames()));
1342         result.getCursorForLoopStatements().addAll(getCursorForLoopStatementSegments());
1343         return result;
1344     }
1345     
1346     @Override
1347     public ASTNode visitParameterDeclaration(final ParameterDeclarationContext ctx) {
1348         if (null != ctx.parameterName()) {
1349             IdentifierValue paramName = (IdentifierValue) visit(ctx.parameterName().identifier());
1350             getVariableNames().add(paramName.getValue().toLowerCase());
1351             return new VariableSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), paramName.getValue());
1352         }
1353         return super.visitParameterDeclaration(ctx);
1354     }
1355     
1356     @Override
1357     public ASTNode visitItemDeclaration(final ItemDeclarationContext ctx) {
1358         CollectionValue<VariableSegment> result = new CollectionValue<>();
1359         if (null != ctx.collectionVariableDecl() && null != ctx.collectionVariableDecl().variableName()) {
1360             for (VariableNameContext each : ctx.collectionVariableDecl().variableName()) {
1361                 getVariableSegment(each).ifPresent(optional -> result.getValue().add(optional));
1362             }
1363         }
1364         if (null != ctx.constantDeclaration() && null != ctx.constantDeclaration().variableName()) {
1365             getVariableSegment(ctx.constantDeclaration().variableName()).ifPresent(optional -> result.getValue().add(optional));
1366         }
1367         if (null != ctx.cursorVariableDeclaration() && null != ctx.cursorVariableDeclaration().variableName()) {
1368             getVariableSegment(ctx.cursorVariableDeclaration().variableName()).ifPresent(optional -> result.getValue().add(optional));
1369         }
1370         if (null != ctx.exceptionDeclaration() && null != ctx.exceptionDeclaration().variableName()) {
1371             getVariableSegment(ctx.exceptionDeclaration().variableName()).ifPresent(optional -> result.getValue().add(optional));
1372         }
1373         if (null != ctx.recordVariableDeclaration() && null != ctx.recordVariableDeclaration().variableName()) {
1374             getVariableSegment(ctx.recordVariableDeclaration().variableName()).ifPresent(optional -> result.getValue().add(optional));
1375         }
1376         if (null != ctx.variableDeclaration() && null != ctx.variableDeclaration().variableName()) {
1377             getVariableSegment(ctx.variableDeclaration().variableName()).ifPresent(optional -> result.getValue().add(optional));
1378         }
1379         return result;
1380     }
1381     
1382     private Optional<VariableSegment> getVariableSegment(final VariableNameContext variableNameContext) {
1383         if (null == variableNameContext) {
1384             return Optional.empty();
1385         }
1386         if (null != variableNameContext.identifier()) {
1387             String variableName = ((IdentifierValue) visitIdentifier(variableNameContext.identifier())).getValue().toLowerCase();
1388             getVariableNames().add(variableName);
1389             return Optional.of(new VariableSegment(variableNameContext.start.getStartIndex(), variableNameContext.stop.getStopIndex(), variableName));
1390         }
1391         if (null != variableNameContext.stringLiterals()) {
1392             String variableName = variableNameContext.stringLiterals().STRING_().getText().toLowerCase();
1393             getVariableNames().add(variableName);
1394             return Optional.of(new VariableSegment(variableNameContext.start.getStartIndex(), variableNameContext.stop.getStopIndex(), variableName));
1395         }
1396         return Optional.empty();
1397     }
1398     
1399     @Override
1400     public ASTNode visitCollectionVariableDecl(final CollectionVariableDeclContext ctx) {
1401         if (null == ctx.variableName()) {
1402             return super.visitCollectionVariableDecl(ctx);
1403         }
1404         CollectionValue<VariableSegment> result = new CollectionValue<>();
1405         for (VariableNameContext each : ctx.variableName()) {
1406             getVariableSegment(each).ifPresent(optional -> result.getValue().add(optional));
1407         }
1408         return result;
1409     }
1410     
1411     private FunctionNameSegment visitProcedureName(final PlsqlProcedureSourceContext ctx) {
1412         SchemaNameContext schemaName = ctx.schemaName();
1413         IdentifierValue procedureName = (IdentifierValue) visit(ctx.procedureName().identifier());
1414         if (null == schemaName) {
1415             return new FunctionNameSegment(ctx.procedureName().start.getStartIndex(), ctx.procedureName().stop.getStopIndex(), procedureName);
1416         }
1417         OwnerSegment owner = new OwnerSegment(schemaName.start.getStartIndex(), schemaName.stop.getStopIndex(), (IdentifierValue) visit(schemaName.identifier()));
1418         FunctionNameSegment result = new FunctionNameSegment(schemaName.start.getStartIndex(), ctx.procedureName().stop.getStopIndex(), procedureName);
1419         result.setOwner(owner);
1420         return result;
1421     }
1422     
1423     @Override
1424     public ASTNode visitCursorDefinition(final CursorDefinitionContext ctx) {
1425         SQLStatement statement = visitSelect0(ctx.select());
1426         getCursorStatements().put(null != ctx.variableName().identifier() ? new IdentifierValue(ctx.variableName().getText()).getValue()
1427                 : new StringLiteralValue(ctx.variableName().getText()).getValue(), statement);
1428         return defaultResult();
1429     }
1430     
1431     @Override
1432     public ASTNode visitBody(final BodyContext ctx) {
1433         for (StatementContext each : ctx.statement()) {
1434             visit(each);
1435         }
1436         for (ExceptionHandlerContext eachExceptionHandler : ctx.exceptionHandler()) {
1437             for (StatementContext each : eachExceptionHandler.statement()) {
1438                 visit(each);
1439             }
1440         }
1441         if (null != ctx.identifier()) {
1442             getProcedureBodyEndNameSegments().add(
1443                     new ProcedureBodyEndNameSegment(ctx.identifier().getStart().getStartIndex(), ctx.identifier().getStop().getStopIndex(), new IdentifierValue(ctx.identifier().getText())));
1444         }
1445         return defaultResult();
1446     }
1447     
1448     @Override
1449     public ASTNode visitProcedureCall(final ProcedureCallContext ctx) {
1450         int startIndex = ctx.procedureName().start.getStartIndex();
1451         PackageSegment packageSegment = null;
1452         if (null != ctx.packageName()) {
1453             startIndex = ctx.packageName().start.getStartIndex();
1454             packageSegment = (PackageSegment) visit(ctx.packageName());
1455         }
1456         ProcedureCallNameSegment result = new ProcedureCallNameSegment(startIndex, ctx.procedureName().stop.getStopIndex(), (IdentifierValue) visit(ctx.procedureName().identifier()));
1457         result.setPackageSegment(packageSegment);
1458         getProcedureCallNames().add(result);
1459         return defaultResult();
1460     }
1461     
1462     @Override
1463     public ASTNode visitCursorForLoopStatement(final CursorForLoopStatementContext ctx) {
1464         SQLStatement relatedCursorStatement;
1465         String cursorName = null;
1466         if (null != ctx.select()) {
1467             relatedCursorStatement = visitSelect0(ctx.select());
1468         } else {
1469             cursorName = null == ctx.cursor().variableName().identifier()
1470                     ? new StringLiteralValue(ctx.cursor().getText()).getValue()
1471                     : new IdentifierValue(ctx.cursor().getText()).getValue();
1472             relatedCursorStatement = getCursorStatements().get(cursorName);
1473         }
1474         increaseCursorForLoopLevel();
1475         for (StatementContext each : ctx.statement()) {
1476             visit(each);
1477         }
1478         Set<SQLStatement> sqlStatements = getTempCursorForLoopStatements().remove(getCursorForLoopLevel());
1479         CursorForLoopStatementSegment cursorForLoopStatementSegment = new CursorForLoopStatementSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
1480                 new IdentifierValue(ctx.record().getText()).getValue(), cursorName, relatedCursorStatement, null == sqlStatements ? Collections.emptyList() : sqlStatements);
1481         getCursorForLoopStatementSegments().add(cursorForLoopStatementSegment);
1482         decreaseCursorForLoopLevel();
1483         return defaultResult();
1484     }
1485     
1486     @Override
1487     public ASTNode visitOpenForStatement(final OpenForStatementContext ctx) {
1488         if (null != ctx.select()) {
1489             visitSelect0(ctx.select());
1490         }
1491         // TODO handle SQL in dynamicString
1492         return defaultResult();
1493     }
1494     
1495     private SQLStatement visitSelect0(final SelectContext select) {
1496         OracleStatementVisitor visitor = createOracleDMLStatementVisitor();
1497         SQLStatement result = (SQLStatement) visitor.visitSelect(select);
1498         getSqlStatementsInPlsql().add(new SQLStatementSegment(select.start.getStartIndex(), select.stop.getStopIndex(), result));
1499         addToTempCursorForLoopStatements(result);
1500         return result;
1501     }
1502     
1503     private void addToTempCursorForLoopStatements(final SQLStatement sqlStatement) {
1504         if (0 == getCursorForLoopLevel()) {
1505             return;
1506         }
1507         for (int i = 1; i <= getCursorForLoopLevel(); i++) {
1508             getTempCursorForLoopStatements().computeIfAbsent(i, key -> new LinkedHashSet<>()).add(sqlStatement);
1509         }
1510     }
1511     
1512     @Override
1513     public ASTNode visitSqlStatementInPlsql(final SqlStatementInPlsqlContext ctx) {
1514         if (null != ctx.commit()) {
1515             OracleStatementVisitor visitor = createOracleTCLStatementVisitor();
1516             SQLStatement result = (SQLStatement) visitor.visitCommit(ctx.commit());
1517             getSqlStatementsInPlsql().add(new SQLStatementSegment(ctx.commit().start.getStartIndex(), ctx.commit().stop.getStopIndex(), result));
1518             addToTempCursorForLoopStatements(result);
1519         }
1520         // TODO visit collection_method_call
1521         if (null != ctx.delete()) {
1522             OracleStatementVisitor visitor = createOracleDMLStatementVisitor();
1523             SQLStatement result = (SQLStatement) visitor.visitDelete(ctx.delete());
1524             getSqlStatementsInPlsql().add(new SQLStatementSegment(ctx.delete().start.getStartIndex(), ctx.delete().stop.getStopIndex(), result));
1525             addToTempCursorForLoopStatements(result);
1526         }
1527         if (null != ctx.insert()) {
1528             OracleStatementVisitor visitor = createOracleDMLStatementVisitor();
1529             SQLStatement result = (SQLStatement) visitor.visitInsert(ctx.insert());
1530             getSqlStatementsInPlsql().add(new SQLStatementSegment(ctx.insert().start.getStartIndex(), ctx.insert().stop.getStopIndex(), result));
1531             addToTempCursorForLoopStatements(result);
1532         }
1533         if (null != ctx.lock()) {
1534             OracleStatementVisitor visitor = createOracleDMLStatementVisitor();
1535             SQLStatement result = (SQLStatement) visitor.visitLock(ctx.lock());
1536             getSqlStatementsInPlsql().add(new SQLStatementSegment(ctx.lock().start.getStartIndex(), ctx.lock().stop.getStopIndex(), result));
1537             addToTempCursorForLoopStatements(result);
1538         }
1539         if (null != ctx.merge()) {
1540             OracleStatementVisitor visitor = createOracleDMLStatementVisitor();
1541             SQLStatement result = (SQLStatement) visitor.visitMerge(ctx.merge());
1542             getSqlStatementsInPlsql().add(new SQLStatementSegment(ctx.merge().start.getStartIndex(), ctx.merge().stop.getStopIndex(), result));
1543             addToTempCursorForLoopStatements(result);
1544         }
1545         if (null != ctx.rollback()) {
1546             OracleStatementVisitor visitor = createOracleTCLStatementVisitor();
1547             SQLStatement result = (SQLStatement) visitor.visitRollback(ctx.rollback());
1548             getSqlStatementsInPlsql().add(new SQLStatementSegment(ctx.rollback().start.getStartIndex(), ctx.rollback().stop.getStopIndex(), result));
1549             addToTempCursorForLoopStatements(result);
1550         }
1551         if (null != ctx.savepoint()) {
1552             OracleStatementVisitor visitor = createOracleTCLStatementVisitor();
1553             SQLStatement result = (SQLStatement) visitor.visitSavepoint(ctx.savepoint());
1554             getSqlStatementsInPlsql().add(new SQLStatementSegment(ctx.savepoint().start.getStartIndex(), ctx.savepoint().stop.getStopIndex(), result));
1555             addToTempCursorForLoopStatements(result);
1556         }
1557         if (null != ctx.setTransaction()) {
1558             OracleStatementVisitor visitor = createOracleTCLStatementVisitor();
1559             SQLStatement result = (SQLStatement) visitor.visitSetTransaction(ctx.setTransaction());
1560             getSqlStatementsInPlsql().add(new SQLStatementSegment(ctx.setTransaction().start.getStartIndex(), ctx.setTransaction().stop.getStopIndex(), result));
1561             addToTempCursorForLoopStatements(result);
1562         }
1563         if (null != ctx.update()) {
1564             OracleStatementVisitor visitor = createOracleDMLStatementVisitor();
1565             SQLStatement result = (SQLStatement) visitor.visitUpdate(ctx.update());
1566             getSqlStatementsInPlsql().add(new SQLStatementSegment(ctx.update().start.getStartIndex(), ctx.update().stop.getStopIndex(), result));
1567             addToTempCursorForLoopStatements(result);
1568         }
1569         return defaultResult();
1570     }
1571     
1572     private OracleStatementVisitor createOracleTCLStatementVisitor() {
1573         OracleStatementVisitor result = new OracleTCLStatementVisitor();
1574         result.getVariableNames().addAll(getVariableNames());
1575         return result;
1576     }
1577     
1578     private OracleStatementVisitor createOracleDMLStatementVisitor() {
1579         OracleStatementVisitor result = new OracleDMLStatementVisitor();
1580         result.getVariableNames().addAll(getVariableNames());
1581         return result;
1582     }
1583     
1584     @Override
1585     public ASTNode visitDmlStatement(final DmlStatementContext ctx) {
1586         if (null != ctx.insert()) {
1587             OracleStatementVisitor visitor = createOracleDMLStatementVisitor();
1588             SQLStatement result = (SQLStatement) visitor.visitInsert(ctx.insert());
1589             getSqlStatementsInPlsql().add(new SQLStatementSegment(ctx.insert().start.getStartIndex(), ctx.insert().stop.getStopIndex(), result));
1590             addToTempCursorForLoopStatements(result);
1591         }
1592         if (null != ctx.update()) {
1593             OracleStatementVisitor visitor = createOracleDMLStatementVisitor();
1594             SQLStatement result = (SQLStatement) visitor.visitUpdate(ctx.update());
1595             getSqlStatementsInPlsql().add(new SQLStatementSegment(ctx.update().start.getStartIndex(), ctx.update().stop.getStopIndex(), result));
1596             addToTempCursorForLoopStatements(result);
1597         }
1598         if (null != ctx.delete()) {
1599             OracleStatementVisitor visitor = createOracleDMLStatementVisitor();
1600             SQLStatement result = (SQLStatement) visitor.visitDelete(ctx.delete());
1601             getSqlStatementsInPlsql().add(new SQLStatementSegment(ctx.delete().start.getStartIndex(), ctx.delete().stop.getStopIndex(), result));
1602             addToTempCursorForLoopStatements(result);
1603         }
1604         if (null != ctx.merge()) {
1605             OracleStatementVisitor visitor = createOracleDMLStatementVisitor();
1606             SQLStatement result = (SQLStatement) visitor.visitMerge(ctx.merge());
1607             getSqlStatementsInPlsql().add(new SQLStatementSegment(ctx.merge().start.getStartIndex(), ctx.merge().stop.getStopIndex(), result));
1608             addToTempCursorForLoopStatements(result);
1609         }
1610         // TODO Handling dynamicSqlStmt if we can
1611         return defaultResult();
1612     }
1613     
1614     @Override
1615     public ASTNode visitSelectIntoStatement(final SelectIntoStatementContext ctx) {
1616         // TODO Visit intoClause
1617         OracleStatementVisitor visitor = createOracleDMLStatementVisitor();
1618         SelectStatement result = (SelectStatement) visitor.visitSelectIntoStatement(ctx);
1619         getSqlStatementsInPlsql().add(new SQLStatementSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), result));
1620         addToTempCursorForLoopStatements(result);
1621         return result;
1622     }
1623     
1624     @Override
1625     public ASTNode visitDynamicSqlStmt(final DynamicSqlStmtContext ctx) {
1626         ExpressionSegment result = (ExpressionSegment) visit(ctx.expression().expr());
1627         getDynamicSqlStatementExpressions().add(result);
1628         return result;
1629     }
1630     
1631     @Override
1632     public ASTNode visitPlsqlBlock(final PlsqlBlockContext ctx) {
1633         if (null != ctx.body() && null != ctx.body().statement()) {
1634             ctx.body().statement().forEach(this::visit);
1635         }
1636         return new OraclePLSQLBlockStatement();
1637     }
1638     
1639     @Override
1640     public ASTNode visitAlterProcedure(final AlterProcedureContext ctx) {
1641         return new AlterProcedureStatement();
1642     }
1643     
1644     @Override
1645     public ASTNode visitDropProcedure(final DropProcedureContext ctx) {
1646         return new DropProcedureStatement();
1647     }
1648     
1649     @Override
1650     public ASTNode visitDropIndexType(final DropIndexTypeContext ctx) {
1651         return new OracleDropIndexTypeStatement();
1652     }
1653     
1654     @Override
1655     public ASTNode visitDropProfile(final DropProfileContext ctx) {
1656         return new OracleDropProfileStatement();
1657     }
1658     
1659     @Override
1660     public ASTNode visitDropPluggableDatabase(final DropPluggableDatabaseContext ctx) {
1661         return new OracleDropPluggableDatabaseStatement();
1662     }
1663     
1664     @Override
1665     public ASTNode visitDropJava(final DropJavaContext ctx) {
1666         return new OracleDropJavaStatement();
1667     }
1668     
1669     @Override
1670     public ASTNode visitDropFunction(final DropFunctionContext ctx) {
1671         return new DropFunctionStatement();
1672     }
1673     
1674     @Override
1675     public ASTNode visitDropLibrary(final DropLibraryContext ctx) {
1676         return new OracleDropLibraryStatement();
1677     }
1678     
1679     @Override
1680     public ASTNode visitDropCluster(final DropClusterContext ctx) {
1681         return new OracleDropClusterStatement();
1682     }
1683     
1684     @Override
1685     public ASTNode visitDropMaterializedView(final DropMaterializedViewContext ctx) {
1686         return new DropMaterializedViewStatement();
1687     }
1688     
1689     @Override
1690     public ASTNode visitDropMaterializedViewLog(final DropMaterializedViewLogContext ctx) {
1691         return new OracleDropMaterializedViewLogStatement();
1692     }
1693     
1694     @Override
1695     public ASTNode visitDropMaterializedZonemap(final DropMaterializedZonemapContext ctx) {
1696         return new OracleDropMaterializedZoneMapStatement();
1697     }
1698     
1699     @Override
1700     public ASTNode visitCreateTablespace(final CreateTablespaceContext ctx) {
1701         return new CreateTablespaceStatement();
1702     }
1703     
1704     @Override
1705     public ASTNode visitCreateMaterializedView(final CreateMaterializedViewContext ctx) {
1706         return new CreateMaterializedViewStatement();
1707     }
1708     
1709     @Override
1710     public ASTNode visitCreateMaterializedViewLog(final CreateMaterializedViewLogContext ctx) {
1711         return new OracleCreateMaterializedViewLogStatement();
1712     }
1713     
1714     @Override
1715     public ASTNode visitCreateCluster(final CreateClusterContext ctx) {
1716         return new OracleCreateClusterStatement();
1717     }
1718     
1719     @Override
1720     public ASTNode visitSystemAction(final SystemActionContext ctx) {
1721         return new OracleSystemActionStatement();
1722     }
1723     
1724     @Override
1725     public ASTNode visitAlterType(final AlterTypeContext ctx) {
1726         return new AlterTypeStatement();
1727     }
1728     
1729     @Override
1730     public ASTNode visitCreateJava(final CreateJavaContext ctx) {
1731         return new OracleCreateJavaStatement();
1732     }
1733     
1734     @Override
1735     public ASTNode visitCreateLibrary(final CreateLibraryContext ctx) {
1736         return new OracleCreateLibraryStatement();
1737     }
1738     
1739     @Override
1740     public ASTNode visitSwitch(final SwitchContext ctx) {
1741         return new OracleSwitchStatement();
1742     }
1743     
1744     @Override
1745     public ASTNode visitCreateProfile(final CreateProfileContext ctx) {
1746         return new OracleCreateProfileStatement();
1747     }
1748     
1749     @Override
1750     public ASTNode visitDropDatabase(final DropDatabaseContext ctx) {
1751         return new DropDatabaseStatement(null, false);
1752     }
1753     
1754     @Override
1755     public ASTNode visitCreateOperator(final CreateOperatorContext ctx) {
1756         return new CreateOperatorStatement();
1757     }
1758     
1759     @Override
1760     public ASTNode visitCreateOutline(final CreateOutlineContext ctx) {
1761         return new OracleCreateOutlineStatement();
1762     }
1763 }