diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2024-03-28 16:51:20 +0100 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2024-03-28 16:51:20 +0100 |
commit | e2395cdbe83adc50ac03dd17474ee88c5a97359a (patch) | |
tree | fac57f68f483ae308a03a7127693dca45d6c26ba /src/backend/commands | |
parent | be98a550cc81994959f19a117cb2732762df924c (diff) | |
download | postgresql-e2395cdbe83adc50ac03dd17474ee88c5a97359a.tar.gz postgresql-e2395cdbe83adc50ac03dd17474ee88c5a97359a.zip |
ALTER TABLE: rework determination of access method ID
Avoid setting an access method OID for relation kinds that don't take
one. Code review for new feature added in 374c7a229042.
Author: Justin Pryzby <pryzby@telsasoft.com>
Reported-by: Alexander Lakhin <exclusion@gmail.com>
Discussion: https://postgr.es/m/e5516ac1-5264-c3c0-d822-9e6f614ea93b@gmail.com
Diffstat (limited to 'src/backend/commands')
-rw-r--r-- | src/backend/commands/tablecmds.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 8a02c5b05b6..6741e721ae3 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -958,22 +958,26 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, } /* - * Select access method to use: an explicitly indicated one, or (in the - * case of a partitioned table) the parent's, if it has one. + * For relations with table AM and partitioned tables, select access + * method to use: an explicitly indicated one, or (in the case of a + * partitioned table) the parent's, if it has one. */ if (stmt->accessMethod != NULL) - accessMethodId = get_table_am_oid(stmt->accessMethod, false); - else if (stmt->partbound) { - Assert(list_length(inheritOids) == 1); - accessMethodId = get_rel_relam(linitial_oid(inheritOids)); + Assert(RELKIND_HAS_TABLE_AM(relkind) || relkind == RELKIND_PARTITIONED_TABLE); + accessMethodId = get_table_am_oid(stmt->accessMethod, false); } - else - accessMethodId = InvalidOid; + else if (RELKIND_HAS_TABLE_AM(relkind) || relkind == RELKIND_PARTITIONED_TABLE) + { + if (stmt->partbound) + { + Assert(list_length(inheritOids) == 1); + accessMethodId = get_rel_relam(linitial_oid(inheritOids)); + } - /* still nothing? use the default */ - if (RELKIND_HAS_TABLE_AM(relkind) && !OidIsValid(accessMethodId)) - accessMethodId = get_table_am_oid(default_table_access_method, false); + if (RELKIND_HAS_TABLE_AM(relkind) && !OidIsValid(accessMethodId)) + accessMethodId = get_table_am_oid(default_table_access_method, false); + } /* * Create the relation. Inherited defaults and constraints are passed in |