Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 16 additions & 15 deletions dbms/src/Functions/FunctionsJson.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
#include <ext/range.h>
#include <limits>
#include <magic_enum.hpp>
#include <optional>
#include <string_view>
#include <type_traits>

Expand Down Expand Up @@ -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
{
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -526,7 +527,7 @@ class FunctionCastJsonAsString : public IFunction
}

private:
const tipb::FieldType * tidb_tp = nullptr;
std::optional<tipb::FieldType> tidb_tp;
const Context & context;
};

Expand Down Expand Up @@ -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
{
Expand All @@ -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<IntFieldType>)
doExecute<IntFieldType, UInt64>(data_to, offsets_to, from.column);
Expand Down Expand Up @@ -1454,7 +1455,7 @@ class FunctionCastIntAsJson : public IFunction
}

private:
const tipb::FieldType * input_tidb_tp = nullptr;
std::optional<tipb::FieldType> input_tidb_tp;
};

class FunctionCastStringAsJson : public IFunction
Expand All @@ -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
Expand Down Expand Up @@ -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<false, false>(
data_to,
Expand Down Expand Up @@ -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())
{
Expand Down Expand Up @@ -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<tipb::FieldType> input_tidb_tp;
std::optional<tipb::FieldType> output_tidb_tp;
TiDB::TiDBCollatorPtr collator = nullptr;
};

Expand All @@ -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
{
Expand All @@ -1795,7 +1796,7 @@ class FunctionCastTimeAsJson : public IFunction
if (checkDataType<DataTypeMyDateTime>(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<DataTypeMyDateTime, true>(data_to, offsets_to, from.column);
else
Expand Down Expand Up @@ -1845,7 +1846,7 @@ class FunctionCastTimeAsJson : public IFunction
}

private:
const tipb::FieldType * input_tidb_tp = nullptr;
std::optional<tipb::FieldType> input_tidb_tp;
};

class FunctionCastDurationAsJson : public IFunction
Expand Down