aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/access/common/tupdesc.c14
-rw-r--r--src/tools/valgrind.supp16
2 files changed, 10 insertions, 20 deletions
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index 11c31d8fe92..bf47640092a 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -468,6 +468,12 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2)
* This function initializes a single attribute structure in
* a previously allocated tuple descriptor.
*
+ * If attributeName is NULL, the attname field is set to an empty string
+ * (this is for cases where we don't know or need a name for the field).
+ * Also, some callers use this function to change the datatype-related fields
+ * in an existing tupdesc; they pass attributeName = NameStr(att->attname)
+ * to indicate that the attname field shouldn't be modified.
+ *
* Note that attcollation is set to the default for the specified datatype.
* If a nondefault collation is needed, insert it afterwards using
* TupleDescInitEntryCollation.
@@ -501,12 +507,12 @@ TupleDescInitEntry(TupleDesc desc,
/*
* Note: attributeName can be NULL, because the planner doesn't always
* fill in valid resname values in targetlists, particularly for resjunk
- * attributes.
+ * attributes. Also, do nothing if caller wants to re-use the old attname.
*/
- if (attributeName != NULL)
- namestrcpy(&(att->attname), attributeName);
- else
+ if (attributeName == NULL)
MemSet(NameStr(att->attname), 0, NAMEDATALEN);
+ else if (attributeName != NameStr(att->attname))
+ namestrcpy(&(att->attname), attributeName);
att->attstattarget = -1;
att->attcacheoff = -1;
diff --git a/src/tools/valgrind.supp b/src/tools/valgrind.supp
index 8c14d6962e8..d3447d7feb8 100644
--- a/src/tools/valgrind.supp
+++ b/src/tools/valgrind.supp
@@ -64,22 +64,6 @@
}
-# resolve_polymorphic_tupdesc(), a subroutine of internal_get_result_type(),
-# can instigate a memcpy() call where the two pointer arguments are exactly
-# equal. The behavior thereof is formally undefined, but implementations
-# where it's anything other than a no-op are thought unlikely.
-{
- noopmemcpy_internal_get_result_type
- Memcheck:Overlap
-
- fun:*strncpy*
- fun:namestrcpy
- fun:TupleDescInitEntry
- ...
- fun:internal_get_result_type
-}
-
-
# gcc on ppc64 can generate a four-byte read to fetch the final "char" fields
# of a FormData_pg_cast. This is valid compiler behavior, because a proper
# FormData_pg_cast has trailing padding. Tuples we treat as structures omit