diff --git a/src/decoderbufs.c b/src/decoderbufs.c index 1c5e5e4..ba34503 100644 --- a/src/decoderbufs.c +++ b/src/decoderbufs.c @@ -370,34 +370,41 @@ static bool geography_point_as_decoderbufs_point(Datum datum, static void set_datum_value(Decoderbufs__DatumMessage *datum_msg, Oid typid, Oid typoutput, Datum datum) { Numeric num; - bytea *valptr; - const char *output; - Point *p; + bytea *valptr = NULL; + const char *output = NULL; + Point *p = NULL; int size = 0; switch (typid) { case BOOLOID: datum_msg->datum_bool = DatumGetBool(datum); + datum_msg->datum_case = DECODERBUFS__DATUM_MESSAGE__DATUM_DATUM_BOOL; break; case INT2OID: datum_msg->datum_int32 = DatumGetInt16(datum); + datum_msg->datum_case = DECODERBUFS__DATUM_MESSAGE__DATUM_DATUM_INT32; break; case INT4OID: datum_msg->datum_int32 = DatumGetInt32(datum); + datum_msg->datum_case = DECODERBUFS__DATUM_MESSAGE__DATUM_DATUM_INT32; break; case INT8OID: case OIDOID: datum_msg->datum_int64 = DatumGetInt64(datum); + datum_msg->datum_case = DECODERBUFS__DATUM_MESSAGE__DATUM_DATUM_INT64; break; case FLOAT4OID: datum_msg->datum_float = DatumGetFloat4(datum); + datum_msg->datum_case = DECODERBUFS__DATUM_MESSAGE__DATUM_DATUM_FLOAT; break; case FLOAT8OID: datum_msg->datum_double = DatumGetFloat8(datum); + datum_msg->datum_case = DECODERBUFS__DATUM_MESSAGE__DATUM_DATUM_DOUBLE; break; case NUMERICOID: num = DatumGetNumeric(datum); if (!numeric_is_nan(num)) { datum_msg->datum_double = numeric_to_double_no_overflow(num); + datum_msg->datum_case = DECODERBUFS__DATUM_MESSAGE__DATUM_DATUM_DOUBLE; } break; case CHAROID: @@ -409,6 +416,7 @@ static void set_datum_value(Decoderbufs__DatumMessage *datum_msg, Oid typid, case UUIDOID: output = OidOutputFunctionCall(typoutput, datum); datum_msg->datum_string = pnstrdup(output, strlen(output)); + datum_msg->datum_case = DECODERBUFS__DATUM_MESSAGE__DATUM_DATUM_STRING; break; case TIMESTAMPOID: /* @@ -417,6 +425,7 @@ static void set_datum_value(Decoderbufs__DatumMessage *datum_msg, Oid typid, case TIMESTAMPTZOID: output = timestamptz_to_str(DatumGetTimestampTz(datum)); datum_msg->datum_string = pnstrdup(output, strlen(output)); + datum_msg->datum_case = DECODERBUFS__DATUM_MESSAGE__DATUM_DATUM_STRING; break; case BYTEAOID: valptr = DatumGetByteaPCopy(datum); @@ -424,6 +433,7 @@ static void set_datum_value(Decoderbufs__DatumMessage *datum_msg, Oid typid, datum_msg->datum_bytes.data = palloc(size); memcpy(datum_msg->datum_bytes.data, (uint8_t *)VARDATA(valptr), size); datum_msg->datum_bytes.len = size; + datum_msg->datum_case = DECODERBUFS__DATUM_MESSAGE__DATUM_DATUM_BYTES; break; case POINTOID: p = DatumGetPointP(datum); @@ -432,6 +442,7 @@ static void set_datum_value(Decoderbufs__DatumMessage *datum_msg, Oid typid, dp.y = p->y; datum_msg->datum_point = palloc(sizeof(Decoderbufs__Point)); memcpy(datum_msg->datum_point, &dp, sizeof(dp)); + datum_msg->datum_case = DECODERBUFS__DATUM_MESSAGE__DATUM_DATUM_POINT; break; default: // PostGIS uses dynamic OIDs so we need to check the type again here @@ -439,6 +450,7 @@ static void set_datum_value(Decoderbufs__DatumMessage *datum_msg, Oid typid, elog(DEBUG1, "Converting geography point to datum_point"); datum_msg->datum_point = palloc(sizeof(Decoderbufs__Point)); geography_point_as_decoderbufs_point(datum, datum_msg->datum_point); + datum_msg->datum_case = DECODERBUFS__DATUM_MESSAGE__DATUM_DATUM_POINT; } else { elog(WARNING, "Encountered unknown typid: %d, using bytes", typid); output = OidOutputFunctionCall(typoutput, datum); @@ -447,6 +459,7 @@ static void set_datum_value(Decoderbufs__DatumMessage *datum_msg, Oid typid, datum_msg->datum_bytes.data = palloc(size); memcpy(datum_msg->datum_bytes.data, (uint8_t *)output, size); datum_msg->datum_bytes.len = len; + datum_msg->datum_case = DECODERBUFS__DATUM_MESSAGE__DATUM_DATUM_BYTES; } break; }