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 6fa387a65ff Oracle sql parser support approx rank. (#28477)
6fa387a65ff is described below

commit 6fa387a65ffdd85c2cb4b94b84ff3e4c77699ea1
Author: Cong Hu <[email protected]>
AuthorDate: Wed Sep 20 18:17:12 2023 +0800

    Oracle sql parser support approx rank. (#28477)
---
 .../src/main/antlr4/imports/oracle/BaseRule.g4     |  6 ++++-
 .../main/antlr4/imports/oracle/OracleKeyword.g4    |  4 +++
 .../visitor/statement/OracleStatementVisitor.java  | 12 ++++++++-
 .../main/resources/case/dml/select-aggregate.xml   | 29 ++++++++++++++++++++++
 .../sql/supported/dml/select-aggregate.xml         |  3 +++
 5 files changed, 52 insertions(+), 2 deletions(-)

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 327a850c566..385a3b837de 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
@@ -775,7 +775,11 @@ leadLagInfo
 
 specialFunction
     : castFunction | charFunction | extractFunction | formatFunction | 
firstOrLastValueFunction | trimFunction | featureFunction
-    | setFunction | translateFunction | cursorFunction | toDateFunction
+    | setFunction | translateFunction | cursorFunction | toDateFunction | 
approxRank
+    ;
+
+approxRank
+    : APPROX_RANK LP_ queryPartitionClause? orderByClause RP_
     ;
 
 toDateFunction
diff --git 
a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/OracleKeyword.g4 
b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/OracleKeyword.g4
index f9d6f4ca486..8297e155329 100644
--- a/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/OracleKeyword.g4
+++ b/parser/sql/dialect/oracle/src/main/antlr4/imports/oracle/OracleKeyword.g4
@@ -1751,6 +1751,10 @@ APPLY
     : A P P L Y
     ;
 
+APPROX_RANK
+    : A P P R O X UL_ R A N K
+    ;
+
 MAXIMIZE
     : M A X I M I Z E
     ;
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 c17be79e6cf..21715d6181e 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
@@ -27,6 +27,7 @@ import org.apache.shardingsphere.sql.parser.api.ASTNode;
 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementBaseVisitor;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AggregationFunctionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.AnalyticFunctionContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.ApproxRankContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.BitExprContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.BitValueLiteralsContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser.BooleanLiteralsContext;
@@ -976,8 +977,17 @@ public abstract class OracleStatementVisitor extends 
OracleStatementBaseVisitor<
         if (null != ctx.toDateFunction()) {
             return visit(ctx.toDateFunction());
         }
+        if (null != ctx.approxRank()) {
+            return visit(ctx.approxRank());
+        }
         throw new IllegalStateException(
-                "SpecialFunctionContext must have castFunction, charFunction, 
extractFunction, formatFunction, firstOrLastValueFunction, trimFunction, 
toDateFunction or featureFunction.");
+                "SpecialFunctionContext must have castFunction, charFunction, 
extractFunction, formatFunction, firstOrLastValueFunction, trimFunction, 
toDateFunction, approxCount"
+                        + " or featureFunction.");
+    }
+    
+    @Override
+    public ASTNode visitApproxRank(final ApproxRankContext ctx) {
+        return new FunctionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), ctx.APPROX_RANK().getText(), 
getOriginalText(ctx));
     }
     
     @Override
diff --git a/test/it/parser/src/main/resources/case/dml/select-aggregate.xml 
b/test/it/parser/src/main/resources/case/dml/select-aggregate.xml
index 2a861341fd3..bd6a0474542 100644
--- a/test/it/parser/src/main/resources/case/dml/select-aggregate.xml
+++ b/test/it/parser/src/main/resources/case/dml/select-aggregate.xml
@@ -461,4 +461,33 @@
             <aggregation-projection type="BIT_XOR" 
expression="BIT_XOR(user_id)" start-index="7" stop-index="22" />
         </projections>
     </select>
+    <select sql-case-id="select_approx_count">
+        <projections start-index="7" stop-index="92">
+            <column-projection name="owner" start-index="7" stop-index="11"/>
+            <expression-projection text="approx_count(*)" start-index="14" 
stop-index="28"/>
+            <expression-projection text="approx_rank(partition by owner order 
by approx_count(*) desc)" start-index="32" stop-index="92"/>
+        </projections>
+        <from>
+            <simple-table name="t" start-index="99" stop-index="99"/>
+        </from>
+        <group-by>
+            <column-item name="owner" start-index="110" stop-index="114"/>
+        </group-by>
+        <having start-index="116" stop-index="188">
+            <expr>
+                <binary-operation-expression start-index="123" 
stop-index="188">
+                    <left>
+                        <function function-name="approx_rank" 
start-index="123" stop-index="183" text="approx_rank(partition by owner order 
by approx_count(*) desc)"/>
+                    </left>
+                    <operator>&lt;=</operator>
+                    <right>
+                        <literal-expression start-index="188" stop-index="188" 
value="1"/>
+                    </right>
+                </binary-operation-expression>
+            </expr>
+        </having>
+        <order-by>
+            <index-item index="1" start-index="199" stop-index="199"/>
+        </order-by>
+    </select>
 </sql-parser-test-cases>
diff --git 
a/test/it/parser/src/main/resources/sql/supported/dml/select-aggregate.xml 
b/test/it/parser/src/main/resources/sql/supported/dml/select-aggregate.xml
index 5abe97537d5..829b8757786 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/select-aggregate.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/select-aggregate.xml
@@ -33,4 +33,7 @@
     <sql-case id="select_count_with_in_clause" value="SELECT COUNT(*) FROM 
t_order WHERE last_value IN (?, ?)" db-types="MySQL" />
     <sql-case id="select_count_with_not_in_clause" value="SELECT COUNT(*) FROM 
t_order WHERE category IN (?, ?) AND last_value NOT IN (?, ?)" db-types="MySQL" 
/>
     <sql-case id="select_bit_xor" value="SELECT BIT_XOR(user_id) FROM t_order" 
db-types="MySQL" />
+    <sql-case id="select_approx_count"
+              value="select owner, approx_count(*) , approx_rank(partition by 
owner order by approx_count(*) desc) from t group by owner having 
approx_rank(partition by owner order by approx_count(*) desc) &lt;= 1 order by 
1"
+              db-types="Oracle"/>
 </sql-cases>

Reply via email to