From d70d5d570bda08ba01c18f732e4786714cd14b82 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 22 Sep 2025 14:47:48 +0200 Subject: [PATCH 04/23] C11 anonymous unions [plpython] --- src/pl/plpython/plpy_exec.c | 2 +- src/pl/plpython/plpy_typeio.c | 134 +++++++++++++++++----------------- src/pl/plpython/plpy_typeio.h | 4 +- 3 files changed, 70 insertions(+), 70 deletions(-) diff --git a/src/pl/plpython/plpy_exec.c b/src/pl/plpython/plpy_exec.c index fd06b9e0e4e..0117f1e77ef 100644 --- a/src/pl/plpython/plpy_exec.c +++ b/src/pl/plpython/plpy_exec.c @@ -1046,7 +1046,7 @@ PLy_modify_tuple(PLyProcedure *proc, PyObject *pltd, TriggerData *tdata, Py_INCREF(plval); /* We assume proc->result is set up to convert tuples properly */ - att = &proc->result.u.tuple.atts[attn - 1]; + att = &proc->result.tuple.atts[attn - 1]; modvalues[attn - 1] = PLy_output_convert(att, plval, diff --git a/src/pl/plpython/plpy_typeio.c b/src/pl/plpython/plpy_typeio.c index f6509a41902..bba78fb7592 100644 --- a/src/pl/plpython/plpy_typeio.c +++ b/src/pl/plpython/plpy_typeio.c @@ -171,15 +171,15 @@ PLy_input_setup_tuple(PLyDatumToOb *arg, TupleDesc desc, PLyProcedure *proc) /* Save pointer to tupdesc, but only if this is an anonymous record type */ if (arg->typoid == RECORDOID && arg->typmod < 0) - arg->u.tuple.recdesc = desc; + arg->tuple.recdesc = desc; /* (Re)allocate atts array as needed */ - if (arg->u.tuple.natts != desc->natts) + if (arg->tuple.natts != desc->natts) { - if (arg->u.tuple.atts) - pfree(arg->u.tuple.atts); - arg->u.tuple.natts = desc->natts; - arg->u.tuple.atts = (PLyDatumToOb *) + if (arg->tuple.atts) + pfree(arg->tuple.atts); + arg->tuple.natts = desc->natts; + arg->tuple.atts = (PLyDatumToOb *) MemoryContextAllocZero(arg->mcxt, desc->natts * sizeof(PLyDatumToOb)); } @@ -188,7 +188,7 @@ PLy_input_setup_tuple(PLyDatumToOb *arg, TupleDesc desc, PLyProcedure *proc) for (i = 0; i < desc->natts; i++) { Form_pg_attribute attr = TupleDescAttr(desc, i); - PLyDatumToOb *att = &arg->u.tuple.atts[i]; + PLyDatumToOb *att = &arg->tuple.atts[i]; if (attr->attisdropped) continue; @@ -221,15 +221,15 @@ PLy_output_setup_tuple(PLyObToDatum *arg, TupleDesc desc, PLyProcedure *proc) /* Save pointer to tupdesc, but only if this is an anonymous record type */ if (arg->typoid == RECORDOID && arg->typmod < 0) - arg->u.tuple.recdesc = desc; + arg->tuple.recdesc = desc; /* (Re)allocate atts array as needed */ - if (arg->u.tuple.natts != desc->natts) + if (arg->tuple.natts != desc->natts) { - if (arg->u.tuple.atts) - pfree(arg->u.tuple.atts); - arg->u.tuple.natts = desc->natts; - arg->u.tuple.atts = (PLyObToDatum *) + if (arg->tuple.atts) + pfree(arg->tuple.atts); + arg->tuple.natts = desc->natts; + arg->tuple.atts = (PLyObToDatum *) MemoryContextAllocZero(arg->mcxt, desc->natts * sizeof(PLyObToDatum)); } @@ -238,7 +238,7 @@ PLy_output_setup_tuple(PLyObToDatum *arg, TupleDesc desc, PLyProcedure *proc) for (i = 0; i < desc->natts; i++) { Form_pg_attribute attr = TupleDescAttr(desc, i); - PLyObToDatum *att = &arg->u.tuple.atts[i]; + PLyObToDatum *att = &arg->tuple.atts[i]; if (attr->attisdropped) continue; @@ -277,9 +277,9 @@ PLy_output_setup_record(PLyObToDatum *arg, TupleDesc desc, PLyProcedure *proc) * for the record type. */ arg->typmod = desc->tdtypmod; - if (arg->u.tuple.recdesc && - arg->u.tuple.recdesc->tdtypmod != arg->typmod) - arg->u.tuple.recdesc = NULL; + if (arg->tuple.recdesc && + arg->tuple.recdesc->tdtypmod != arg->typmod) + arg->tuple.recdesc = NULL; /* Update derived data if necessary */ PLy_output_setup_tuple(arg, desc, proc); @@ -343,11 +343,11 @@ PLy_output_setup_func(PLyObToDatum *arg, MemoryContext arg_mcxt, { /* Domain */ arg->func = PLyObject_ToDomain; - arg->u.domain.domain_info = NULL; + arg->domain.domain_info = NULL; /* Recursively set up conversion info for the element type */ - arg->u.domain.base = (PLyObToDatum *) + arg->domain.base = (PLyObToDatum *) MemoryContextAllocZero(arg_mcxt, sizeof(PLyObToDatum)); - PLy_output_setup_func(arg->u.domain.base, arg_mcxt, + PLy_output_setup_func(arg->domain.base, arg_mcxt, typentry->domainBaseType, typentry->domainBaseTypmod, proc); @@ -359,11 +359,11 @@ PLy_output_setup_func(PLyObToDatum *arg, MemoryContext arg_mcxt, arg->func = PLySequence_ToArray; /* Get base type OID to insert into constructed array */ /* (note this might not be the same as the immediate child type) */ - arg->u.array.elmbasetype = getBaseType(typentry->typelem); + arg->array.elmbasetype = getBaseType(typentry->typelem); /* Recursively set up conversion info for the element type */ - arg->u.array.elm = (PLyObToDatum *) + arg->array.elm = (PLyObToDatum *) MemoryContextAllocZero(arg_mcxt, sizeof(PLyObToDatum)); - PLy_output_setup_func(arg->u.array.elm, arg_mcxt, + PLy_output_setup_func(arg->array.elm, arg_mcxt, typentry->typelem, typmod, proc); } @@ -372,20 +372,20 @@ PLy_output_setup_func(PLyObToDatum *arg, MemoryContext arg_mcxt, proc->trftypes))) { arg->func = PLyObject_ToTransform; - fmgr_info_cxt(trfuncid, &arg->u.transform.typtransform, arg_mcxt); + fmgr_info_cxt(trfuncid, &arg->transform.typtransform, arg_mcxt); } else if (typtype == TYPTYPE_COMPOSITE) { /* Named composite type, or RECORD */ arg->func = PLyObject_ToComposite; /* We'll set up the per-field data later */ - arg->u.tuple.recdesc = NULL; - arg->u.tuple.typentry = typentry; - arg->u.tuple.tupdescid = INVALID_TUPLEDESC_IDENTIFIER; - arg->u.tuple.atts = NULL; - arg->u.tuple.natts = 0; + arg->tuple.recdesc = NULL; + arg->tuple.typentry = typentry; + arg->tuple.tupdescid = INVALID_TUPLEDESC_IDENTIFIER; + arg->tuple.atts = NULL; + arg->tuple.natts = 0; /* Mark this invalid till needed, too */ - arg->u.tuple.recinfunc.fn_oid = InvalidOid; + arg->tuple.recinfunc.fn_oid = InvalidOid; } else { @@ -400,8 +400,8 @@ PLy_output_setup_func(PLyObToDatum *arg, MemoryContext arg_mcxt, break; default: arg->func = PLyObject_ToScalar; - getTypeInputInfo(typeOid, &typinput, &arg->u.scalar.typioparam); - fmgr_info_cxt(typinput, &arg->u.scalar.typfunc, arg_mcxt); + getTypeInputInfo(typeOid, &typinput, &arg->scalar.typioparam); + fmgr_info_cxt(typinput, &arg->scalar.typfunc, arg_mcxt); break; } } @@ -476,9 +476,9 @@ PLy_input_setup_func(PLyDatumToOb *arg, MemoryContext arg_mcxt, /* Standard array */ arg->func = PLyList_FromArray; /* Recursively set up conversion info for the element type */ - arg->u.array.elm = (PLyDatumToOb *) + arg->array.elm = (PLyDatumToOb *) MemoryContextAllocZero(arg_mcxt, sizeof(PLyDatumToOb)); - PLy_input_setup_func(arg->u.array.elm, arg_mcxt, + PLy_input_setup_func(arg->array.elm, arg_mcxt, typentry->typelem, typmod, proc); } @@ -487,18 +487,18 @@ PLy_input_setup_func(PLyDatumToOb *arg, MemoryContext arg_mcxt, proc->trftypes))) { arg->func = PLyObject_FromTransform; - fmgr_info_cxt(trfuncid, &arg->u.transform.typtransform, arg_mcxt); + fmgr_info_cxt(trfuncid, &arg->transform.typtransform, arg_mcxt); } else if (typtype == TYPTYPE_COMPOSITE) { /* Named composite type, or RECORD */ arg->func = PLyDict_FromComposite; /* We'll set up the per-field data later */ - arg->u.tuple.recdesc = NULL; - arg->u.tuple.typentry = typentry; - arg->u.tuple.tupdescid = INVALID_TUPLEDESC_IDENTIFIER; - arg->u.tuple.atts = NULL; - arg->u.tuple.natts = 0; + arg->tuple.recdesc = NULL; + arg->tuple.typentry = typentry; + arg->tuple.tupdescid = INVALID_TUPLEDESC_IDENTIFIER; + arg->tuple.atts = NULL; + arg->tuple.natts = 0; } else { @@ -535,7 +535,7 @@ PLy_input_setup_func(PLyDatumToOb *arg, MemoryContext arg_mcxt, default: arg->func = PLyUnicode_FromScalar; getTypeOutputInfo(typeOid, &typoutput, &typisvarlena); - fmgr_info_cxt(typoutput, &arg->u.scalar.typfunc, arg_mcxt); + fmgr_info_cxt(typoutput, &arg->scalar.typfunc, arg_mcxt); break; } } @@ -641,7 +641,7 @@ PLyBytes_FromBytea(PLyDatumToOb *arg, Datum d) static PyObject * PLyUnicode_FromScalar(PLyDatumToOb *arg, Datum d) { - char *x = OutputFunctionCall(&arg->u.scalar.typfunc, d); + char *x = OutputFunctionCall(&arg->scalar.typfunc, d); PyObject *r = PLyUnicode_FromString(x); pfree(x); @@ -656,7 +656,7 @@ PLyObject_FromTransform(PLyDatumToOb *arg, Datum d) { Datum t; - t = FunctionCall1(&arg->u.transform.typtransform, d); + t = FunctionCall1(&arg->transform.typtransform, d); return (PyObject *) DatumGetPointer(t); } @@ -667,7 +667,7 @@ static PyObject * PLyList_FromArray(PLyDatumToOb *arg, Datum d) { ArrayType *array = DatumGetArrayTypeP(d); - PLyDatumToOb *elm = arg->u.array.elm; + PLyDatumToOb *elm = arg->array.elm; int ndim; int *dims; char *dataptr; @@ -817,7 +817,7 @@ PLyDict_FromTuple(PLyDatumToOb *arg, HeapTuple tuple, TupleDesc desc, bool inclu PyObject *volatile dict; /* Simple sanity check that desc matches */ - Assert(desc->natts == arg->u.tuple.natts); + Assert(desc->natts == arg->tuple.natts); dict = PyDict_New(); if (dict == NULL) @@ -827,9 +827,9 @@ PLyDict_FromTuple(PLyDatumToOb *arg, HeapTuple tuple, TupleDesc desc, bool inclu { int i; - for (i = 0; i < arg->u.tuple.natts; i++) + for (i = 0; i < arg->tuple.natts; i++) { - PLyDatumToOb *att = &arg->u.tuple.atts[i]; + PLyDatumToOb *att = &arg->tuple.atts[i]; Form_pg_attribute attr = TupleDescAttr(desc, i); char *key; Datum vattr; @@ -971,22 +971,22 @@ PLyObject_ToComposite(PLyObToDatum *arg, PyObject *plrv, { desc = lookup_rowtype_tupdesc(arg->typoid, arg->typmod); /* We should have the descriptor of the type's typcache entry */ - Assert(desc == arg->u.tuple.typentry->tupDesc); + Assert(desc == arg->tuple.typentry->tupDesc); /* Detect change of descriptor, update cache if needed */ - if (arg->u.tuple.tupdescid != arg->u.tuple.typentry->tupDesc_identifier) + if (arg->tuple.tupdescid != arg->tuple.typentry->tupDesc_identifier) { PLy_output_setup_tuple(arg, desc, PLy_current_execution_context()->curr_proc); - arg->u.tuple.tupdescid = arg->u.tuple.typentry->tupDesc_identifier; + arg->tuple.tupdescid = arg->tuple.typentry->tupDesc_identifier; } } else { - desc = arg->u.tuple.recdesc; + desc = arg->tuple.recdesc; if (desc == NULL) { desc = lookup_rowtype_tupdesc(arg->typoid, arg->typmod); - arg->u.tuple.recdesc = desc; + arg->tuple.recdesc = desc; } else { @@ -996,7 +996,7 @@ PLyObject_ToComposite(PLyObToDatum *arg, PyObject *plrv, } /* Simple sanity check on our caching */ - Assert(desc->natts == arg->u.tuple.natts); + Assert(desc->natts == arg->tuple.natts); /* * Convert, using the appropriate method depending on the type of the @@ -1088,9 +1088,9 @@ PLyObject_ToScalar(PLyObToDatum *arg, PyObject *plrv, str = PLyObject_AsString(plrv); - return InputFunctionCall(&arg->u.scalar.typfunc, + return InputFunctionCall(&arg->scalar.typfunc, str, - arg->u.scalar.typioparam, + arg->scalar.typioparam, arg->typmod); } @@ -1103,11 +1103,11 @@ PLyObject_ToDomain(PLyObToDatum *arg, PyObject *plrv, bool *isnull, bool inarray) { Datum result; - PLyObToDatum *base = arg->u.domain.base; + PLyObToDatum *base = arg->domain.base; result = base->func(base, plrv, isnull, inarray); domain_check(result, *isnull, arg->typoid, - &arg->u.domain.domain_info, arg->mcxt); + &arg->domain.domain_info, arg->mcxt); return result; } @@ -1125,7 +1125,7 @@ PLyObject_ToTransform(PLyObToDatum *arg, PyObject *plrv, return (Datum) 0; } *isnull = false; - return FunctionCall1(&arg->u.transform.typtransform, PointerGetDatum(plrv)); + return FunctionCall1(&arg->transform.typtransform, PointerGetDatum(plrv)); } @@ -1169,12 +1169,12 @@ PLySequence_ToArray(PLyObToDatum *arg, PyObject *plrv, */ PLySequence_ToArray_recurse(plrv, &astate, &ndims, dims, 1, - arg->u.array.elm, - arg->u.array.elmbasetype); + arg->array.elm, + arg->array.elmbasetype); /* ensure we get zero-D array for no inputs, as per PG convention */ if (astate == NULL) - return PointerGetDatum(construct_empty_array(arg->u.array.elmbasetype)); + return PointerGetDatum(construct_empty_array(arg->array.elmbasetype)); for (int i = 0; i < ndims; i++) lbs[i] = 1; @@ -1289,8 +1289,8 @@ PLyUnicode_ToComposite(PLyObToDatum *arg, PyObject *string, bool inarray) * Set up call data for record_in, if we didn't already. (We can't just * use DirectFunctionCall, because record_in needs a fn_extra field.) */ - if (!OidIsValid(arg->u.tuple.recinfunc.fn_oid)) - fmgr_info_cxt(F_RECORD_IN, &arg->u.tuple.recinfunc, arg->mcxt); + if (!OidIsValid(arg->tuple.recinfunc.fn_oid)) + fmgr_info_cxt(F_RECORD_IN, &arg->tuple.recinfunc, arg->mcxt); str = PLyObject_AsString(string); @@ -1334,7 +1334,7 @@ PLyUnicode_ToComposite(PLyObToDatum *arg, PyObject *string, bool inarray) errhint("To return a composite type in an array, return the composite type as a Python tuple, e.g., \"[('foo',)]\"."))); } - return InputFunctionCall(&arg->u.tuple.recinfunc, + return InputFunctionCall(&arg->tuple.recinfunc, str, arg->typoid, arg->typmod); @@ -1371,7 +1371,7 @@ PLyMapping_ToComposite(PLyObToDatum *arg, TupleDesc desc, PyObject *mapping) key = NameStr(attr->attname); value = NULL; - att = &arg->u.tuple.atts[i]; + att = &arg->tuple.atts[i]; PG_TRY(); { value = PyMapping_GetItemString(mapping, key); @@ -1451,7 +1451,7 @@ PLySequence_ToComposite(PLyObToDatum *arg, TupleDesc desc, PyObject *sequence) } value = NULL; - att = &arg->u.tuple.atts[i]; + att = &arg->tuple.atts[i]; PG_TRY(); { value = PySequence_GetItem(sequence, idx); @@ -1511,7 +1511,7 @@ PLyGenericObject_ToComposite(PLyObToDatum *arg, TupleDesc desc, PyObject *object key = NameStr(attr->attname); value = NULL; - att = &arg->u.tuple.atts[i]; + att = &arg->tuple.atts[i]; PG_TRY(); { value = PyObject_GetAttrString(object, key); diff --git a/src/pl/plpython/plpy_typeio.h b/src/pl/plpython/plpy_typeio.h index 5417f0945d2..29258509b5c 100644 --- a/src/pl/plpython/plpy_typeio.h +++ b/src/pl/plpython/plpy_typeio.h @@ -69,7 +69,7 @@ struct PLyDatumToOb PLyArrayToOb array; PLyTupleToOb tuple; PLyTransformToOb transform; - } u; + }; }; /* @@ -143,7 +143,7 @@ struct PLyObToDatum PLyObToTuple tuple; PLyObToDomain domain; PLyObToTransform transform; - } u; + }; }; -- 2.51.0