Re: generate syscache info automatically

Поиск
Список
Период
Сортировка
От Dagfinn Ilmari Mannsåker
Тема Re: generate syscache info automatically
Дата
Msg-id 871qiwtovy.fsf@wibble.ilmari.org
обсуждение исходный текст
Ответ на generate syscache info automatically  (Peter Eisentraut <peter@eisentraut.org>)
Ответы Re: generate syscache info automatically  (Peter Eisentraut <peter@eisentraut.org>)
Список pgsql-hackers
Peter Eisentraut <peter@eisentraut.org> writes:

> The idea was mentioned in [0].  genbki.pl already knows everything about
> system catalog indexes.  If we add a "please also make a syscache for 
> this one" flag to the catalog metadata, we can have genbki.pl produce
> the tables in syscache.c and syscache.h automatically.

+1 on this worthwhile reduction of manual work.  Tangentially, it
reminded me of one of my least favourite parts of Catalog.pm, the
regexes in ParseHeader():


> diff --git a/src/backend/catalog/Catalog.pm b/src/backend/catalog/Catalog.pm
> index 84aaeb002a..a727d692b7 100644
> --- a/src/backend/catalog/Catalog.pm
> +++ b/src/backend/catalog/Catalog.pm
> @@ -110,7 +110,7 @@ sub ParseHeader
>                };
>          }
>          elsif (
> -            /^DECLARE_(UNIQUE_)?INDEX(_PKEY)?\(\s*(\w+),\s*(\d+),\s*(\w+),\s*(.+)\)/
> +            /^DECLARE_(UNIQUE_)?INDEX(_PKEY)?\(\s*(\w+),\s*(\d+),\s*(\w+),\s*(\w+),\s*(.+)\)/
>            )
>          {
>              push @{ $catalog{indexing} },
> @@ -120,7 +120,8 @@ sub ParseHeader
>                  index_name => $3,
>                  index_oid => $4,
>                  index_oid_macro => $5,
> -                index_decl => $6
> +                table_name => $6,
> +                index_decl => $7
>                };
>          }
>          elsif (/^DECLARE_OID_DEFINING_MACRO\(\s*(\w+),\s*(\d+)\)/)


Now that we require Perl 5.14, we could replace this parenthesis-
counting nightmare with named captures (introduced in Perl 5.10), which
would make the above change look like this instead (context expanded to
show the whole elsif block):

          elsif (
             /^DECLARE_(UNIQUE_)?INDEX(_PKEY)?\(\s*
              (?<index_name>\w+),\s*
              (?<index_oid>\d+),\s*
              (?<index_oid_macro>\w+),\s*
+             (?<table_name>\w+),\s*
              (?<index_decl>.+)
              \)/x
           )
         {
             push @{ $catalog{indexing} },
               {
                 is_unique => $1 ? 1 : 0,
                 is_pkey => $2 ? 1 : 0,
                 %+,
               };
         }

For other patterns without the optional bits in the keyword, it becomes
even simpler, e.g.

        if (/^DECLARE_TOAST\(\s*
             (?<parent_table>\w+),\s*
             (?<toast_oid>\d+),\s*
             (?<toast_index_oid>\d+)\s*
             \)/x
          )
        {
            push @{ $catalog{toasting} }, {%+};
           }


I'd be happy to submit a patch to do this for all the ParseHeader()
regexes (in a separate thread) if others agree this is an improvement.

- ilmari



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

Предыдущее
От: Tomas Vondra
Дата:
Сообщение: Re: Do we want a hashset type?
Следующее
От: Sandro Santilli
Дата:
Сообщение: Re: [PATCH] Support % wildcard in extension upgrade filenames