*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.105 2003/02/09 06:56:26 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.106 2003/03/03 04:37:37 tgl Exp $
*
*-------------------------------------------------------------------------
*/
stmt->indexname, stmt->relation->relname);
}
+ /* All other checks are done in cluster_rel() */
rvtc.tableOid = tableOid;
rvtc.indexOid = indexOid;
RelationGetRelationName(OldIndex),
RelationGetRelationName(OldHeap));
+ /*
+ * Disallow clustering on incomplete indexes (those that might not index
+ * every row of the relation). We could relax this by making a separate
+ * seqscan pass over the table to copy the missing rows, but that seems
+ * expensive and tedious.
+ */
+ if (VARSIZE(&OldIndex->rd_index->indpred) > VARHDRSZ) /* partial? */
+ elog(ERROR, "CLUSTER: cannot cluster on partial index");
+ if (!OldIndex->rd_am->amindexnulls)
+ {
+ AttrNumber colno;
+
+ /*
+ * If the AM doesn't index nulls, then it's a partial index unless
+ * we can prove all the rows are non-null. Note we only need look
+ * at the first column; multicolumn-capable AMs are *required* to
+ * index nulls in columns after the first.
+ */
+ if (OidIsValid(OldIndex->rd_index->indproc))
+ elog(ERROR, "CLUSTER: cannot cluster on functional index when index access method does not handle nulls");
+ colno = OldIndex->rd_index->indkey[0];
+ if (colno > 0) /* system columns are non-null */
+ if (!OldHeap->rd_att->attrs[colno - 1]->attnotnull)
+ elog(ERROR, "CLUSTER: cannot cluster when index access method does not handle nulls"
+ "\n\tYou may be able to work around this by marking column \"%s\" NOT NULL",
+ NameStr(OldHeap->rd_att->attrs[colno - 1]->attname));
+ }
+
/*
* Disallow clustering system relations. This will definitely NOT
* work for shared relations (we have no way to update pg_class rows