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

morningman 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 55ce88d  [Schema change] Support More column type in schema change 
(#4938)
55ce88d is described below

commit 55ce88da340284d2ee9d68f56aa4a6d3f5adaa7c
Author: HappenLee <[email protected]>
AuthorDate: Sat Nov 28 09:52:28 2020 +0800

    [Schema change] Support More column type in schema change (#4938)
    
    1. Support modify column type CHAR to 
TINYINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE/DATE
    and TINYINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE convert to a wider 
range of numeric types (#4937)
    
    2. Use template to refactor code of types.h and schema_change.cpp to delete 
redundant code.
---
 be/src/olap/schema_change.cpp                      |  54 +++-----
 be/src/olap/types.h                                | 152 +++++++++------------
 .../sql-statements/Data Definition/ALTER TABLE.md  |   6 +-
 .../sql-statements/Data Definition/ALTER TABLE.md  |   6 +-
 .../java/org/apache/doris/catalog/ColumnType.java  |  15 ++
 5 files changed, 99 insertions(+), 134 deletions(-)

diff --git a/be/src/olap/schema_change.cpp b/be/src/olap/schema_change.cpp
index c16ef09..1db8780 100644
--- a/be/src/olap/schema_change.cpp
+++ b/be/src/olap/schema_change.cpp
@@ -149,7 +149,7 @@ ColumnMapping* 
RowBlockChanger::get_mutable_column_mapping(size_t column_index)
 
 #define CONVERT_FROM_TYPE(from_type)                                           
                 \
     {                                                                          
                 \
-        switch (mutable_block->tablet_schema().column(i).type()) {             
                 \
+        switch (newtype) {                                                     
                 \
         case OLAP_FIELD_TYPE_TINYINT:                                          
                 \
             TYPE_REINTERPRET_CAST(from_type, int8_t);                          
                 \
         case OLAP_FIELD_TYPE_UNSIGNED_TINYINT:                                 
                 \
@@ -168,6 +168,8 @@ ColumnMapping* 
RowBlockChanger::get_mutable_column_mapping(size_t column_index)
             TYPE_REINTERPRET_CAST(from_type, uint64_t);                        
                 \
         case OLAP_FIELD_TYPE_LARGEINT:                                         
                 \
             LARGEINT_REINTERPRET_CAST(from_type, int128_t);                    
                 \
+        case OLAP_FIELD_TYPE_FLOAT:                                            
                 \
+            TYPE_REINTERPRET_CAST(from_type, float);                           
                 \
         case OLAP_FIELD_TYPE_DOUBLE:                                           
                 \
             TYPE_REINTERPRET_CAST(from_type, double);                          
                 \
         default:                                                               
                 \
@@ -217,6 +219,16 @@ private:
 };
 
 ConvertTypeResolver::ConvertTypeResolver() {
+    // from char type
+    add_convert_type_mapping<OLAP_FIELD_TYPE_CHAR, OLAP_FIELD_TYPE_TINYINT>();
+    add_convert_type_mapping<OLAP_FIELD_TYPE_CHAR, OLAP_FIELD_TYPE_SMALLINT>();
+    add_convert_type_mapping<OLAP_FIELD_TYPE_CHAR, OLAP_FIELD_TYPE_INT>();
+    add_convert_type_mapping<OLAP_FIELD_TYPE_CHAR, OLAP_FIELD_TYPE_BIGINT>();
+    add_convert_type_mapping<OLAP_FIELD_TYPE_CHAR, OLAP_FIELD_TYPE_LARGEINT>();
+    add_convert_type_mapping<OLAP_FIELD_TYPE_CHAR, OLAP_FIELD_TYPE_FLOAT>();
+    add_convert_type_mapping<OLAP_FIELD_TYPE_CHAR, OLAP_FIELD_TYPE_DOUBLE>();
+    add_convert_type_mapping<OLAP_FIELD_TYPE_CHAR, OLAP_FIELD_TYPE_DATE>();
+
     // supported type convert should annotate in doc:
     // 
http://doris.incubator.apache.org/master/zh-CN/sql-reference/sql-statements/Data%20Definition/ALTER%20TABLE.html#description
     // If type convert is supported here, you should check 
fe/src/main/java/org/apache/doris/catalog/ColumnType.java to supported it either
@@ -239,6 +251,7 @@ ConvertTypeResolver::ConvertTypeResolver() {
     add_convert_type_mapping<OLAP_FIELD_TYPE_FLOAT, OLAP_FIELD_TYPE_VARCHAR>();
     add_convert_type_mapping<OLAP_FIELD_TYPE_DOUBLE, 
OLAP_FIELD_TYPE_VARCHAR>();
     add_convert_type_mapping<OLAP_FIELD_TYPE_DECIMAL, 
OLAP_FIELD_TYPE_VARCHAR>();
+    add_convert_type_mapping<OLAP_FIELD_TYPE_CHAR, OLAP_FIELD_TYPE_VARCHAR>();
 
     add_convert_type_mapping<OLAP_FIELD_TYPE_DATE, OLAP_FIELD_TYPE_DATETIME>();
 
@@ -452,7 +465,6 @@ OLAPStatus RowBlockChanger::change_row_block(const 
RowBlock* ref_block, int32_t
     for (size_t i = 0, len = mutable_block->tablet_schema().num_columns(); 
!filter_all && i < len;
          ++i) {
         int32_t ref_column = _schema_mapping[i].ref_column;
-
         if (_schema_mapping[i].ref_column >= 0) {
             if (!_schema_mapping[i].materialized_function.empty()) {
                 bool (*_do_materialized_transform) (RowCursor*, RowCursor*, 
const TabletColumn&, int, int, MemPool* );
@@ -523,38 +535,6 @@ OLAPStatus RowBlockChanger::change_row_block(const 
RowBlock* ref_block, int32_t
                         }
                     }
                 }
-
-                // 从ref_column 写入 i列。
-            } else if (newtype == OLAP_FIELD_TYPE_VARCHAR && reftype == 
OLAP_FIELD_TYPE_CHAR) {
-                // 效率低下,也可以直接计算变长域拷贝,但仍然会破坏封装
-                for (size_t row_index = 0, new_row_index = 0;
-                     row_index < ref_block->row_block_info().row_num; 
++row_index) {
-                    // 不需要的row,每次处理到这个row时就跳过
-                    if (need_filter_data && is_data_left_vec[row_index] == 0) {
-                        continue;
-                    }
-
-                    // 指定新的要写入的row index(不同于读的row_index)
-                    mutable_block->get_row(new_row_index++, &write_helper);
-
-                    ref_block->get_row(row_index, &read_helper);
-
-                    if (true == read_helper.is_null(ref_column)) {
-                        write_helper.set_null(i);
-                    } else {
-                        // 要写入的
-
-                        write_helper.set_not_null(i);
-                        int p = 
ref_block->tablet_schema().column(ref_column).length() - 1;
-                        Slice* slice = 
reinterpret_cast<Slice*>(read_helper.cell_ptr(ref_column));
-                        char* buf = slice->data;
-                        while (p >= 0 && buf[p] == '\0') {
-                            p--;
-                        }
-                        slice->size = p + 1;
-                        write_helper.set_field_content(i, 
reinterpret_cast<char*>(slice), mem_pool);
-                    }
-                }
             } else if 
(ConvertTypeResolver::instance()->get_convert_type_info(reftype, newtype)) {
                 for (size_t row_index = 0, new_row_index = 0;
                      row_index < ref_block->row_block_info().row_num; 
++row_index) {
@@ -602,6 +582,8 @@ OLAPStatus RowBlockChanger::change_row_block(const 
RowBlock* ref_block, int32_t
                     CONVERT_FROM_TYPE(int64_t);
                 case OLAP_FIELD_TYPE_UNSIGNED_BIGINT:
                     CONVERT_FROM_TYPE(uint64_t);
+                case OLAP_FIELD_TYPE_LARGEINT:
+                    CONVERT_FROM_TYPE(int128_t);
                 default:
                     LOG(WARNING) << "the column type which was altered from 
was unsupported."
                                  << " from_type="
@@ -736,10 +718,8 @@ SORT_ERR_EXIT:
 RowBlockAllocator::RowBlockAllocator(const TabletSchema& tablet_schema, size_t 
memory_limitation)
         : _tablet_schema(tablet_schema),
           _memory_allocated(0),
+          _row_len(tablet_schema.row_size()),
           _memory_limitation(memory_limitation) {
-    _row_len = 0;
-    _row_len = tablet_schema.row_size();
-
     VLOG(3) << "RowBlockAllocator(). row_len=" << _row_len;
 }
 
diff --git a/be/src/olap/types.h b/be/src/olap/types.h
index 1a44983..583e2de 100644
--- a/be/src/olap/types.h
+++ b/be/src/olap/types.h
@@ -28,6 +28,7 @@
 #include "gen_cpp/segment_v2.pb.h" // for ColumnMetaPB
 #include "olap/collection.h"
 #include "olap/decimal12.h"
+
 #include "olap/olap_common.h"
 #include "olap/olap_define.h"
 #include "olap/tablet_schema.h" // for TabletColumn
@@ -495,12 +496,32 @@ struct BaseFieldtypeTraits : public 
CppTypeTraits<field_type> {
     }
 };
 
+static void prepare_char_before_convert(const void* src) {
+    Slice* slice = const_cast<Slice*>(reinterpret_cast<const Slice*>(src));
+    char* buf = slice->data;
+    auto p = slice->size - 1;
+    while (p >= 0 && buf[p] == '\0') {
+        p--;
+    }
+    slice->size = p + 1;
+}
+
 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);
+T convert_from_varchar(const Slice* src_value, StringParser::ParseResult& 
parse_res, std::true_type) {
+    return StringParser::string_to_int<T>(src_value->get_data(), 
src_value->get_size(), &parse_res);
+}
+
+template <typename T>
+T convert_from_varchar(const Slice* src_value, StringParser::ParseResult& 
parse_res, std::false_type) {
+    return StringParser::string_to_float<T>(src_value->get_data(), 
src_value->get_size(), &parse_res);
+}
+
+template <typename T>
+OLAPStatus arithmetic_convert_from_varchar(void* dest, const void* src) {
+    auto src_value = reinterpret_cast<const Slice*>(src);
     StringParser::ParseResult parse_res;
-    T result = StringParser::string_to_int<T>(src_value->get_data(), 
src_value->get_size(), &parse_res);
+    //TODO: use C++17 if constexpr to replace label assignment
+    auto result = convert_from_varchar<T>(src_value, parse_res, 
std::is_integral<T>());
     if (UNLIKELY(parse_res != StringParser::PARSE_SUCCESS)) {
         return OLAPStatus::OLAP_ERR_INVALID_SCHEMA;
     }
@@ -509,98 +530,55 @@ OLAPStatus convert_int_from_varchar(void* dest, const 
void* src) {
 }
 
 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;
+OLAPStatus numeric_convert_from_char(void *dest, const void *src) {
+    prepare_char_before_convert(src);
+    return arithmetic_convert_from_varchar<T>(dest, src);
 }
 
-template<FieldType field_type>
-struct FieldTypeTraits : public BaseFieldtypeTraits<field_type> { };
+// Using NumericFieldtypeTraits to Derived code for OLAP_FIELD_TYPE_XXXINT, 
OLAP_FIELD_TYPE_FLOAT,
+// OLAP_FIELD_TYPE_DOUBLE, to reduce redundant code
+template <FieldType fieldType, bool isArithmetic>
+struct NumericFieldtypeTraits : public BaseFieldtypeTraits<fieldType> {
+    using CppType = typename CppTypeTraits<fieldType>::CppType;
 
-template<>
-struct FieldTypeTraits<OLAP_FIELD_TYPE_BOOL> : public 
BaseFieldtypeTraits<OLAP_FIELD_TYPE_BOOL> {
     static std::string to_string(const void* src) {
-        char buf[1024] = {'\0'};
-        snprintf(buf, sizeof(buf), "%d", *reinterpret_cast<const bool*>(src));
-        return std::string(buf);
+        return std::to_string(*reinterpret_cast<const CppType*>(src));
     }
-    static void set_to_max(void* buf) {
-        (*(bool*)buf) = true;
-    }
-    static void set_to_min(void* buf) {
-        (*(bool*)buf) = false;
-    }
-};
 
-template<>
-struct FieldTypeTraits<OLAP_FIELD_TYPE_TINYINT> : public 
BaseFieldtypeTraits<OLAP_FIELD_TYPE_TINYINT> {
-    static std::string to_string(const void* src) {
-        char buf[1024] = {'\0'};
-        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 arithmetic_convert_from_varchar<CppType>(dest, src);
+        } else if (src_type->type() == OLAP_FIELD_TYPE_CHAR) {
+            return numeric_convert_from_char<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 <FieldType fieldType>
+struct NumericFieldtypeTraits<fieldType, false> : public 
BaseFieldtypeTraits<fieldType> {};
 
-template<>
-struct FieldTypeTraits<OLAP_FIELD_TYPE_INT> : public 
BaseFieldtypeTraits<OLAP_FIELD_TYPE_INT> {
-    static std::string to_string(const void* src) {
-        char buf[1024] = {'\0'};
-        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 <FieldType fieldType>
+struct FieldTypeTraits : public NumericFieldtypeTraits<fieldType,
+        std::is_arithmetic<typename 
BaseFieldtypeTraits<fieldType>::CppType>::value && std::is_signed<typename 
BaseFieldtypeTraits<fieldType>::CppType>::value> {};
 
 template<>
-struct FieldTypeTraits<OLAP_FIELD_TYPE_BIGINT> : public 
BaseFieldtypeTraits<OLAP_FIELD_TYPE_BIGINT> {
+struct FieldTypeTraits<OLAP_FIELD_TYPE_BOOL> : public 
BaseFieldtypeTraits<OLAP_FIELD_TYPE_BOOL> {
     static std::string to_string(const void* src) {
         char buf[1024] = {'\0'};
-        snprintf(buf, sizeof(buf), "%ld", *reinterpret_cast<const 
int64_t*>(src));
+        snprintf(buf, sizeof(buf), "%d", *reinterpret_cast<const bool*>(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;
+    static void set_to_max(void* buf) {
+        (*(bool*)buf) = true;
+    }
+    static void set_to_min(void* buf) {
+        (*(bool*)buf) = false;
     }
 };
 
 template<>
-struct FieldTypeTraits<OLAP_FIELD_TYPE_LARGEINT> : public 
BaseFieldtypeTraits<OLAP_FIELD_TYPE_LARGEINT> {
+struct FieldTypeTraits<OLAP_FIELD_TYPE_LARGEINT> : public 
NumericFieldtypeTraits<OLAP_FIELD_TYPE_LARGEINT, true> {
     static OLAPStatus from_string(void* buf, const std::string& scan_key) {
         int128_t value = 0;
 
@@ -699,16 +677,10 @@ 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<>
-struct FieldTypeTraits<OLAP_FIELD_TYPE_FLOAT> : public 
BaseFieldtypeTraits<OLAP_FIELD_TYPE_FLOAT> {
+struct FieldTypeTraits<OLAP_FIELD_TYPE_FLOAT> : public 
NumericFieldtypeTraits<OLAP_FIELD_TYPE_FLOAT, true> {
     static OLAPStatus from_string(void* buf, const std::string& scan_key) {
         CppType value = 0.0f;
         if (scan_key.length() > 0) {
@@ -723,16 +695,10 @@ struct FieldTypeTraits<OLAP_FIELD_TYPE_FLOAT> : public 
BaseFieldtypeTraits<OLAP_
         DCHECK(length >= 0) << "gcvt float failed, float value=" << 
*reinterpret_cast<const CppType *>(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_float_from_varchar<CppType>(dest, src);
-        }
-        return OLAPStatus::OLAP_ERR_INVALID_SCHEMA;
-    }
 };
 
 template<>
-struct FieldTypeTraits<OLAP_FIELD_TYPE_DOUBLE> : public 
BaseFieldtypeTraits<OLAP_FIELD_TYPE_DOUBLE> {
+struct FieldTypeTraits<OLAP_FIELD_TYPE_DOUBLE> : public 
NumericFieldtypeTraits<OLAP_FIELD_TYPE_DOUBLE, true> {
     static OLAPStatus from_string(void* buf, const std::string& scan_key) {
         CppType value = 0.0;
         if (scan_key.length() > 0) {
@@ -767,10 +733,8 @@ 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;
+
+        return NumericFieldtypeTraits<OLAP_FIELD_TYPE_DOUBLE, 
true>::convert_from(dest, src, src_type, mem_pool);
     }
 };
 
@@ -844,7 +808,10 @@ struct FieldTypeTraits<OLAP_FIELD_TYPE_DATE> : public 
BaseFieldtypeTraits<OLAP_F
             return OLAPStatus::OLAP_SUCCESS;
         }
 
-        if (src_type->type() == FieldType::OLAP_FIELD_TYPE_VARCHAR) {
+        if (src_type->type() == OLAP_FIELD_TYPE_VARCHAR || src_type->type() == 
OLAP_FIELD_TYPE_CHAR) {
+            if (src_type->type() == OLAP_FIELD_TYPE_CHAR) {
+                prepare_char_before_convert(src);
+            }
             using SrcType = typename 
CppTypeTraits<OLAP_FIELD_TYPE_VARCHAR>::CppType;
             auto src_value = *reinterpret_cast<const SrcType*>(src);
             DateTimeValue dt;
@@ -1032,6 +999,9 @@ struct FieldTypeTraits<OLAP_FIELD_TYPE_VARCHAR> : public 
FieldTypeTraits<OLAP_FI
            memcpy(slice->data, result.c_str(), result.size());
            slice->size = result.size();
             return OLAP_SUCCESS;
+        } else if (src_type->type() == OLAP_FIELD_TYPE_CHAR) {
+            prepare_char_before_convert(src);
+            deep_copy(dest, src, mem_pool);
         }
         return OLAP_ERR_INVALID_SCHEMA;
     }
diff --git a/docs/en/sql-reference/sql-statements/Data Definition/ALTER 
TABLE.md b/docs/en/sql-reference/sql-statements/Data Definition/ALTER TABLE.md
index 1d92f71..f469bb0 100644
--- a/docs/en/sql-reference/sql-statements/Data Definition/ALTER TABLE.md       
+++ b/docs/en/sql-reference/sql-statements/Data Definition/ALTER TABLE.md       
@@ -153,11 +153,11 @@ under the License.
             3) Only the type of the column can be modified. The other 
attributes of the column remain as they are (ie other attributes need to be 
explicitly written in the statement according to the original attribute, see 
example 8)
             4) The partition column cannot be modified
             5) The following types of conversions are currently supported 
(accuracy loss is guaranteed by the user)
-                TINYINT/SMALLINT/INT/BIGINT is converted to 
TINYINT/SMALLINT/INT/BIGINT/DOUBLE.
+               TINYINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE convert to a 
wider range of numeric types
                 TINTINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE/DECIMAL is 
converted to VARCHAR
                 VARCHAR supports modification of maximum length
-                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 VARCHAR/CHAR to 
TINYINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE.
+                Convert VARCHAR/CHAR 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`)
                 Convert FLOAT to DOUBLE
diff --git a/docs/zh-CN/sql-reference/sql-statements/Data Definition/ALTER 
TABLE.md b/docs/zh-CN/sql-reference/sql-statements/Data Definition/ALTER 
TABLE.md
index a0bb66d..32e43a4 100644
--- a/docs/zh-CN/sql-reference/sql-statements/Data Definition/ALTER TABLE.md    
+++ b/docs/zh-CN/sql-reference/sql-statements/Data Definition/ALTER TABLE.md    
@@ -151,11 +151,11 @@ under the License.
             3) 只能修改列的类型,列的其他属性维持原样(即其他属性需在语句中按照原属性显式的写出,参见 example 8)
             4) 分区列不能做任何修改
             5) 目前支持以下类型的转换(精度损失由用户保证)
-                TINYINT/SMALLINT/INT/BIGINT 转换成 
TINYINT/SMALLINT/INT/BIGINT/DOUBLE。
+                TINYINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE 
类型向范围更大的数字类型转换
                 TINTINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE/DECIMAL 转换成 
VARCHAR
                 VARCHAR 支持修改最大长度
-                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"六种格式化格式)
+                VARCHAR/CHAR 转换成 
TINTINT/SMALLINT/INT/BIGINT/LARGEINT/FLOAT/DOUBLE
+                VARCHAR/CHAR 转换成 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`)
                 FLOAT 转换成 DOUBLE
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/ColumnType.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/ColumnType.java
index f27e414..f6f1b4c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/ColumnType.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/ColumnType.java
@@ -46,25 +46,31 @@ public abstract class ColumnType {
         
schemaChangeMatrix[PrimitiveType.TINYINT.ordinal()][PrimitiveType.INT.ordinal()]
 = true;
         
schemaChangeMatrix[PrimitiveType.TINYINT.ordinal()][PrimitiveType.BIGINT.ordinal()]
 = true;
         
schemaChangeMatrix[PrimitiveType.TINYINT.ordinal()][PrimitiveType.LARGEINT.ordinal()]
 = true;
+        
schemaChangeMatrix[PrimitiveType.TINYINT.ordinal()][PrimitiveType.FLOAT.ordinal()]
 = true;
         
schemaChangeMatrix[PrimitiveType.TINYINT.ordinal()][PrimitiveType.DOUBLE.ordinal()]
 = true;
         
schemaChangeMatrix[PrimitiveType.TINYINT.ordinal()][PrimitiveType.VARCHAR.ordinal()]
 = true;
 
         
schemaChangeMatrix[PrimitiveType.SMALLINT.ordinal()][PrimitiveType.INT.ordinal()]
 = true;
         
schemaChangeMatrix[PrimitiveType.SMALLINT.ordinal()][PrimitiveType.BIGINT.ordinal()]
 = true;
         
schemaChangeMatrix[PrimitiveType.SMALLINT.ordinal()][PrimitiveType.LARGEINT.ordinal()]
 = true;
+        
schemaChangeMatrix[PrimitiveType.SMALLINT.ordinal()][PrimitiveType.FLOAT.ordinal()]
 = true;
         
schemaChangeMatrix[PrimitiveType.SMALLINT.ordinal()][PrimitiveType.DOUBLE.ordinal()]
 = true;
         
schemaChangeMatrix[PrimitiveType.SMALLINT.ordinal()][PrimitiveType.VARCHAR.ordinal()]
 = true;
 
         
schemaChangeMatrix[PrimitiveType.INT.ordinal()][PrimitiveType.BIGINT.ordinal()] 
= true;
         
schemaChangeMatrix[PrimitiveType.INT.ordinal()][PrimitiveType.LARGEINT.ordinal()]
 = true;
+        
schemaChangeMatrix[PrimitiveType.INT.ordinal()][PrimitiveType.FLOAT.ordinal()] 
= true;
         
schemaChangeMatrix[PrimitiveType.INT.ordinal()][PrimitiveType.DOUBLE.ordinal()] 
= true;
         
schemaChangeMatrix[PrimitiveType.INT.ordinal()][PrimitiveType.DATE.ordinal()] = 
true;
         
schemaChangeMatrix[PrimitiveType.INT.ordinal()][PrimitiveType.VARCHAR.ordinal()]
 = true;
 
         
schemaChangeMatrix[PrimitiveType.BIGINT.ordinal()][PrimitiveType.LARGEINT.ordinal()]
 = true;
+        
schemaChangeMatrix[PrimitiveType.BIGINT.ordinal()][PrimitiveType.FLOAT.ordinal()]
 = true;
         
schemaChangeMatrix[PrimitiveType.BIGINT.ordinal()][PrimitiveType.DOUBLE.ordinal()]
 = true;
         
schemaChangeMatrix[PrimitiveType.BIGINT.ordinal()][PrimitiveType.VARCHAR.ordinal()]
 = true;
 
+        
schemaChangeMatrix[PrimitiveType.LARGEINT.ordinal()][PrimitiveType.FLOAT.ordinal()]
 = true;
+        
schemaChangeMatrix[PrimitiveType.LARGEINT.ordinal()][PrimitiveType.DOUBLE.ordinal()]
 = true;
         
schemaChangeMatrix[PrimitiveType.LARGEINT.ordinal()][PrimitiveType.VARCHAR.ordinal()]
 = true;
 
         
schemaChangeMatrix[PrimitiveType.FLOAT.ordinal()][PrimitiveType.DOUBLE.ordinal()]
 = true;
@@ -84,6 +90,15 @@ public abstract class ColumnType {
         
schemaChangeMatrix[PrimitiveType.VARCHAR.ordinal()][PrimitiveType.DOUBLE.ordinal()]
 = true;
         
schemaChangeMatrix[PrimitiveType.VARCHAR.ordinal()][PrimitiveType.DATE.ordinal()]
 = true;
 
+        
schemaChangeMatrix[PrimitiveType.CHAR.ordinal()][PrimitiveType.TINYINT.ordinal()]
 = true;
+        
schemaChangeMatrix[PrimitiveType.CHAR.ordinal()][PrimitiveType.SMALLINT.ordinal()]
 = true;
+        
schemaChangeMatrix[PrimitiveType.CHAR.ordinal()][PrimitiveType.INT.ordinal()] = 
true;
+        
schemaChangeMatrix[PrimitiveType.CHAR.ordinal()][PrimitiveType.BIGINT.ordinal()]
 = true;
+        
schemaChangeMatrix[PrimitiveType.CHAR.ordinal()][PrimitiveType.LARGEINT.ordinal()]
 = true;
+        
schemaChangeMatrix[PrimitiveType.CHAR.ordinal()][PrimitiveType.FLOAT.ordinal()] 
= true;
+        
schemaChangeMatrix[PrimitiveType.CHAR.ordinal()][PrimitiveType.DOUBLE.ordinal()]
 = true;
+        
schemaChangeMatrix[PrimitiveType.CHAR.ordinal()][PrimitiveType.DATE.ordinal()] 
= true;
+
         
schemaChangeMatrix[PrimitiveType.DECIMAL.ordinal()][PrimitiveType.VARCHAR.ordinal()]
 = true;
         
schemaChangeMatrix[PrimitiveType.DECIMALV2.ordinal()][PrimitiveType.VARCHAR.ordinal()]
 = true;
 


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

Reply via email to