aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2017-09-08 20:45:31 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2017-09-08 20:45:31 -0400
commitfdf87ed451ef1ccb710f4e65dddbc6da17e92ba7 (patch)
tree42570d39b3bacd3e89d6a2bfb8691d41b2efd632
parente56dd7cf5078d9651d715a72cd802a3aa346c63a (diff)
downloadpostgresql-fdf87ed451ef1ccb710f4e65dddbc6da17e92ba7.tar.gz
postgresql-fdf87ed451ef1ccb710f4e65dddbc6da17e92ba7.zip
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.
-rw-r--r--src/backend/catalog/partition.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/backend/catalog/partition.c b/src/backend/catalog/partition.c
index c94ee941ded..73eff17202c 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]);