3 # Generate the keywords table for the documentation's SQL Key Words appendix
5 # Copyright (c) 2019-2024, PostgreSQL Global Development Group
8 use warnings FATAL
=> 'all';
10 my @sql_versions = reverse sort ('1992', '2016', '2023');
12 my $srcdir = $ARGV[0];
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;
30 $keywords{$_}{$ver}{$res} = 1;
38 # read PostgreSQL keywords
40 open my $fh, '<', "$srcdir/../../../src/include/parser/kwlist.h" or die;
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';
55 print "<!-- autogenerated, do not edit -->\n";
58 <table id="keywords-table">
59 <title><acronym>SQL</acronym> Key Words</title>
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*"/>
69 <entry>Key Word</entry>
70 <entry><productname>PostgreSQL</productname></entry>
73 foreach my $ver (@sql_versions)
75 my $s = ($ver eq '1992' ?
'SQL-92' : "SQL:$ver");
76 print " <entry>$s</entry>\n";
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);
94 print " <entry><token>$printword</token></entry>\n";
97 if ($keywords{$word}{pg
}{'unreserved'})
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'})
113 if ($as_keywords{$word})
115 print ", requires <literal>AS</literal>";
119 foreach my $ver (@sql_versions)
122 if ($keywords{$word}{$ver}{'reserved'})
126 elsif ($keywords{$word}{$ver}{'nonreserved'})
128 print "non-reserved";