From fdf87ed451ef1ccb710f4e65dddbc6da17e92ba7 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 8 Sep 2017 20:45:31 -0400 Subject: [PATCH] Fix failure-to-copy bug in commit 6f6b99d13. The previous coding of get_qual_for_list() was careful to copy everything it was using from the input data structure. The new version missed making a copy of pass-by-ref datum values that it's inserting into Consts. This is not optional, however, as revealed by buildfarm failures on machines running -DRELCACHE_FORCE_RELEASE: we're copying from a relcache entry that could go away before the required lifespan of our output expression. I'm pretty sure -DCLOBBER_CACHE_ALWAYS machines won't like this either, but none of them have reported in yet. --- src/backend/catalog/partition.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/backend/catalog/partition.c b/src/backend/catalog/partition.c index c94ee941de..73eff17202 100644 --- a/src/backend/catalog/partition.c +++ b/src/backend/catalog/partition.c @@ -1559,12 +1559,18 @@ get_qual_for_list(Relation parent, PartitionBoundSpec *spec) { Const *val; - /* Construct const from datum */ + /* + * Construct Const from known-not-null datum. We must be careful + * to copy the value, because our result has to be able to outlive + * the relcache entry we're copying from. + */ val = makeConst(key->parttypid[0], key->parttypmod[0], key->parttypcoll[0], key->parttyplen[0], - *boundinfo->datums[i], + datumCopy(*boundinfo->datums[i], + key->parttypbyval[0], + key->parttyplen[0]), false, /* isnull */ key->parttypbyval[0]); -- 2.40.0