From c09b63f44780b7dd608fafeb3af297484d6c5e4f Mon Sep 17 00:00:00 2001 From: Benjamin Gaidioz Date: Mon, 23 Dec 2024 11:47:48 +0100 Subject: [PATCH 1/3] Fixed RD-15252: Missing handling of TIMESTAMPTZOID --- src/python.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/python.c b/src/python.c index be7563d..ddba3c4 100644 --- a/src/python.c +++ b/src/python.c @@ -1805,6 +1805,7 @@ datumToPython(Datum datum, Oid type, ConversionInfo * cinfo) return datumDecimalToPython(datum, cinfo); case DATEOID: return datumDateToPython(datum, cinfo); + case TIMESTAMPTZOID: case TIMESTAMPOID: return datumTimestampToPython(datum, cinfo); case FLOAT4OID: From 0af6390a88991d89f0251648d0599ddffeb4306b Mon Sep 17 00:00:00 2001 From: Benjamin Gaidioz Date: Thu, 26 Dec 2024 09:28:44 +0100 Subject: [PATCH 2/3] fixup! Fixed RD-15252: Missing handling of TIMESTAMPTZOID wip --- src/python.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/python.c b/src/python.c index ddba3c4..e7a46de 100644 --- a/src/python.c +++ b/src/python.c @@ -1708,6 +1708,29 @@ datumTimestampToPython(Datum datum, ConversionInfo * cinfo) return result; } +PyObject * +datumTimestampTzToPython(Datum datum, ConversionInfo * cinfo) +{ + struct pg_tm *pg_tm_value = palloc(sizeof(struct pg_tm)); + PyObject *result; + fsec_t fsec; + int tzp; + const char* tzn; + pg_tz atttimezone; + + PyDateTime_IMPORT; + timestamp2tm(DatumGetTimestampTz(datum), &tzp, pg_tm_value, &fsec, + &tzn, &atttimezone); + result = PyDateTime_FromDateAndTime(pg_tm_value->tm_year, + pg_tm_value->tm_mon, + pg_tm_value->tm_mday, + pg_tm_value->tm_hour, + pg_tm_value->tm_min, + pg_tm_value->tm_sec, 0); + pfree(pg_tm_value); + return result; +} + static PyObject * datumIntToPython(Datum datum, ConversionInfo * cinfo) { From 5a9566ad6af495dd8cb8dcf6c8f6acce7acd9182 Mon Sep 17 00:00:00 2001 From: Benjamin Gaidioz Date: Thu, 26 Dec 2024 10:01:40 +0100 Subject: [PATCH 3/3] fixup! fixup! Fixed RD-15252: Missing handling of TIMESTAMPTZOID wip --- Makefile | 2 +- src/python.c | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 6efb0a0..326aeb0 100755 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ srcdir = . MODULE_big = multicorn OBJS = src/errors.o src/python.o src/query.o src/multicorn.o # Uncomment to have symbols in debuggers -# PG_CFLAGS = -g -O0 +PG_CFLAGS = -g -O0 DATA = $(filter-out $(wildcard sql/*--*.sql),$(wildcard sql/*.sql)) diff --git a/src/python.c b/src/python.c index e7a46de..15d0803 100644 --- a/src/python.c +++ b/src/python.c @@ -55,6 +55,7 @@ static PyObject *datumFloat4ToPython(Datum datum, ConversionInfo * cinfo); static PyObject *datumFloat8ToPython(Datum datum, ConversionInfo * cinfo); static PyObject *datumDateToPython(Datum datum, ConversionInfo * cinfo); static PyObject *datumTimestampToPython(Datum datum, ConversionInfo * cinfo); +static PyObject *datumTimestampTzToPython(Datum datum, ConversionInfo * cinfo); static PyObject *datumIntToPython(Datum datum, ConversionInfo * cinfo); static PyObject *datumArrayToPython(Datum datum, Oid type, ConversionInfo * cinfo); static PyObject *datumByteaToPython(Datum datum, ConversionInfo * cinfo); @@ -1703,7 +1704,8 @@ datumTimestampToPython(Datum datum, ConversionInfo * cinfo) pg_tm_value->tm_mday, pg_tm_value->tm_hour, pg_tm_value->tm_min, - pg_tm_value->tm_sec, 0); + pg_tm_value->tm_sec, + fsec); pfree(pg_tm_value); return result; } @@ -1716,17 +1718,17 @@ datumTimestampTzToPython(Datum datum, ConversionInfo * cinfo) fsec_t fsec; int tzp; const char* tzn; - pg_tz atttimezone; PyDateTime_IMPORT; timestamp2tm(DatumGetTimestampTz(datum), &tzp, pg_tm_value, &fsec, - &tzn, &atttimezone); + &tzn, session_timezone); result = PyDateTime_FromDateAndTime(pg_tm_value->tm_year, pg_tm_value->tm_mon, pg_tm_value->tm_mday, pg_tm_value->tm_hour, pg_tm_value->tm_min, - pg_tm_value->tm_sec, 0); + pg_tm_value->tm_sec, + fsec); pfree(pg_tm_value); return result; } @@ -1829,6 +1831,7 @@ datumToPython(Datum datum, Oid type, ConversionInfo * cinfo) case DATEOID: return datumDateToPython(datum, cinfo); case TIMESTAMPTZOID: + return datumTimestampTzToPython(datum, cinfo); case TIMESTAMPOID: return datumTimestampToPython(datum, cinfo); case FLOAT4OID: