aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/common/tupdesc.c
diff options
context:
space:
mode:
authorPeter Eisentraut <peter@eisentraut.org>2023-09-27 18:52:40 +0100
committerPeter Eisentraut <peter@eisentraut.org>2023-09-27 18:52:40 +0100
commitebf76f2753a91615d45f113f1535a8443fa8d076 (patch)
treecb82bc6f663156a233fbff877a03ff97959fd298 /src/backend/access/common/tupdesc.c
parent9dce22033d5d2813e9f8e7d595f57ee5a38b3f8e (diff)
downloadpostgresql-ebf76f2753a91615d45f113f1535a8443fa8d076.tar.gz
postgresql-ebf76f2753a91615d45f113f1535a8443fa8d076.zip
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
Diffstat (limited to 'src/backend/access/common/tupdesc.c')
-rw-r--r--src/backend/access/common/tupdesc.c25
1 files changed, 25 insertions, 0 deletions
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;
+}