1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-17 06:41:09 +03:00
Files
postgres/doc/src/sgml/generate-keywords-table.pl
Peter Eisentraut c29ba98189 Update SQL keywords list to SQL:2016
Per previous convention (see
ace397e9d2), drop SQL:2008 and only keep
the latest two standards and SQL-92.

Note: SQL:2016-2 lists a large number of non-reserved keywords that
are really just information_schema column names related to new
features.  Those kinds of thing have not previously been listed as
keywords, and this was apparently done here by mistake, since these
keywords have been removed again in post-2016 working drafts.  So in
order to avoid bloating the keywords table unnecessarily, I have
omitted these erroneous keywords here.
2019-05-14 15:44:37 +02:00

123 lines
2.0 KiB
Perl

#!/usr/bin/perl
#
# Generate the keywords table file
# Copyright (c) 2019, PostgreSQL Global Development Group
use strict;
use warnings;
my @sql_versions = reverse sort ('1992', '2011', '2016');
my $srcdir = $ARGV[0];
my %keywords;
# read SQL keywords
foreach my $ver (@sql_versions)
{
foreach my $res ('reserved', 'nonreserved')
{
foreach my $file (glob "$srcdir/keywords/sql${ver}*-${res}.txt")
{
open my $fh, '<', $file or die;
while (<$fh>)
{
chomp;
$keywords{$_}{$ver}{$res} = 1;
}
close $fh;
}
}
}
# read PostgreSQL keywords
open my $fh, '<', "$srcdir/../../../src/include/parser/kwlist.h" or die;
while (<$fh>)
{
if (/^PG_KEYWORD\("(\w+)", \w+, (\w+)_KEYWORD\)/)
{
$keywords{ uc $1 }{'pg'}{ lc $2 } = 1;
}
}
close $fh;
# print output
print "<!-- autogenerated, do not edit -->\n";
print <<END;
<table id="keywords-table">
<title><acronym>SQL</acronym> Key Words</title>
<tgroup cols="5">
<thead>
<row>
<entry>Key Word</entry>
<entry><productname>PostgreSQL</productname></entry>
END
foreach my $ver (@sql_versions)
{
my $s = ($ver eq '1992' ? 'SQL-92' : "SQL:$ver");
print " <entry>$s</entry>\n";
}
print <<END;
</row>
</thead>
<tbody>
END
foreach my $word (sort keys %keywords)
{
print " <row>\n";
print " <entry><token>$word</token></entry>\n";
print " <entry>";
if ($keywords{$word}{pg}{'unreserved'})
{
print "non-reserved";
}
elsif ($keywords{$word}{pg}{'col_name'})
{
print "non-reserved (cannot be function or type)";
}
elsif ($keywords{$word}{pg}{'type_func_name'})
{
print "reserved (can be function or type)";
}
elsif ($keywords{$word}{pg}{'reserved'})
{
print "reserved";
}
print "</entry>\n";
foreach my $ver (@sql_versions)
{
print " <entry>";
if ($keywords{$word}{$ver}{'reserved'})
{
print "reserved";
}
elsif ($keywords{$word}{$ver}{'nonreserved'})
{
print "non-reserved";
}
print "</entry>\n";
}
print " </row>\n";
}
print <<END;
</tbody>
</tgroup>
</table>
END