You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2023/04/22 11:17:52 UTC

[doris] 04/15: [fix](planner) Failed to create table with CTAS when multiple varchar type filed as key (#18814)

This is an automated email from the ASF dual-hosted git repository.

morningman pushed a commit to branch branch-2.0-alpha
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 19f7051355c125a18c670f4edc23ddb6b9f6bef6
Author: AKIRA <33...@users.noreply.github.com>
AuthorDate: Fri Apr 21 14:33:35 2023 +0900

    [fix](planner) Failed to create table with CTAS when multiple varchar type filed as key (#18814)
    
    Add restricton for converting varchar/char to string type, only fields that is string type and not in key desc could be convert to string type now.
---
 .../apache/doris/datasource/InternalCatalog.java   |  8 +++-
 .../analysis/CreateTableAsSelectStmtTest.java      |  2 +-
 regression-test/suites/ddl_p0/test_ctas.groovy     | 49 ++++++++++++++++++++++
 3 files changed, 57 insertions(+), 2 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
index 290eddf9c1..9994b3ad08 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
@@ -43,6 +43,7 @@ import org.apache.doris.analysis.DropDbStmt;
 import org.apache.doris.analysis.DropPartitionClause;
 import org.apache.doris.analysis.DropTableStmt;
 import org.apache.doris.analysis.Expr;
+import org.apache.doris.analysis.FunctionCallExpr;
 import org.apache.doris.analysis.HashDistributionDesc;
 import org.apache.doris.analysis.KeysDesc;
 import org.apache.doris.analysis.LinkDbStmt;
@@ -1216,6 +1217,7 @@ public class InternalCatalog implements CatalogIf<Database> {
             List<String> columnNames = stmt.getColumnNames();
             CreateTableStmt createTableStmt = stmt.getCreateTableStmt();
             QueryStmt queryStmt = stmt.getQueryStmt();
+            KeysDesc keysDesc = createTableStmt.getKeysDesc();
             ArrayList<Expr> resultExprs = queryStmt.getResultExprs();
             ArrayList<String> colLabels = queryStmt.getColLabels();
             int size = resultExprs.size();
@@ -1237,7 +1239,11 @@ public class InternalCatalog implements CatalogIf<Database> {
                 TypeDef typeDef;
                 Expr resultExpr = resultExprs.get(i);
                 Type resultType = resultExpr.getType();
-                if (resultType.isStringType()) {
+                if (resultExpr instanceof FunctionCallExpr
+                        && resultExpr.getType().getPrimitiveType().equals(PrimitiveType.VARCHAR)) {
+                    resultType = ScalarType.createVarchar(65533);
+                }
+                if (resultType.isStringType() && (keysDesc == null || !keysDesc.containsCol(name))) {
                     // Use String for varchar/char/string type,
                     // to avoid char-length-vs-byte-length issue.
                     typeDef = new TypeDef(ScalarType.createStringType());
diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateTableAsSelectStmtTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateTableAsSelectStmtTest.java
index 58fcff2c2a..9544dfc7a6 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateTableAsSelectStmtTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateTableAsSelectStmtTest.java
@@ -473,7 +473,7 @@ public class CreateTableAsSelectStmtTest extends TestWithFeService {
         ShowResultSet showResultSet = showCreateTableByName("test_use_key_type");
         Assertions.assertEquals(
                 "CREATE TABLE `test_use_key_type` (\n"
-                        + "  `userId` varchar(65533) NOT NULL,\n"
+                        + "  `userId` varchar(255) NOT NULL,\n"
                         + "  `username` text NOT NULL\n"
                         + ") ENGINE=OLAP\n"
                         + "UNIQUE KEY(`userId`)\n"
diff --git a/regression-test/suites/ddl_p0/test_ctas.groovy b/regression-test/suites/ddl_p0/test_ctas.groovy
index 1fdb93cc58..e17b82b2ec 100644
--- a/regression-test/suites/ddl_p0/test_ctas.groovy
+++ b/regression-test/suites/ddl_p0/test_ctas.groovy
@@ -107,6 +107,51 @@ suite("test_ctas") {
             rowNum 6
         }
 
+        sql """
+            create table if not exists test_tbl_81748325
+            (
+                `col1`        varchar(66) not null ,
+                `col2`      bigint      not null ,
+                `col3`  varchar(66) not null ,
+                `col4`  varchar(42) not null ,
+                `col5` bigint      not null ,
+                `col6`         bigint      not null ,
+                `col7`        datetime    not null ,
+                `col8`            varchar(66) not null, 
+                `col9`            varchar(66)          ,
+                `col10`            varchar(66)          ,
+                `col11`            varchar(66)          ,
+                `col12`              text                 
+            )
+            UNIQUE KEY (`col1`,`col2`,`col3`,`col4`,`col5`,`col6`)
+            DISTRIBUTED BY HASH(`col4`) BUCKETS 1
+            PROPERTIES (
+            "replication_allocation" = "tag.location.default: 1"
+            );
+        """
+
+        sql """
+            create table `test_tbl_3156019`
+            UNIQUE KEY (col4,col3,from_address,to_address)
+            DISTRIBUTED BY HASH (col4) BUCKETS 1
+            PROPERTIES (
+                  "replication_allocation" = "tag.location.default: 1"
+            )
+           as 
+            select
+                col4                                as col4,
+                col3                                as col3,
+                concat('0x', substring(col9, 27))             as from_address,
+                concat('0x', substring(col10, 27))             as to_address,
+                col7                                      as date_time,
+                now()                                           as update_time,
+                '20230318'                                      as pt,
+                col8                                            as amount
+            from test_tbl_81748325
+            where col4 = '43815251'
+              and substring(col8, 1, 10) = '1451601';
+        """
+
     } finally {
         sql """ DROP TABLE IF EXISTS test_ctas """
 
@@ -119,6 +164,10 @@ suite("test_ctas") {
         sql """ DROP TABLE IF EXISTS test_ctas_json_object1 """
 
         sql """drop table if exists a"""
+
+        sql """DROP TABLE IF EXISTS test_tbl_81748325"""
+
+        sql """DROP TABLE IF EXISTS test_tbl_3156019"""
     }
 
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org