From 3e89fb8414b8811445806424b8644418a329e5c3 Mon Sep 17 00:00:00 2001 From: Brendan Younger Date: Tue, 25 Apr 2023 10:37:22 -0400 Subject: [PATCH] Add support for decimal types --- src/common.cpp | 15 +++++++++++++++ src/reader.cpp | 16 ++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/common.cpp b/src/common.cpp index 5439098..3bdbda6 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -10,6 +10,7 @@ extern "C" #include "utils/memutils.h" #include "utils/memdebug.h" #include "utils/timestamp.h" +#include "utils/numeric.h" } #if PG_VERSION_NUM < 130000 @@ -69,6 +70,8 @@ to_postgres_type(int arrow_type) return TIMESTAMPOID; case arrow::Type::DATE32: return DATEOID; + case arrow::Type::DECIMAL: + return NUMERICOID; default: return InvalidOid; } @@ -114,6 +117,18 @@ bytes_to_postgres_type(const char *bytes, Size len, const arrow::DataType *arrow case arrow::Type::DATE32: return DateADTGetDatum(*(int32 *) bytes + (UNIX_EPOCH_JDATE - POSTGRES_EPOCH_JDATE)); + case arrow::Type::DECIMAL128: { + auto dectype = (arrow::Decimal128Type *)arrow_type; + std::string val = arrow::Decimal128(bytes).ToString(dectype->scale()); + + return NumericGetDatum(DirectFunctionCall1(numeric_in, CStringGetDatum(val.c_str()))); + } + case arrow::Type::DECIMAL256: { + auto dectype = (arrow::Decimal256Type *)arrow_type; + std::string val = arrow::Decimal256(bytes).ToString(dectype->scale()); + + return NumericGetDatum(DirectFunctionCall1(numeric_in, CStringGetDatum(val.c_str()))); + } default: return PointerGetDatum(NULL); } diff --git a/src/reader.cpp b/src/reader.cpp index f276d4b..1be2ac9 100644 --- a/src/reader.cpp +++ b/src/reader.cpp @@ -466,6 +466,22 @@ Datum ParquetReader::read_primitive_type(arrow::Array *array, res = DateADTGetDatum(d + (UNIX_EPOCH_JDATE - POSTGRES_EPOCH_JDATE)); break; } + case arrow::Type::DECIMAL128: + { + arrow::Decimal128Array *decarray = (arrow::Decimal128Array *) array; + std::string val = decarray->FormatValue(i); + + res = NumericGetDatum(DirectFunctionCall1(numeric_in, CStringGetDatum(val.c_str()))); + break; + } + case arrow::Type::DECIMAL256: + { + arrow::Decimal256Array *decarray = (arrow::Decimal256Array *) array; + std::string val = decarray->FormatValue(i); + + res = NumericGetDatum(DirectFunctionCall1(numeric_in, CStringGetDatum(val.c_str()))); + break; + } /* TODO: add other types */ default: throw Error("parquet_fdw: unsupported column type: %s",