This is an automated email from the ASF dual-hosted git repository.

zhaojinchao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new bbc2b19d31b Minimal refactor of oracle dml statement parameter parse 
(#28462)
bbc2b19d31b is described below

commit bbc2b19d31b77e0653e394d3b599b04fd25ff036
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Tue Sep 19 15:20:53 2023 +0800

    Minimal refactor of oracle dml statement parameter parse (#28462)
    
    * Minimal refactor of oracle dml statement parameter parse
    
    * fix build error
    
    * fix sql parser test case
---
 .../insert/EncryptInsertValuesTokenGenerator.java  | 50 ++++++++++++++--------
 .../visitor/statement/OracleStatementVisitor.java  | 29 ++++++++++---
 .../statement/type/OracleDALStatementVisitor.java  |  6 ++-
 .../statement/type/OracleDDLStatementVisitor.java  | 21 ++++-----
 .../statement/type/OracleDMLStatementVisitor.java  | 20 +++++----
 .../parser/src/main/resources/case/dml/insert.xml  |  6 +--
 .../main/resources/case/dml/select-pagination.xml  |  4 +-
 .../main/resources/case/dml/select-sub-query.xml   |  2 +-
 8 files changed, 87 insertions(+), 51 deletions(-)

diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertValuesTokenGenerator.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertValuesTokenGenerator.java
index 93d9fe050ca..5de7cc64531 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertValuesTokenGenerator.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertValuesTokenGenerator.java
@@ -30,7 +30,6 @@ import 
org.apache.shardingsphere.encrypt.rule.column.item.LikeQueryColumnItem;
 import 
org.apache.shardingsphere.infra.binder.context.segment.insert.values.InsertValueContext;
 import 
org.apache.shardingsphere.infra.binder.context.segment.insert.values.expression.DerivedLiteralExpressionSegment;
 import 
org.apache.shardingsphere.infra.binder.context.segment.insert.values.expression.DerivedParameterMarkerExpressionSegment;
-import 
org.apache.shardingsphere.infra.binder.context.segment.insert.values.expression.DerivedSimpleExpressionSegment;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.dml.InsertStatementContext;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
@@ -41,9 +40,11 @@ import 
org.apache.shardingsphere.infra.rewrite.sql.token.pojo.generic.InsertValu
 import 
org.apache.shardingsphere.infra.rewrite.sql.token.pojo.generic.InsertValuesToken;
 import 
org.apache.shardingsphere.infra.rewrite.sql.token.pojo.generic.UseDefaultInsertColumnsToken;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.InsertValuesSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
 import java.util.Collection;
 import java.util.Iterator;
@@ -143,14 +144,15 @@ public final class EncryptInsertValuesTokenGenerator 
implements OptionalSQLToken
             int columnIndex = useDefaultInsertColumnsToken
                     .map(optional -> ((UseDefaultInsertColumnsToken) 
optional).getColumns().indexOf(columnName)).orElseGet(() -> 
insertStatementContext.getColumnNames().indexOf(columnName));
             Object originalValue = 
insertValueContext.getLiteralValue(columnIndex).orElse(null);
-            setCipherColumn(schemaName, tableName, encryptColumn, 
insertValueToken, insertValueContext.getValueExpressions().get(columnIndex), 
columnIndex, originalValue);
+            ExpressionSegment valueExpression = 
insertValueContext.getValueExpressions().get(columnIndex);
+            setCipherColumn(schemaName, tableName, encryptColumn, 
insertValueToken, valueExpression, columnIndex, originalValue);
             int indexDelta = 1;
             if (encryptColumn.getAssistedQuery().isPresent()) {
-                addAssistedQueryColumn(schemaName, tableName, encryptColumn, 
insertValueContext, insertValueToken, columnIndex, indexDelta, originalValue);
+                addAssistedQueryColumn(schemaName, tableName, encryptColumn, 
insertValueToken, valueExpression, columnIndex, indexDelta, originalValue);
                 indexDelta++;
             }
             if (encryptColumn.getLikeQuery().isPresent()) {
-                addLikeQueryColumn(schemaName, tableName, encryptColumn, 
insertValueContext, insertValueToken, columnIndex, indexDelta, originalValue);
+                addLikeQueryColumn(schemaName, tableName, encryptColumn, 
insertValueToken, valueExpression, columnIndex, indexDelta, originalValue);
             }
         }
     }
@@ -163,31 +165,45 @@ public final class EncryptInsertValuesTokenGenerator 
implements OptionalSQLToken
         }
     }
     
-    private void addAssistedQueryColumn(final String schemaName, final String 
tableName, final EncryptColumn encryptColumn,
-                                        final InsertValueContext 
insertValueContext, final InsertValue insertValueToken, final int columnIndex, 
final int indexDelta, final Object originalValue) {
+    private void addAssistedQueryColumn(final String schemaName, final String 
tableName, final EncryptColumn encryptColumn, final InsertValue 
insertValueToken,
+                                        final ExpressionSegment 
valueExpression, final int columnIndex, final int indexDelta, final Object 
originalValue) {
         Optional<AssistedQueryColumnItem> assistedQueryColumnItem = 
encryptColumn.getAssistedQuery();
         Preconditions.checkState(assistedQueryColumnItem.isPresent());
         Object derivedValue = 
assistedQueryColumnItem.get().encrypt(databaseName, schemaName, tableName, 
encryptColumn.getName(), originalValue);
-        addDerivedColumn(insertValueContext, insertValueToken, columnIndex, 
indexDelta, derivedValue);
+        addDerivedColumn(insertValueToken, valueExpression, columnIndex, 
indexDelta, derivedValue, assistedQueryColumnItem.get().getName());
     }
     
-    private void addLikeQueryColumn(final String schemaName, final String 
tableName, final EncryptColumn encryptColumn,
-                                    final InsertValueContext 
insertValueContext, final InsertValue insertValueToken, final int columnIndex, 
final int indexDelta, final Object originalValue) {
+    private void addLikeQueryColumn(final String schemaName, final String 
tableName, final EncryptColumn encryptColumn, final InsertValue 
insertValueToken,
+                                    final ExpressionSegment valueExpression, 
final int columnIndex, final int indexDelta, final Object originalValue) {
         Optional<LikeQueryColumnItem> likeQueryColumnItem = 
encryptColumn.getLikeQuery();
         Preconditions.checkState(likeQueryColumnItem.isPresent());
         Object derivedValue = likeQueryColumnItem.get().encrypt(databaseName, 
schemaName, tableName, encryptColumn.getName(), originalValue);
-        addDerivedColumn(insertValueContext, insertValueToken, columnIndex, 
indexDelta, derivedValue);
+        addDerivedColumn(insertValueToken, valueExpression, columnIndex, 
indexDelta, derivedValue, likeQueryColumnItem.get().getName());
     }
     
-    private void addDerivedColumn(final InsertValueContext insertValueContext, 
final InsertValue insertValueToken, final int columnIndex, final int 
indexDelta, final Object derivedValue) {
-        DerivedSimpleExpressionSegment derivedExpressionSegment = 
isAddLiteralExpressionSegment(insertValueContext, columnIndex)
-                ? new DerivedLiteralExpressionSegment(derivedValue)
-                : new 
DerivedParameterMarkerExpressionSegment(getParameterIndexCount(insertValueToken));
-        insertValueToken.getValues().add(columnIndex + indexDelta, 
derivedExpressionSegment);
+    private void addDerivedColumn(final InsertValue insertValueToken, final 
ExpressionSegment valueExpression, final int columnIndex, final int indexDelta, 
final Object derivedValue,
+                                  final String derivedColumnName) {
+        ExpressionSegment derivedExpression;
+        if (valueExpression instanceof LiteralExpressionSegment) {
+            derivedExpression = new 
DerivedLiteralExpressionSegment(derivedValue);
+        } else if (valueExpression instanceof 
ParameterMarkerExpressionSegment) {
+            derivedExpression = new 
DerivedParameterMarkerExpressionSegment(getParameterIndexCount(insertValueToken));
+        } else if (valueExpression instanceof ColumnSegment) {
+            derivedExpression = createColumnSegment((ColumnSegment) 
valueExpression, derivedColumnName);
+        } else {
+            derivedExpression = valueExpression;
+        }
+        insertValueToken.getValues().add(columnIndex + indexDelta, 
derivedExpression);
     }
     
-    private boolean isAddLiteralExpressionSegment(final InsertValueContext 
insertValueContext, final int columnIndex) {
-        return insertValueContext.getParameters().isEmpty() || 
insertValueContext.getValueExpressions().get(columnIndex) instanceof 
LiteralExpressionSegment;
+    private ColumnSegment createColumnSegment(final ColumnSegment 
originalColumn, final String columnName) {
+        ColumnSegment result = new 
ColumnSegment(originalColumn.getStartIndex(), originalColumn.getStopIndex(), 
new IdentifierValue(columnName, 
originalColumn.getIdentifier().getQuoteCharacter()));
+        
result.setNestedObjectAttributes(originalColumn.getNestedObjectAttributes());
+        originalColumn.getOwner().ifPresent(result::setOwner);
+        result.setColumnBoundedInfo(originalColumn.getColumnBoundedInfo());
+        
result.setOtherUsingColumnBoundedInfo(originalColumn.getOtherUsingColumnBoundedInfo());
+        result.setVariable(originalColumn.isVariable());
+        return result;
     }
     
     private int getParameterIndexCount(final InsertValue insertValueToken) {
diff --git 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
index 4854c9107f0..c17be79e6cf 100644
--- 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
+++ 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
@@ -31,9 +31,9 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.BitExp
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.BitValueLiteralsContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.BooleanLiteralsContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.BooleanPrimaryContext;
-import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CastFunctionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CaseExpressionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CaseWhenContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CastFunctionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CharFunctionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ColumnNameContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ColumnNamesContext;
@@ -45,8 +45,8 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DataTy
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DateTimeLiteralsContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DatetimeExprContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ExprContext;
-import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ExtractFunctionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ExprListContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ExtractFunctionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.FeatureFunctionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.FirstOrLastValueFunctionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.FormatFunctionContext;
@@ -79,8 +79,8 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.Synony
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.TableNameContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.TableNamesContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ToDateFunctionContext;
-import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.TrimFunctionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.TranslateFunctionContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.TrimFunctionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.TypeNameContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.UnreservedWordContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ViewNameContext;
@@ -180,11 +180,13 @@ import java.util.stream.Collectors;
 @Getter
 public abstract class OracleStatementVisitor extends 
OracleStatementBaseVisitor<ASTNode> {
     
-    private final Collection<ParameterMarkerSegment> parameterMarkerSegments = 
new LinkedList<>();
+    private final Collection<ParameterMarkerSegment> 
globalParameterMarkerSegments = new LinkedList<>();
+    
+    private final Collection<ParameterMarkerSegment> 
statementParameterMarkerSegments = new LinkedList<>();
     
     @Override
     public final ASTNode visitParameterMarker(final ParameterMarkerContext 
ctx) {
-        return new ParameterMarkerValue(parameterMarkerSegments.size(), 
ParameterMarkerType.QUESTION);
+        return new ParameterMarkerValue(globalParameterMarkerSegments.size(), 
ParameterMarkerType.QUESTION);
     }
     
     @Override
@@ -537,7 +539,8 @@ public abstract class OracleStatementVisitor extends 
OracleStatementBaseVisitor<
             ParameterMarkerValue parameterMarker = (ParameterMarkerValue) 
astNode;
             ParameterMarkerExpressionSegment segment = new 
ParameterMarkerExpressionSegment(context.start.getStartIndex(), 
context.stop.getStopIndex(),
                     parameterMarker.getValue(), parameterMarker.getType());
-            parameterMarkerSegments.add(segment);
+            globalParameterMarkerSegments.add(segment);
+            statementParameterMarkerSegments.add(segment);
             return segment;
         }
         if (astNode instanceof SubquerySegment) {
@@ -559,7 +562,8 @@ public abstract class OracleStatementVisitor extends 
OracleStatementBaseVisitor<
         if (null != ctx.parameterMarker()) {
             ParameterMarkerValue parameterMarker = (ParameterMarkerValue) 
visit(ctx.parameterMarker());
             ParameterMarkerExpressionSegment segment = new 
ParameterMarkerExpressionSegment(startIndex, stopIndex, 
parameterMarker.getValue(), parameterMarker.getType());
-            parameterMarkerSegments.add(segment);
+            globalParameterMarkerSegments.add(segment);
+            statementParameterMarkerSegments.add(segment);
             return segment;
         }
         if (null != ctx.literals()) {
@@ -1172,4 +1176,15 @@ public abstract class OracleStatementVisitor extends 
OracleStatementBaseVisitor<
     protected String getOriginalText(final ParserRuleContext ctx) {
         return ctx.start.getInputStream().getText(new 
Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
     }
+    
+    /**
+     * Pop all statement parameter marker segments.
+     *
+     * @return all statement parameter marker segments
+     */
+    protected Collection<ParameterMarkerSegment> 
popAllStatementParameterMarkerSegments() {
+        Collection<ParameterMarkerSegment> result = new 
LinkedList<>(statementParameterMarkerSegments);
+        statementParameterMarkerSegments.clear();
+        return result;
+    }
 }
diff --git 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDALStatementVisitor.java
 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDALStatementVisitor.java
index 1b01372814d..cf7ab2bc570 100644
--- 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDALStatementVisitor.java
+++ 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDALStatementVisitor.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.sql.parser.oracle.visitor.statement.type;
 import org.apache.shardingsphere.sql.parser.api.ASTNode;
 import 
org.apache.shardingsphere.sql.parser.api.visitor.statement.type.DALStatementVisitor;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AlterResourceCostContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ExecuteContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ExplainContext;
 import 
org.apache.shardingsphere.sql.parser.oracle.visitor.statement.OracleStatementVisitor;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
@@ -40,7 +41,8 @@ public final class OracleDALStatementVisitor extends 
OracleStatementVisitor impl
     public ASTNode visitExplain(final ExplainContext ctx) {
         OracleExplainStatement result = new OracleExplainStatement();
         OracleDMLStatementVisitor visitor = new OracleDMLStatementVisitor();
-        
visitor.getParameterMarkerSegments().addAll(getParameterMarkerSegments());
+        
getGlobalParameterMarkerSegments().addAll(visitor.getGlobalParameterMarkerSegments());
+        
getStatementParameterMarkerSegments().addAll(visitor.getStatementParameterMarkerSegments());
         if (null != ctx.insert()) {
             result.setStatement((SQLStatement) visitor.visit(ctx.insert()));
         } else if (null != ctx.delete()) {
@@ -50,7 +52,7 @@ public final class OracleDALStatementVisitor extends 
OracleStatementVisitor impl
         } else if (null != ctx.select()) {
             result.setStatement((SQLStatement) visitor.visit(ctx.select()));
         }
-        result.addParameterMarkerSegments(getParameterMarkerSegments());
+        result.addParameterMarkerSegments(ctx.getParent() instanceof 
ExecuteContext ? getGlobalParameterMarkerSegments() : 
popAllStatementParameterMarkerSegments());
         return result;
     }
 }
diff --git 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
index 20c623fc534..802ec6c4fb2 100644
--- 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
+++ 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDDLStatementVisitor.java
@@ -64,10 +64,10 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.Associ
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AuditContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AuditTraditionalContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AuditUnifiedContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ColumnClausesContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ColumnDefinitionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ColumnNameContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ColumnOrVirtualDefinitionContext;
-import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ColumnClausesContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CommentContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ConstraintClausesContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateClusterContext;
@@ -85,6 +85,8 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.Create
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateIndexContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateInmemoryJoinGroupContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateLockdownProfileContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateMaterializedViewContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateMaterializedViewLogContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreatePFileContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateProcedureContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateRestorePointContext;
@@ -94,8 +96,6 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.Create
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateSynonymContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateTableContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateTablespaceContext;
-import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateMaterializedViewContext;
-import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateMaterializedViewLogContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateTypeContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.CreateViewContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DataTypeDefinitionContext;
@@ -108,7 +108,6 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropCo
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropDatabaseLinkContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropDimensionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropDirectoryContext;
-import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropProfileContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropDiskgroupContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropEditionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropFlashbackArchiveContext;
@@ -127,6 +126,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropOu
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropPackageContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropPluggableDatabaseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropProcedureContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropProfileContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropRestorePointContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropRollbackSegmentContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DropSequenceContext;
@@ -144,8 +144,8 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.IndexE
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.IndexNameContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.IndexTypeNameContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.InlineConstraintContext;
-import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ModifyCollectionRetrievalContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ModifyColPropertiesContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ModifyCollectionRetrievalContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ModifyColumnSpecificationContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ModifyConstraintClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.NestedTableTypeSpecContext;
@@ -246,6 +246,8 @@ import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.Ora
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateIndexStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateInmemoryJoinGroupStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateLockdownProfileStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateMaterializedViewLogStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateMaterializedViewStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateNestedTableTypeStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateObjectTypeStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreatePFileStatement;
@@ -258,10 +260,8 @@ import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.Ora
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateSynonymStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateTableStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateTablespaceStatement;
-import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateMaterializedViewStatement;
-import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateMaterializedViewLogStatement;
-import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateViewStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateVarrayTypeStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleCreateViewStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleDisassociateStatisticsStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleDropClusterStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.oracle.ddl.OracleDropContextStatement;
@@ -318,11 +318,12 @@ public final class OracleDDLStatementVisitor extends 
OracleStatementVisitor impl
     public ASTNode visitCreateView(final CreateViewContext ctx) {
         OracleCreateViewStatement result = new OracleCreateViewStatement();
         OracleDMLStatementVisitor visitor = new OracleDMLStatementVisitor();
-        
visitor.getParameterMarkerSegments().addAll(getParameterMarkerSegments());
+        
getGlobalParameterMarkerSegments().addAll(visitor.getGlobalParameterMarkerSegments());
+        
getStatementParameterMarkerSegments().addAll(visitor.getStatementParameterMarkerSegments());
         result.setView((SimpleTableSegment) visit(ctx.viewName()));
         result.setSelect((SelectStatement) visitor.visit(ctx.select()));
         result.setViewDefinition(getOriginalText(ctx.select()));
-        result.addParameterMarkerSegments(getParameterMarkerSegments());
+        result.addParameterMarkerSegments(getGlobalParameterMarkerSegments());
         return result;
     }
     
diff --git 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
index 39c6223ae87..d97e9933e76 100644
--- 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
+++ 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleDMLStatementVisitor.java
@@ -39,6 +39,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.Dimens
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DmlSubqueryClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DmlTableClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.DuplicateSpecificationContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ExecuteContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ExprContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ExpressionListContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ForUpdateClauseContext;
@@ -62,8 +63,8 @@ import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.JoinCl
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.LockTableContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.MergeAssignmentContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.MergeAssignmentValueContext;
-import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.MergeContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.MergeColumnValueContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.MergeContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.MergeInsertClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.MergeInsertColumnContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.MergeSetAssignmentsClauseContext;
@@ -208,7 +209,7 @@ public final class OracleDMLStatementVisitor extends 
OracleStatementVisitor impl
         if (null != ctx.whereClause()) {
             result.setWhere((WhereSegment) visit(ctx.whereClause()));
         }
-        result.addParameterMarkerSegments(getParameterMarkerSegments());
+        result.addParameterMarkerSegments(ctx.getParent() instanceof 
ExecuteContext ? getGlobalParameterMarkerSegments() : 
popAllStatementParameterMarkerSegments());
         return result;
     }
     
@@ -299,7 +300,9 @@ public final class OracleDMLStatementVisitor extends 
OracleStatementVisitor impl
     @Override
     public ASTNode visitInsert(final InsertContext ctx) {
         // TODO :FIXME, since there is no segment for insertValuesClause, 
InsertStatement is created by sub rule.
-        return null == ctx.insertSingleTable() ? visit(ctx.insertMultiTable()) 
: visit(ctx.insertSingleTable());
+        OracleInsertStatement result = (OracleInsertStatement) (null == 
ctx.insertSingleTable() ? visit(ctx.insertMultiTable()) : 
visit(ctx.insertSingleTable()));
+        result.addParameterMarkerSegments(ctx.getParent() instanceof 
ExecuteContext ? getGlobalParameterMarkerSegments() : 
popAllStatementParameterMarkerSegments());
+        return result;
     }
     
     @Override
@@ -313,7 +316,6 @@ public final class OracleDMLStatementVisitor extends 
OracleStatementVisitor impl
             SubquerySegment subquerySegment = new 
SubquerySegment(ctx.selectSubquery().start.getStartIndex(), 
ctx.selectSubquery().stop.getStopIndex(), subquery);
             result.setInsertSelect(subquerySegment);
         }
-        result.addParameterMarkerSegments(getParameterMarkerSegments());
         return result;
     }
     
@@ -326,7 +328,6 @@ public final class OracleDMLStatementVisitor extends 
OracleStatementVisitor impl
     @Override
     public ASTNode visitInsertMultiTable(final InsertMultiTableContext ctx) {
         OracleInsertStatement result = new OracleInsertStatement();
-        result.setInsertSelect(new 
SubquerySegment(ctx.selectSubquery().start.getStartIndex(), 
ctx.selectSubquery().stop.getStopIndex(), (OracleSelectStatement) 
visit(ctx.selectSubquery())));
         result.setMultiTableInsertType(null != ctx.conditionalInsertClause() 
&& null != ctx.conditionalInsertClause().FIRST() ? MultiTableInsertType.FIRST : 
MultiTableInsertType.ALL);
         List<MultiTableElementContext> multiTableElementContexts = 
ctx.multiTableElement();
         if (null != multiTableElementContexts && 
!multiTableElementContexts.isEmpty()) {
@@ -337,7 +338,7 @@ public final class OracleDMLStatementVisitor extends 
OracleStatementVisitor impl
         } else {
             
result.setMultiTableConditionalIntoSegment((MultiTableConditionalIntoSegment) 
visit(ctx.conditionalInsertClause()));
         }
-        result.addParameterMarkerSegments(getParameterMarkerSegments());
+        result.setInsertSelect(new 
SubquerySegment(ctx.selectSubquery().start.getStartIndex(), 
ctx.selectSubquery().stop.getStopIndex(), (OracleSelectStatement) 
visit(ctx.selectSubquery())));
         return result;
     }
     
@@ -387,7 +388,7 @@ public final class OracleDMLStatementVisitor extends 
OracleStatementVisitor impl
         if (null != ctx.whereClause()) {
             result.setWhere((WhereSegment) visit(ctx.whereClause()));
         }
-        result.addParameterMarkerSegments(getParameterMarkerSegments());
+        result.addParameterMarkerSegments(ctx.getParent() instanceof 
ExecuteContext ? getGlobalParameterMarkerSegments() : 
popAllStatementParameterMarkerSegments());
         return result;
     }
     
@@ -410,13 +411,14 @@ public final class OracleDMLStatementVisitor extends 
OracleStatementVisitor impl
         if (null != ctx.insertValuesClause()) {
             
result.getValues().addAll(createInsertValuesSegments(ctx.insertValuesClause().assignmentValues()));
         }
+        result.addParameterMarkerSegments(ctx.getParent() instanceof 
ExecuteContext ? getGlobalParameterMarkerSegments() : 
popAllStatementParameterMarkerSegments());
         return result;
     }
     
     @Override
     public ASTNode visitSelect(final SelectContext ctx) {
         OracleSelectStatement result = (OracleSelectStatement) 
visit(ctx.selectSubquery());
-        result.addParameterMarkerSegments(getParameterMarkerSegments());
+        result.addParameterMarkerSegments(ctx.getParent() instanceof 
ExecuteContext ? getGlobalParameterMarkerSegments() : 
popAllStatementParameterMarkerSegments());
         if (null != ctx.forUpdateClause()) {
             result.setLock((LockSegment) visit(ctx.forUpdateClause()));
         }
@@ -535,7 +537,7 @@ public final class OracleDMLStatementVisitor extends 
OracleStatementVisitor impl
         if (null != ctx.orderByClause()) {
             result.setOrderBy((OrderBySegment) visit(ctx.orderByClause()));
         }
-        result.addParameterMarkerSegments(getParameterMarkerSegments());
+        result.addParameterMarkerSegments(ctx.getParent() instanceof 
ExecuteContext ? getGlobalParameterMarkerSegments() : 
popAllStatementParameterMarkerSegments());
         return result;
     }
     
diff --git a/test/it/parser/src/main/resources/case/dml/insert.xml 
b/test/it/parser/src/main/resources/case/dml/insert.xml
index 34c2b6b6107..7c69aca33e2 100644
--- a/test/it/parser/src/main/resources/case/dml/insert.xml
+++ b/test/it/parser/src/main/resources/case/dml/insert.xml
@@ -1364,7 +1364,7 @@
     <insert sql-case-id="insert_all_with_all_placeholders" parameters="1, 1, 
'init', 2, 2, 'init', 3, 3, 'init'">
         <multi-table-insert-type value="ALL" />
         <multi-table-insert-into start-index="11" stop-index="183" 
literal-start-index="11" literal-stop-index="198">
-            <insert-statement>
+            <insert-statement parameters="1, 1, 'init'">
                 <table name="t_order" start-index="16" stop-index="22" />
                 <columns start-index="24" stop-index="50">
                     <column name="order_id" start-index="25" stop-index="32" />
@@ -1388,7 +1388,7 @@
                     </value>
                 </values>
             </insert-statement>
-            <insert-statement>
+            <insert-statement parameters="2, 2, 'init'">
                 <table name="t_order" start-index="74" stop-index="80" 
literal-start-index="79" literal-stop-index="85" />
                 <columns start-index="82" stop-index="108" 
literal-start-index="87" literal-stop-index="113">
                     <column name="order_id" start-index="83" stop-index="90" 
literal-start-index="88" literal-stop-index="95" />
@@ -1412,7 +1412,7 @@
                     </value>
                 </values>
             </insert-statement>
-            <insert-statement>
+            <insert-statement parameters="2, 2, 'init'">
                 <table name="t_order" start-index="132" stop-index="138" 
literal-start-index="142" literal-stop-index="148" />
                 <columns start-index="140" stop-index="166" 
literal-start-index="150" literal-stop-index="176">
                     <column name="order_id" start-index="141" stop-index="148" 
literal-start-index="151" literal-stop-index="158" />
diff --git a/test/it/parser/src/main/resources/case/dml/select-pagination.xml 
b/test/it/parser/src/main/resources/case/dml/select-pagination.xml
index 268fc4fc1f7..ec28c8481e9 100644
--- a/test/it/parser/src/main/resources/case/dml/select-pagination.xml
+++ b/test/it/parser/src/main/resources/case/dml/select-pagination.xml
@@ -1627,7 +1627,7 @@
         <from>
             <subquery-table alias="tt">
                 <subquery start-index="14" stop_index="363">
-                    <select>
+                    <select parameters="7">
                         <projections start-index="22" stop-index="43">
                             <shorthand-projection start-index="22" 
stop-index="27">
                                 <owner start-index="22" stop-index="25" 
name="row_" />
@@ -1637,7 +1637,7 @@
                         <from>
                             <subquery-table start-index="50" stop-index="339" 
alias="row_">
                                 <subquery>
-                                    <select>
+                                    <select parameters="1, 2, 9">
                                         <projections start-index="58" 
stop-index="139" >
                                             <column-projection 
start-index="58" stop-index="85" name="order_id" alias="order_id">
                                                 <owner start-index="58" 
stop-index="64" name="order0_" />
diff --git a/test/it/parser/src/main/resources/case/dml/select-sub-query.xml 
b/test/it/parser/src/main/resources/case/dml/select-sub-query.xml
index c6d128750bc..f07dc554277 100644
--- a/test/it/parser/src/main/resources/case/dml/select-sub-query.xml
+++ b/test/it/parser/src/main/resources/case/dml/select-sub-query.xml
@@ -108,7 +108,7 @@
         <from>
             <subquery-table alias="t">
                 <subquery>
-                    <select>
+                    <select parameters="3, 4">
                         <projections start-index="24" stop-index="24">
                             <shorthand-projection start-index="24" 
stop-index="24" />
                         </projections>


Reply via email to