aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/tablecmds.c
diff options
context:
space:
mode:
authorAndres Freund <andres@anarazel.de>2019-04-04 17:17:50 -0700
committerAndres Freund <andres@anarazel.de>2019-04-04 17:39:39 -0700
commitea97e440b8570ffd1a6cd6604f2ef882c0a72291 (patch)
tree97a95c62374d8cfa6ff2a8f1e539faf5314464be /src/backend/commands/tablecmds.c
parent344b7e11bbaf5e11f2497b11405e63d190043cfe (diff)
downloadpostgresql-ea97e440b8570ffd1a6cd6604f2ef882c0a72291.tar.gz
postgresql-ea97e440b8570ffd1a6cd6604f2ef882c0a72291.zip
Harden tableam against nonexistant / wrong kind of AMs.
Previously it was allowed to set default_table_access_method to an empty string. That makes sense for default_tablespace, where that was copied from, as it signals falling back to the database's default tablespace. As there is no equivalent for table AMs, forbid that. Also make sure to throw a usable error when creating a table using an index AM, by using get_am_type_oid() to implement get_table_am_oid() instead of a separate copy. Previously we'd error out only later, in GetTableAmRoutine(). Thirdly remove GetTableAmRoutineByAmId() - it was only used in an earlier version of 8586bf7ed8. Add tests for the above (some for index AMs as well).
Diffstat (limited to 'src/backend/commands/tablecmds.c')
-rw-r--r--src/backend/commands/tablecmds.c17
1 files changed, 2 insertions, 15 deletions
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 58eb7e1d8e8..e842f9152b7 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -832,22 +832,9 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId,
relkind == RELKIND_MATVIEW)
accessMethod = default_table_access_method;
- /*
- * look up the access method, verify it can handle the requested features
- */
+ /* look up the access method, verify it is for a table */
if (accessMethod != NULL)
- {
- HeapTuple tuple;
-
- tuple = SearchSysCache1(AMNAME, PointerGetDatum(accessMethod));
- if (!HeapTupleIsValid(tuple))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("table access method \"%s\" does not exist",
- accessMethod)));
- accessMethodId = ((Form_pg_am) GETSTRUCT(tuple))->oid;
- ReleaseSysCache(tuple);
- }
+ accessMethodId = get_table_am_oid(accessMethod, false);
/*
* Create the relation. Inherited defaults and constraints are passed in