<para>
Adding a column with a non-null default or changing the type of an
existing column will require the entire table and indexes to be rewritten.
- As an exception, if the old type type is binary coercible to the new
- type and the <literal>USING</> clause does not change the column contents,
- a table rewrite is not needed, but any indexes on the affected columns
- must still be rebuilt. Adding or removing a system <literal>oid</> column
- also requires rewriting the entire table. Table and/or index rebuilds may
- take a significant amount of time for a large table; and will temporarily
- require as much as double the disk space.
+ As an exception, if the <literal>USING</> clause does not change the column
+ contents and the old type is either binary coercible to the new type or
+ an unconstrained domain over the new type, a table rewrite is not needed,
+ but any indexes on the affected columns must still be rebuilt. Adding or
+ removing a system <literal>oid</> column also requires rewriting the entire
+ table. Table and/or index rebuilds may take a significant amount of time
+ for a large table; and will temporarily require as much as double the disk
+ space.
</para>
<para>
}
/*
- * When the data type of a column is changed, a rewrite might not be require
- * if the data type is being changed to its current type, or more interestingly
- * to a type to which it is binary coercible. But we must check carefully that
- * the USING clause isn't trying to insert some other value.
+ * When the data type of a column is changed, a rewrite might not be required
+ * if the new type is sufficiently identical to the old one, and the USING
+ * clause isn't trying to insert some other value. It's safe to skip the
+ * rewrite if the old type is binary coercible to the new type, or if the
+ * new type is an unconstrained domain over the old type. In the case of a
+ * constrained domain, we could get by with scanning the table and checking
+ * the constraint rather than actually rewriting it, but we don't currently
+ * try to do that.
*/
static bool
ATColumnChangeRequiresRewrite(Node *expr, AttrNumber varattno)
return false;
else if (IsA(expr, RelabelType))
expr = (Node *) ((RelabelType *) expr)->arg;
+ else if (IsA(expr, CoerceToDomain))
+ {
+ CoerceToDomain *d = (CoerceToDomain *) expr;
+
+ if (GetDomainConstraints(d->resulttype) != NIL)
+ return true;
+ expr = (Node *) d->arg;
+ }
else
return true;
}