aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2007-11-08 23:23:23 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2007-11-08 23:23:23 +0000
commitfcc3ac19fdb76e2975cc39a5cf5ca5c5c23751f3 (patch)
tree8c55c654732dad32be70bc4c1f5740a4d4db2528 /src
parentebec2bac886062d6288be25109605bb2b316a43d (diff)
downloadpostgresql-fcc3ac19fdb76e2975cc39a5cf5ca5c5c23751f3.tar.gz
postgresql-fcc3ac19fdb76e2975cc39a5cf5ca5c5c23751f3.zip
If an index depends on no columns of its table, give it a dependency on the
whole table instead, to ensure that it goes away when the table is dropped. Per bug #3723 from Sam Mason. Backpatch as far as 7.4; AFAICT 7.3 does not have the issue, because it doesn't have general-purpose expression indexes and so there must be at least one column referenced by an index.
Diffstat (limited to 'src')
-rw-r--r--src/backend/catalog/index.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 9464b9a1fad..073f06b064b 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.219.2.1 2005/06/25 16:54:12 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.219.2.2 2007/11/08 23:23:23 tgl Exp $
*
*
* INTERFACE ROUTINES
@@ -42,6 +42,7 @@
#include "miscadmin.h"
#include "optimizer/clauses.h"
#include "optimizer/prep.h"
+#include "optimizer/var.h"
#include "parser/parse_expr.h"
#include "parser/parse_func.h"
#include "storage/sinval.h"
@@ -661,6 +662,8 @@ index_create(Oid heapRelationId,
}
else
{
+ bool have_simple_col = false;
+
/* Create auto dependencies on simply-referenced columns */
for (i = 0; i < indexInfo->ii_NumIndexAttrs; i++)
{
@@ -671,8 +674,29 @@ index_create(Oid heapRelationId,
referenced.objectSubId = indexInfo->ii_KeyAttrNumbers[i];
recordDependencyOn(&myself, &referenced, DEPENDENCY_AUTO);
+
+ have_simple_col = true;
}
}
+
+ /*
+ * 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 (!have_simple_col &&
+ !contain_vars_of_level((Node *) indexInfo->ii_Expressions, 0) &&
+ !contain_vars_of_level((Node *) indexInfo->ii_Predicate, 0))
+ {
+ referenced.classId = RelOid_pg_class;
+ referenced.objectId = heapRelationId;
+ referenced.objectSubId = 0;
+
+ recordDependencyOn(&myself, &referenced, DEPENDENCY_AUTO);
+ }
}
/* Store dependency on operator classes */