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"/>