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

sunnianjun 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 a5408875fa2 Fix wrong parse result when parse Oracle WM_CONCAT 
function with schema (#30494)
a5408875fa2 is described below

commit a5408875fa27f1c16c46910152b9b9a2f0626e5f
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Fri Mar 15 11:03:35 2024 +0800

    Fix wrong parse result when parse Oracle WM_CONCAT function with schema 
(#30494)
---
 .../src/main/antlr4/imports/oracle/BaseRule.g4     |  2 +-
 .../visitor/statement/OracleStatementVisitor.java  |  4 +++
 .../resources/case/dml/select-special-function.xml | 29 ++++++++++++++++++++++
 .../sql/supported/dml/select-special-function.xml  |  1 +
 4 files changed, 35 insertions(+), 1 deletion(-)

diff --git 
a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4 
b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
index 6cc68ec86a0..bb039133eb5 100644
--- a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
+++ b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/BaseRule.g4
@@ -793,7 +793,7 @@ specialFunction
     ;
 
 wmConcatFunction
-    : WM_CONCAT LP_ expr RP_ overClause?
+    : (owner DOT_)? WM_CONCAT LP_ expr RP_ overClause?
     ;
 
 approxRank
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 a75922e31e8..3c7d51575b4 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
@@ -762,6 +762,10 @@ public abstract class OracleStatementVisitor extends 
OracleStatementBaseVisitor<
     public ASTNode visitWmConcatFunction(final WmConcatFunctionContext ctx) {
         FunctionSegment result = new 
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), 
ctx.WM_CONCAT().getText(), getOriginalText(ctx));
         result.getParameters().add((ExpressionSegment) visit(ctx.expr()));
+        if (null != ctx.owner()) {
+            OwnerContext owner = ctx.owner();
+            result.setOwner(new OwnerSegment(owner.getStart().getStartIndex(), 
owner.getStop().getStopIndex(), (IdentifierValue) visit(owner.identifier())));
+        }
         return result;
     }
     
diff --git 
a/test/it/parser/src/main/resources/case/dml/select-special-function.xml 
b/test/it/parser/src/main/resources/case/dml/select-special-function.xml
index fea46090c24..3b741bb1e75 100644
--- a/test/it/parser/src/main/resources/case/dml/select-special-function.xml
+++ b/test/it/parser/src/main/resources/case/dml/select-special-function.xml
@@ -1127,4 +1127,33 @@
             <column-item name="DeptId" order-direction="ASC" start-index="176" 
stop-index="181" />
         </group-by>
     </select>
+    
+    <select sql-case-id="select_wm_concat_function_with_schema">
+        <projections start-index="7" stop-index="49">
+            <expression-projection start-index="7" stop-index="49" 
text="TO_CHAR(WMSYS.WM_CONCAT(DISTINCT o.status))">
+                <expr>
+                    <function function-name="TO_CHAR" 
text="TO_CHAR(WMSYS.WM_CONCAT(DISTINCT o.status))" start-index="7" 
stop-index="49">
+                        <parameter>
+                            <function function-name="WM_CONCAT" 
text="WMSYS.WM_CONCAT(DISTINCT o.status)" start-index="15" stop-index="48">
+                                <parameter>
+                                    <column name="status" start-index="40" 
stop-index="47">
+                                        <owner start-index="40" 
stop-index="40" name="o" />
+                                    </column>
+                                </parameter>
+                                <owner start-index="15" stop-index="19" 
name="WMSYS" />
+                            </function>
+                        </parameter>
+                    </function>
+                </expr>
+            </expression-projection>
+        </projections>
+        <from>
+            <simple-table name="t_order" start-index="56" stop-index="64" 
alias="o" />
+        </from>
+        <group-by start-index="66" stop-index="84">
+            <column-item name="order_id" order-direction="ASC" 
start-index="75" stop-index="84">
+                <owner start-index="75" stop-index="75" name="o" />
+            </column-item>
+        </group-by>
+    </select>
 </sql-parser-test-cases>
diff --git 
a/test/it/parser/src/main/resources/sql/supported/dml/select-special-function.xml
 
b/test/it/parser/src/main/resources/sql/supported/dml/select-special-function.xml
index 3892c0cd142..3a84ceee379 100644
--- 
a/test/it/parser/src/main/resources/sql/supported/dml/select-special-function.xml
+++ 
b/test/it/parser/src/main/resources/sql/supported/dml/select-special-function.xml
@@ -57,4 +57,5 @@
     <sql-case id="select_dm_exec_sessions_with_json_object_function" 
value="SELECT s.session_id, JSON_OBJECT('security_id':s.security_id, 
'login':s.login_name, 'status':s.status) as info FROM sys.dm_exec_sessions AS s 
WHERE s.is_user_process = 1" db-types="SQLServer" />
     <sql-case id="select_first_last_value_function" value="SELECT 
BusinessEntityID, DATEPART(QUARTER, QuotaDate) AS Quarter, YEAR(QuotaDate) AS 
SalesYear, SalesQuota AS QuotaThisQuarter, SalesQuota - FIRST_VALUE(SalesQuota) 
OVER (PARTITION BY BusinessEntityID, YEAR(QuotaDate) ORDER BY DATEPART(QUARTER, 
QuotaDate)) AS DifferenceFromFirstQuarter, SalesQuota - LAST_VALUE(SalesQuota) 
OVER (PARTITION BY BusinessEntityID, YEAR(QuotaDate) ORDER BY DATEPART(QUARTER, 
QuotaDate) RANGE BETWEEN CURR [...]
     <sql-case id="select_approx_percentile_cont_function" value="SELECT 
DeptId,APPROX_PERCENTILE_CONT(0.10) WITHIN GROUP(ORDER BY Salary) AS 
'P10',APPROX_PERCENTILE_CONT(0.90) WITHIN GROUP(ORDER BY Salary) AS 'P90' FROM 
tblEmployee GROUP BY DeptId" db-types="SQLServer" />
+    <sql-case id="select_wm_concat_function_with_schema" value="SELECT 
TO_CHAR(WMSYS.WM_CONCAT(DISTINCT o.status)) FROM t_order o GROUP BY o.order_id" 
db-types="Oracle" />
 </sql-cases>

Reply via email to