From 0194cb4b59438d8d46fc05a4b1abd85eeb69972f Mon Sep 17 00:00:00 2001 From: ti-srebot <66930949+ti-srebot@users.noreply.github.com> Date: Thu, 1 Jul 2021 14:24:20 +0800 Subject: [PATCH] init nested value for nullable column for function `TiDBCast`, `TiDBTimestampDiff` and `TiDBDateDiff` (#2289) (#2291) --- dbms/src/Columns/ColumnDecimal.h | 9 +++++++++ dbms/src/Functions/FunctionsDateTime.h | 8 ++++---- dbms/src/Functions/FunctionsTiDBConversion.h | 12 ++++-------- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/dbms/src/Columns/ColumnDecimal.h b/dbms/src/Columns/ColumnDecimal.h index d2484d7f910..c11a3a9e35b 100644 --- a/dbms/src/Columns/ColumnDecimal.h +++ b/dbms/src/Columns/ColumnDecimal.h @@ -28,6 +28,11 @@ class DecimalPaddedPODArray : public PaddedPODArray scale(scale_) {} + DecimalPaddedPODArray(size_t size, const T & x, UInt32 scale_) + : Base(size, x), + scale(scale_) + {} + DecimalPaddedPODArray(const DecimalPaddedPODArray & other) : Base(other.begin(), other.end()), scale(other.scale) @@ -73,6 +78,10 @@ class ColumnDecimal final : public COWPtrHelper(x, y, res->getData(), result_null_map->getData()); else if (unit == "quarter") @@ -1720,8 +1720,8 @@ class FunctionTiDBDateDiff : public IFunction const IColumn & y = *y_p; size_t rows = block.rows(); - auto res = ColumnInt64::create(rows); - auto result_null_map = ColumnUInt8::create(rows); + auto res = ColumnInt64::create(rows, 0); + auto result_null_map = ColumnUInt8::create(rows, 0); dispatch(x, y, res->getData(), result_null_map->getData()); diff --git a/dbms/src/Functions/FunctionsTiDBConversion.h b/dbms/src/Functions/FunctionsTiDBConversion.h index 339ba5ee19c..60d1ba0e25d 100644 --- a/dbms/src/Functions/FunctionsTiDBConversion.h +++ b/dbms/src/Functions/FunctionsTiDBConversion.h @@ -441,9 +441,8 @@ struct TiDBConvertToInteger { size_t size = block.getByPosition(arguments[0]).column->size(); - auto col_to = ColumnVector::create(); + auto col_to = ColumnVector::create(size, 0); typename ColumnVector::Container & vec_to = col_to->getData(); - vec_to.resize(size); ColumnUInt8::MutablePtr col_null_map_to; ColumnUInt8::Container * vec_null_map_to [[maybe_unused]] = nullptr; @@ -684,9 +683,8 @@ struct TiDBConvertToFloat size_t size = block.getByPosition(arguments[0]).column->size(); /// NOTICE: Since ToFieldType only can be Float32 or Float64, convert from_value to Float64 and then implicitly cast to ToFieldType is fine. - auto col_to = ColumnVector::create(); + auto col_to = ColumnVector::create(size, 0); typename ColumnVector::Container & vec_to = col_to->getData(); - vec_to.resize(size); ColumnUInt8::MutablePtr col_null_map_to; ColumnUInt8::Container * vec_null_map_to [[maybe_unused]] = nullptr; @@ -1096,9 +1094,8 @@ struct TiDBConvertToDecimal bool, const tipb::FieldType &, const Context & context) { size_t size = block.getByPosition(arguments[0]).column->size(); - auto col_to = ColumnDecimal::create(0, scale); + auto col_to = ColumnDecimal::create(size, static_cast(0), scale); typename ColumnDecimal::Container & vec_to = col_to->getData(); - vec_to.resize(size); ColumnUInt8::MutablePtr col_null_map_to; ColumnUInt8::Container * vec_null_map_to [[maybe_unused]] = nullptr; @@ -1193,9 +1190,8 @@ struct TiDBConvertToTime Block & block, const ColumnNumbers & arguments, size_t result, bool, const tipb::FieldType &, const Context & context) { size_t size = block.getByPosition(arguments[0]).column->size(); - auto col_to = ColumnUInt64::create(); + auto col_to = ColumnUInt64::create(size, 0); ColumnUInt64::Container & vec_to = col_to->getData(); - vec_to.resize(size); ColumnUInt8::MutablePtr col_null_map_to; ColumnUInt8::Container * vec_null_map_to [[maybe_unused]] = nullptr;