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><=</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) <= 1 order by
1"
+ db-types="Oracle"/>
</sql-cases>