diff options
-rw-r--r-- | src/backend/catalog/toasting.c | 42 |
1 files changed, 26 insertions, 16 deletions
diff --git a/src/backend/catalog/toasting.c b/src/backend/catalog/toasting.c index f3306130cdf..2276d3c5d36 100644 --- a/src/backend/catalog/toasting.c +++ b/src/backend/catalog/toasting.c @@ -18,6 +18,7 @@ #include "access/tuptoaster.h" #include "access/xact.h" #include "catalog/binary_upgrade.h" +#include "catalog/catalog.h" #include "catalog/dependency.h" #include "catalog/heap.h" #include "catalog/index.h" @@ -147,21 +148,6 @@ create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid, toastobject; /* - * Toast table is shared if and only if its parent is. - * - * We cannot allow toasting a shared relation after initdb (because - * there's no way to mark it toasted in other databases' pg_class). - */ - shared_relation = rel->rd_rel->relisshared; - if (shared_relation && !IsBootstrapProcessingMode()) - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("shared tables cannot be toasted after initdb"))); - - /* It's mapped if and only if its parent is, too */ - mapped_relation = RelationIsMapped(rel); - - /* * Is it already toasted? */ if (rel->rd_rel->reltoastrelid != InvalidOid) @@ -260,6 +246,12 @@ create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid, binary_upgrade_next_toast_pg_type_oid = InvalidOid; } + /* Toast table is shared if and only if its parent is. */ + shared_relation = rel->rd_rel->relisshared; + + /* It's mapped if and only if its parent is, too */ + mapped_relation = RelationIsMapped(rel); + toast_relid = heap_create_with_catalog(toast_relname, namespaceid, rel->rd_rel->reltablespace, @@ -398,7 +390,6 @@ create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid, * (1) there are any toastable attributes, and (2) the maximum length * of a tuple could exceed TOAST_TUPLE_THRESHOLD. (We don't want to * create a toast table for something like "f1 varchar(20)".) - * No need to create a TOAST table for partitioned tables. */ static bool needs_toast_table(Relation rel) @@ -410,9 +401,28 @@ needs_toast_table(Relation rel) int32 tuple_length; int i; + /* + * No need to create a TOAST table for partitioned tables. + */ if (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) return false; + /* + * We cannot allow toasting a shared relation after initdb (because + * there's no way to mark it toasted in other databases' pg_class). + */ + if (rel->rd_rel->relisshared && !IsBootstrapProcessingMode()) + return false; + + /* + * Ignore attempts to create toast tables on catalog tables after initdb. + * Which catalogs get toast tables is explicitly chosen in + * catalog/toasting.h. (We could get here via some ALTER TABLE command if + * the catalog doesn't have a toast table.) + */ + if (IsCatalogRelation(rel) && !IsBootstrapProcessingMode()) + return false; + tupdesc = rel->rd_att; for (i = 0; i < tupdesc->natts; i++) |