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]