From 1a44e8a873c935a5dba67037608428840709ba42 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Mon, 12 Aug 2024 15:09:26 -0400
Subject: [PATCH v3 7/7] Remove ecpg's check_rules.pl.

As noted in a previous commit, check_rules.pl is now entirely
redundant with checks made by parse.pl, or would be if it weren't
for the places where it's wrong.  It's a waste of build cycles
and maintenance effort, so remove it.
---
 src/interfaces/ecpg/preproc/Makefile       |   3 +-
 src/interfaces/ecpg/preproc/check_rules.pl | 202 ---------------------
 src/interfaces/ecpg/preproc/meson.build    |  15 --
 3 files changed, 1 insertion(+), 219 deletions(-)
 delete mode 100644 src/interfaces/ecpg/preproc/check_rules.pl

diff --git a/src/interfaces/ecpg/preproc/Makefile b/src/interfaces/ecpg/preproc/Makefile
index 7866037cbb..4f403da935 100644
--- a/src/interfaces/ecpg/preproc/Makefile
+++ b/src/interfaces/ecpg/preproc/Makefile
@@ -65,8 +65,7 @@ preproc.h: preproc.c
 
 preproc.c: BISONFLAGS += -d
 
-preproc.y: ../../../backend/parser/gram.y parse.pl check_rules.pl ecpg.addons ecpg.header ecpg.tokens ecpg.trailer ecpg.type
-	$(PERL) $(srcdir)/check_rules.pl --srcdir $(srcdir) --parser $<
+preproc.y: ../../../backend/parser/gram.y parse.pl ecpg.addons ecpg.header ecpg.tokens ecpg.trailer ecpg.type
 	$(PERL) $(srcdir)/parse.pl --srcdir $(srcdir) --parser $< --output $@
 
 # generate keyword headers
diff --git a/src/interfaces/ecpg/preproc/check_rules.pl b/src/interfaces/ecpg/preproc/check_rules.pl
deleted file mode 100644
index 1ee1aed2f6..0000000000
--- a/src/interfaces/ecpg/preproc/check_rules.pl
+++ /dev/null
@@ -1,202 +0,0 @@
-#!/usr/bin/perl
-# src/interfaces/ecpg/preproc/check_rules.pl
-# test parser generator for ecpg
-# call with backend grammar as stdin
-#
-# Copyright (c) 2009-2024, PostgreSQL Global Development Group
-#
-# Written by Michael Meskes <meskes@postgresql.org>
-#            Andy Colson <andy@squeakycode.net>
-#
-# Placed under the same license as PostgreSQL.
-#
-# Command line:  [-v] [path only to ecpg.addons] [full filename of gram.y]
-#  -v enables verbose mode... show's some stats... thought it might be interesting
-#
-# This script loads rule names from gram.y and sets $found{rule} = 1 for each.
-# Then it checks to make sure each rule in ecpg.addons was found in gram.y
-
-use strict;
-use warnings FATAL => 'all';
-use Getopt::Long;
-
-my $srcdir = '.';
-my $parser = '../../../backend/parser/gram.y';
-my $stamp = '';
-my $verbose = 0;
-
-GetOptions(
-	'srcdir=s' => \$srcdir,
-	'parser=s' => \$parser,
-	'stamp=s' => \$stamp,
-	'verbose' => \$verbose,) or die "wrong arguments";
-
-my $filename = "$srcdir/ecpg.addons";
-if ($verbose)
-{
-	print "parser: $parser\n";
-	print "addons: $filename\n";
-}
-
-my %replace_line = (
-	'ExecuteStmtEXECUTEnameexecute_param_clause' =>
-	  'EXECUTE prepared_name execute_param_clause execute_rest',
-
-	'ExecuteStmtCREATEOptTempTABLEcreate_as_targetASEXECUTEnameexecute_param_clauseopt_with_data'
-	  => 'CREATE OptTemp TABLE create_as_target AS EXECUTE prepared_name execute_param_clause opt_with_data execute_rest',
-
-	'ExecuteStmtCREATEOptTempTABLEIF_PNOTEXISTScreate_as_targetASEXECUTEnameexecute_param_clauseopt_with_data'
-	  => 'CREATE OptTemp TABLE IF_P NOT EXISTS create_as_target AS EXECUTE prepared_name execute_param_clause opt_with_data execute_rest',
-
-	'PrepareStmtPREPAREnameprep_type_clauseASPreparableStmt' =>
-	  'PREPARE prepared_name prep_type_clause AS PreparableStmt');
-
-my $block = '';
-my $yaccmode = 0;
-my $in_rule = 0;
-my $brace_indent = 0;
-my (@arr, %found);
-my $comment = 0;
-my $non_term_id = '';
-my $cc = 0;
-
-open my $parser_fh, '<', $parser or die $!;
-while (<$parser_fh>)
-{
-	if (/^%%/)
-	{
-		$yaccmode++;
-	}
-
-	if ($yaccmode != 1)
-	{
-		next;
-	}
-
-	chomp;    # strip record separator
-
-	next if ($_ eq '');
-
-	# Make sure any braces are split
-	s/{/ { /g;
-	s/}/ } /g;
-
-	# Any comments are split
-	s|\/\*| /* |g;
-	s|\*\/| */ |g;
-
-	# Now split the line into individual fields
-	my $n = (@arr = split(' '));
-
-	# Go through each field in turn
-	for (my $fieldIndexer = 0; $fieldIndexer < $n; $fieldIndexer++)
-	{
-		if ($arr[$fieldIndexer] eq '*/' && $comment)
-		{
-			$comment = 0;
-			next;
-		}
-		elsif ($comment)
-		{
-			next;
-		}
-		elsif ($arr[$fieldIndexer] eq '/*')
-		{
-
-			# start of a multiline comment
-			$comment = 1;
-			next;
-		}
-		elsif ($arr[$fieldIndexer] eq '//')
-		{
-			next;
-		}
-		elsif ($arr[$fieldIndexer] eq '}')
-		{
-			$brace_indent--;
-			next;
-		}
-		elsif ($arr[$fieldIndexer] eq '{')
-		{
-			$brace_indent++;
-			next;
-		}
-
-		if ($brace_indent > 0)
-		{
-			next;
-		}
-
-		if ($arr[$fieldIndexer] eq ';' || $arr[$fieldIndexer] eq '|')
-		{
-			$block = $non_term_id . $block;
-			if ($replace_line{$block})
-			{
-				$block = $non_term_id . $replace_line{$block};
-				$block =~ tr/ |//d;
-			}
-			$found{$block} = 1;
-			$cc++;
-			$block = '';
-			$in_rule = 0 if $arr[$fieldIndexer] eq ';';
-		}
-		elsif (
-			($arr[$fieldIndexer] =~ '[A-Za-z0-9]+:')
-			|| (   $fieldIndexer + 1 < $n
-				&& $arr[ $fieldIndexer + 1 ] eq ':'))
-		{
-			die "unterminated rule at grammar line $.\n"
-			  if $in_rule;
-			$in_rule = 1;
-			$non_term_id = $arr[$fieldIndexer];
-			$non_term_id =~ tr/://d;
-		}
-		else
-		{
-			$block = $block . $arr[$fieldIndexer];
-		}
-	}
-}
-
-die "unterminated rule at end of grammar\n"
-  if $in_rule;
-
-close $parser_fh;
-if ($verbose)
-{
-	print "$cc rules loaded\n";
-}
-
-my $ret = 0;
-$cc = 0;
-
-open my $ecpg_fh, '<', $filename or die $!;
-while (<$ecpg_fh>)
-{
-	if (!/^ECPG:/)
-	{
-		next;
-	}
-
-	my @Fld = split(' ', $_, 3);
-	$cc++;
-	if (not exists $found{ $Fld[1] })
-	{
-		print $Fld[1], " is not used for building parser!\n";
-		$ret = 1;
-	}
-}
-close $ecpg_fh;
-
-if ($verbose)
-{
-	print "$cc rules checked\n";
-}
-
-if ($stamp)
-{
-	open my $stampfh, '>', $stamp or die $!;
-	close $stampfh;
-}
-
-exit $ret;
diff --git a/src/interfaces/ecpg/preproc/meson.build b/src/interfaces/ecpg/preproc/meson.build
index f680e5d59e..2fb1402c70 100644
--- a/src/interfaces/ecpg/preproc/meson.build
+++ b/src/interfaces/ecpg/preproc/meson.build
@@ -45,20 +45,6 @@ preproc_y = custom_target('preproc.y',
 )
 generated_sources += preproc_y
 
-check_rules = custom_target('preproc.y.check_rules',
-  input: [
-    '../../../backend/parser/gram.y',
-    ecpg_files,
-  ],
-  output: 'preproc.y.check_rules',
-  command: [
-    perl, files('check_rules.pl'),
-    '--srcdir', '@CURRENT_SOURCE_DIR@',
-    '--parser', '@INPUT0@',
-    '--stamp', '@OUTPUT0@',
-  ],
-)
-
 preproc = custom_target('preproc.c',
   input: preproc_y,
   kwargs: bison_kw,
@@ -69,7 +55,6 @@ ecpg_sources += preproc
 c_kwlist = custom_target('c_kwlist_d.h',
   input: ['c_kwlist.h'],
   output: ['c_kwlist_d.h'],
-  depends: check_rules,
   depend_files: gen_kwlist_deps,
   command: [gen_kwlist_cmd, '--varname', 'ScanCKeywords', '--no-case-fold'],
 )
-- 
2.43.5

