diff options
author | Andres Freund <andres@anarazel.de> | 2019-04-04 17:17:50 -0700 |
---|---|---|
committer | Andres Freund <andres@anarazel.de> | 2019-04-04 17:39:39 -0700 |
commit | ea97e440b8570ffd1a6cd6604f2ef882c0a72291 (patch) | |
tree | 97a95c62374d8cfa6ff2a8f1e539faf5314464be /src/backend/commands/tablecmds.c | |
parent | 344b7e11bbaf5e11f2497b11405e63d190043cfe (diff) | |
download | postgresql-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.c | 17 |
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 |