This is an automated email from the ASF dual-hosted git repository.
terrymanu 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 a579fccf932 Fix unsupported Doris window syntax parsing (#39622)
a579fccf932 is described below
commit a579fccf93205ee6d868bf0e269a1dac2a54e882
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Aug 28 13:46:05 2026 +0800
Fix unsupported Doris window syntax parsing (#39622)
---
.../src/main/antlr4/imports/doris/BaseRule.g4 | 22 +++++++++--
.../src/main/antlr4/imports/doris/DMLStatement.g4 | 12 ++----
.../visitor/statement/DorisStatementVisitor.java | 14 +------
.../statement/type/DorisDMLStatementVisitor.java | 36 ++----------------
.../resources/case/dml/select-special-function.xml | 44 +++++++++++++++++++---
.../src/main/resources/case/dml/select-window.xml | 27 -------------
.../parser/src/main/resources/case/dml/select.xml | 28 --------------
.../sql/supported/dml/select-special-function.xml | 3 +-
.../resources/sql/supported/dml/select-window.xml | 3 +-
.../main/resources/sql/supported/dml/select.xml | 1 -
.../main/resources/sql/unsupported/unsupported.xml | 9 +++++
11 files changed, 76 insertions(+), 123 deletions(-)
diff --git
a/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/BaseRule.g4
b/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/BaseRule.g4
index fbe6eb38cdf..d8b59cf049d 100644
--- a/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/BaseRule.g4
+++ b/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/BaseRule.g4
@@ -1103,7 +1103,9 @@ aggregationExpression
aggregationFunction
// DORIS CHANGED BEGIN
- : aggregationFunctionName LP_ (distinct | all)? aggregationExpression?
collateClause? separatorName? RP_ overClause?
+ : distinctWindowAggregationFunctionName LP_ distinct
aggregationExpression? collateClause? separatorName? RP_ overClause
+ | aggregationFunctionName LP_ distinct aggregationExpression?
collateClause? separatorName? RP_
+ | aggregationFunctionName LP_ all? aggregationExpression? collateClause?
separatorName? RP_ overClause?
// DORIS CHANGED END
;
@@ -1146,6 +1148,12 @@ aggregationFunctionName
: MAX | MIN | SUM | COUNT | AVG | BIT_XOR | GROUP_CONCAT
;
+// DORIS ADDED BEGIN
+distinctWindowAggregationFunctionName
+ : COUNT | SUM | GROUP_CONCAT
+ ;
+// DORIS ADDED END
+
// DORIS ADDED BEGIN
bitwiseBinaryFunctionName
: BITOR | BITXOR
@@ -1163,11 +1171,15 @@ all
// DORIS ADDED END
overClause
- : OVER (windowSpecification | identifier)
+ // DORIS CHANGED BEGIN
+ : OVER windowSpecification
+ // DORIS CHANGED END
;
windowSpecification
- : LP_ identifier? (PARTITION BY expr (COMMA_ expr)*)? orderByClause?
frameClause? RP_
+ // DORIS CHANGED BEGIN
+ : LP_ (PARTITION BY expr (COMMA_ expr)*)? orderByClause? frameClause? RP_
+ // DORIS CHANGED END
;
frameClause
@@ -1243,7 +1255,9 @@ windowFunction
;
windowingClause
- : OVER (windowName=identifier | windowSpecification)
+ // DORIS CHANGED BEGIN
+ : OVER windowSpecification
+ // DORIS CHANGED END
;
leadLagInfo
diff --git
a/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DMLStatement.g4
b/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DMLStatement.g4
index 896def74ebd..daadf34b192 100644
---
a/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DMLStatement.g4
+++
b/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DMLStatement.g4
@@ -154,7 +154,9 @@ queryPrimary
;
querySpecification
- : SELECT selectSpecification* projections selectIntoExpression?
fromClause? whereClause? groupByClause? havingClause? windowClause?
+ // DORIS CHANGED BEGIN
+ : SELECT selectSpecification* projections selectIntoExpression?
fromClause? whereClause? groupByClause? havingClause?
+ // DORIS CHANGED END
;
call
@@ -534,14 +536,6 @@ limitOffset
: numberLiterals | parameterMarker
;
-windowClause
- : WINDOW windowItem (COMMA_ windowItem)*
- ;
-
-windowItem
- : identifier AS windowSpecification
- ;
-
subquery
: queryExpressionParens
;
diff --git
a/parser/sql/engine/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/engine/doris/visitor/statement/DorisStatementVisitor.java
b/parser/sql/engine/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/engine/doris/visitor/statement/DorisStatementVisitor.java
index 458318bac61..b29794d0ff6 100644
---
a/parser/sql/engine/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/engine/doris/visitor/statement/DorisStatementVisitor.java
+++
b/parser/sql/engine/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/engine/doris/visitor/statement/DorisStatementVisitor.java
@@ -232,7 +232,6 @@ import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.Owner
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.ParameterMarkerSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.ParenthesesSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WindowItemSegment;
-import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WindowSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WithSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.match.MatchAgainstExpression;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.DeleteMultiTableSegment;
@@ -953,9 +952,6 @@ public abstract class DorisStatementVisitor extends
DorisStatementBaseVisitor<AS
if (null != ctx.havingClause()) {
selectStatementBuilder.having((HavingSegment)
visit(ctx.havingClause()));
}
- if (null != ctx.windowClause()) {
- selectStatementBuilder.window((WindowSegment)
visit(ctx.windowClause()));
- }
if (null != ctx.selectIntoExpression()) {
ASTNode intoSegment = visit(ctx.selectIntoExpression());
if (intoSegment instanceof OutfileSegment) {
@@ -1041,7 +1037,7 @@ public abstract class DorisStatementVisitor extends
DorisStatementBaseVisitor<AS
@Override
public final ASTNode visitAggregationFunction(final
AggregationFunctionContext ctx) {
- String aggregationType = ctx.aggregationFunctionName().getText();
+ String aggregationType = null == ctx.aggregationFunctionName() ?
ctx.distinctWindowAggregationFunctionName().getText() :
ctx.aggregationFunctionName().getText();
return AggregationType.isAggregationType(aggregationType)
? createAggregationSegment(ctx, aggregationType)
: new
ExpressionProjectionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), getOriginalText(ctx));
@@ -1129,21 +1125,13 @@ public abstract class DorisStatementVisitor extends
DorisStatementBaseVisitor<AS
if (null != ctx.frameClause()) {
result.setFrameClause(new
CommonExpressionSegment(ctx.frameClause().start.getStartIndex(),
ctx.frameClause().stop.getStopIndex(), getOriginalText(ctx.frameClause())));
}
- if (null != ctx.identifier()) {
- result.setWindowName(new
IdentifierValue(ctx.identifier().getText()));
- }
return result;
}
@Override
public ASTNode visitOverClause(final OverClauseContext ctx) {
WindowItemSegment result = new
WindowItemSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex());
- if (null != ctx.identifier()) {
- result.setWindowName(new
IdentifierValue(ctx.identifier().getText()));
- return result;
- }
WindowItemSegment windowItemSegment = (WindowItemSegment)
visit(ctx.windowSpecification());
- result.setWindowName(windowItemSegment.getWindowName());
result.setPartitionListSegments(windowItemSegment.getPartitionListSegments());
result.setOrderBySegment(windowItemSegment.getOrderBySegment());
result.setFrameClause(windowItemSegment.getFrameClause());
diff --git
a/parser/sql/engine/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/engine/doris/visitor/statement/type/DorisDMLStatementVisitor.java
b/parser/sql/engine/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/engine/doris/visitor/statement/type/DorisDMLStatementVisitor.java
index 2a633c14cf9..285387a718e 100644
---
a/parser/sql/engine/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/engine/doris/visitor/statement/type/DorisDMLStatementVisitor.java
+++
b/parser/sql/engine/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/engine/doris/visitor/statement/type/DorisDMLStatementVisitor.java
@@ -55,9 +55,7 @@ import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.BrokerL
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.ColumnNameContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.LoadStatementContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.LoadXmlStatementContext;
-import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.WindowClauseContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.WindowFunctionContext;
-import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.WindowItemContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.WindowingClauseContext;
import
org.apache.shardingsphere.sql.parser.engine.doris.visitor.statement.DorisStatementVisitor;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.load.BrokerLoadDataDescSegment;
@@ -81,7 +79,6 @@ import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.DatabaseSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.OwnerSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WindowItemSegment;
-import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.WindowSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.IndexHintSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dml.CallStatement;
@@ -556,26 +553,6 @@ public final class DorisDMLStatementVisitor extends
DorisStatementVisitor implem
return result;
}
- @Override
- public ASTNode visitWindowClause(final WindowClauseContext ctx) {
- WindowSegment result = new
WindowSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex());
- for (WindowItemContext each : ctx.windowItem()) {
- result.getItemSegments().add((WindowItemSegment) visit(each));
- }
- return result;
- }
-
- @Override
- public ASTNode visitWindowItem(final WindowItemContext ctx) {
- WindowItemSegment result = new
WindowItemSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex());
- result.setWindowName(new IdentifierValue(ctx.identifier().getText()));
- WindowItemSegment windowItemSegment = (WindowItemSegment)
visit(ctx.windowSpecification());
-
result.setPartitionListSegments(windowItemSegment.getPartitionListSegments());
- result.setOrderBySegment(windowItemSegment.getOrderBySegment());
- result.setFrameClause(windowItemSegment.getFrameClause());
- return result;
- }
-
@Override
public ASTNode visitWindowFunction(final WindowFunctionContext ctx) {
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.funcName.getText(), getOriginalText(ctx));
@@ -616,15 +593,10 @@ public final class DorisDMLStatementVisitor extends
DorisStatementVisitor implem
@Override
public ASTNode visitWindowingClause(final WindowingClauseContext ctx) {
WindowItemSegment result = new
WindowItemSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex());
- if (null != ctx.windowName) {
- result.setWindowName((IdentifierValue) visit(ctx.windowName));
- }
- if (null != ctx.windowSpecification()) {
- WindowItemSegment windowItemSegment = (WindowItemSegment)
visit(ctx.windowSpecification());
-
result.setPartitionListSegments(windowItemSegment.getPartitionListSegments());
- result.setOrderBySegment(windowItemSegment.getOrderBySegment());
- result.setFrameClause(windowItemSegment.getFrameClause());
- }
+ WindowItemSegment windowItemSegment = (WindowItemSegment)
visit(ctx.windowSpecification());
+
result.setPartitionListSegments(windowItemSegment.getPartitionListSegments());
+ result.setOrderBySegment(windowItemSegment.getOrderBySegment());
+ result.setFrameClause(windowItemSegment.getFrameClause());
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 d639febfcb1..26343a94d2c 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
@@ -5237,21 +5237,53 @@
</expression-projection>
</projections>
</select>
- <select sql-case-id="select_window_max_distinct_doris" db-types="Doris">
- <projections start-index="7" stop-index="72">
- <aggregation-distinct-projection type="MAX"
expression="MAX(DISTINCT order_id) OVER (PARTITION BY user_id)"
distinct-inner-expression="order_id" alias="max_order_id" start-index="7"
stop-index="56">
+ <select sql-case-id="select_max_distinct_doris" db-types="Doris">
+ <projections start-index="7" stop-index="44">
+ <aggregation-distinct-projection type="MAX"
expression="MAX(DISTINCT order_id)" distinct-inner-expression="order_id"
alias="max_order_id" start-index="7" stop-index="28">
<parameters>
<column name="order_id" start-index="20" stop-index="27" />
</parameters>
- <window-item start-index="30" stop-index="56">
+ </aggregation-distinct-projection>
+ </projections>
+ <from>
+ <simple-table name="t_order" start-index="51" stop-index="57" />
+ </from>
+ </select>
+ <select sql-case-id="select_window_distinct_aggregation_doris"
db-types="Doris">
+ <projections start-index="7" stop-index="171">
+ <aggregation-distinct-projection type="COUNT"
expression="COUNT(DISTINCT order_id) OVER (PARTITION BY user_id)"
distinct-inner-expression="order_id" start-index="7" stop-index="58">
+ <parameters>
+ <column name="order_id" start-index="22" stop-index="29" />
+ </parameters>
+ <window-item start-index="32" stop-index="58">
+ <partition-by>
+ <column name="user_id" start-index="51"
stop-index="57" />
+ </partition-by>
+ </window-item>
+ </aggregation-distinct-projection>
+ <aggregation-distinct-projection type="SUM"
expression="SUM(DISTINCT order_id) OVER (PARTITION BY user_id)"
distinct-inner-expression="order_id" start-index="61" stop-index="110">
+ <parameters>
+ <column name="order_id" start-index="74" stop-index="81" />
+ </parameters>
+ <window-item start-index="84" stop-index="110">
+ <partition-by>
+ <column name="user_id" start-index="103"
stop-index="109" />
+ </partition-by>
+ </window-item>
+ </aggregation-distinct-projection>
+ <aggregation-distinct-projection type="GROUP_CONCAT"
expression="GROUP_CONCAT(DISTINCT order_id) OVER (PARTITION BY user_id)"
distinct-inner-expression="order_id" start-index="113" stop-index="171">
+ <parameters>
+ <column name="order_id" start-index="135" stop-index="142"
/>
+ </parameters>
+ <window-item start-index="145" stop-index="171">
<partition-by>
- <column name="user_id" start-index="49"
stop-index="55" />
+ <column name="user_id" start-index="164"
stop-index="170" />
</partition-by>
</window-item>
</aggregation-distinct-projection>
</projections>
<from>
- <simple-table name="t_order" start-index="79" stop-index="85" />
+ <simple-table name="t_order" start-index="178" stop-index="184" />
</from>
</select>
<select sql-case-id="select_window_max_all_doris" db-types="Doris">
diff --git a/test/it/parser/src/main/resources/case/dml/select-window.xml
b/test/it/parser/src/main/resources/case/dml/select-window.xml
index a73c68cb6b2..fa5430a927e 100644
--- a/test/it/parser/src/main/resources/case/dml/select-window.xml
+++ b/test/it/parser/src/main/resources/case/dml/select-window.xml
@@ -474,31 +474,4 @@
</from>
</select>
- <select sql-case-id="select_window_named_base_partition_doris">
- <projections start-index="7" stop-index="60">
- <aggregation-projection type="SUM" expression="SUM(sales) OVER (w
PARTITION BY region)" alias="total_sales" start-index="7" stop-index="45">
- <window-item start-index="18" stop-index="45">
- <window-name>w</window-name>
- <partition-by>
- <column name="region" start-index="39" stop-index="44"
/>
- </partition-by>
- </window-item>
- <parameter>
- <column name="sales" start-index="11" stop-index="15" />
- </parameter>
- </aggregation-projection>
- </projections>
- <from>
- <simple-table name="orders" start-index="67" stop-index="72" />
- </from>
- <window start-index="74" stop-index="104">
- <window-item start-index="81" stop-index="104">
- <window-name>w</window-name>
- <order-by start-index="87" stop-index="103">
- <column-item name="order_id" order-direction="ASC"
start-index="96" stop-index="103" />
- </order-by>
- </window-item>
- </window>
- </select>
-
</sql-parser-test-cases>
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 474af3cfad1..5b9b8b9fbb5 100644
--- a/test/it/parser/src/main/resources/case/dml/select.xml
+++ b/test/it/parser/src/main/resources/case/dml/select.xml
@@ -7307,34 +7307,6 @@
</order-by>
</select>
- <select sql-case-id="select_window_named_partition_doris">
- <projections start-index="7" stop-index="38" literal-start-index="7"
literal-stop-index="38">
- <aggregation-projection type="SUM" expression="SUM(sales) OVER w"
alias="total_sales" start-index="7" stop-index="23" literal-start-index="7"
literal-stop-index="23">
- <window-item start-index="18" stop-index="23">
- <window-name>w</window-name>
- </window-item>
- </aggregation-projection>
- </projections>
- <from>
- <simple-table name="orders" start-index="45" stop-index="50"
literal-start-index="45" literal-stop-index="50" />
- </from>
- <window start-index="52" stop-index="102">
- <window-item start-index="59" stop-index="102">
- <window-name>w</window-name>
- <partition-by>
- <expression-projection text="region" start-index="78"
stop-index="83" literal-start-index="78" literal-stop-index="83">
- <expr>
- <column name="region" start-index="78"
stop-index="83" literal-start-index="78" literal-stop-index="83" />
- </expr>
- </expression-projection>
- </partition-by>
- <order-by>
- <column-item name="order_id" order-direction="ASC"
start-index="94" stop-index="101" literal-start-index="94"
literal-stop-index="101" />
- </order-by>
- </window-item>
- </window>
- </select>
-
<select sql-case-id="select_window_frame_lag_doris">
<projections start-index="7" stop-index="124" literal-start-index="7"
literal-stop-index="124">
<expression-projection text="LAG(amount, 1, 0) OVER (PARTITION BY
customer_id ORDER BY tx_time ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)"
alias="lag_amt" start-index="7" stop-index="124" literal-start-index="7"
literal-stop-index="124">
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 4a1aef152cb..1239c3e86a9 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
@@ -298,7 +298,8 @@
<sql-case id="select_bitmap_to_string_multiple" value="SELECT
BITMAP_TO_STRING(BITMAP_OR(TO_BITMAP(1), TO_BITMAP(2)))" db-types="Doris" />
<sql-case id="select_array_last" value="SELECT ARRAY_LAST(x -> x >
0, [1, 2, 3, -1, 2])" db-types="Doris" />
<sql-case id="select_array_last_with_multiple_parameters" value="SELECT
ARRAY_LAST((x, y) -> x > y, [1, 2, 3, 4, 5], [1.1, 2.2, 3.3, 4.4, 5.5])"
db-types="Doris" />
- <sql-case id="select_window_max_distinct_doris" value="SELECT MAX(DISTINCT
order_id) OVER (PARTITION BY user_id) AS max_order_id FROM t_order"
db-types="Doris" />
+ <sql-case id="select_max_distinct_doris" value="SELECT MAX(DISTINCT
order_id) AS max_order_id FROM t_order" db-types="Doris" />
+ <sql-case id="select_window_distinct_aggregation_doris" value="SELECT
COUNT(DISTINCT order_id) OVER (PARTITION BY user_id), SUM(DISTINCT order_id)
OVER (PARTITION BY user_id), GROUP_CONCAT(DISTINCT order_id) OVER (PARTITION BY
user_id) FROM t_order" db-types="Doris" />
<sql-case id="select_window_max_all_doris" value="SELECT MAX(ALL order_id)
OVER (PARTITION BY user_id) AS max_order_id FROM t_order" db-types="Doris" />
<sql-case id="select_instr" value="SELECT INSTR('foobar','bar')"
db-types="Doris" />
<sql-case id="select_strright" value="SELECT STRRIGHT('foobarbar',4)"
db-types="Doris" />
diff --git
a/test/it/parser/src/main/resources/sql/supported/dml/select-window.xml
b/test/it/parser/src/main/resources/sql/supported/dml/select-window.xml
index f5acbad8179..d5a4a7830f5 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/select-window.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/select-window.xml
@@ -18,7 +18,7 @@
<sql-cases>
<sql-case id="select_catalog_window_aggregation" value="select
pg_catalog.max(ref_0.c36) over (partition by ref_0.c39 order by ref_0.vkey
desc) as c_5 from t24 as ref_0" db-types="PostgreSQL,openGauss" />
- <sql-case id="select_window" value="SELECT user_id, ROW_NUMBER() OVER w AS
'row_number', RANK() OVER w AS 'rank', DENSE_RANK() OVER w AS 'dense_rank' FROM
t_order WHERE order_id = ? WINDOW w AS (ORDER BY user_id)"
db-types="MySQL,Doris,Hive" />
+ <sql-case id="select_window" value="SELECT user_id, ROW_NUMBER() OVER w AS
'row_number', RANK() OVER w AS 'rank', DENSE_RANK() OVER w AS 'dense_rank' FROM
t_order WHERE order_id = ? WINDOW w AS (ORDER BY user_id)"
db-types="MySQL,Hive" />
<sql-case id="select_window_partition_order_doris" value="SELECT
ROW_NUMBER() OVER (PARTITION BY k ORDER BY v) FROM t_order"
db-types="Doris,Hive" />
<sql-case id="select_window_rank_doris" value="SELECT RANK() OVER
(PARTITION BY k ORDER BY v) FROM t_order" db-types="Doris" />
<sql-case id="select_window_lead_lag_doris" value="SELECT LEAD(v) OVER
(PARTITION BY k ORDER BY v) FROM t_order" db-types="Doris" />
@@ -38,5 +38,4 @@
<sql-case id="select_window_min_partition_mysql" value="SELECT
MIN(order_id) OVER (PARTITION BY user_id) AS min_order_id FROM t_order"
db-types="MySQL" />
<sql-case id="select_window_max_partition_mysql" value="SELECT
MAX(order_id) OVER (PARTITION BY user_id) AS max_order_id FROM t_order"
db-types="MySQL" />
<sql-case id="select_window_funnel_over_doris" value="SELECT
WINDOW_FUNNEL(3600, 'default', v, k = 1) OVER (PARTITION BY k ORDER BY v) FROM
t_order" db-types="Doris" />
- <sql-case id="select_window_named_base_partition_doris" value="SELECT
SUM(sales) OVER (w PARTITION BY region) AS total_sales FROM orders WINDOW w AS
(ORDER BY order_id)" db-types="Doris" />
</sql-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 efc5b04cb5f..b996e738a5a 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
@@ -258,7 +258,6 @@
<sql-case id="select_with_lead_and_lag_function" value="SELECT hire_date,
LAG(hire_date, 1) OVER (ORDER BY hire_date) AS LAG1, LEAD(hire_date, 1) OVER
(ORDER BY hire_date) AS LEAD1 FROM employees WHERE department_id = 30 ORDER BY
hire_date;" db-types="Oracle,MySQL" />
<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,MySQL,Doris" />
- <sql-case id="select_window_named_partition_doris" value="SELECT
SUM(sales) OVER w AS total_sales FROM orders WINDOW w AS (PARTITION BY region
ORDER BY order_id)" db-types="Doris" />
<sql-case id="select_window_frame_lag_doris" value="SELECT LAG(amount, 1,
0) OVER (PARTITION BY customer_id ORDER BY tx_time ROWS BETWEEN 1 PRECEDING AND
1 FOLLOWING) AS lag_amt FROM payments" db-types="Doris" />
<sql-case id="select_first_value_doris" value="SELECT FIRST_VALUE(price)
OVER (ORDER BY created_at) AS first_price FROM product_prices" db-types="Doris"
/>
<sql-case id="select_nth_value_doris" value="SELECT NTH_VALUE(score, 2)
OVER (ORDER BY score) AS second_score FROM rankings" db-types="Doris" />
diff --git a/test/it/parser/src/main/resources/sql/unsupported/unsupported.xml
b/test/it/parser/src/main/resources/sql/unsupported/unsupported.xml
index fc678f86de4..f704eca6ba3 100644
--- a/test/it/parser/src/main/resources/sql/unsupported/unsupported.xml
+++ b/test/it/parser/src/main/resources/sql/unsupported/unsupported.xml
@@ -31,6 +31,15 @@
<sql-case
id="unsupported_alter_database_set_transaction_quota_with_unit_for_doris"
value="ALTER DATABASE example_db SET TRANSACTION QUOTA 1G" db-types="Doris" />
<sql-case
id="unsupported_create_table_with_char_varying_without_length_for_doris"
value="CREATE TABLE t_varying (c CHAR VARYING)" db-types="Doris" />
<sql-case
id="unsupported_create_table_with_character_varying_without_length_for_doris"
value="CREATE TABLE t_varying (c CHARACTER VARYING)" db-types="Doris" />
+ <sql-case id="unsupported_doris_aggregate_named_window" value="SELECT
SUM(1) OVER w" db-types="Doris" />
+ <sql-case id="unsupported_doris_parenthesized_named_window" value="SELECT
SUM(1) OVER (w)" db-types="Doris" />
+ <sql-case id="unsupported_doris_inherited_named_window" value="SELECT
SUM(v) OVER (w PARTITION BY g ORDER BY v) FROM t" db-types="Doris" />
+ <sql-case id="unsupported_doris_analytic_named_window" value="SELECT
ROW_NUMBER() OVER w" db-types="Doris" />
+ <sql-case id="unsupported_doris_window_clause" value="SELECT SUM(v) OVER
(ORDER BY v) FROM t WINDOW w AS (ORDER BY v)" db-types="Doris" />
+ <sql-case id="unsupported_doris_max_distinct_window" value="SELECT
MAX(DISTINCT v) OVER ()" db-types="Doris" />
+ <sql-case id="unsupported_doris_min_distinct_window" value="SELECT
MIN(DISTINCT v) OVER ()" db-types="Doris" />
+ <sql-case id="unsupported_doris_avg_distinct_window" value="SELECT
AVG(DISTINCT v) OVER ()" db-types="Doris" />
+ <sql-case id="unsupported_doris_bit_xor_distinct_window" value="SELECT
BIT_XOR(DISTINCT v) OVER ()" db-types="Doris" />
<sql-case id="select_like" value="select conname, obj_description(oid,
'pg_constraint') as desc from pg_constraint where conname like
'at_partitioned%' order by conname" db-types="PostgreSQL" />
<sql-case id="select_keyword" value="select relname,c.oid = oldoid as
orig_oid,case relfilenode when 0 then 'none' when c.oid then 'own' when
oldfilenode then 'orig' else 'OTHER' end as storage, obj_description(c.oid,
'pg_class') as desc from pg_class c left join old_oids using (relname) where
relname like 'at_partitioned%' order by relname" db-types="PostgreSQL" />
<sql-case id="unsupported_date_literal_for_clickhouse" value="SELECT DATE
'2024-01-01'" db-types="ClickHouse" />