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 0b63957fa00 fix:Support Hive CREATE MATERIALIZED VIEW statement parse 
(#36144)
0b63957fa00 is described below

commit 0b63957fa001d7036c6cfd69209f7d81529989c5
Author: Claire <[email protected]>
AuthorDate: Fri Aug 1 11:37:59 2025 +0800

    fix:Support Hive CREATE MATERIALIZED VIEW statement parse (#36144)
    
    * support hive CREATE MATERIALIZED VIEW statement
    
    * Update RELEASE-NOTES.md
---
 RELEASE-NOTES.md                                   |  3 ++-
 .../src/main/antlr4/imports/hive/DDLStatement.g4   | 24 ++++++++++++++++++++++
 .../src/main/antlr4/imports/hive/HiveKeyword.g4    | 12 +++++++++++
 .../sql/parser/autogen/HiveStatement.g4            |  1 +
 .../statement/type/HiveDDLStatementVisitor.java    |  7 +++++++
 .../case/ddl/create-materialized-view.xml          | 17 +++++++++++++++
 .../sql/supported/ddl/create-materialized-view.xml | 17 +++++++++++++++
 7 files changed, 80 insertions(+), 1 deletion(-)

diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 53a1470f73b..554ba7d3517 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -77,7 +77,8 @@
 1. SQL Parser: Support Hive ALTER COLUMN statement parse - 
[#36096](https://github.com/apache/shardingsphere/pull/36096)
 1. SQL Parser: Support Hive CREATE VIEW statement parse - 
[#36120](https://github.com/apache/shardingsphere/pull/36120)
 1. SQL Parser: Support Hive DROP VIEW statement parse - 
[#36122](https://github.com/apache/shardingsphere/pull/36122)
-1. SQL Parser: Support Hive DROP VIEW statement parse - 
[#36134](https://github.com/apache/shardingsphere/pull/36134)
+1. SQL Parser: Support Hive ALTER VIEW statement parse - 
[#36134](https://github.com/apache/shardingsphere/pull/36134)
+1. SQL Parser: Support Hive CREATE MATERIALIZED VIEW statement parse - 
[#36144](https://github.com/apache/shardingsphere/pull/36144)
 1. SQL Parser: Support SQL Server xml methods parse - 
[#35911](https://github.com/apache/shardingsphere/pull/35911)
 1. SQL Parser: Support SQL Server CHANGETABLE function parse - 
[#35920](https://github.com/apache/shardingsphere/pull/35920)
 1. SQL Parser: Support SQL Server AI_GENERATE_EMBEDDINGS function parse - 
[#35922](https://github.com/apache/shardingsphere/pull/35922)
diff --git 
a/parser/sql/dialect/hive/src/main/antlr4/imports/hive/DDLStatement.g4 
b/parser/sql/dialect/hive/src/main/antlr4/imports/hive/DDLStatement.g4
index 41afc3def86..5ed45f89569 100644
--- a/parser/sql/dialect/hive/src/main/antlr4/imports/hive/DDLStatement.g4
+++ b/parser/sql/dialect/hive/src/main/antlr4/imports/hive/DDLStatement.g4
@@ -92,6 +92,10 @@ alterView
     | alterViewCommonClause AS select
     ;
 
+createMaterializedView
+    : CREATE MATERIALIZED VIEW ifNotExists? viewNameWithDb 
materializedViewOptions? AS select
+    ;
+
 alterDatabaseSpecification_
     : SET DBPROPERTIES LP_ dbProperties RP_
     | SET OWNER (USER | ROLE) identifier
@@ -401,3 +405,23 @@ addColumns
 replaceColumns
     : REPLACE COLUMNS LP_ columnDefinition (COMMA_ columnDefinition)* RP_ 
(CASCADE | RESTRICT)?
     ;
+
+materializedViewOptions
+    : materializedViewOption*
+    ;
+
+materializedViewOption
+    : DISABLE REWRITE
+    | COMMENT string_
+    | PARTITIONED ON LP_ columnNames RP_
+    | clusteredOrDistrbutedClause
+    | rowFormat
+    | storedAs
+    | storageLocation
+    | tblProperties
+    ;
+
+clusteredOrDistrbutedClause
+    : CLUSTERED ON LP_ columnNames RP_
+    | DISTRIBUTED ON LP_ columnNames RP_ SORTED ON LP_ columnNames RP_
+    ;
diff --git 
a/parser/sql/dialect/hive/src/main/antlr4/imports/hive/HiveKeyword.g4 
b/parser/sql/dialect/hive/src/main/antlr4/imports/hive/HiveKeyword.g4
index 2b5af367d38..71fa03d3f33 100644
--- a/parser/sql/dialect/hive/src/main/antlr4/imports/hive/HiveKeyword.g4
+++ b/parser/sql/dialect/hive/src/main/antlr4/imports/hive/HiveKeyword.g4
@@ -3333,3 +3333,15 @@ MSCK
 SYNC
     : S Y N C
     ;
+
+MATERIALIZED
+    : M A T E R I A L I Z E D
+    ;
+
+REWRITE
+    : R E W R I T E
+    ;
+
+DISTRIBUTED
+    : D I S T R I B U T E D
+    ;
diff --git 
a/parser/sql/dialect/hive/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/HiveStatement.g4
 
b/parser/sql/dialect/hive/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/HiveStatement.g4
index 1f85912a10c..222c8ed7e86 100644
--- 
a/parser/sql/dialect/hive/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/HiveStatement.g4
+++ 
b/parser/sql/dialect/hive/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/HiveStatement.g4
@@ -38,6 +38,7 @@ execute
     | createView
     | dropView
     | alterView
+    | createMaterializedView
     ) (SEMI_ EOF? | EOF)
     | EOF
     ;
diff --git 
a/parser/sql/dialect/hive/src/main/java/org/apache/shardingsphere/sql/parser/hive/visitor/statement/type/HiveDDLStatementVisitor.java
 
b/parser/sql/dialect/hive/src/main/java/org/apache/shardingsphere/sql/parser/hive/visitor/statement/type/HiveDDLStatementVisitor.java
index b8db65d723e..cb74c40b946 100644
--- 
a/parser/sql/dialect/hive/src/main/java/org/apache/shardingsphere/sql/parser/hive/visitor/statement/type/HiveDDLStatementVisitor.java
+++ 
b/parser/sql/dialect/hive/src/main/java/org/apache/shardingsphere/sql/parser/hive/visitor/statement/type/HiveDDLStatementVisitor.java
@@ -39,6 +39,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.HiveStatementParser.AlterVie
 import 
org.apache.shardingsphere.sql.parser.autogen.HiveStatementParser.MsckStatementContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.HiveStatementParser.ChangeColumnContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.HiveStatementParser.ColumnNameContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.HiveStatementParser.CreateMaterializedViewContext;
 import 
org.apache.shardingsphere.sql.parser.hive.visitor.statement.HiveStatementVisitor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.ColumnDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.constraint.ConstraintDefinitionSegment;
@@ -53,6 +54,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.ta
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.table.CreateTableStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.database.DropDatabaseStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.table.DropTableStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.CreateMaterializedViewStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.view.DropViewStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.collection.CollectionValue;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
@@ -332,4 +334,9 @@ public final class HiveDDLStatementVisitor extends 
HiveStatementVisitor implemen
         }
         return result;
     }
+    
+    @Override
+    public ASTNode visitCreateMaterializedView(final 
CreateMaterializedViewContext ctx) {
+        return new CreateMaterializedViewStatement(getDatabaseType());
+    }
 }
diff --git 
a/test/it/parser/src/main/resources/case/ddl/create-materialized-view.xml 
b/test/it/parser/src/main/resources/case/ddl/create-materialized-view.xml
index 433d59af518..f34ac9840c0 100644
--- a/test/it/parser/src/main/resources/case/ddl/create-materialized-view.xml
+++ b/test/it/parser/src/main/resources/case/ddl/create-materialized-view.xml
@@ -40,4 +40,21 @@
     <create-materialized-view 
sql-case-id="create_materialized_view_refresh_on_schedule" />
     <create-materialized-view 
sql-case-id="create_materialized_view_refresh_complete" />
     <create-materialized-view 
sql-case-id="create_materialized_view_build_immediate" />
+    <create-materialized-view 
sql-case-id="create_materialized_view_basic_hive" />
+    <create-materialized-view 
sql-case-id="create_materialized_view_with_if_not_exists_hive" />
+    <create-materialized-view 
sql-case-id="create_materialized_view_with_db_name_hive" />
+    <create-materialized-view 
sql-case-id="create_materialized_view_with_disable_rewrite_hive" />
+    <create-materialized-view 
sql-case-id="create_materialized_view_with_comment_hive" />
+    <create-materialized-view 
sql-case-id="create_materialized_view_with_partitioned_hive" />
+    <create-materialized-view 
sql-case-id="create_materialized_view_with_clustered_hive" />
+    <create-materialized-view 
sql-case-id="create_materialized_view_with_clustered_two_cols_hive" />
+    <create-materialized-view 
sql-case-id="create_materialized_view_with_distributed_sorted_hive" />
+    <create-materialized-view 
sql-case-id="create_materialized_view_with_row_format_hive" />
+    <create-materialized-view 
sql-case-id="create_materialized_view_with_stored_as_hive" />
+    <create-materialized-view 
sql-case-id="create_materialized_view_with_stored_by_no_serdeprops_hive" />
+    <create-materialized-view 
sql-case-id="create_materialized_view_with_stored_by_hive" />
+    <create-materialized-view 
sql-case-id="create_materialized_view_with_location_hive" />
+    <create-materialized-view 
sql-case-id="create_materialized_view_with_tblproperties_hive" />
+    <create-materialized-view 
sql-case-id="create_materialized_view_full_options_hive" />
+    <create-materialized-view 
sql-case-id="create_materialized_view_full_options_with_stored_by_hive" />
 </sql-parser-test-cases>
diff --git 
a/test/it/parser/src/main/resources/sql/supported/ddl/create-materialized-view.xml
 
b/test/it/parser/src/main/resources/sql/supported/ddl/create-materialized-view.xml
index fab9ced5f05..443dec360be 100644
--- 
a/test/it/parser/src/main/resources/sql/supported/ddl/create-materialized-view.xml
+++ 
b/test/it/parser/src/main/resources/sql/supported/ddl/create-materialized-view.xml
@@ -146,4 +146,21 @@
     <sql-case id="create_materialized_view_refresh_on_schedule" value="CREATE 
MATERIALIZED VIEW mv1 REFRESH ON SCHEDULE EVERY 2 HOUR STARTS '2023-12-13 
21:07:09' AS SELECT k1, k2 FROM test_table;" db-types="Doris" />
     <sql-case id="create_materialized_view_refresh_complete" value="CREATE 
MATERIALIZED VIEW mv1 REFRESH COMPLETE AS SELECT k1, k2 FROM test_table;" 
db-types="Doris" />
     <sql-case id="create_materialized_view_build_immediate" value="CREATE 
MATERIALIZED VIEW mv1 BUILD IMMEDIATE AS SELECT k1, k2 FROM test_table;" 
db-types="Doris" />
+    <sql-case id="create_materialized_view_basic_hive" value="CREATE 
MATERIALIZED VIEW sales_mv AS SELECT order_id, sum(amount) FROM sales GROUP BY 
order_id" db-types="Hive" />
+    <sql-case id="create_materialized_view_with_if_not_exists_hive" 
value="CREATE MATERIALIZED VIEW IF NOT EXISTS sales_mv AS SELECT order_id, 
sum(amount) FROM sales GROUP BY order_id" db-types="Hive" />
+    <sql-case id="create_materialized_view_with_db_name_hive" value="CREATE 
MATERIALIZED VIEW db1.sales_mv AS SELECT order_id, sum(amount) FROM db2.sales 
GROUP BY order_id" db-types="Hive" />
+    <sql-case id="create_materialized_view_with_disable_rewrite_hive" 
value="CREATE MATERIALIZED VIEW sales_mv disable REWRITE AS SELECT order_id, 
sum(amount) FROM sales GROUP BY order_id" db-types="Hive" />
+    <sql-case id="create_materialized_view_with_comment_hive" value="CREATE 
MATERIALIZED VIEW sales_mv COMMENT 'Materialized view for sales aggregation' AS 
SELECT order_id, sum(amount) FROM sales GROUP BY order_id" db-types="Hive" />
+    <sql-case id="create_materialized_view_with_partitioned_hive" 
value="CREATE MATERIALIZED VIEW sales_mv PARTITIONED ON (sale_date) AS SELECT 
order_id, sale_date, sum(amount) FROM sales GROUP BY order_id, sale_date" 
db-types="Hive" />
+    <sql-case id="create_materialized_view_with_clustered_hive" value="CREATE 
MATERIALIZED VIEW sales_mv CLUSTERED ON (order_id) AS SELECT order_id, 
sum(amount) FROM sales GROUP BY order_id" db-types="Hive" />
+    <sql-case id="create_materialized_view_with_clustered_two_cols_hive" 
value="CREATE MATERIALIZED VIEW sales_mv CLUSTERED ON (order_id, region) AS 
SELECT order_id, region, sum(amount) FROM sales GROUP BY order_id, region" 
db-types="Hive" />
+    <sql-case id="create_materialized_view_with_distributed_sorted_hive" 
value="CREATE MATERIALIZED VIEW sales_mv DISTRIBUTED ON (order_id) SORTED ON 
(sale_date) AS SELECT order_id, sale_date, sum(amount) FROM sales GROUP BY 
order_id, sale_date" db-types="Hive" />
+    <sql-case id="create_materialized_view_with_row_format_hive" value="CREATE 
MATERIALIZED VIEW sales_mv ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' AS 
SELECT order_id, sum(amount) FROM sales GROUP BY order_id" db-types="Hive" />
+    <sql-case id="create_materialized_view_with_stored_as_hive" value="CREATE 
MATERIALIZED VIEW sales_mv STORED AS PARQUET AS SELECT order_id, sum(amount) 
FROM sales GROUP BY order_id" db-types="Hive" />
+    <sql-case id="create_materialized_view_with_stored_by_no_serdeprops_hive" 
value="CREATE MATERIALIZED VIEW sales_mv STORED BY 
'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' AS SELECT order_id, 
sum(amount) FROM sales GROUP BY order_id" db-types="Hive" />
+    <sql-case id="create_materialized_view_with_stored_by_hive" value="CREATE 
MATERIALIZED VIEW sales_mv STORED BY 
'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES 
('hbase.columns.mapping' = ':key,cf:order_id,cf:amount') AS SELECT order_id, 
sum(amount) FROM sales GROUP BY order_id" db-types="Hive" />
+    <sql-case id="create_materialized_view_with_location_hive" value="CREATE 
MATERIALIZED VIEW sales_mv LOCATION '/user/hive/materialized_views/sales_mv' AS 
SELECT order_id, sum(amount) FROM sales GROUP BY order_id" db-types="Hive" />
+    <sql-case id="create_materialized_view_with_tblproperties_hive" 
value="CREATE MATERIALIZED VIEW sales_mv TBLPROPERTIES ('refresh_interval' = 
'1h', 'owner' = 'analytics_team') AS SELECT order_id, sum(amount) FROM sales 
GROUP BY order_id" db-types="Hive" />
+    <sql-case id="create_materialized_view_full_options_hive" value="CREATE 
MATERIALIZED VIEW IF NOT EXISTS db1.sales_mv DISABLE REWRITE COMMENT 
'Materialized view for monthly sales aggregation' PARTITIONED ON (sale_month) 
CLUSTERED ON (region, product_id) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' 
LINES TERMINATED BY '\n' NULL DEFINED AS '\\N' STORED AS ORC LOCATION 
'/user/hive/warehouse/db1.db/sales_mv' TBLPROPERTIES ('refresh_interval' = 
'1d', 'retention_days' = '90', 'owner' = 'an [...]
+    <sql-case id="create_materialized_view_full_options_with_stored_by_hive" 
value="CREATE MATERIALIZED VIEW IF NOT EXISTS db1.sales_hbase_mv DISABLE 
REWRITE COMMENT 'Materialized view for sales data stored in HBase' PARTITIONED 
ON (sale_quarter) DISTRIBUTED ON (region) SORTED ON (sale_date) STORED BY 
'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES 
('hbase.table.name' = 'sales:aggregated', 'hbase.columns.mapping' = 
':key,cf1:sale_quarter,cf1:region,cf1:total_order [...]
 </sql-cases>

Reply via email to