From ebf76f2753a91615d45f113f1535a8443fa8d076 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 27 Sep 2023 18:52:40 +0100 Subject: Add TupleDescGetDefault() This unifies some repetitive code. Note: I didn't push the "not found" error message into the new function, even though all existing callers would be able to make use of it. Using the existing error handling as-is would probably require exposing the Relation type via tupdesc.h, which doesn't seem desirable. (Or even if we changed it to just report the OID, it would inject the concept of a relation containing the tuple descriptor into tupdesc.h, which might be a layering violation. Perhaps some further improvements could be considered here separately.) Discussion: https://www.postgresql.org/message-id/flat/52a125e4-ff9a-95f5-9f61-b87cf447e4da%40eisentraut.org --- src/backend/access/common/tupdesc.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'src/backend/access') diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c index 253d6c86f86..ce2c7bce856 100644 --- a/src/backend/access/common/tupdesc.c +++ b/src/backend/access/common/tupdesc.c @@ -927,3 +927,28 @@ BuildDescFromLists(const List *names, const List *types, const List *typmods, co return desc; } + +/* + * Get default expression (or NULL if none) for the given attribute number. + */ +Node * +TupleDescGetDefault(TupleDesc tupdesc, AttrNumber attnum) +{ + Node *result = NULL; + + if (tupdesc->constr) + { + AttrDefault *attrdef = tupdesc->constr->defval; + + for (int i = 0; i < tupdesc->constr->num_defval; i++) + { + if (attrdef[i].adnum == attnum) + { + result = stringToNode(attrdef[i].adbin); + break; + } + } + } + + return result; +} -- cgit v1.2.3