diff options
author | vvvv <vvvv@ydb.tech> | 2022-12-23 06:45:41 +0300 |
---|---|---|
committer | vvvv <vvvv@ydb.tech> | 2022-12-23 06:45:41 +0300 |
commit | ad13572121fc1cd77319496f59e8fd9ba6343fbd (patch) | |
tree | 97bd42a858ae7f18725f2c68e3b7159d8f34da14 | |
parent | 73522d43535f3d9f3027d234188bbe030bf6b1b9 (diff) | |
download | ydb-ad13572121fc1cd77319496f59e8fd9ba6343fbd.tar.gz |
fixed handling of passthrough arguments
-rw-r--r-- | ydb/library/yql/parser/pg_wrapper/comp_factory.cpp | 75 |
1 files changed, 37 insertions, 38 deletions
diff --git a/ydb/library/yql/parser/pg_wrapper/comp_factory.cpp b/ydb/library/yql/parser/pg_wrapper/comp_factory.cpp index 00604a63e46..468da595f11 100644 --- a/ydb/library/yql/parser/pg_wrapper/comp_factory.cpp +++ b/ydb/library/yql/parser/pg_wrapper/comp_factory.cpp @@ -147,6 +147,37 @@ NUdf::TUnboxedValuePod OwnedPointerDatumToPod(Datum datum) { return NUdf::TUnboxedValuePod(std::move(ref)); } +class TVPtrHolder { +public: + TVPtrHolder() { + new(Dummy) TBoxedValueWithFree(); + } + + static bool IsBoxedVPtr(Datum ptr) { + return *(const uintptr_t*)((char*)ptr - PallocHdrSize) == *(const uintptr_t*)Instance.Dummy; + } + +private: + char Dummy[sizeof(NUdf::IBoxedValue)]; + + static TVPtrHolder Instance; +}; + +TVPtrHolder TVPtrHolder::Instance; + +NUdf::TUnboxedValuePod AnyDatumToPod(Datum datum, bool passByValue) { + if (passByValue) { + return ScalarDatumToPod(datum); + } + + if (TVPtrHolder::IsBoxedVPtr(datum)) { + // returned one of arguments + return OwnedPointerDatumToPod(datum); + } + + return PointerDatumToPod(datum); +} + Datum PointerDatumFromPod(const NUdf::TUnboxedValuePod& value) { return (Datum)(((const char*)value.AsBoxed().Get()) + PallocHdrSize); } @@ -236,24 +267,6 @@ const MemoryContextMethods MkqlMethods = { #endif }; -class TVPtrHolder { -public: - TVPtrHolder() { - new(Dummy) TBoxedValueWithFree(); - } - - static bool IsBoxedVPtr(Datum ptr) { - return *(const uintptr_t*)((char*)ptr - PallocHdrSize) == *(const uintptr_t*)Instance.Dummy; - } - -private: - char Dummy[sizeof(NUdf::IBoxedValue)]; - - static TVPtrHolder Instance; -}; - -TVPtrHolder TVPtrHolder::Instance; - inline ui32 MakeTypeIOParam(const NPg::TTypeDesc& desc) { return desc.ElementTypeId ? desc.ElementTypeId : desc.TypeId; } @@ -304,7 +317,7 @@ public: { auto ret = FInfo.fn_addr(callInfo); Y_ENSURE(!callInfo->isnull); - return TypeDesc.PassByValue ? ScalarDatumToPod(ret) : PointerDatumToPod(ret); + return AnyDatumToPod(ret, TypeDesc.PassByValue); } PG_CATCH(); { @@ -551,16 +564,7 @@ private: return NUdf::TUnboxedValuePod(); } - if (this->RetTypeDesc.PassByValue) { - return ScalarDatumToPod(ret); - } - - if (TVPtrHolder::IsBoxedVPtr(ret)) { - // returned one of arguments - return OwnedPointerDatumToPod(ret); - } - - return PointerDatumToPod(ret); + return AnyDatumToPod(ret, this->RetTypeDesc.PassByValue); } PG_CATCH(); { @@ -641,13 +645,8 @@ private: if (callInfo.isnull) { value = NUdf::TUnboxedValuePod(); - } else if (RetTypeDesc.PassByValue) { - value = ScalarDatumToPod(ret); - } else if (TVPtrHolder::IsBoxedVPtr(ret)) { - // returned one of arguments - value = OwnedPointerDatumToPod(ret); } else { - value = PointerDatumToPod(ret); + value = AnyDatumToPod(ret, RetTypeDesc.PassByValue); } return true; @@ -898,7 +897,7 @@ public: ScalarDatumFromPod(value) : PointerDatumFromPod(value); auto ret = ConvertDatum(datum, state, typeMod); - return TargetTypeDesc.PassByValue ? ScalarDatumToPod(ret) : PointerDatumToPod(ret); + return AnyDatumToPod(ret, TargetTypeDesc.PassByValue); } } @@ -1978,7 +1977,7 @@ NUdf::TUnboxedValue PgValueFromNativeBinary(const TStringBuf binary, ui32 pgType errMsg << "Not all data has been consumed by 'recv' function: " << NPg::LookupProc(receiveFuncId).Name << ", data size: " << stringInfo.len << ", consumed size: " << stringInfo.cursor; UdfTerminate(errMsg.c_str()); } - return typeInfo.PassByValue ? ScalarDatumToPod(x) : PointerDatumToPod(x); + return AnyDatumToPod(x, typeInfo.PassByValue); } PG_CATCH(); { @@ -2024,7 +2023,7 @@ NUdf::TUnboxedValue PgValueFromNativeText(const TStringBuf text, ui32 pgTypeId) auto x = finfo.fn_addr(callInfo); Y_ENSURE(!callInfo->isnull); - return typeInfo.PassByValue ? ScalarDatumToPod(x) : PointerDatumToPod(x); + return AnyDatumToPod(x, typeInfo.PassByValue); } PG_CATCH(); { |