diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2008-08-10 19:02:46 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2008-08-10 19:02:46 +0000 |
commit | e9ec4bbffe1102bd1818a69ac9abf942bc17498f (patch) | |
tree | 9f13d6a5c3b3b03c3feb786f181524e9ece54bb7 /src/backend/utils/cache | |
parent | 5e2ff20edf4bba7b1015abf18874f65192936901 (diff) | |
download | postgresql-e9ec4bbffe1102bd1818a69ac9abf942bc17498f.tar.gz postgresql-e9ec4bbffe1102bd1818a69ac9abf942bc17498f.zip |
Fix corner-case bug introduced with HOT: if REINDEX TABLE pg_class (or a
REINDEX DATABASE including same) is done before a session has done any other
update on pg_class, the pg_class relcache entry was left with an incorrect
setting of rd_indexattr, because the indexed-attributes set would be first
demanded at a time when we'd forced a partial list of indexes into the
pg_class entry, and it would remain cached after that. This could result
in incorrect decisions about HOT-update safety later in the same session.
In practice, since only pg_class_relname_nsp_index would be missed out,
only ALTER TABLE RENAME and ALTER TABLE SET SCHEMA could trigger a problem.
Per report and test case from Ondrej Jirman.
Diffstat (limited to 'src/backend/utils/cache')
-rw-r--r-- | src/backend/utils/cache/relcache.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index ec0ba854cf6..73d7d8ef1ed 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.266.2.3 2008/04/16 18:23:12 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.266.2.4 2008/08/10 19:02:46 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -2994,6 +2994,13 @@ insert_ordered_oid(List *list, Oid datum) * messages. In practice it is only used on pg_class (see REINDEX). * * It is up to the caller to make sure the given list is correctly ordered. + * + * We deliberately do not change rd_indexattr here: even when operating + * with a temporary partial index list, HOT-update decisions must be made + * correctly with respect to the full index set. It is up to the caller + * to ensure that a correct rd_indexattr set has been cached before first + * calling RelationSetIndexList; else a subsequent inquiry might cause a + * wrong rd_indexattr set to get computed and cached. */ void RelationSetIndexList(Relation relation, List *indexIds, Oid oidIndex) @@ -3012,7 +3019,6 @@ RelationSetIndexList(Relation relation, List *indexIds, Oid oidIndex) relation->rd_indexvalid = 2; /* mark list as forced */ /* must flag that we have a forced index list */ need_eoxact_work = true; - /* we deliberately do not change rd_indexattr */ } /* |