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