Hi. I noticed that RelationBuildPartitionKey() is not doing the right thing with respect to which context it passes to fmgr.c to set a the (cached) partition support function's FmgrInfo's fn_mcxt.
I noticed a crash while trying to change partition pruning tests to use manually created hash operator class per [1]. CREATE OR REPLACE FUNCTION hashint4_noop(int4, int8) RETURNS int8 AS $$SELECT coalesce($1)::int8$$ LANGUAGE sql IMMUTABLE STRICT; CREATE OPERATOR CLASS test_int4_ops FOR TYPE int4 USING HASH AS OPERATOR 1 = , FUNCTION 2 hashint4_noop(int4, int8); CREATE OR REPLACE FUNCTION hashtext_length(text, int8) RETURNS int8 AS $$SELECT length(coalesce($1))::int8$$ LANGUAGE sql IMMUTABLE STRICT; CREATE OPERATOR CLASS test_text_ops FOR TYPE text USING HASH AS OPERATOR 1 = , FUNCTION 2 hashtext_length(text, int8); create table hp (a int, b text) partition by hash (a test_int4_ops, b test_text_ops); create table hp0 partition of hp for values with (modulus 4, remainder 0); create table hp3 partition of hp for values with (modulus 4, remainder 3); create table hp1 partition of hp for values with (modulus 4, remainder 1); create table hp2 partition of hp for values with (modulus 4, remainder 2); insert into hp values (1, 'abcde'); INSERT 0 1 Time: 13.604 ms postgres=# insert into hp values (null, 'abcde'); server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request. The connection to the server was lost. Attempting reset: Failed. Attached fixes it. It teaches RelationBuildPartitionKey() to use fmgr_info_cxt and pass rd_partkeycxt to it. Since this bug also exists in the released PG 10 branch, I also created a patch for that. It's slightly different than the one for PG 11dev, because there were some changes recently to how the memory context is manipulated in RelationBuildPartitionKey. That's v1-PG10-0001-Fix-a-memory-context-bug-in-RelationBuildPartitio.patch. Thanks, Amit [1] https://www.postgresql.org/message-id/CA%2BTgmoZ0D5kJbt8eKXtvVdvTcGGWn6ehWCRSZbWytD-uzH92mQ%40mail.gmail.com
From 81d8337760be175b37b5ffe84df06903173787c5 Mon Sep 17 00:00:00 2001 From: amit <amitlangot...@gmail.com> Date: Tue, 10 Apr 2018 15:38:19 +0900 Subject: [PATCH v1] Fix a memory context bug in RelationBuildPartitionKey We should pass rd_partkeycxt to set fn_mcxt, not CurrentMemoryContex. --- src/backend/utils/cache/relcache.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index a69b078f91..be7d5b7eef 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -849,6 +849,10 @@ RelationBuildPartitionKey(Relation relation) if (!HeapTupleIsValid(tuple)) return; + partkeycxt = AllocSetContextCreate(CacheMemoryContext, + RelationGetRelationName(relation), + ALLOCSET_SMALL_SIZES); + key = (PartitionKey) palloc0(sizeof(PartitionKeyData)); /* Fixed-length attributes */ @@ -951,7 +955,7 @@ RelationBuildPartitionKey(Relation relation) BTORDER_PROC, opclassform->opcintype, opclassform->opcintype, opclassform->opcfamily); - fmgr_info(funcid, &key->partsupfunc[i]); + fmgr_info_cxt(funcid, &key->partsupfunc[i], partkeycxt); /* Collation */ key->partcollation[i] = collation->values[i]; @@ -985,9 +989,6 @@ RelationBuildPartitionKey(Relation relation) ReleaseSysCache(tuple); /* Success --- now copy to the cache memory */ - partkeycxt = AllocSetContextCreate(CacheMemoryContext, - RelationGetRelationName(relation), - ALLOCSET_SMALL_SIZES); relation->rd_partkeycxt = partkeycxt; oldcxt = MemoryContextSwitchTo(relation->rd_partkeycxt); relation->rd_partkey = copy_partition_key(key); -- 2.11.0
From 57056b1ca511ef549ee3f28a8e17d2bdfbf757a5 Mon Sep 17 00:00:00 2001 From: amit <amitlangot...@gmail.com> Date: Tue, 10 Apr 2018 15:38:19 +0900 Subject: [PATCH v1] Fix a memory context bug in RelationBuildPartitionKey We should pass rd_partkeycxt to set fn_mcxt, not CurrentMemoryContex. --- src/backend/utils/cache/relcache.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index e81c4691ec..2a74601fc1 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -1034,7 +1034,7 @@ RelationBuildPartitionKey(Relation relation) procnum, format_type_be(opclassform->opcintype)))); - fmgr_info(funcid, &key->partsupfunc[i]); + fmgr_info_cxt(funcid, &key->partsupfunc[i], partkeycxt); /* Collation */ key->partcollation[i] = collation->values[i]; -- 2.11.0