pg.ddx.io  pgsql-hackers@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Justin Pryzby <pryzby@telsasoft.com>
To: Alvaro Herrera <alvherre@alvh.no-ip.org>
Cc: pgsql-hackers@postgresql.org
Subject: list_free() in index_get_partition()
Date: Thu, 5 Nov 2020 14:36:06 -0600
Message-ID: <20201105203606.GF22691@telsasoft.com> (raw)

Seems to be missing.

The 2nd patch does some more cleanup - Before, a failed syscache lookup would
ERROR, but I don't think that's supposed to happen.  get_rel_relispartition()
would instead return false, and we won't call get_partition_parent().

commit a8ad949f22b8dd7b23049b0b0704e5be9233e319
Author: Justin Pryzby <pryzbyj@telsasoft.com>
Date:   Thu Nov 5 12:06:49 2020 -0600

    list_free() in index_get_partition()
    
    which was added at: a6da0047158b8a227f883aeed19eb7fcfbef11fb

inline patch 1: src/backend/catalog/partition.c (+2/-1 lines) download inline-1.patchdiff --git a/src/backend/catalog/partition.c b/src/backend/catalog/partition.c index 239ac017fa..4dfac39adf 100644 --- a/src/backend/catalog/partition.c +++ b/src/backend/catalog/partition.c @@ -153,44 +153,45 @@ Oid index_get_partition(Relation partition, Oid indexId) { List *idxlist = RelationGetIndexList(partition); ListCell *l; foreach(l, idxlist) { Oid partIdx = lfirst_oid(l); HeapTuple tup; Form_pg_class classForm; bool ispartition; tup = SearchSysCache1(RELOID, ObjectIdGetDatum(partIdx)); if (!HeapTupleIsValid(tup)) elog(ERROR, "cache lookup failed for relation %u", partIdx); classForm = (Form_pg_class) GETSTRUCT(tup); ispartition = classForm->relispartition; ReleaseSysCache(tup); if (!ispartition) continue; - if (get_partition_parent(lfirst_oid(l)) == indexId) + if (get_partition_parent(partIdx) == indexId) { list_free(idxlist); return partIdx; } } + list_free(idxlist); return InvalidOid; }
commit 0a01cb7561d6ec74aa5829040bd1478e7b113d89 Author: Justin Pryzby <pryzbyj@telsasoft.com> Date: Thu Nov 5 12:14:24 2020 -0600 index_get_partition(): use lsyscache ?? The old code failed when !HeapTupleIsValid(), the new code will return false - is that ok ?? Two of the existing callers error anyway.
inline patch 2: src/backend/catalog/partition.c (+3/-11 lines) download inline-2.patchdiff --git a/src/backend/catalog/partition.c b/src/backend/catalog/partition.c index 4dfac39adf..3d78bc0872 100644 --- a/src/backend/catalog/partition.c +++ b/src/backend/catalog/partition.c @@ -28,6 +28,7 @@ #include "partitioning/partbounds.h" #include "rewrite/rewriteManip.h" #include "utils/fmgroids.h" +#include "utils/lsyscache.h" #include "utils/partcache.h" #include "utils/rel.h" #include "utils/syscache.h" @@ -158,17 +159,8 @@ index_get_partition(Relation partition, Oid indexId) foreach(l, idxlist) { Oid partIdx = lfirst_oid(l); - HeapTuple tup; - Form_pg_class classForm; - bool ispartition; - - tup = SearchSysCache1(RELOID, ObjectIdGetDatum(partIdx)); - if (!HeapTupleIsValid(tup)) - elog(ERROR, "cache lookup failed for relation %u", partIdx); - classForm = (Form_pg_class) GETSTRUCT(tup); - ispartition = classForm->relispartition; - ReleaseSysCache(tup); - if (!ispartition) + + if (!get_rel_relispartition(partIdx)) continue; if (get_partition_parent(partIdx) == indexId) {
Patches and attachments: download all (4 files, .tar.gz)
0001-Fixes-to-index_get_partition.patch (text/x-diff, 992B) download From 90e155f660314ec70de14177241dd1ec029d9311 Mon Sep 17 00:00:00 2001 From: Justin Pryzby <pryzbyj@telsasoft.com> Date: Thu, 5 Nov 2020 12:06:49 -0600 Subject: [PATCH 1/2] Fixes to index_get_partition() which was added at: a6da0047158b8a227f883aeed19eb7fcfbef11fb free list in cases where there's no parent use lsyscache: get_rel_relispartition() --- src/backend/catalog/partition.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/backend/catalog/partition.c b/src/backend/catalog/partition.c index 239ac017fa..4dfac39adf 100644 --- a/src/backend/catalog/partition.c +++ b/src/backend/catalog/partition.c @@ -170,13 +170,14 @@ index_get_partition(Relation partition, Oid indexId) ReleaseSysCache(tup); if (!ispartition) continue; - if (get_partition_parent(lfirst_oid(l)) == indexId) + if (get_partition_parent(partIdx) == indexId) { list_free(idxlist); return partIdx; } } + list_free(idxlist); return InvalidOid; } -- 2.17.0
0002-index_get_partition-use-lsyscache.patch (text/x-diff, 1.4K) download From 768f91199b5e197759b2ead6d838a72974dca6b6 Mon Sep 17 00:00:00 2001 From: Justin Pryzby <pryzbyj@telsasoft.com> Date: Thu, 5 Nov 2020 12:14:24 -0600 Subject: [PATCH 2/2] index_get_partition(): use lsyscache ?? The old code failed when !HeapTupleIsValid(), the new code will return false - is that ok ?? --- src/backend/catalog/partition.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/backend/catalog/partition.c b/src/backend/catalog/partition.c index 4dfac39adf..3d78bc0872 100644 --- a/src/backend/catalog/partition.c +++ b/src/backend/catalog/partition.c @@ -28,6 +28,7 @@ #include "partitioning/partbounds.h" #include "rewrite/rewriteManip.h" #include "utils/fmgroids.h" +#include "utils/lsyscache.h" #include "utils/partcache.h" #include "utils/rel.h" #include "utils/syscache.h" @@ -158,17 +159,8 @@ index_get_partition(Relation partition, Oid indexId) foreach(l, idxlist) { Oid partIdx = lfirst_oid(l); - HeapTuple tup; - Form_pg_class classForm; - bool ispartition; - - tup = SearchSysCache1(RELOID, ObjectIdGetDatum(partIdx)); - if (!HeapTupleIsValid(tup)) - elog(ERROR, "cache lookup failed for relation %u", partIdx); - classForm = (Form_pg_class) GETSTRUCT(tup); - ispartition = classForm->relispartition; - ReleaseSysCache(tup); - if (!ispartition) + + if (!get_rel_relispartition(partIdx)) continue; if (get_partition_parent(partIdx) == indexId) { -- 2.17.0

view thread (3+ messages)  latest in thread

Message-ID: <20201105203606.GF22691@telsasoft.com>
Permalink:  ../20201105203606.GF22691@telsasoft.com/
Also on:    postgresql.org/message-id/20201105203606.GF22691@telsasoft.com

 ·  · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-hackers@postgresql.org
  Cc: pryzby@telsasoft.com, alvherre@alvh.no-ip.org
  Subject: Re: list_free() in index_get_partition()
  In-Reply-To: <20201105203606.GF22691@telsasoft.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox