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

zhaoc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git


The following commit(s) were added to refs/heads/master by this push:
     new f7032b0  Support more schema change from VARCHAR type (#2501)
f7032b0 is described below

commit f7032b07f3fdd158177fbe48e8421bdadc77d186
Author: WingC <[email protected]>
AuthorDate: Thu Dec 26 22:38:53 2019 +0800

    Support more schema change from VARCHAR type (#2501)
---
 be/src/olap/schema_change.cpp                      |  18 +-
 be/src/olap/types.h                                |  86 +++++++-
 be/test/olap/schema_change_test.cpp                | 219 ++++++++++++---------
 .../sql-statements/Data Definition/ALTER TABLE.md  |   2 +-
 .../Data Definition/ALTER TABLE_EN.md              |   2 +-
 .../java/org/apache/doris/catalog/ColumnType.java  |  10 +-
 6 files changed, 224 insertions(+), 113 deletions(-)

diff --git a/be/src/olap/schema_change.cpp b/be/src/olap/schema_change.cpp
index fd18754..91f86ba 100644
--- a/be/src/olap/schema_change.cpp
+++ b/be/src/olap/schema_change.cpp
@@ -338,12 +338,18 @@ bool RowBlockChanger::change_row_block(
                         write_helper.set_field_content(i, buf, mem_pool);
                     }
                 }
-            } else if ((newtype == OLAP_FIELD_TYPE_INT && reftype == 
OLAP_FIELD_TYPE_VARCHAR)
-                || (newtype == OLAP_FIELD_TYPE_DOUBLE && reftype == 
OLAP_FIELD_TYPE_FLOAT)
-                || (newtype == OLAP_FIELD_TYPE_DATE && reftype == 
OLAP_FIELD_TYPE_INT)
-                || (newtype == OLAP_FIELD_TYPE_DATE && reftype == 
OLAP_FIELD_TYPE_VARCHAR)
-                || (newtype == OLAP_FIELD_TYPE_DATE && reftype == 
OLAP_FIELD_TYPE_DATETIME)
-                || (newtype == OLAP_FIELD_TYPE_DATETIME && reftype == 
OLAP_FIELD_TYPE_DATE)) {
+            } else if ((reftype == OLAP_FIELD_TYPE_FLOAT && newtype == 
OLAP_FIELD_TYPE_DOUBLE)
+                || (reftype == OLAP_FIELD_TYPE_INT && newtype == 
OLAP_FIELD_TYPE_DATE)
+                || (reftype == OLAP_FIELD_TYPE_DATE && newtype == 
OLAP_FIELD_TYPE_DATETIME)
+                || (reftype == OLAP_FIELD_TYPE_DATETIME && newtype == 
OLAP_FIELD_TYPE_DATE)
+                || (reftype == OLAP_FIELD_TYPE_VARCHAR && newtype == 
OLAP_FIELD_TYPE_DATE)
+                || (reftype == OLAP_FIELD_TYPE_VARCHAR && newtype == 
OLAP_FIELD_TYPE_FLOAT)
+                || (reftype == OLAP_FIELD_TYPE_VARCHAR && newtype == 
OLAP_FIELD_TYPE_DOUBLE)
+                || (reftype == OLAP_FIELD_TYPE_VARCHAR && newtype == 
OLAP_FIELD_TYPE_TINYINT)
+                || (reftype == OLAP_FIELD_TYPE_VARCHAR && newtype == 
OLAP_FIELD_TYPE_SMALLINT)
+                || (reftype == OLAP_FIELD_TYPE_VARCHAR && newtype == 
OLAP_FIELD_TYPE_INT)
+                || (reftype == OLAP_FIELD_TYPE_VARCHAR && newtype == 
OLAP_FIELD_TYPE_BIGINT)
+                || (reftype == OLAP_FIELD_TYPE_VARCHAR && newtype == 
OLAP_FIELD_TYPE_LARGEINT)) {
                 for (size_t row_index = 0, new_row_index = 0;
                         row_index < ref_block->row_block_info().row_num; 
++row_index) {
                     // Skip filtered rows
diff --git a/be/src/olap/types.h b/be/src/olap/types.h
index 6e581ae..155bb0b 100644
--- a/be/src/olap/types.h
+++ b/be/src/olap/types.h
@@ -255,6 +255,32 @@ struct BaseFieldtypeTraits : public 
CppTypeTraits<field_type> {
     }
 };
 
+template <typename T>
+OLAPStatus convert_int_from_varchar(void* dest, const void* src) {
+    using SrcType = typename CppTypeTraits<OLAP_FIELD_TYPE_VARCHAR>::CppType;
+    auto src_value = reinterpret_cast<const SrcType*>(src);
+    StringParser::ParseResult parse_res;
+    T result = StringParser::string_to_int<T>(src_value->get_data(), 
src_value->get_size(), &parse_res);
+    if (UNLIKELY(parse_res != StringParser::PARSE_SUCCESS)) {
+        return OLAPStatus::OLAP_ERR_INVALID_SCHEMA;
+    }
+    memcpy(dest, &result, sizeof(T));
+    return OLAPStatus::OLAP_SUCCESS;
+}
+
+template <typename T>
+OLAPStatus convert_float_from_varchar(void* dest, const void* src) {
+    using SrcType = typename CppTypeTraits<OLAP_FIELD_TYPE_VARCHAR>::CppType;
+    auto src_value = reinterpret_cast<const SrcType *>(src);
+    StringParser::ParseResult parse_res;
+    T result = StringParser::string_to_float<T>(src_value->get_data(), 
src_value->get_size(), &parse_res);
+    if (UNLIKELY(parse_res != StringParser::PARSE_SUCCESS)) {
+        return OLAPStatus::OLAP_ERR_INVALID_SCHEMA;
+    }
+    *reinterpret_cast<T*>(dest) = result;
+    return OLAPStatus::OLAP_SUCCESS;
+}
+
 template<FieldType field_type>
 struct FieldTypeTraits : public BaseFieldtypeTraits<field_type> { };
 
@@ -280,6 +306,27 @@ struct FieldTypeTraits<OLAP_FIELD_TYPE_TINYINT> : public 
BaseFieldtypeTraits<OLA
         snprintf(buf, sizeof(buf), "%d", *reinterpret_cast<const 
int8_t*>(src));
         return std::string(buf);
     }
+    static OLAPStatus convert_from(void* dest, const void* src, const 
TypeInfo* src_type, MemPool* mem_pool) {
+        if (src_type->type() == OLAP_FIELD_TYPE_VARCHAR) {
+            return convert_int_from_varchar<CppType>(dest, src);
+        }
+        return OLAPStatus::OLAP_ERR_INVALID_SCHEMA;
+    }
+};
+
+template<>
+struct FieldTypeTraits<OLAP_FIELD_TYPE_SMALLINT> : public 
BaseFieldtypeTraits<OLAP_FIELD_TYPE_SMALLINT> {
+    static std::string to_string(const void* src) {
+        char buf[1024] = {'\0'};
+        snprintf(buf, sizeof(buf), "%d", *reinterpret_cast<const 
int16_t*>(src));
+        return std::string(buf);
+    }
+    static OLAPStatus convert_from(void* dest, const void* src, const 
TypeInfo* src_type, MemPool* mem_pool) {
+        if (src_type->type() == OLAP_FIELD_TYPE_VARCHAR) {
+            return convert_int_from_varchar<CppType>(dest, src);
+        }
+        return OLAPStatus::OLAP_ERR_INVALID_SCHEMA;
+    }
 };
 
 template<>
@@ -289,18 +336,24 @@ struct FieldTypeTraits<OLAP_FIELD_TYPE_INT> : public 
BaseFieldtypeTraits<OLAP_FI
         snprintf(buf, sizeof(buf), "%d", *reinterpret_cast<const int32_t 
*>(src));
         return std::string(buf);
     }
+    static OLAPStatus convert_from(void* dest, const void* src, const 
TypeInfo* src_type, MemPool* mem_pool) {
+        if (src_type->type() == OLAP_FIELD_TYPE_VARCHAR) {
+            return convert_int_from_varchar<CppType>(dest, src);
+        }
+        return OLAPStatus::OLAP_ERR_INVALID_SCHEMA;
+    }
+};
 
+template<>
+struct FieldTypeTraits<OLAP_FIELD_TYPE_BIGINT> : public 
BaseFieldtypeTraits<OLAP_FIELD_TYPE_BIGINT> {
+    static std::string to_string(const void* src) {
+        char buf[1024] = {'\0'};
+        snprintf(buf, sizeof(buf), "%ld", *reinterpret_cast<const 
int64_t*>(src));
+        return std::string(buf);
+    }
     static OLAPStatus convert_from(void* dest, const void* src, const 
TypeInfo* src_type, MemPool* mem_pool) {
         if (src_type->type() == OLAP_FIELD_TYPE_VARCHAR) {
-            using SrcType = typename 
CppTypeTraits<OLAP_FIELD_TYPE_VARCHAR>::CppType;
-            using DestType = typename 
CppTypeTraits<OLAP_FIELD_TYPE_INT>::CppType;
-            auto src_value = *reinterpret_cast<const SrcType*>(src);
-            StringParser::ParseResult parse_res;
-            auto result = 
StringParser::string_to_int<DestType>(src_value.get_data(), 
src_value.get_size(), &parse_res);
-            if (parse_res == StringParser::PARSE_SUCCESS) {
-                *reinterpret_cast<DestType*>(dest) = result;
-                return OLAPStatus::OLAP_SUCCESS;
-            }
+            return convert_int_from_varchar<CppType>(dest, src);
         }
         return OLAPStatus::OLAP_ERR_INVALID_SCHEMA;
     }
@@ -406,6 +459,12 @@ struct FieldTypeTraits<OLAP_FIELD_TYPE_LARGEINT> : public 
BaseFieldtypeTraits<OL
     static void set_to_min(void* buf) {
         *reinterpret_cast<PackedInt128*>(buf) = (int128_t)(1) << 127;
     }
+    static OLAPStatus convert_from(void* dest, const void* src, const 
TypeInfo* src_type, MemPool* mem_pool) {
+        if (src_type->type() == OLAP_FIELD_TYPE_VARCHAR) {
+            return convert_int_from_varchar<CppType>(dest, src);
+        }
+        return OLAPStatus::OLAP_ERR_INVALID_SCHEMA;
+    }
 };
 
 template<>
@@ -418,6 +477,12 @@ struct FieldTypeTraits<OLAP_FIELD_TYPE_FLOAT> : public 
BaseFieldtypeTraits<OLAP_
         *reinterpret_cast<CppType*>(buf) = value;
         return OLAP_SUCCESS;
     }
+    static OLAPStatus convert_from(void* dest, const void* src, const 
TypeInfo* src_type, MemPool* mem_pool) {
+        if (src_type->type() == OLAP_FIELD_TYPE_VARCHAR) {
+            return convert_float_from_varchar<CppType>(dest, src);
+        }
+        return OLAPStatus::OLAP_ERR_INVALID_SCHEMA;
+    }
 };
 
 template<>
@@ -455,6 +520,9 @@ struct FieldTypeTraits<OLAP_FIELD_TYPE_DOUBLE> : public 
BaseFieldtypeTraits<OLAP
             *reinterpret_cast<CppType*>(dest) = strtod(buf,&tg);
             return OLAPStatus::OLAP_SUCCESS;
         }
+        if (src_type->type() == OLAP_FIELD_TYPE_VARCHAR) {
+            return convert_float_from_varchar<CppType>(dest, src);
+        }
         return OLAPStatus::OLAP_ERR_INVALID_SCHEMA;
     }
 };
diff --git a/be/test/olap/schema_change_test.cpp 
b/be/test/olap/schema_change_test.cpp
index 6bdf03e..c329ca1 100644
--- a/be/test/olap/schema_change_test.cpp
+++ b/be/test/olap/schema_change_test.cpp
@@ -216,6 +216,93 @@ public:
         ASSERT_EQ(_column_writer->create_row_index_entry(), OLAP_SUCCESS);
     }
 
+    void test_convert_from_varchar(std::string type_name, int type_size,
+                                   std::string normal_value,
+                                   std::string overflow_value,
+                                   std::string invalid_value="invalid") {
+        AddColumn(
+                "VarcharColumn",
+                "VARCHAR",
+                "REPLACE",
+                255,
+                false,
+                true);
+
+        AddColumn(
+                "ConvertColumn",
+                type_name,
+                "REPLACE",
+                type_size,
+                false,
+                false);
+
+        TabletSchema tablet_schema;
+        InitTablet(&tablet_schema);
+        CreateColumnWriter(tablet_schema);
+
+        RowCursor write_row;
+        write_row.init(tablet_schema);
+
+        RowBlock block(&tablet_schema);
+        RowBlockInfo block_info;
+        block_info.row_num = 10000;
+        block.init(block_info);
+
+        Slice normal_str(normal_value);
+        write_row.set_field_content(0, reinterpret_cast<char*>(&normal_str), 
_mem_pool.get());
+        block.set_row(0, write_row);
+        block.finalize(1);
+        ASSERT_EQ(_column_writer->write_batch(&block, &write_row), 
OLAP_SUCCESS);
+
+        ColumnDataHeaderMessage header;
+        ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
+
+        CreateColumnReader(tablet_schema);
+
+        RowCursor read_row;
+        read_row.init(tablet_schema);
+
+        _col_vector.reset(new ColumnVector());
+        ASSERT_EQ(_column_reader->next_vector(_col_vector.get(), 1, 
_mem_pool.get()), OLAP_SUCCESS);
+        char* data = reinterpret_cast<char*>(_col_vector->col_data());
+        read_row.set_field_content(0, data, _mem_pool.get());
+        const Field* src_field = read_row.column_schema(0);
+        read_row.convert_from(1, read_row.cell_ptr(0), src_field->type_info(), 
_mem_pool.get());
+        std::string dst_str = 
read_row.column_schema(1)->to_string(read_row.cell_ptr(1));
+        ASSERT_EQ(normal_value, dst_str);
+
+        Slice invalid_str("invalid");
+        write_row.set_field_content(0, reinterpret_cast<char*>(&invalid_str), 
_mem_pool.get());
+        block.set_row(0, write_row);
+        block.finalize(1);
+        ASSERT_EQ(_column_writer->write_batch(&block, &write_row), 
OLAP_SUCCESS);
+
+        _col_vector.reset(new ColumnVector());
+        ASSERT_EQ(_column_reader->next_vector(_col_vector.get(), 1, 
_mem_pool.get()), OLAP_SUCCESS);
+        data = reinterpret_cast<char*>(_col_vector->col_data());
+        read_row.set_field_content(0, data, _mem_pool.get());
+        const Field* src_field2 = read_row.column_schema(0);
+        ASSERT_EQ(read_row.convert_from(1, read_row.cell_ptr(0), 
src_field2->type_info(), _mem_pool.get()), OLAP_ERR_INVALID_SCHEMA);
+
+        Slice overflow_str(overflow_value);
+        write_row.set_field_content(0, reinterpret_cast<char*>(&overflow_str), 
_mem_pool.get());
+        block.set_row(0, write_row);
+        block.finalize(1);
+        ASSERT_EQ(_column_writer->write_batch(&block, &write_row), 
OLAP_SUCCESS);
+
+        _col_vector.reset(new ColumnVector());
+        ASSERT_EQ(_column_reader->next_vector(_col_vector.get(), 1, 
_mem_pool.get()), OLAP_SUCCESS);
+        data = reinterpret_cast<char*>(_col_vector->col_data());
+        read_row.set_field_content(0, data, _mem_pool.get());
+        const Field* src_field3 = read_row.column_schema(0);
+        ASSERT_EQ(read_row.convert_from(1, read_row.cell_ptr(0), 
src_field3->type_info(), _mem_pool.get()), OLAP_ERR_INVALID_SCHEMA);
+
+        TypeInfo* tp = get_type_info(OLAP_FIELD_TYPE_HLL);
+        OLAPStatus st = read_row.convert_from(1, read_row.cell_ptr(0), tp, 
_mem_pool.get());
+        ASSERT_EQ(st, OLAP_ERR_INVALID_SCHEMA);
+
+    }
+
     ColumnWriter *_column_writer;
 
     ColumnReader *_column_reader;
@@ -501,93 +588,6 @@ TEST_F(TestColumn, ConvertIntToDate) {
     ASSERT_TRUE( st == OLAP_ERR_INVALID_SCHEMA);
 }
 
-TEST_F(TestColumn, ConvertVarcharToInt) {
-    AddColumn(
-            "VarcharColumn",
-            "VARCHAR",
-            "REPLACE",
-            255,
-            false,
-            true);
-
-    AddColumn(
-            "IntColumn",
-            "INT",
-            "REPLACE",
-            4,
-            false,
-            false);
-
-    TabletSchema tablet_schema;
-    InitTablet(&tablet_schema);
-    CreateColumnWriter(tablet_schema);
-
-    RowCursor write_row;
-    write_row.init(tablet_schema);
-
-    RowBlock block(&tablet_schema);
-    RowBlockInfo block_info;
-    block_info.row_num = 10000;
-    block.init(block_info);
-
-    // test max int range
-    std::string src_str = "2147483647";
-    write_row.set_field_content(0, src_str.data(), _mem_pool.get());
-    block.set_row(0, write_row);
-    block.finalize(1);
-    ASSERT_EQ(_column_writer->write_batch(&block, &write_row), OLAP_SUCCESS);
-
-    ColumnDataHeaderMessage header;
-    ASSERT_EQ(_column_writer->finalize(&header), OLAP_SUCCESS);
-
-    CreateColumnReader(tablet_schema);
-
-    RowCursor read_row;
-    read_row.init(tablet_schema);
-
-    _col_vector.reset(new ColumnVector());
-    ASSERT_EQ(_column_reader->next_vector(_col_vector.get(), 1, 
_mem_pool.get()), OLAP_SUCCESS);
-    char* data = reinterpret_cast<char*>(_col_vector->col_data());
-    read_row.set_field_content(0, data, _mem_pool.get());
-    const Field* src_field = read_row.column_schema(0);
-    read_row.convert_from(1, read_row.cell_ptr(0), src_field->type_info(), 
_mem_pool.get());
-    std::string dst_str = 
read_row.column_schema(1)->to_string(read_row.cell_ptr(1));
-    ASSERT_EQ(src_str, dst_str);
-
-    // test invalid schema change
-    src_str = "invalid";
-    write_row.set_field_content(0, src_str.data(), _mem_pool.get());
-    block.set_row(0, write_row);
-    block.finalize(1);
-    ASSERT_EQ(_column_writer->write_batch(&block, &write_row), OLAP_SUCCESS);
-
-    _col_vector.reset(new ColumnVector());
-    ASSERT_EQ(_column_reader->next_vector(_col_vector.get(), 1, 
_mem_pool.get()), OLAP_SUCCESS);
-    data = reinterpret_cast<char*>(_col_vector->col_data());
-    read_row.set_field_content(0, data, _mem_pool.get());
-    const Field* src_field2 = read_row.column_schema(0);
-    ASSERT_EQ(read_row.convert_from(1, read_row.cell_ptr(0), 
src_field2->type_info(), _mem_pool.get()), OLAP_ERR_INVALID_SCHEMA);
-
-    // test overflow
-    src_str = "2147483648";
-    write_row.set_field_content(0, src_str.data(), _mem_pool.get());
-    block.set_row(0, write_row);
-    block.finalize(1);
-    ASSERT_EQ(_column_writer->write_batch(&block, &write_row), OLAP_SUCCESS);
-
-    _col_vector.reset(new ColumnVector());
-    ASSERT_EQ(_column_reader->next_vector(_col_vector.get(), 1, 
_mem_pool.get()), OLAP_SUCCESS);
-    data = reinterpret_cast<char*>(_col_vector->col_data());
-    read_row.set_field_content(0, data, _mem_pool.get());
-    const Field* src_field3 = read_row.column_schema(0);
-    ASSERT_EQ(read_row.convert_from(1, read_row.cell_ptr(0), 
src_field3->type_info(), _mem_pool.get()), OLAP_ERR_INVALID_SCHEMA);
-
-    //test not support type
-    TypeInfo* tp = get_type_info(OLAP_FIELD_TYPE_HLL);
-    OLAPStatus st = read_row.convert_from(1, read_row.cell_ptr(0), tp, 
_mem_pool.get());
-    ASSERT_EQ(st, OLAP_ERR_INVALID_SCHEMA);
-}
-
 TEST_F(TestColumn, ConvertVarcharToDate) {
     AddColumn(
             "VarcharColumn",
@@ -619,7 +619,7 @@ TEST_F(TestColumn, ConvertVarcharToDate) {
     block.init(block_info);
 
     // test valid format convert
-    std::vector<std::string> valid_src_strs = {
+    std::vector<Slice> valid_src_strs = {
         "2019-12-17",
         "19-12-17",
         "20191217",
@@ -627,8 +627,9 @@ TEST_F(TestColumn, ConvertVarcharToDate) {
         "2019/12/17",
         "19/12/17",
     };
-    for (const auto& src_str : valid_src_strs) {
-        write_row.set_field_content(0, src_str.data(), _mem_pool.get());
+    std::string expected_val("2019-12-17");
+    for (auto src_str : valid_src_strs) {
+        write_row.set_field_content(0, reinterpret_cast<char*>(&src_str), 
_mem_pool.get());
         block.set_row(0, write_row);
         block.finalize(1);
         ASSERT_EQ(_column_writer->write_batch(&block, &write_row), 
OLAP_SUCCESS);
@@ -648,12 +649,12 @@ TEST_F(TestColumn, ConvertVarcharToDate) {
         const Field *src_field = read_row.column_schema(0);
         read_row.convert_from(1, read_row.cell_ptr(0), src_field->type_info(), 
_mem_pool.get());
         std::string dst_str = 
read_row.column_schema(1)->to_string(read_row.cell_ptr(1));
-        ASSERT_EQ(src_str, dst_str);
+        ASSERT_EQ(expected_val, dst_str);
     }
 
     // test invalid schema change
-    std::string src_str = "invalid";
-    write_row.set_field_content(0, src_str.data(), _mem_pool.get());
+    Slice invalid_str("invalid");
+    write_row.set_field_content(0, reinterpret_cast<char*>(&invalid_str), 
_mem_pool.get());
     block.set_row(0, write_row);
     block.finalize(1);
     ASSERT_EQ(_column_writer->write_batch(&block, &write_row), OLAP_SUCCESS);
@@ -672,7 +673,37 @@ TEST_F(TestColumn, ConvertVarcharToDate) {
     OLAPStatus st = read_row.convert_from(1, read_row.cell_ptr(0), tp, 
_mem_pool.get());
     ASSERT_EQ(st, OLAP_ERR_INVALID_SCHEMA);
 }
-  
+
+TEST_F(TestColumn, ConvertVarcharToTinyInt) {
+    test_convert_from_varchar("TINYINT", 1, "127", "128");
+}
+
+TEST_F(TestColumn, ConvertVarcharToSmallInt) {
+    test_convert_from_varchar("SMALLINT", 2, "32767", "32768");
+}
+
+TEST_F(TestColumn, ConvertVarcharToInt) {
+    test_convert_from_varchar("INT", 4, "2147483647", "2147483648");
+}
+
+TEST_F(TestColumn, ConvertVarcharToBigInt) {
+    test_convert_from_varchar("BIGINT", 8, "9223372036854775807", 
"9223372036854775808");
+}
+
+TEST_F(TestColumn, ConvertVarcharToLargeInt) {
+    test_convert_from_varchar("LARGEINT", 16, 
"170141183460469000000000000000000000000", 
"1701411834604690000000000000000000000000");
+}
+
+TEST_F(TestColumn, ConvertVarcharToFloat) {
+    test_convert_from_varchar("FLOAT", 4, "3.40282e+38", "3.40282e+39");
+}
+
+TEST_F(TestColumn, ConvertVarcharToDouble) {
+    test_convert_from_varchar("DOUBLE", 8,
+            
"179769000000000006323030492138942643493033036433685336215410983289126434148906289940615299632196609445533816320312774433484859900046491141051651091672734470972759941382582304802812882753059262973637182942535982636884444611376868582636745405553206881859340916340092953230149901406738427651121855107737424232448.0000000000",
+            
"1797690000000000063230304921389426434930330364336853362154109832891264341489062899406152996321966094455338163203127744334848599000464911410516510916727344709727599413825823048028128827530592629736371829425359826368844446113768685826367454055532068818593409163400929532301499014067384276511218551077374242324480.0000000000");
+}
+
 }
 
 int main(int argc, char** argv) {
diff --git a/docs/documentation/cn/sql-reference/sql-statements/Data 
Definition/ALTER TABLE.md 
b/docs/documentation/cn/sql-reference/sql-statements/Data Definition/ALTER 
TABLE.md
index f33a496..4957a88 100644
--- a/docs/documentation/cn/sql-reference/sql-statements/Data Definition/ALTER 
TABLE.md 
+++ b/docs/documentation/cn/sql-reference/sql-statements/Data Definition/ALTER 
TABLE.md 
@@ -127,7 +127,7 @@ under the License.
                 TINYINT/SMALLINT/INT/BIGINT 转换成 
TINYINT/SMALLINT/INT/BIGINT/DOUBLE。
                 LARGEINT 转换成 DOUBLE
                 VARCHAR 支持修改最大长度
-                VARCHAR 转换成 INT
+                VARCHAR 转换成 TINTINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE
                 VARCHAR 转换成 DATE (目前支持"%Y-%m-%d", "%y-%m-%d", "%Y%m%d", 
"%y%m%d", "%Y/%m/%d, "%y/%m/%d"六种格式化格式)
                 DATETIME 转换成 DATE(仅保留年-月-日信息, 例如: `2019-12-09 21:47:05` <--> 
`2019-12-09`)
                 DATE 转换成 DATETIME(时分秒自动补零, 例如: `2019-12-09` <--> `2019-12-09 
00:00:00`)
diff --git a/docs/documentation/en/sql-reference/sql-statements/Data 
Definition/ALTER TABLE_EN.md 
b/docs/documentation/en/sql-reference/sql-statements/Data Definition/ALTER 
TABLE_EN.md
index ec0a829..74c5708 100644
--- a/docs/documentation/en/sql-reference/sql-statements/Data Definition/ALTER 
TABLE_EN.md      
+++ b/docs/documentation/en/sql-reference/sql-statements/Data Definition/ALTER 
TABLE_EN.md      
@@ -127,7 +127,7 @@ under the License.
                 TINYINT/SMALLINT/INT/BIGINT is converted to 
TINYINT/SMALLINT/INT/BIGINT/DOUBLE.
                 Convert LARGEINT to DOUBLE
                 VARCHAR supports modification of maximum length
-                Convert VARCHAR to INT
+                Convert VARCHAR to 
TINYINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE.
                 Convert VARCHAR to DATE (currently support six formats: 
"%Y-%m-%d", "%y-%m-%d", "%Y%m%d", "%y%m%d", "%Y/%m/%d, "%y/%m/%d")
                 Convert DATETIME to DATE(Only year-month-day information is 
retained, For example: `2019-12-09 21:47:05` <--> `2019-12-09`)
                 Convert DATE to DATETIME(Set hour, minute, second to zero, For 
example: `2019-12-09` <--> `2019-12-09 00:00:00`)
diff --git a/fe/src/main/java/org/apache/doris/catalog/ColumnType.java 
b/fe/src/main/java/org/apache/doris/catalog/ColumnType.java
index 1638ee8..7866213 100644
--- a/fe/src/main/java/org/apache/doris/catalog/ColumnType.java
+++ b/fe/src/main/java/org/apache/doris/catalog/ColumnType.java
@@ -64,9 +64,15 @@ public abstract class ColumnType {
         
schemaChangeMatrix[PrimitiveType.CHAR.ordinal()][PrimitiveType.VARCHAR.ordinal()]
 = true;
         
schemaChangeMatrix[PrimitiveType.CHAR.ordinal()][PrimitiveType.CHAR.ordinal()] 
= true;
 
-        
schemaChangeMatrix[PrimitiveType.VARCHAR.ordinal()][PrimitiveType.INT.ordinal()]
 = true;
         
schemaChangeMatrix[PrimitiveType.VARCHAR.ordinal()][PrimitiveType.DATE.ordinal()]
 = true;
-     
+        
schemaChangeMatrix[PrimitiveType.VARCHAR.ordinal()][PrimitiveType.FLOAT.ordinal()]
 = true;
+        
schemaChangeMatrix[PrimitiveType.VARCHAR.ordinal()][PrimitiveType.DOUBLE.ordinal()]
 = true;
+        
schemaChangeMatrix[PrimitiveType.VARCHAR.ordinal()][PrimitiveType.TINYINT.ordinal()]
 = true;
+        
schemaChangeMatrix[PrimitiveType.VARCHAR.ordinal()][PrimitiveType.SMALLINT.ordinal()]
 = true;
+        
schemaChangeMatrix[PrimitiveType.VARCHAR.ordinal()][PrimitiveType.INT.ordinal()]
 = true;
+        
schemaChangeMatrix[PrimitiveType.VARCHAR.ordinal()][PrimitiveType.BIGINT.ordinal()]
 = true;
+        
schemaChangeMatrix[PrimitiveType.VARCHAR.ordinal()][PrimitiveType.LARGEINT.ordinal()]
 = true;
+
         
schemaChangeMatrix[PrimitiveType.DATETIME.ordinal()][PrimitiveType.DATE.ordinal()]
 = true;
         
schemaChangeMatrix[PrimitiveType.DATE.ordinal()][PrimitiveType.DATETIME.ordinal()]
 = true;
         
schemaChangeMatrix[PrimitiveType.FLOAT.ordinal()][PrimitiveType.DOUBLE.ordinal()]
 = true;


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to