diff options
author | vvvv <vvvv@yandex-team.ru> | 2022-04-04 16:57:43 +0300 |
---|---|---|
committer | vvvv <vvvv@yandex-team.ru> | 2022-04-04 16:57:43 +0300 |
commit | f2f4cb75e4242308b792c4a82e6978856bedbaea (patch) | |
tree | acf6de8fdd701a654f2bb8411e11c8134a2a3624 | |
parent | 406878bb4f4e8c7c3bfb0e580f5e51c0927eb539 (diff) | |
download | ydb-f2f4cb75e4242308b792c4a82e6978856bedbaea.tar.gz |
YQL-14629 canonize fp bits in StablePickle, generic PG presort, yson/skiff writers
ref:1aa847e80d79f8c877bb29603acc68ddd2512aa8
5 files changed, 47 insertions, 6 deletions
diff --git a/ydb/library/yql/minikql/computation/mkql_computation_node_pack.cpp b/ydb/library/yql/minikql/computation/mkql_computation_node_pack.cpp index 66fa97698d0..20a7f5d9578 100644 --- a/ydb/library/yql/minikql/computation/mkql_computation_node_pack.cpp +++ b/ydb/library/yql/minikql/computation/mkql_computation_node_pack.cpp @@ -689,7 +689,7 @@ void TValuePacker::PackImpl(const TType* type, const NUdf::TUnboxedValuePod& val auto pgType = static_cast<const TPgType*>(type); OptionalUsageMask.SetNextEmptyOptional(!value); if (value) { - PGPackImpl(pgType, value, Buffer); + PGPackImpl(Stable, pgType, value, Buffer); } break; } diff --git a/ydb/library/yql/minikql/computation/mkql_computation_node_pack_impl.h b/ydb/library/yql/minikql/computation/mkql_computation_node_pack_impl.h index 5d64387f3cc..de6311e5f9f 100644 --- a/ydb/library/yql/minikql/computation/mkql_computation_node_pack_impl.h +++ b/ydb/library/yql/minikql/computation/mkql_computation_node_pack_impl.h @@ -97,7 +97,7 @@ T GetRawData(TStringBuf& buf) { } // NDetails -void PGPackImpl(const TPgType* type, const NUdf::TUnboxedValuePod& value, TBuffer& buf); +void PGPackImpl(bool stable, const TPgType* type, const NUdf::TUnboxedValuePod& value, TBuffer& buf); NUdf::TUnboxedValue PGUnpackImpl(const TPgType* type, TStringBuf& buf); } diff --git a/ydb/library/yql/parser/pg_wrapper/comp_factory.cpp b/ydb/library/yql/parser/pg_wrapper/comp_factory.cpp index 71b5fe66e09..013b93bb2df 100644 --- a/ydb/library/yql/parser/pg_wrapper/comp_factory.cpp +++ b/ydb/library/yql/parser/pg_wrapper/comp_factory.cpp @@ -11,6 +11,7 @@ #include <ydb/library/yql/providers/common/codec/yql_pg_codec.h> #include <ydb/library/yql/parser/pg_catalog/catalog.h> #include <ydb/library/yql/core/yql_pg_utils.h> +#include <ydb/library/yql/utils/fp_bits.h> #include <library/cpp/yson/detail.h> #define TypeName PG_TypeName @@ -51,6 +52,8 @@ namespace NYql { using namespace NKikimr::NMiniKQL; +static __thread bool NeedCanonizeFp = false; + struct TMainContext { MemoryContextData Data; MemoryContext PrevCurrentMemoryContext = nullptr; @@ -975,10 +978,12 @@ void WriteYsonValueInTableFormatPg(TOutputBuf& buf, TPgType* type, const NUdf::T callInfo->args[0] = { typeInfo.PassByValue ? ScalarDatumFromPod(value): PointerDatumFromPod(value), false }; + NeedCanonizeFp = true; auto x = (text*)finfo.fn_addr(callInfo); Y_ENSURE(!callInfo->isnull); Y_DEFER { pfree(x); + NeedCanonizeFp = false; }; auto s = GetVarBuf(x); @@ -1339,10 +1344,12 @@ void WriteSkiffPg(NKikimr::NMiniKQL::TPgType* type, const NKikimr::NUdf::TUnboxe callInfo->args[0] = { typeInfo.PassByValue ? ScalarDatumFromPod(value) : PointerDatumFromPod(value), false }; + NeedCanonizeFp = true; auto x = (text*)finfo.fn_addr(callInfo); Y_ENSURE(!callInfo->isnull); Y_DEFER { pfree(x); + NeedCanonizeFp = false; }; auto s = GetVarBuf(x); @@ -1415,7 +1422,7 @@ namespace NMiniKQL { using namespace NYql; -void PGPackImpl(const TPgType* type, const NUdf::TUnboxedValuePod& value, TBuffer& buf) { +void PGPackImpl(bool stable, const TPgType* type, const NUdf::TUnboxedValuePod& value, TBuffer& buf) { switch (type->GetTypeId()) { case BOOLOID: { const auto x = DatumGetBool(ScalarDatumFromPod(value)) != 0; @@ -1438,12 +1445,20 @@ void PGPackImpl(const TPgType* type, const NUdf::TUnboxedValuePod& value, TBuffe break; } case FLOAT4OID: { - const auto x = DatumGetFloat4(ScalarDatumFromPod(value)); + auto x = DatumGetFloat4(ScalarDatumFromPod(value)); + if (stable) { + NYql::CanonizeFpBits<float>(&x); + } + NDetails::PutRawData(x, buf); break; } case FLOAT8OID: { - const auto x = DatumGetFloat8(ScalarDatumFromPod(value)); + auto x = DatumGetFloat8(ScalarDatumFromPod(value)); + if (stable) { + NYql::CanonizeFpBits<double>(&x); + } + NDetails::PutRawData(x, buf); break; } @@ -1482,10 +1497,12 @@ void PGPackImpl(const TPgType* type, const NUdf::TUnboxedValuePod& value, TBuffe callInfo->args[0] = { typeInfo.PassByValue ? ScalarDatumFromPod(value) : PointerDatumFromPod(value), false }; + NeedCanonizeFp = stable; auto x = (text*)finfo.fn_addr(callInfo); Y_ENSURE(!callInfo->isnull); Y_DEFER{ pfree(x); + NeedCanonizeFp = false; }; auto s = GetVarBuf(x); @@ -1638,10 +1655,12 @@ void EncodePresortPGValue(TPgType* type, const NUdf::TUnboxedValue& value, TVect callInfo->args[0] = { typeInfo.PassByValue ? ScalarDatumFromPod(value) : PointerDatumFromPod(value), false }; + NeedCanonizeFp = true; auto x = (text*)finfo.fn_addr(callInfo); Y_ENSURE(!callInfo->isnull); Y_DEFER { pfree(x); + NeedCanonizeFp = false; }; auto s = GetVarBuf(x); @@ -1989,3 +2008,20 @@ void PgReleaseThreadContext(void* ctx) { } // namespace NMiniKQL } // namespace NKikimr +extern "C" { + +void yql_canonize_float4(float4* x) { + if (NYql::NeedCanonizeFp) { + NYql::CanonizeFpBits<float>(x); + } +} + +extern void yql_canonize_float8(float8* x) { + if (NYql::NeedCanonizeFp) { + NYql::CanonizeFpBits<double>(x); + } +} + +} + + diff --git a/ydb/library/yql/parser/pg_wrapper/postgresql/src/backend/libpq/pqformat.c b/ydb/library/yql/parser/pg_wrapper/postgresql/src/backend/libpq/pqformat.c index 19998988190..217b05d8dad 100644 --- a/ydb/library/yql/parser/pg_wrapper/postgresql/src/backend/libpq/pqformat.c +++ b/ydb/library/yql/parser/pg_wrapper/postgresql/src/backend/libpq/pqformat.c @@ -78,6 +78,8 @@ #include "mb/pg_wchar.h" #include "port/pg_bswap.h" +extern void yql_canonize_float4(float4*); +extern void yql_canonize_float8(float8*); /* -------------------------------- * pq_beginmessage - initialize for sending a message @@ -260,6 +262,7 @@ pq_sendfloat4(StringInfo buf, float4 f) } swap; swap.f = f; + yql_canonize_float4(&swap.f); pq_sendint32(buf, swap.i); } @@ -284,6 +287,7 @@ pq_sendfloat8(StringInfo buf, float8 f) } swap; swap.f = f; + yql_canonize_float8(&swap.f); pq_sendint64(buf, swap.i); } diff --git a/ydb/library/yql/sql/pg_dummy/pg_sql_dummy.cpp b/ydb/library/yql/sql/pg_dummy/pg_sql_dummy.cpp index 9ca7fa1d151..840c2b5910c 100644 --- a/ydb/library/yql/sql/pg_dummy/pg_sql_dummy.cpp +++ b/ydb/library/yql/sql/pg_dummy/pg_sql_dummy.cpp @@ -92,7 +92,8 @@ void PgReleaseThreadContext(void* ctx) { Y_UNUSED(ctx); } -void PGPackImpl(const TPgType* type, const NUdf::TUnboxedValuePod& value, TBuffer& buf) { +void PGPackImpl(bool stable, const TPgType* type, const NUdf::TUnboxedValuePod& value, TBuffer& buf) { + Y_UNUSED(stable); Y_UNUSED(type); Y_UNUSED(value); Y_UNUSED(buf); |