public inbox for [email protected]  
help / color / mirror / Atom feed
From: Dagfinn Ilmari MannsÃ¥ker <[email protected]>
To: Peter Eisentraut <[email protected]>
Cc: pgsql-hackers <[email protected]>
Subject: Re: generate syscache info automatically
Date: Wed, 31 May 2023 18:02:57 +0100
Message-ID: <[email protected]> (raw)
In-Reply-To: <[email protected]>
References: <[email protected]>

Peter Eisentraut <[email protected]> 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






view thread (4+ messages)  latest in thread

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: [email protected]
  Cc: [email protected], [email protected]
  Subject: Re: generate syscache info automatically
  In-Reply-To: <[email protected]>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox