Remove old RULE privilege completely.
[pgsql.git] / doc / src / sgml / generate-keywords-table.pl
blob891d7811a866cc8c5a46c0140895191d63632fe6
1 #!/usr/bin/perl
3 # Generate the keywords table for the documentation's SQL Key Words appendix
5 # Copyright (c) 2019-2024, PostgreSQL Global Development Group
7 use strict;
8 use warnings FATAL => 'all';
10 my @sql_versions = reverse sort ('1992', '2016', '2023');
12 my $srcdir = $ARGV[0];
14 my %keywords;
15 my %as_keywords;
17 # read SQL-spec keywords
19 foreach my $ver (@sql_versions)
21 foreach my $res ('reserved', 'nonreserved')
23 foreach my $file (glob "$srcdir/keywords/sql${ver}*-${res}.txt")
25 open my $fh, '<', $file or die;
27 while (<$fh>)
29 chomp;
30 $keywords{$_}{$ver}{$res} = 1;
33 close $fh;
38 # read PostgreSQL keywords
40 open my $fh, '<', "$srcdir/../../../src/include/parser/kwlist.h" or die;
42 while (<$fh>)
44 if (/^PG_KEYWORD\("(\w+)", \w+, (\w+)_KEYWORD\, (\w+)\)/)
46 $keywords{ uc $1 }{'pg'}{ lc $2 } = 1;
47 $as_keywords{ uc $1 } = 1 if $3 eq 'AS_LABEL';
51 close $fh;
53 # print output
55 print "<!-- autogenerated, do not edit -->\n";
57 print <<END;
58 <table id="keywords-table">
59 <title><acronym>SQL</acronym> Key Words</title>
61 <tgroup cols="5">
62 <colspec colname="col1" colwidth="5*"/>
63 <colspec colname="col2" colwidth="3*"/>
64 <colspec colname="col3" colwidth="2*"/>
65 <colspec colname="col4" colwidth="2*"/>
66 <colspec colname="col5" colwidth="2*"/>
67 <thead>
68 <row>
69 <entry>Key Word</entry>
70 <entry><productname>PostgreSQL</productname></entry>
71 END
73 foreach my $ver (@sql_versions)
75 my $s = ($ver eq '1992' ? 'SQL-92' : "SQL:$ver");
76 print " <entry>$s</entry>\n";
79 print <<END;
80 </row>
81 </thead>
83 <tbody>
84 END
86 foreach my $word (sort keys %keywords)
88 # Insert zwsp's into very long keywords, so that they can be broken
89 # into multiple lines in PDF format (or narrow HTML windows).
90 my $printword = $word;
91 $printword =~ s/_/_&zwsp;/g if (length($printword) > 20);
93 print " <row>\n";
94 print " <entry><token>$printword</token></entry>\n";
96 print " <entry>";
97 if ($keywords{$word}{pg}{'unreserved'})
99 print "non-reserved";
101 elsif ($keywords{$word}{pg}{'col_name'})
103 print "non-reserved (cannot be function or type)";
105 elsif ($keywords{$word}{pg}{'type_func_name'})
107 print "reserved (can be function or type)";
109 elsif ($keywords{$word}{pg}{'reserved'})
111 print "reserved";
113 if ($as_keywords{$word})
115 print ", requires <literal>AS</literal>";
117 print "</entry>\n";
119 foreach my $ver (@sql_versions)
121 print " <entry>";
122 if ($keywords{$word}{$ver}{'reserved'})
124 print "reserved";
126 elsif ($keywords{$word}{$ver}{'nonreserved'})
128 print "non-reserved";
130 print "</entry>\n";
132 print " </row>\n";
135 print <<END;
136 </tbody>
137 </tgroup>
138 </table>