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]; diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out index eb89a5eb67..ba493f04ab 100644 --- a/src/test/regress/expected/partition_prune.out +++ b/src/test/regress/expected/partition_prune.out @@ -1475,6 +1475,12 @@ explain (costs off) select * from hp where a is null and b is null; Filter: ((a IS NULL) AND (b IS NULL)) (3 rows) +select satisfies_hash_partition('hp'::regclass, 4, 0, null::int, null::text); + satisfies_hash_partition +-------------------------- + t +(1 row) + explain (costs off) select * from hp where a = 1 and b is null; QUERY PLAN ------------------------------------------- @@ -1483,6 +1489,12 @@ explain (costs off) select * from hp where a = 1 and b is null; Filter: ((b IS NULL) AND (a = 1)) (3 rows) +select satisfies_hash_partition('hp'::regclass, 4, 0, 1, null::text); + satisfies_hash_partition +-------------------------- + t +(1 row) + explain (costs off) select * from hp where a = 1 and b = 'xxx'; QUERY PLAN ------------------------------------------------- @@ -1491,6 +1503,12 @@ explain (costs off) select * from hp where a = 1 and b = 'xxx'; Filter: ((a = 1) AND (b = 'xxx'::text)) (3 rows) +select satisfies_hash_partition('hp'::regclass, 4, 3, 1, 'xxx'::text); + satisfies_hash_partition +-------------------------- + t +(1 row) + explain (costs off) select * from hp where a is null and b = 'xxx'; QUERY PLAN ----------------------------------------------------- @@ -1499,6 +1517,12 @@ explain (costs off) select * from hp where a is null and b = 'xxx'; Filter: ((a IS NULL) AND (b = 'xxx'::text)) (3 rows) +select satisfies_hash_partition('hp'::regclass, 4, 2, null::int, 'xxx'::text); + satisfies_hash_partition +-------------------------- + t +(1 row) + explain (costs off) select * from hp where a = 2 and b = 'xxx'; QUERY PLAN ------------------------------------------------- @@ -1507,6 +1531,12 @@ explain (costs off) select * from hp where a = 2 and b = 'xxx'; Filter: ((a = 2) AND (b = 'xxx'::text)) (3 rows) +select satisfies_hash_partition('hp'::regclass, 4, 2, 2, 'xxx'::text); + satisfies_hash_partition +-------------------------- + t +(1 row) + explain (costs off) select * from hp where a = 1 and b = 'abcde'; QUERY PLAN --------------------------------------------------- @@ -1515,6 +1545,12 @@ explain (costs off) select * from hp where a = 1 and b = 'abcde'; Filter: ((a = 1) AND (b = 'abcde'::text)) (3 rows) +select satisfies_hash_partition('hp'::regclass, 4, 1, 1, 'abcde'::text); + satisfies_hash_partition +-------------------------- + t +(1 row) + explain (costs off) select * from hp where (a = 1 and b = 'abcde') or (a = 2 and b = 'xxx') or (a is null and b is null); QUERY PLAN ------------------------------------------------------------------------------------------------------------------------- diff --git a/src/test/regress/sql/partition_prune.sql b/src/test/regress/sql/partition_prune.sql index 6cc8e3cdfc..787468f290 100644 --- a/src/test/regress/sql/partition_prune.sql +++ b/src/test/regress/sql/partition_prune.sql @@ -282,11 +282,23 @@ explain (costs off) select * from hp where a <> 1 and b <> 'xxx'; -- pruning should work if either a value or a IS NULL clause is provided for -- each of the keys explain (costs off) select * from hp where a is null and b is null; +select satisfies_hash_partition('hp'::regclass, 4, 0, null::int, null::text); + explain (costs off) select * from hp where a = 1 and b is null; +select satisfies_hash_partition('hp'::regclass, 4, 0, 1, null::text); + explain (costs off) select * from hp where a = 1 and b = 'xxx'; +select satisfies_hash_partition('hp'::regclass, 4, 3, 1, 'xxx'::text); + explain (costs off) select * from hp where a is null and b = 'xxx'; +select satisfies_hash_partition('hp'::regclass, 4, 2, null::int, 'xxx'::text); + explain (costs off) select * from hp where a = 2 and b = 'xxx'; +select satisfies_hash_partition('hp'::regclass, 4, 2, 2, 'xxx'::text); + explain (costs off) select * from hp where a = 1 and b = 'abcde'; +select satisfies_hash_partition('hp'::regclass, 4, 1, 1, 'abcde'::text); + explain (costs off) select * from hp where (a = 1 and b = 'abcde') or (a = 2 and b = 'xxx') or (a is null and b is null); drop table hp;