From d4e1a6ba837552ef7d8d41b73a15cf72b5488488 Mon Sep 17 00:00:00 2001 From: morningman Date: Thu, 10 Aug 2023 14:43:03 +0800 Subject: [PATCH] [branch2.0](fix) fix varchar len in ctas This is only for branch-2.0 related to #21754 and #21302 --- .../org/apache/doris/analysis/ColumnDef.java | 9 ++++-- .../analysis/CreateTableAsSelectStmtTest.java | 28 +++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnDef.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnDef.java index e65d5c4c9a9d90..2ae7a043357966 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnDef.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnDef.java @@ -316,11 +316,14 @@ public void analyze(boolean isOlap) throws AnalysisException { if (typeDef.getType().isScalarType()) { final ScalarType targetType = (ScalarType) typeDef.getType(); if (targetType.getPrimitiveType().isStringType() && !targetType.isLengthSet()) { - if (targetType.getPrimitiveType() != PrimitiveType.STRING) { - targetType.setLength(1); - } else { + if (targetType.getPrimitiveType() == PrimitiveType.VARCHAR) { + // always set varchar length MAX_VARCHAR_LENGTH + targetType.setLength(ScalarType.MAX_VARCHAR_LENGTH); + } else if (targetType.getPrimitiveType() == PrimitiveType.STRING) { // always set text length MAX_STRING_LENGTH targetType.setLength(ScalarType.MAX_STRING_LENGTH); + } else { + targetType.setLength(1); } } } 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 2a5ff740d5929a..1d2bcdb146f58a 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 @@ -576,4 +576,32 @@ public void testQuerySchema() throws Exception { } Assert.assertEquals(2, createStmts.size()); } + + @Test + public void testVarcharLength() throws Exception { + String createSql = + "create table `test`.`varchar_len1` PROPERTIES (\"replication_num\" = \"1\")" + + " as select 'abc', concat('xx', userId), userId from `test`.`varchar_table`"; + createTableAsSelect(createSql); + ShowResultSet showResultSet = showCreateTableByName("varchar_len1"); + String showStr = showResultSet.getResultRows().get(0).get(1); + Assertions.assertEquals( + "CREATE TABLE `varchar_len1` (\n" + + " `_col0` varchar(65533) NULL,\n" + + " `_col1` varchar(65533) NULL,\n" + + " `userId` varchar(255) NOT NULL\n" + + ") ENGINE=OLAP\n" + + "DUPLICATE KEY(`_col0`)\n" + + "COMMENT 'OLAP'\n" + + "DISTRIBUTED BY HASH(`_col0`) BUCKETS 10\n" + + "PROPERTIES (\n" + + "\"replication_allocation\" = \"tag.location.default: 1\",\n" + + "\"is_being_synced\" = \"false\",\n" + + "\"storage_format\" = \"V2\",\n" + + "\"light_schema_change\" = \"true\",\n" + + "\"disable_auto_compaction\" = \"false\",\n" + + "\"enable_single_replica_compaction\" = \"false\"\n" + + ");", + showStr); + } }