aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvvvv <vvvv@yandex-team.ru>2022-04-04 16:57:43 +0300
committervvvv <vvvv@yandex-team.ru>2022-04-04 16:57:43 +0300
commitf2f4cb75e4242308b792c4a82e6978856bedbaea (patch)
treeacf6de8fdd701a654f2bb8411e11c8134a2a3624
parent406878bb4f4e8c7c3bfb0e580f5e51c0927eb539 (diff)
downloadydb-f2f4cb75e4242308b792c4a82e6978856bedbaea.tar.gz
YQL-14629 canonize fp bits in StablePickle, generic PG presort, yson/skiff writers
ref:1aa847e80d79f8c877bb29603acc68ddd2512aa8
-rw-r--r--ydb/library/yql/minikql/computation/mkql_computation_node_pack.cpp2
-rw-r--r--ydb/library/yql/minikql/computation/mkql_computation_node_pack_impl.h2
-rw-r--r--ydb/library/yql/parser/pg_wrapper/comp_factory.cpp42
-rw-r--r--ydb/library/yql/parser/pg_wrapper/postgresql/src/backend/libpq/pqformat.c4
-rw-r--r--ydb/library/yql/sql/pg_dummy/pg_sql_dummy.cpp3
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);