From e84bf651216a80c1d0c0d14901dea244c6a333ab Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 2 Nov 2010 17:15:13 -0400 Subject: Ensure an index that uses a whole-row Var still depends on its table. We failed to record any dependency on the underlying table for an index declared like "create index i on t (foo(t.*))". This would create trouble if the table were dropped without previously dropping the index. To fix, simplify some overly-cute code in index_create(), accepting the possibility that sometimes the whole-table dependency will be redundant. Also document this hazard in dependency.c. Per report from Kevin Grittner. In passing, prevent a core dump in pg_get_indexdef() if the index's table can't be found. I came across this while experimenting with Kevin's example. Not sure it's a real issue when the catalogs aren't corrupt, but might as well be cautious. Back-patch to all supported versions. --- src/backend/catalog/index.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) (limited to 'src/backend/catalog/index.c') diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index dea6889075f..a3ac44cf79b 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -50,7 +50,6 @@ #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "optimizer/clauses.h" -#include "optimizer/var.h" #include "parser/parser.h" #include "storage/bufmgr.h" #include "storage/lmgr.h" @@ -853,16 +852,12 @@ index_create(Oid heapRelationId, } /* - * It's possible for an index to not depend on any columns of the - * table at all, in which case we need to give it a dependency on - * the table as a whole; else it won't get dropped when the table - * is dropped. This edge case is not totally useless; for - * example, a unique index on a constant expression can serve to - * prevent a table from containing more than one row. + * If there are no simply-referenced columns, give the index an + * auto dependency on the whole table. In most cases, this will + * be redundant, but it might not be if the index expressions and + * predicate contain no Vars or only whole-row Vars. */ - if (!have_simple_col && - !contain_vars_of_level((Node *) indexInfo->ii_Expressions, 0) && - !contain_vars_of_level((Node *) indexInfo->ii_Predicate, 0)) + if (!have_simple_col) { referenced.classId = RelationRelationId; referenced.objectId = heapRelationId; -- cgit v1.2.3