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

duanzhengqiang 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 3a69406cbf2 Add oracle column parsing assertions of multiset 
expression (#28018)
3a69406cbf2 is described below

commit 3a69406cbf256c6fa942e3df49105cad06709103
Author: ZhangCheng <[email protected]>
AuthorDate: Thu Aug 10 17:24:15 2023 +0800

    Add oracle column parsing assertions of multiset expression (#28018)
---
 .../segment/expression/ExpressionAssert.java       | 18 ++++++++-
 .../jaxb/segment/impl/expr/ExpectedExpression.java |  3 ++
 .../impl/expr/ExpectedMultisetExpression.java      | 44 ++++++++++++++++++++++
 .../main/resources/case/dml/select-expression.xml  | 16 +++++++-
 4 files changed, 79 insertions(+), 2 deletions(-)

diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/expression/ExpressionAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/expression/ExpressionAssert.java
index e65dd42cbe3..22d628ca1d5 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/expression/ExpressionAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/expression/ExpressionAssert.java
@@ -31,10 +31,10 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExtractA
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.FunctionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.InExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.IntervalDayToSecondExpression;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.IntervalExpressionProjection;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.IntervalYearToMonthExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ListExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.MatchAgainstExpression;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.MultisetExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.NotExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.TypeCastExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ValuesExpression;
@@ -47,6 +47,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubquerySegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.AggregationProjectionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ExpressionProjectionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.IntervalExpressionProjection;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.DataTypeSegment;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.SQLSegmentAssert;
@@ -70,6 +71,7 @@ import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.s
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.ExpectedIntervalYearToMonthExpression;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.ExpectedListExpression;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.ExpectedMatchExpression;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.ExpectedMultisetExpression;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.ExpectedNotExpression;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.ExpectedTypeCastExpression;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr.ExpectedValuesExpression;
@@ -498,6 +500,18 @@ public final class ExpressionAssert {
         }
     }
     
+    private static void assertMultisetExpression(final SQLCaseAssertContext 
assertContext, final MultisetExpression actual, final 
ExpectedMultisetExpression expected) {
+        if (null == expected) {
+            assertNull(actual, assertContext.getText("Multiset expression 
should not exist."));
+            return;
+        }
+        assertNotNull(actual, assertContext.getText("Multiset expression 
should exist."));
+        assertExpression(assertContext, actual.getLeft(), expected.getLeft());
+        assertExpression(assertContext, actual.getRight(), 
expected.getRight());
+        assertThat(assertContext.getText("Multiset operator assertion error: 
"), actual.getOperator(), is(expected.getOperator()));
+        assertThat(assertContext.getText("Multiset keyword assertion error: 
"), actual.getKeyWord(), is(expected.getKeyWord()));
+    }
+    
     /**
      * Assert expression by actual expression segment class type.
      *
@@ -561,6 +575,8 @@ public final class ExpressionAssert {
             ColumnWithJoinOperatorAssert.assertIs(assertContext, 
(ColumnWithJoinOperatorSegment) actual, 
expected.getColumnWithJoinOperatorSegment());
         } else if (actual instanceof IntervalExpressionProjection) {
             assertIntervalExpression(assertContext, 
(IntervalExpressionProjection) actual, expected.getIntervalExpression());
+        } else if (actual instanceof MultisetExpression) {
+            assertMultisetExpression(assertContext, (MultisetExpression) 
actual, expected.getMultisetExpression());
         } else {
             throw new UnsupportedOperationException(String.format("Unsupported 
expression: %s", actual.getClass().getName()));
         }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedExpression.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedExpression.java
index 08d66195e4b..3789526410b 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedExpression.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedExpression.java
@@ -110,4 +110,7 @@ public final class ExpectedExpression extends 
AbstractExpectedSQLSegment {
     
     @XmlElement(name = "interval-expression")
     private ExpectedIntervalExpression intervalExpression;
+    
+    @XmlElement(name = "multiset-expression")
+    private ExpectedMultisetExpression multisetExpression;
 }
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedMultisetExpression.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedMultisetExpression.java
new file mode 100644
index 00000000000..917ca93ebf8
--- /dev/null
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/expr/ExpectedMultisetExpression.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.expr;
+
+import lombok.Getter;
+import lombok.Setter;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedSQLSegment;
+
+import javax.xml.bind.annotation.XmlElement;
+
+/**
+ * Expected multiset expression.
+ */
+@Getter
+@Setter
+public final class ExpectedMultisetExpression extends 
AbstractExpectedSQLSegment implements ExpectedExpressionSegment {
+    
+    @XmlElement
+    private ExpectedExpression left;
+    
+    @XmlElement
+    private ExpectedExpression right;
+    
+    @XmlElement
+    private String operator;
+    
+    @XmlElement
+    private String keyWord;
+}
diff --git a/test/it/parser/src/main/resources/case/dml/select-expression.xml 
b/test/it/parser/src/main/resources/case/dml/select-expression.xml
index 8df051d1af1..27271350e73 100644
--- a/test/it/parser/src/main/resources/case/dml/select-expression.xml
+++ b/test/it/parser/src/main/resources/case/dml/select-expression.xml
@@ -2687,7 +2687,21 @@
         </from>
         <projections start-index="7" stop-index="102">
             <column-projection name="customer_id" start-index="7" 
stop-index="17" />
-            <expression-projection text="cust_address_ntab MULTISET INTERSECT 
DISTINCT cust_address2_ntab" alias="multiset_intersect" start-index="20" 
stop-index="102" />
+            <expression-projection text="cust_address_ntab MULTISET INTERSECT 
DISTINCT cust_address2_ntab" alias="multiset_intersect" start-index="20" 
stop-index="102" literal-start-index="20" literal-stop-index="102">
+                <literalText>cust_address_ntab MULTISET INTERSECT DISTINCT 
cust_address2_ntab</literalText>
+                <expr>
+                    <multiset-expression>
+                        <left>
+                            <column name="cust_address_ntab" start-index="20" 
stop-index="36" literal-start-index="20" literal-stop-index="36" />
+                        </left>
+                        <right>
+                            <column name="cust_address2_ntab" start-index="66" 
stop-index="83" literal-start-index="66" literal-stop-index="83" />
+                        </right>
+                        <operator>INTERSECT</operator>
+                        <keyWord>DISTINCT</keyWord>
+                    </multiset-expression>
+                </expr>
+            </expression-projection>
         </projections>
         <order-by>
             <column-item name="customer_id" order-direction="ASC" 
start-index="133" stop-index="143"/>

Reply via email to