This is an automated email from the ASF dual-hosted git repository.
jianglongtao 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 551fec79ba6 [Oracle SQL] Support HR-7-1 of Oracle SQL (#27604)
551fec79ba6 is described below
commit 551fec79ba6c8f9993a9f4176c0ef7cf9dcd8b04
Author: Liao Lanyu <[email protected]>
AuthorDate: Tue Aug 1 14:45:25 2023 +0800
[Oracle SQL] Support HR-7-1 of Oracle SQL (#27604)
* support HR-7-1
* support HR-7-1 test
* support HR-7-1
---
.../visitor/statement/OracleStatementVisitor.java | 14 ++++++-
.../main/resources/case/dml/select-sub-query.xml | 47 ++++++++++++++++++++++
.../sql/supported/dml/select-sub-query.xml | 1 +
3 files changed, 60 insertions(+), 2 deletions(-)
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 bc093ead672..468dc72ed78 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
@@ -405,8 +405,18 @@ public abstract class OracleStatementVisitor extends
OracleStatementBaseVisitor<
private ASTNode createCompareSegment(final BooleanPrimaryContext ctx) {
ExpressionSegment left = (ExpressionSegment)
visit(ctx.booleanPrimary());
- String operator = null == ctx.SAFE_EQ_() ?
ctx.comparisonOperator().getText() : ctx.SAFE_EQ_().getText();
- ExpressionSegment right = null != ctx.predicate() ?
(ExpressionSegment) visit(ctx.predicate()) : (ExpressionSegment)
visit(ctx.subquery());
+ ExpressionSegment right;
+ String operator;
+ if (null != ctx.ALL()) {
+ operator = null != ctx.SAFE_EQ_() ? ctx.SAFE_EQ_().getText() :
ctx.comparisonOperator().getText() + " ALL";
+ } else {
+ operator = null != ctx.SAFE_EQ_() ? ctx.SAFE_EQ_().getText() :
ctx.comparisonOperator().getText();
+ }
+ if (null != ctx.predicate()) {
+ right = (ExpressionSegment) visit(ctx.predicate());
+ } else {
+ right = new SubqueryExpressionSegment(new
SubquerySegment(ctx.subquery().start.getStartIndex(),
ctx.subquery().stop.getStopIndex(), (OracleSelectStatement)
visit(ctx.subquery())));
+ }
String text = ctx.start.getInputStream().getText(new
Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
return new BinaryOperationExpression(ctx.start.getStartIndex(),
ctx.stop.getStopIndex(), left, right, operator, text);
}
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 5fd48e9c9d1..c6d128750bc 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
@@ -187,6 +187,53 @@
</where>
</select>
+ <select sql-case-id="select_with_any_subquery">
+ <from>
+ <simple-table name="employees" start-index="14" stop-index="22" />
+ </from>
+ <projections start-index="7" stop-index="7">
+ <shorthand-projection start-index="7" stop-index="7" />
+ </projections>
+ <where start-index="24" stop-index="97">
+ <expr>
+ <binary-operation-expression start-index="30" stop-index="97">
+ <left>
+ <column name="salary" start-index="30" stop-index="35"
/>
+ </left>
+ <operator>=</operator>
+ <right>
+ <subquery start-index="43" stop-index="97">
+ <select>
+ <from start-index="63" stop-index="71">
+ <simple-table name="employees"
start-index="63" stop-index="71"/>
+ </from>
+ <projections start-index="51" stop-index="56">
+ <column-projection name="salary"
start-index="51" stop-index="56"/>
+ </projections>
+ <where start-index="73" stop-index="96">
+ <expr>
+ <binary-operation-expression
start-index="79" stop-index="96">
+ <left>
+ <column name="department_id"
start-index="79" stop-index="91" />
+ </left>
+ <operator>=</operator>
+ <right>
+ <literal-expression value="30"
start-index="95" stop-index="96" />
+ </right>
+ </binary-operation-expression>
+ </expr>
+ </where>
+ </select>
+ </subquery>
+ </right>
+ </binary-operation-expression>
+ </expr>
+ </where>
+ <order-by>
+ <column-item name="employee_id" order-direction="ASC"
start-index="108" stop-index="118" />
+ </order-by>
+ </select>
+
<select sql-case-id="select_with_in_subquery">
<from>
<simple-table name="t_order" start-index="14" stop-index="20" />
diff --git
a/test/it/parser/src/main/resources/sql/supported/dml/select-sub-query.xml
b/test/it/parser/src/main/resources/sql/supported/dml/select-sub-query.xml
index d833661a4f4..0bc79bdd0b3 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/select-sub-query.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/select-sub-query.xml
@@ -21,6 +21,7 @@
<sql-case id="select_sub_query_with_project" value="SELECT order_id,
(SELECT 1) AS num FROM t_order" db-types="MySQL, PostgreSQL,openGauss,
SQLServer" />
<sql-case id="select_sub_query_with_table" value="SELECT t.* FROM (SELECT
* FROM t_order WHERE order_id IN (?, ?)) t" />
<sql-case id="select_with_equal_subquery" value="SELECT * FROM t_order
WHERE user_id = (SELECT user_id FROM t_order_item WHERE id = 10)"
db-types="MySQL, PostgreSQL,openGauss" />
+ <sql-case id="select_with_any_subquery" value="SELECT * FROM employees
WHERE salary = ANY (SELECT salary FROM employees WHERE department_id = 30)
ORDER BY employee_id;" db-types="Oracle" />
<sql-case id="select_with_in_subquery" value="SELECT * FROM t_order WHERE
user_id IN (SELECT user_id FROM t_order_item WHERE id IN (10, 11))"
db-types="MySQL, PostgreSQL,openGauss" />
<sql-case id="select_with_between_subquery" value="SELECT * FROM t_order
WHERE user_id BETWEEN (SELECT user_id FROM t_order_item WHERE order_id = 10)
AND ?" db-types="MySQL, PostgreSQL,openGauss" />
<sql-case id="select_with_exists_sub_query_with_project" value="SELECT
EXISTS (SELECT 1 FROM t_order)" db-types="MySQL, PostgreSQL,openGauss" />