1
0
mirror of https://github.com/postgres/postgres.git synced 2025-05-01 01:04:50 +03:00

Remove pg_authid's TOAST table.

pg_authid's only varlena column is rolpassword, which unfortunately
cannot be de-TOASTed during authentication because we haven't
selected a database yet and cannot read pg_class.  By removing
pg_authid's TOAST table, attempts to set password hashes that
require out-of-line storage will fail with a "row is too big"
error instead.  We may want to provide a more user-friendly error
in the future, but for now let's just remove the useless TOAST
table.

Bumps catversion.

Reported-by: Alexander Lakhin
Reviewed-by: Tom Lane, Michael Paquier
Discussion: https://postgr.es/m/89e8649c-eb74-db25-7945-6d6b23992394%40gmail.com
This commit is contained in:
Nathan Bossart 2024-09-21 15:17:46 -05:00
parent c4d5cb71d2
commit 6aa44060a3
9 changed files with 30 additions and 29 deletions

View File

@ -300,9 +300,7 @@ IsSharedRelation(Oid relationId)
relationId == TablespaceOidIndexId) relationId == TablespaceOidIndexId)
return true; return true;
/* These are their toast tables and toast indexes */ /* These are their toast tables and toast indexes */
if (relationId == PgAuthidToastTable || if (relationId == PgDatabaseToastTable ||
relationId == PgAuthidToastIndex ||
relationId == PgDatabaseToastTable ||
relationId == PgDatabaseToastIndex || relationId == PgDatabaseToastIndex ||
relationId == PgDbRoleSettingToastTable || relationId == PgDbRoleSettingToastTable ||
relationId == PgDbRoleSettingToastIndex || relationId == PgDbRoleSettingToastIndex ||

View File

@ -57,6 +57,6 @@
*/ */
/* yyyymmddN */ /* yyyymmddN */
#define CATALOG_VERSION_NO 202409182 #define CATALOG_VERSION_NO 202409211
#endif #endif

View File

@ -55,8 +55,6 @@ CATALOG(pg_authid,1260,AuthIdRelationId) BKI_SHARED_RELATION BKI_ROWTYPE_OID(284
*/ */
typedef FormData_pg_authid *Form_pg_authid; typedef FormData_pg_authid *Form_pg_authid;
DECLARE_TOAST_WITH_MACRO(pg_authid, 4175, 4176, PgAuthidToastTable, PgAuthidToastIndex);
DECLARE_UNIQUE_INDEX(pg_authid_rolname_index, 2676, AuthIdRolnameIndexId, pg_authid, btree(rolname name_ops)); DECLARE_UNIQUE_INDEX(pg_authid_rolname_index, 2676, AuthIdRolnameIndexId, pg_authid, btree(rolname name_ops));
DECLARE_UNIQUE_INDEX_PKEY(pg_authid_oid_index, 2677, AuthIdOidIndexId, pg_authid, btree(oid oid_ops)); DECLARE_UNIQUE_INDEX_PKEY(pg_authid_oid_index, 2677, AuthIdOidIndexId, pg_authid, btree(oid oid_ops));

View File

@ -2664,10 +2664,10 @@ REINDEX TABLE CONCURRENTLY pg_class; -- no catalog relation
ERROR: cannot reindex system catalogs concurrently ERROR: cannot reindex system catalogs concurrently
REINDEX INDEX CONCURRENTLY pg_class_oid_index; -- no catalog index REINDEX INDEX CONCURRENTLY pg_class_oid_index; -- no catalog index
ERROR: cannot reindex system catalogs concurrently ERROR: cannot reindex system catalogs concurrently
-- These are the toast table and index of pg_authid. -- These are the toast table and index of pg_database.
REINDEX TABLE CONCURRENTLY pg_toast.pg_toast_1260; -- no catalog toast table REINDEX TABLE CONCURRENTLY pg_toast.pg_toast_1262; -- no catalog toast table
ERROR: cannot reindex system catalogs concurrently ERROR: cannot reindex system catalogs concurrently
REINDEX INDEX CONCURRENTLY pg_toast.pg_toast_1260_index; -- no catalog toast index REINDEX INDEX CONCURRENTLY pg_toast.pg_toast_1262_index; -- no catalog toast index
ERROR: cannot reindex system catalogs concurrently ERROR: cannot reindex system catalogs concurrently
REINDEX SYSTEM CONCURRENTLY postgres; -- not allowed for SYSTEM REINDEX SYSTEM CONCURRENTLY postgres; -- not allowed for SYSTEM
ERROR: cannot reindex system catalogs concurrently ERROR: cannot reindex system catalogs concurrently
@ -2974,10 +2974,10 @@ ERROR: must be owner of schema schema_to_reindex
RESET ROLE; RESET ROLE;
GRANT USAGE ON SCHEMA pg_toast TO regress_reindexuser; GRANT USAGE ON SCHEMA pg_toast TO regress_reindexuser;
SET SESSION ROLE regress_reindexuser; SET SESSION ROLE regress_reindexuser;
REINDEX TABLE pg_toast.pg_toast_1260; REINDEX TABLE pg_toast.pg_toast_1262;
ERROR: permission denied for table pg_toast_1260 ERROR: permission denied for table pg_toast_1262
REINDEX INDEX pg_toast.pg_toast_1260_index; REINDEX INDEX pg_toast.pg_toast_1262_index;
ERROR: permission denied for index pg_toast_1260_index ERROR: permission denied for index pg_toast_1262_index
-- Clean up -- Clean up
RESET ROLE; RESET ROLE;
REVOKE USAGE ON SCHEMA pg_toast FROM regress_reindexuser; REVOKE USAGE ON SCHEMA pg_toast FROM regress_reindexuser;

View File

@ -40,6 +40,8 @@ WHERE refclassid = 0 OR refobjid = 0 OR
-- 2. pg_largeobject and pg_largeobject_metadata. Large object catalogs -- 2. pg_largeobject and pg_largeobject_metadata. Large object catalogs
-- and toast tables are mutually exclusive and large object data is handled -- and toast tables are mutually exclusive and large object data is handled
-- as user data by pg_upgrade, which would cause failures. -- as user data by pg_upgrade, which would cause failures.
-- 3. pg_authid, since its toast table cannot be accessed when it would be
-- needed, i.e., during authentication before we've selected a database.
SELECT relname, attname, atttypid::regtype SELECT relname, attname, atttypid::regtype
FROM pg_class c JOIN pg_attribute a ON c.oid = attrelid FROM pg_class c JOIN pg_attribute a ON c.oid = attrelid
WHERE c.oid < 16384 AND WHERE c.oid < 16384 AND
@ -53,12 +55,13 @@ ORDER BY 1, 2;
pg_attribute | attfdwoptions | text[] pg_attribute | attfdwoptions | text[]
pg_attribute | attmissingval | anyarray pg_attribute | attmissingval | anyarray
pg_attribute | attoptions | text[] pg_attribute | attoptions | text[]
pg_authid | rolpassword | text
pg_class | relacl | aclitem[] pg_class | relacl | aclitem[]
pg_class | reloptions | text[] pg_class | reloptions | text[]
pg_class | relpartbound | pg_node_tree pg_class | relpartbound | pg_node_tree
pg_largeobject | data | bytea pg_largeobject | data | bytea
pg_largeobject_metadata | lomacl | aclitem[] pg_largeobject_metadata | lomacl | aclitem[]
(9 rows) (10 rows)
-- system catalogs without primary keys -- system catalogs without primary keys
-- --

View File

@ -51,13 +51,13 @@ ERROR: cannot move system relation "pg_authid_rolname_index"
REINDEX (TABLESPACE regress_tblspace) TABLE CONCURRENTLY pg_authid; REINDEX (TABLESPACE regress_tblspace) TABLE CONCURRENTLY pg_authid;
ERROR: cannot reindex system catalogs concurrently ERROR: cannot reindex system catalogs concurrently
-- toast relations, fail -- toast relations, fail
REINDEX (TABLESPACE regress_tblspace) INDEX pg_toast.pg_toast_1260_index; REINDEX (TABLESPACE regress_tblspace) INDEX pg_toast.pg_toast_1262_index;
ERROR: cannot move system relation "pg_toast_1260_index" ERROR: cannot move system relation "pg_toast_1262_index"
REINDEX (TABLESPACE regress_tblspace) INDEX CONCURRENTLY pg_toast.pg_toast_1260_index; REINDEX (TABLESPACE regress_tblspace) INDEX CONCURRENTLY pg_toast.pg_toast_1262_index;
ERROR: cannot reindex system catalogs concurrently ERROR: cannot reindex system catalogs concurrently
REINDEX (TABLESPACE regress_tblspace) TABLE pg_toast.pg_toast_1260; REINDEX (TABLESPACE regress_tblspace) TABLE pg_toast.pg_toast_1262;
ERROR: cannot move system relation "pg_toast_1260_index" ERROR: cannot move system relation "pg_toast_1262_index"
REINDEX (TABLESPACE regress_tblspace) TABLE CONCURRENTLY pg_toast.pg_toast_1260; REINDEX (TABLESPACE regress_tblspace) TABLE CONCURRENTLY pg_toast.pg_toast_1262;
ERROR: cannot reindex system catalogs concurrently ERROR: cannot reindex system catalogs concurrently
-- system catalog, fail -- system catalog, fail
REINDEX (TABLESPACE pg_global) TABLE pg_authid; REINDEX (TABLESPACE pg_global) TABLE pg_authid;

View File

@ -1126,9 +1126,9 @@ REINDEX TABLE CONCURRENTLY concur_reindex_tab;
COMMIT; COMMIT;
REINDEX TABLE CONCURRENTLY pg_class; -- no catalog relation REINDEX TABLE CONCURRENTLY pg_class; -- no catalog relation
REINDEX INDEX CONCURRENTLY pg_class_oid_index; -- no catalog index REINDEX INDEX CONCURRENTLY pg_class_oid_index; -- no catalog index
-- These are the toast table and index of pg_authid. -- These are the toast table and index of pg_database.
REINDEX TABLE CONCURRENTLY pg_toast.pg_toast_1260; -- no catalog toast table REINDEX TABLE CONCURRENTLY pg_toast.pg_toast_1262; -- no catalog toast table
REINDEX INDEX CONCURRENTLY pg_toast.pg_toast_1260_index; -- no catalog toast index REINDEX INDEX CONCURRENTLY pg_toast.pg_toast_1262_index; -- no catalog toast index
REINDEX SYSTEM CONCURRENTLY postgres; -- not allowed for SYSTEM REINDEX SYSTEM CONCURRENTLY postgres; -- not allowed for SYSTEM
REINDEX (CONCURRENTLY) SYSTEM postgres; -- ditto REINDEX (CONCURRENTLY) SYSTEM postgres; -- ditto
REINDEX (CONCURRENTLY) SYSTEM; -- ditto REINDEX (CONCURRENTLY) SYSTEM; -- ditto
@ -1305,8 +1305,8 @@ REINDEX SCHEMA schema_to_reindex;
RESET ROLE; RESET ROLE;
GRANT USAGE ON SCHEMA pg_toast TO regress_reindexuser; GRANT USAGE ON SCHEMA pg_toast TO regress_reindexuser;
SET SESSION ROLE regress_reindexuser; SET SESSION ROLE regress_reindexuser;
REINDEX TABLE pg_toast.pg_toast_1260; REINDEX TABLE pg_toast.pg_toast_1262;
REINDEX INDEX pg_toast.pg_toast_1260_index; REINDEX INDEX pg_toast.pg_toast_1262_index;
-- Clean up -- Clean up
RESET ROLE; RESET ROLE;

View File

@ -43,6 +43,8 @@ WHERE refclassid = 0 OR refobjid = 0 OR
-- 2. pg_largeobject and pg_largeobject_metadata. Large object catalogs -- 2. pg_largeobject and pg_largeobject_metadata. Large object catalogs
-- and toast tables are mutually exclusive and large object data is handled -- and toast tables are mutually exclusive and large object data is handled
-- as user data by pg_upgrade, which would cause failures. -- as user data by pg_upgrade, which would cause failures.
-- 3. pg_authid, since its toast table cannot be accessed when it would be
-- needed, i.e., during authentication before we've selected a database.
SELECT relname, attname, atttypid::regtype SELECT relname, attname, atttypid::regtype
FROM pg_class c JOIN pg_attribute a ON c.oid = attrelid FROM pg_class c JOIN pg_attribute a ON c.oid = attrelid

View File

@ -40,10 +40,10 @@ REINDEX (TABLESPACE regress_tblspace) TABLE CONCURRENTLY pg_am;
REINDEX (TABLESPACE regress_tblspace) TABLE pg_authid; REINDEX (TABLESPACE regress_tblspace) TABLE pg_authid;
REINDEX (TABLESPACE regress_tblspace) TABLE CONCURRENTLY pg_authid; REINDEX (TABLESPACE regress_tblspace) TABLE CONCURRENTLY pg_authid;
-- toast relations, fail -- toast relations, fail
REINDEX (TABLESPACE regress_tblspace) INDEX pg_toast.pg_toast_1260_index; REINDEX (TABLESPACE regress_tblspace) INDEX pg_toast.pg_toast_1262_index;
REINDEX (TABLESPACE regress_tblspace) INDEX CONCURRENTLY pg_toast.pg_toast_1260_index; REINDEX (TABLESPACE regress_tblspace) INDEX CONCURRENTLY pg_toast.pg_toast_1262_index;
REINDEX (TABLESPACE regress_tblspace) TABLE pg_toast.pg_toast_1260; REINDEX (TABLESPACE regress_tblspace) TABLE pg_toast.pg_toast_1262;
REINDEX (TABLESPACE regress_tblspace) TABLE CONCURRENTLY pg_toast.pg_toast_1260; REINDEX (TABLESPACE regress_tblspace) TABLE CONCURRENTLY pg_toast.pg_toast_1262;
-- system catalog, fail -- system catalog, fail
REINDEX (TABLESPACE pg_global) TABLE pg_authid; REINDEX (TABLESPACE pg_global) TABLE pg_authid;
REINDEX (TABLESPACE pg_global) TABLE CONCURRENTLY pg_authid; REINDEX (TABLESPACE pg_global) TABLE CONCURRENTLY pg_authid;