From e74426dd3dea2afb15e8e2004a279a15f37bc2ca Mon Sep 17 00:00:00 2001 From: yongman Date: Fri, 8 May 2026 00:02:07 +0800 Subject: [PATCH] functions: save FieldType as value instead of ptr in json function Signed-off-by: yongman --- dbms/src/Functions/FunctionsJson.h | 31 +++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/dbms/src/Functions/FunctionsJson.h b/dbms/src/Functions/FunctionsJson.h index f680e4be8b7..8ffcbb96344 100644 --- a/dbms/src/Functions/FunctionsJson.h +++ b/dbms/src/Functions/FunctionsJson.h @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -435,7 +436,7 @@ class FunctionCastJsonAsString : public IFunction bool useDefaultImplementationForConstants() const override { return true; } - void setOutputTiDBFieldType(const tipb::FieldType & tidb_tp_) { tidb_tp = &tidb_tp_; } + void setOutputTiDBFieldType(const tipb::FieldType & tidb_tp_) { tidb_tp = tidb_tp_; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { @@ -463,7 +464,7 @@ class FunctionCastJsonAsString : public IFunction ColumnUInt8::MutablePtr col_null_map = ColumnUInt8::create(rows, 0); ColumnUInt8::Container & vec_null_map = col_null_map->getData(); JsonBinary::JsonBinaryWriteBuffer write_buffer(data_to); - if likely (tidb_tp->flen() < 0) + if likely (!tidb_tp.has_value() || tidb_tp->flen() < 0) { size_t current_offset = 0; for (size_t i = 0; i < block.rows(); ++i) @@ -526,7 +527,7 @@ class FunctionCastJsonAsString : public IFunction } private: - const tipb::FieldType * tidb_tp = nullptr; + std::optional tidb_tp; const Context & context; }; @@ -1364,7 +1365,7 @@ class FunctionCastIntAsJson : public IFunction bool useDefaultImplementationForNulls() const override { return true; } bool useDefaultImplementationForConstants() const override { return true; } - void setInputTiDBFieldType(const tipb::FieldType & tidb_tp_) { input_tidb_tp = &tidb_tp_; } + void setInputTiDBFieldType(const tipb::FieldType & tidb_tp_) { input_tidb_tp = tidb_tp_; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { @@ -1390,7 +1391,7 @@ class FunctionCastIntAsJson : public IFunction using IntFieldType = typename IntType::FieldType; const auto & from = block.getByPosition(arguments[0]); // In raw function test, input_tidb_tp is nullptr. - if (unlikely(input_tidb_tp == nullptr) || !hasIsBooleanFlag(*input_tidb_tp)) + if (unlikely(!input_tidb_tp.has_value()) || !hasIsBooleanFlag(*input_tidb_tp)) { if constexpr (std::is_unsigned_v) doExecute(data_to, offsets_to, from.column); @@ -1454,7 +1455,7 @@ class FunctionCastIntAsJson : public IFunction } private: - const tipb::FieldType * input_tidb_tp = nullptr; + std::optional input_tidb_tp; }; class FunctionCastStringAsJson : public IFunction @@ -1470,8 +1471,8 @@ class FunctionCastStringAsJson : public IFunction bool useDefaultImplementationForNulls() const override { return false; } bool useDefaultImplementationForConstants() const override { return true; } - void setInputTiDBFieldType(const tipb::FieldType & tidb_tp_) { input_tidb_tp = &tidb_tp_; } - void setOutputTiDBFieldType(const tipb::FieldType & tidb_tp_) { output_tidb_tp = &tidb_tp_; } + void setInputTiDBFieldType(const tipb::FieldType & tidb_tp_) { input_tidb_tp = tidb_tp_; } + void setOutputTiDBFieldType(const tipb::FieldType & tidb_tp_) { output_tidb_tp = tidb_tp_; } void setCollator(const TiDB::TiDBCollatorPtr & collator_) override { collator = collator_; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override @@ -1512,7 +1513,7 @@ class FunctionCastStringAsJson : public IFunction // In raw function test, input_tidb_tp/output_tidb_tp is nullptr. if (collator && collator->isBinary()) { - if (unlikely(input_tidb_tp == nullptr)) + if (unlikely(!input_tidb_tp.has_value())) { doExecuteForBinary( data_to, @@ -1561,7 +1562,7 @@ class FunctionCastStringAsJson : public IFunction block.rows()); } } - else if ((unlikely(output_tidb_tp == nullptr)) || hasParseToJSONFlag(*output_tidb_tp)) + else if (unlikely(!output_tidb_tp.has_value()) || hasParseToJSONFlag(*output_tidb_tp)) { if (from.column->isColumnNullable()) { @@ -1754,8 +1755,8 @@ class FunctionCastStringAsJson : public IFunction } private: - const tipb::FieldType * input_tidb_tp = nullptr; - const tipb::FieldType * output_tidb_tp = nullptr; + std::optional input_tidb_tp; + std::optional output_tidb_tp; TiDB::TiDBCollatorPtr collator = nullptr; }; @@ -1772,7 +1773,7 @@ class FunctionCastTimeAsJson : public IFunction bool useDefaultImplementationForNulls() const override { return true; } bool useDefaultImplementationForConstants() const override { return true; } - void setInputTiDBFieldType(const tipb::FieldType & tidb_tp_) { input_tidb_tp = &tidb_tp_; } + void setInputTiDBFieldType(const tipb::FieldType & tidb_tp_) { input_tidb_tp = tidb_tp_; } DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override { @@ -1795,7 +1796,7 @@ class FunctionCastTimeAsJson : public IFunction if (checkDataType(from.type.get())) { // In raw function test, input_tidb_tp is nullptr. - bool is_timestamp = (unlikely(input_tidb_tp == nullptr)) || input_tidb_tp->tp() == TiDB::TypeTimestamp; + bool is_timestamp = unlikely(!input_tidb_tp.has_value()) || input_tidb_tp->tp() == TiDB::TypeTimestamp; if (is_timestamp) doExecute(data_to, offsets_to, from.column); else @@ -1845,7 +1846,7 @@ class FunctionCastTimeAsJson : public IFunction } private: - const tipb::FieldType * input_tidb_tp = nullptr; + std::optional input_tidb_tp; }; class FunctionCastDurationAsJson : public IFunction