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 ac4bfc2d34f Support oracle keep clause parsing (#27420)
ac4bfc2d34f is described below

commit ac4bfc2d34f270154a06fc3867167269604118b9
Author: ZhangCheng <[email protected]>
AuthorDate: Mon Jul 24 17:22:30 2023 +0800

    Support oracle keep clause parsing (#27420)
    
    * Support oracle keep clause parsing
    
    * Support oracle keep clause parsing
---
 .../oracle/src/main/antlr4/imports/oracle/BaseRule.g4      |  6 +++++-
 test/it/parser/src/main/resources/case/dml/select.xml      | 14 ++++++++++++++
 .../parser/src/main/resources/sql/supported/dml/select.xml |  1 +
 3 files changed, 20 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 f1e55d54017..c3b84a416c6 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
@@ -685,7 +685,11 @@ functionCall
     ;
 
 aggregationFunction
-    : aggregationFunctionName LP_ (((DISTINCT | ALL)? expr (COMMA_ expr)*) | 
ASTERISK_) (COMMA_ stringLiterals)? listaggOverflowClause? RP_ (WITHIN GROUP 
LP_ orderByClause RP_)? overClause? overClause?
+    : aggregationFunctionName LP_ (((DISTINCT | ALL)? expr (COMMA_ expr)*) | 
ASTERISK_) (COMMA_ stringLiterals)? listaggOverflowClause? RP_ (WITHIN GROUP 
LP_ orderByClause RP_)? keepClause? overClause? overClause?
+    ;
+
+keepClause
+    : KEEP LP_ DENSE_RANK (FIRST | LAST) orderByClause RP_ overClause?
     ;
 
 aggregationFunctionName
diff --git a/test/it/parser/src/main/resources/case/dml/select.xml 
b/test/it/parser/src/main/resources/case/dml/select.xml
index 1e2041309a2..f39fd794adb 100644
--- a/test/it/parser/src/main/resources/case/dml/select.xml
+++ b/test/it/parser/src/main/resources/case/dml/select.xml
@@ -5726,4 +5726,18 @@
             <column-item name="department_id" order-direction="ASC" 
start-index="189" stop-index="201" literal-start-index="189" 
literal-stop-index="201" />
         </group-by>
     </select>
+
+    <select sql-case-id="select_with_keep_clause">
+        <projections start-index="7" stop-index="215" literal-start-index="7" 
literal-stop-index="215">
+            <column-projection name="salary" start-index="7" stop-index="12" 
literal-start-index="7" literal-stop-index="12" />
+            <aggregation-projection type="MIN" expression="MIN(salary) KEEP 
(DENSE_RANK FIRST ORDER BY commission_pct) OVER (PARTITION BY department_id)" 
alias="Worst" start-index="14" stop-index="106" literal-start-index="14" 
literal-stop-index="106" />
+            <aggregation-projection type="MAX" expression="MAX(salary) KEEP 
(DENSE_RANK LAST ORDER BY commission_pct) OVER (PARTITION BY department_id)" 
alias="Best" start-index="117" stop-index="208" literal-start-index="117" 
literal-stop-index="208" />
+        </projections>
+        <from>
+            <simple-table name="employees" start-index="222" stop-index="230" 
literal-start-index="222" literal-stop-index="230" />
+        </from>
+        <order-by>
+            <column-item name="department_id" order-direction="ASC" 
start-index="241" stop-index="253" literal-start-index="241" 
literal-stop-index="253" />
+        </order-by>
+    </select>
 </sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/select.xml 
b/test/it/parser/src/main/resources/sql/supported/dml/select.xml
index 12a934ea074..34338406191 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/select.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/select.xml
@@ -193,4 +193,5 @@
     <sql-case id="select_with_connect_by_root" value="SELECT CONNECT_BY_ROOT 
last_name 'Manager' FROM employees CONNECT BY PRIOR employee_id = manager_id" 
db-types="Oracle" />
     <sql-case id="select_with_ntile_function" value="SELECT NTILE(4) OVER 
(ORDER BY salary DESC) AS quartile FROM employees WHERE department_id = 100 
ORDER BY last_name" db-types="Oracle" />
     <sql-case id="select_with_percentile_functions" value="SELECT 
department_id, PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary DESC) 'Median 
cont', PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY salary DESC) 'Median disc' 
FROM employees GROUP BY department_id" db-types="Oracle" />
+    <sql-case id="select_with_keep_clause" value="SELECT salary,MIN(salary) 
KEEP (DENSE_RANK FIRST ORDER BY commission_pct) OVER (PARTITION BY 
department_id) 'Worst', MAX(salary) KEEP (DENSE_RANK LAST ORDER BY 
commission_pct) OVER (PARTITION BY department_id) 'Best' FROM employees ORDER 
BY department_id" db-types="Oracle" />
 </sql-cases>

Reply via email to