Re: [bug] Table not have typarray when created by single user mode

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: [bug] Table not have typarray when created by single user mode
Дата
Msg-id 684587.1593622039@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Re: [bug] Table not have typarray when created by single user mode  (shawn wang <shawn.wang.pg@gmail.com>)
Ответы Re: [bug] Table not have typarray when created by single user mode  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-bugs
I poked at this patch a bit, and was reminded of the real reason why
we'd skipped making these array types in the first place: it bloats
pg_type noticeably.  As of HEAD, a freshly initialized database has
411 rows in pg_type.  As written this patch results in 543 entries,
or a 32% increase.  That seems like kind of a lot.  On the other hand,
in the big scheme of things maybe it's negligible.  pg_type is still
far from the largest catalog:

postgres=# select relname, relpages from pg_class order by 2 desc;
                    relname                    | relpages
-----------------------------------------------+----------
 pg_proc                                       |       81
 pg_toast_2618                                 |       60
 pg_depend                                     |       59
 pg_attribute                                  |       53
 pg_depend_reference_index                     |       44
 pg_description                                |       36
 pg_depend_depender_index                      |       35
 pg_collation                                  |       32
 pg_proc_proname_args_nsp_index                |       32
 pg_description_o_c_o_index                    |       21
 pg_statistic                                  |       19
 pg_attribute_relid_attnam_index               |       15
 pg_operator                                   |       14
 pg_type                                       |       14  <--- up from 10
 pg_class                                      |       13
 pg_rewrite                                    |       12
 pg_proc_oid_index                             |       11
 ...

However, if we're going to go this far, I think there's a good
case to be made for going all the way and eliminating the policy
of not making array types for system catalogs.  That was never
anything but a wart justified by space savings in pg_type, and
this patch already kills most of the space savings.  If we
drop the system-state test in heap_create_with_catalog altogether,
we end up with 601 initial pg_type entries.  That still leaves
the four bootstrap catalogs without array types, because they are
not created by heap_create_with_catalog; but we can manually add
those too for a total of 605 initial entries.  (That brings initial
pg_type to 14 pages as I show above; I think it was 13 with the
original version of the patch.)

In short, if we're gonna do this, I think we should do it like
the attached.  Or we could do nothing, but there is some appeal
to removing this old inconsistency.

            regards, tom lane

diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index d279842d3c..fd04e82b20 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -1262,17 +1262,14 @@ heap_create_with_catalog(const char *relname,
     new_rel_desc->rd_rel->relrewrite = relrewrite;
 
     /*
-     * Decide whether to create an array type over the relation's rowtype. We
-     * do not create any array types for system catalogs (ie, those made
-     * during initdb). We do not create them where the use of a relation as
-     * such is an implementation detail: toast tables, sequences and indexes.
-     */
-    if (IsUnderPostmaster && (relkind == RELKIND_RELATION ||
-                              relkind == RELKIND_VIEW ||
-                              relkind == RELKIND_MATVIEW ||
-                              relkind == RELKIND_FOREIGN_TABLE ||
-                              relkind == RELKIND_COMPOSITE_TYPE ||
-                              relkind == RELKIND_PARTITIONED_TABLE))
+     * Decide whether to create an array type over the relation's rowtype.
+     * Array types are made except where the use of a relation as such is an
+     * implementation detail: toast tables, sequences and indexes.
+     */
+    if (!(relkind == RELKIND_SEQUENCE ||
+          relkind == RELKIND_TOASTVALUE ||
+          relkind == RELKIND_INDEX ||
+          relkind == RELKIND_PARTITIONED_INDEX))
         new_array_oid = AssignTypeArrayOid();
 
     /*
diff --git a/src/include/catalog/pg_type.dat b/src/include/catalog/pg_type.dat
index e8be000835..b2cec07416 100644
--- a/src/include/catalog/pg_type.dat
+++ b/src/include/catalog/pg_type.dat
@@ -113,22 +113,22 @@
 
 # hand-built rowtype entries for bootstrapped catalogs
 # NB: OIDs assigned here must match the BKI_ROWTYPE_OID declarations
-{ oid => '71',
+{ oid => '71', array_type_oid => '210',
   typname => 'pg_type', typlen => '-1', typbyval => 'f', typtype => 'c',
   typcategory => 'C', typrelid => 'pg_type', typinput => 'record_in',
   typoutput => 'record_out', typreceive => 'record_recv',
   typsend => 'record_send', typalign => 'd', typstorage => 'x' },
-{ oid => '75',
+{ oid => '75', array_type_oid => '270',
   typname => 'pg_attribute', typlen => '-1', typbyval => 'f', typtype => 'c',
   typcategory => 'C', typrelid => 'pg_attribute', typinput => 'record_in',
   typoutput => 'record_out', typreceive => 'record_recv',
   typsend => 'record_send', typalign => 'd', typstorage => 'x' },
-{ oid => '81',
+{ oid => '81', array_type_oid => '272',
   typname => 'pg_proc', typlen => '-1', typbyval => 'f', typtype => 'c',
   typcategory => 'C', typrelid => 'pg_proc', typinput => 'record_in',
   typoutput => 'record_out', typreceive => 'record_recv',
   typsend => 'record_send', typalign => 'd', typstorage => 'x' },
-{ oid => '83',
+{ oid => '83', array_type_oid => '273',
   typname => 'pg_class', typlen => '-1', typbyval => 'f', typtype => 'c',
   typcategory => 'C', typrelid => 'pg_class', typinput => 'record_in',
   typoutput => 'record_out', typreceive => 'record_recv',

В списке pgsql-bugs по дате отправления:

Предыдущее
От: Dmitry Dolgov
Дата:
Сообщение: Re: BUG #16500: SQL Abend. select multi_key_columns_range_partition_table
Следующее
От: Klaudie Willis
Дата:
Сообщение: Re: BUG #16521: n_distinct_inherited does not affect child partitions when set on main partition