> @@ -947,20 +947,22 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid > ownerId, > * a type of relation that needs one, use the default. > */ > if (stmt->accessMethod != NULL) > + accessMethodId = get_table_am_oid(stmt->accessMethod, false); > + else if (RELKIND_HAS_TABLE_AM(relkind) || relkind == > RELKIND_PARTITIONED_TABLE) > { > - accessMethod = stmt->accessMethod; > - > - if (partitioned) > - ereport(ERROR, > - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), > - errmsg("specifying a table access > method is not supported on a partitioned table"))); > + if (stmt->partbound) > + { > + /* > + * For partitions, if no access method is specified, > use the AM of > + * the parent table. > + */ > + Assert(list_length(inheritOids) == 1); > + accessMethodId = > get_rel_relam(linitial_oid(inheritOids)); > + Assert(OidIsValid(accessMethodId)); > + } > + else > + accessMethodId = > get_table_am_oid(default_table_access_method, false); > }
I think this works similarly but not identically to tablespace defaults, and the difference could be confusing. You seem to have made it so that the partitioned table _always_ have a table AM, so the partitions can always inherit from it. I think it would be more sensible to _allow_ partitioned tables to have one, but not mandatory; if they don't have it, then a partition created from it would use default_table_access_method. -- Álvaro Herrera 48°01'N 7°57'E — https://www.EnterpriseDB.com/ Bob [Floyd] used to say that he was planning to get a Ph.D. by the "green stamp method," namely by saving envelopes addressed to him as 'Dr. Floyd'. After collecting 500 such letters, he mused, a university somewhere in Arizona would probably grant him a degree. (Don Knuth)