From 471fda80c41fae835ecbe63ae8505526a37487a9 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 12 Jul 2023 16:12:35 +0200 Subject: [PATCH v2 04/10] 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. --- src/backend/access/common/tupdesc.c | 25 +++++++++++++++++++++++++ src/backend/commands/tablecmds.c | 17 ++--------------- src/backend/parser/parse_utilcmd.c | 13 ++----------- src/backend/rewrite/rewriteHandler.c | 16 +--------------- src/include/access/tupdesc.h | 2 ++ 5 files changed, 32 insertions(+), 41 deletions(-) diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c index 253d6c86f8..ce2c7bce85 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; +} diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index fb6d1b90dc..0a7101dadc 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -2796,22 +2796,9 @@ MergeAttributes(List *columns, const List *supers, char relpersistence, */ if (attribute->atthasdef) { - Node *this_default = NULL; + Node *this_default; - /* Find default in constraint structure */ - if (constr != NULL) - { - AttrDefault *attrdef = constr->defval; - - for (int i = 0; i < constr->num_defval; i++) - { - if (attrdef[i].adnum == parent_attno) - { - this_default = stringToNode(attrdef[i].adbin); - break; - } - } - } + this_default = TupleDescGetDefault(tupleDesc, parent_attno); if (this_default == NULL) elog(ERROR, "default expression not found for attribute %d of relation \"%s\"", parent_attno, RelationGetRelationName(relation)); diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c index 55c315f0e2..cf0d432ab1 100644 --- a/src/backend/parser/parse_utilcmd.c +++ b/src/backend/parser/parse_utilcmd.c @@ -1358,20 +1358,11 @@ expandTableLikeClause(RangeVar *heapRel, TableLikeClause *table_like_clause) (table_like_clause->options & CREATE_TABLE_LIKE_GENERATED) : (table_like_clause->options & CREATE_TABLE_LIKE_DEFAULTS))) { - Node *this_default = NULL; - AttrDefault *attrdef = constr->defval; + Node *this_default; AlterTableCmd *atsubcmd; bool found_whole_row; - /* Find default in constraint structure */ - for (int i = 0; i < constr->num_defval; i++) - { - if (attrdef[i].adnum == parent_attno) - { - this_default = stringToNode(attrdef[i].adbin); - break; - } - } + this_default = TupleDescGetDefault(tupleDesc, parent_attno); if (this_default == NULL) elog(ERROR, "default expression not found for attribute %d of relation \"%s\"", parent_attno, RelationGetRelationName(relation)); diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c index b486ab559a..41a362310a 100644 --- a/src/backend/rewrite/rewriteHandler.c +++ b/src/backend/rewrite/rewriteHandler.c @@ -1246,21 +1246,7 @@ build_column_default(Relation rel, int attrno) */ if (att_tup->atthasdef) { - if (rd_att->constr && rd_att->constr->num_defval > 0) - { - AttrDefault *defval = rd_att->constr->defval; - int ndef = rd_att->constr->num_defval; - - while (--ndef >= 0) - { - if (attrno == defval[ndef].adnum) - { - /* Found it, convert string representation to node tree. */ - expr = stringToNode(defval[ndef].adbin); - break; - } - } - } + expr = TupleDescGetDefault(rd_att, attrno); if (expr == NULL) elog(ERROR, "default expression not found for attribute %d of relation \"%s\"", attrno, RelationGetRelationName(rel)); diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h index f6cc28a661..ffd2874ee3 100644 --- a/src/include/access/tupdesc.h +++ b/src/include/access/tupdesc.h @@ -151,4 +151,6 @@ extern TupleDesc BuildDescForRelation(const List *columns); extern TupleDesc BuildDescFromLists(const List *names, const List *types, const List *typmods, const List *collations); +extern Node *TupleDescGetDefault(TupleDesc tupdesc, AttrNumber attnum); + #endif /* TUPDESC_H */ -- 2.41.0