diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2017-09-08 20:45:31 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2017-09-08 20:45:31 -0400 |
commit | fdf87ed451ef1ccb710f4e65dddbc6da17e92ba7 (patch) | |
tree | 42570d39b3bacd3e89d6a2bfb8691d41b2efd632 | |
parent | e56dd7cf5078d9651d715a72cd802a3aa346c63a (diff) | |
download | postgresql-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.c | 10 |
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]); |