From e206890a018348bc9a36b24efcc3be5a26150162 Mon Sep 17 00:00:00 2001 From: lingo-xp <36907211+lingo-xp@users.noreply.github.com> Date: Mon, 26 May 2025 17:03:33 +0800 Subject: [PATCH] Fix holo/ck array date type parse/output issue. (#6434) * Fix holo/ck array date type parse/output issue. * Fix holo/ck array date type parse/output issue. * Fix holo/ck array date type parse/output issue. --- .../clickhouse/parser/CKExprParser.java | 11 ++++++ .../clickhouse/visitor/CKOutputVisitor.java | 35 +++++-------------- .../visitor/HologresOutputVisitor.java | 9 +++++ .../druid/sql/parser/SQLExprParser.java | 2 +- .../resources/bvt/parser/clickhouse/0.txt | 12 +++++-- .../resources/bvt/parser/clickhouse/4.txt | 8 ++--- .../test/resources/bvt/parser/hologres/0.txt | 2 ++ 7 files changed, 45 insertions(+), 34 deletions(-) diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/clickhouse/parser/CKExprParser.java b/core/src/main/java/com/alibaba/druid/sql/dialect/clickhouse/parser/CKExprParser.java index 8071d258e..4b1bb29a9 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/clickhouse/parser/CKExprParser.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/clickhouse/parser/CKExprParser.java @@ -15,6 +15,7 @@ */ package com.alibaba.druid.sql.dialect.clickhouse.parser; +import com.alibaba.druid.sql.ast.SQLArrayDataType; import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; @@ -162,4 +163,14 @@ public class CKExprParser extends SQLExprParser { return struct; } + + @Override + protected SQLArrayDataType parseArrayDataType() { + lexer.nextToken(); + accept(Token.LPAREN); + SQLDataType itemType = parseDataType(); + SQLArrayDataType array = new SQLArrayDataType(itemType, dbType); + accept(Token.RPAREN); + return array; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/clickhouse/visitor/CKOutputVisitor.java b/core/src/main/java/com/alibaba/druid/sql/dialect/clickhouse/visitor/CKOutputVisitor.java index c6e2ec979..d9141b400 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/clickhouse/visitor/CKOutputVisitor.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/clickhouse/visitor/CKOutputVisitor.java @@ -180,33 +180,6 @@ public class CKOutputVisitor extends SQLASTOutputVisitor implements CKASTVisitor return false; } - @Override - public boolean visit(SQLArrayDataType x) { - final List arguments = x.getArguments(); - if (Boolean.TRUE.equals(x.getAttribute("ads.arrayDataType"))) { - x.getComponentType().accept(this); - print('['); - printAndAccept(arguments, ", "); - print(']'); - } else { - SQLDataType componentType = x.getComponentType(); - if (componentType != null) { - print0(ucase ? "Array<" : "array<"); - componentType.accept(this); - print('>'); - } else { - print0(ucase ? "Array" : "array"); - } - - if (arguments.size() > 0) { - print('('); - printAndAccept(arguments, ", "); - print(')'); - } - } - return false; - } - @Override public boolean visit(CKAlterTableUpdateStatement x) { print0(ucase ? "ALTER TABLE " : "alter table "); @@ -367,4 +340,12 @@ public class CKOutputVisitor extends SQLASTOutputVisitor implements CKASTVisitor print(')'); return false; } + + @Override + public boolean visit(SQLArrayDataType x) { + print0(ucase ? "ARRAY(" : "array("); + x.getComponentType().accept(this); + print(')'); + return false; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/hologres/visitor/HologresOutputVisitor.java b/core/src/main/java/com/alibaba/druid/sql/dialect/hologres/visitor/HologresOutputVisitor.java index 64a843010..83ed73163 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/hologres/visitor/HologresOutputVisitor.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/hologres/visitor/HologresOutputVisitor.java @@ -1,6 +1,7 @@ package com.alibaba.druid.sql.dialect.hologres.visitor; import com.alibaba.druid.DbType; +import com.alibaba.druid.sql.ast.SQLArrayDataType; import com.alibaba.druid.sql.ast.SQLPartitionBy; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGOutputVisitor; @@ -27,4 +28,12 @@ public class HologresOutputVisitor extends PGOutputVisitor { print0(ucase ? "PARTITION BY " : "partition by "); partitionBy.accept(this); } + + @Override + public boolean visit(SQLArrayDataType x) { + print0(ucase ? "ARRAY<" : "array<"); + x.getComponentType().accept(this); + print('>'); + return false; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/core/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index 2ca5bc2fe..c63c411f9 100644 --- a/core/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/core/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -4200,7 +4200,7 @@ public class SQLExprParser extends SQLParser { return null; } - if (lexer.identifierEquals(FnvHash.Constants.ARRAY)) { + if (lexer.identifierEquals(FnvHash.Constants.ARRAY) || lexer.token() == Token.ARRAY) { return parseArrayDataType(); } diff --git a/core/src/test/resources/bvt/parser/clickhouse/0.txt b/core/src/test/resources/bvt/parser/clickhouse/0.txt index 292c8613b..eda60597c 100644 --- a/core/src/test/resources/bvt/parser/clickhouse/0.txt +++ b/core/src/test/resources/bvt/parser/clickhouse/0.txt @@ -1,3 +1,11 @@ +CREATE TABLE test.test ( +`aa` Array(UInt64) ) +ENGINE = MergeTree() +-------------------- +CREATE TABLE test.test ( + `aa` ARRAY(UInt64) +) ENGINE = MergeTree() +------------------------------------------------------------------------------------------------------------------------ CREATE TABLE tmp.tmp_exp_mobile_tzfx_tzqy_m_20240506 ( date_code Int32 COMMENT '日期编码', @@ -176,8 +184,8 @@ CREATE TABLE if not exists etda.mytable1 -------------------- CREATE TABLE IF NOT EXISTS etda.mytable1 ( `id` UInt64, - `action_parameter_uint64_list` Array(UInt64), - `action_parameter_string_list` Array(String) + `action_parameter_uint64_list` ARRAY(UInt64), + `action_parameter_string_list` ARRAY(String) ) ------------------------------------------------------------------------------------------------------------------------ SELECT level, sum(cnt) OVER (PARTITION BY NULL ORDER BY level DESC) AS cnt diff --git a/core/src/test/resources/bvt/parser/clickhouse/4.txt b/core/src/test/resources/bvt/parser/clickhouse/4.txt index 9cfbb7097..f80aa361d 100644 --- a/core/src/test/resources/bvt/parser/clickhouse/4.txt +++ b/core/src/test/resources/bvt/parser/clickhouse/4.txt @@ -28,10 +28,10 @@ CREATE TABLE replicated_orders ( product_id LowCardinality(UInt32), quantity Int32, price Decimal(10, 2), - array1 Array(UInt8), + array1 ARRAY(UInt8), tuple1 Tuple(UInt8, String), map1 MAP(String, UInt64), - variant1 Variant(String, Array(UInt8)), + variant1 Variant(String, ARRAY(UInt8)), null1 Nullable(String) ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/replicated_orders', '{replica}') PARTITION BY order_date @@ -90,10 +90,10 @@ CREATE TABLE replicated_orders ( product_id LowCardinality(UInt32), quantity Int32, price Decimal(10, 2), - array1 Array(UInt8), + array1 ARRAY(UInt8), tuple1 Tuple(UInt8, String), map1 MAP(String, UInt64), - variant1 Variant(String, Array(UInt8)), + variant1 Variant(String, ARRAY(UInt8)), null1 Nullable(String) ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/replicated_orders', '{replica}') PARTITION BY (order_date, quantity) diff --git a/core/src/test/resources/bvt/parser/hologres/0.txt b/core/src/test/resources/bvt/parser/hologres/0.txt index dc7719420..1603fa0b1 100644 --- a/core/src/test/resources/bvt/parser/hologres/0.txt +++ b/core/src/test/resources/bvt/parser/hologres/0.txt @@ -2,6 +2,7 @@ CREATE TABLE IF NOT EXISTS my_partitioned_table ( id INT, name text, value FLOAT , +arr ARRAY, dt TEXT not null, region TEXT not null ) @@ -15,6 +16,7 @@ CREATE TABLE IF NOT EXISTS my_partitioned_table ( id INT, name text, value FLOAT, + arr ARRAY, dt TEXT NOT NULL, region TEXT NOT NULL )