From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

use strict;
use vars '$VERSION';
$VERSION = '0.8';
use constant SQL1992 => 0x01;
use constant SQL1999 => 0x02;
use constant SQL2003 => 0x04;
{
require Sub::Exporter;
my @exports = qw[
is_reserved
is_reserved_by_sql1992
is_reserved_by_sql1999
is_reserved_by_sql2003
reserved_by
words
];
Sub::Exporter->import( -setup => { exports => \@exports } );
}
{
my %WORDS = (
ABSOLUTE => SQL1992 | SQL1999,
ACTION => SQL1992 | SQL1999,
ADD => SQL1992 | SQL1999 | SQL2003,
AFTER => SQL1999,
ALL => SQL1992 | SQL1999 | SQL2003,
ALLOCATE => SQL1992 | SQL1999 | SQL2003,
ALTER => SQL1992 | SQL1999 | SQL2003,
AND => SQL1992 | SQL1999 | SQL2003,
ANY => SQL1992 | SQL1999 | SQL2003,
ARE => SQL1992 | SQL1999 | SQL2003,
ARRAY => SQL1999 | SQL2003,
AS => SQL1992 | SQL1999 | SQL2003,
ASC => SQL1992 | SQL1999,
ASENSITIVE => SQL1999 | SQL2003,
ASSERTION => SQL1992 | SQL1999,
ASYMMETRIC => SQL1999 | SQL2003,
AT => SQL1992 | SQL1999 | SQL2003,
ATOMIC => SQL1999 | SQL2003,
AUTHORIZATION => SQL1992 | SQL1999 | SQL2003,
AVG => SQL1992,
BEFORE => SQL1999,
BEGIN => SQL1992 | SQL1999 | SQL2003,
BETWEEN => SQL1992 | SQL1999 | SQL2003,
BIGINT => SQL2003,
BINARY => SQL1999 | SQL2003,
BIT => SQL1992 | SQL1999,
BIT_LENGTH => SQL1992,
BLOB => SQL1999 | SQL2003,
BOOLEAN => SQL1999 | SQL2003,
BOTH => SQL1992 | SQL1999 | SQL2003,
BREADTH => SQL1999,
BY => SQL1992 | SQL1999 | SQL2003,
CALL => SQL1992 | SQL1999 | SQL2003,
CALLED => SQL1999 | SQL2003,
CASCADE => SQL1992 | SQL1999,
CASCADED => SQL1992 | SQL1999 | SQL2003,
CASE => SQL1992 | SQL1999 | SQL2003,
CAST => SQL1992 | SQL1999 | SQL2003,
CATALOG => SQL1992 | SQL1999,
CHAR => SQL1992 | SQL1999 | SQL2003,
CHARACTER => SQL1992 | SQL1999 | SQL2003,
CHARACTER_LENGTH => SQL1992,
CHAR_LENGTH => SQL1992,
CHECK => SQL1992 | SQL1999 | SQL2003,
CLOB => SQL1999 | SQL2003,
CLOSE => SQL1992 | SQL1999 | SQL2003,
COALESCE => SQL1992,
COLLATE => SQL1992 | SQL1999 | SQL2003,
COLLATION => SQL1992 | SQL1999,
COLUMN => SQL1992 | SQL1999 | SQL2003,
COMMIT => SQL1992 | SQL1999 | SQL2003,
CONDITION => SQL1992 | SQL1999 | SQL2003,
CONNECT => SQL1992 | SQL1999 | SQL2003,
CONNECTION => SQL1992 | SQL1999,
CONSTRAINT => SQL1992 | SQL1999 | SQL2003,
CONSTRAINTS => SQL1992 | SQL1999,
CONSTRUCTOR => SQL1999,
CONTAINS => SQL1992,
CONTINUE => SQL1992 | SQL1999 | SQL2003,
CONVERT => SQL1992,
CORRESPONDING => SQL1992 | SQL1999 | SQL2003,
COUNT => SQL1992,
CREATE => SQL1992 | SQL1999 | SQL2003,
CROSS => SQL1992 | SQL1999 | SQL2003,
CUBE => SQL1999 | SQL2003,
CURRENT => SQL1992 | SQL1999 | SQL2003,
CURRENT_DATE => SQL1992 | SQL1999 | SQL2003,
CURRENT_DEFAULT_TRANSFORM_GROUP => SQL1999 | SQL2003,
CURRENT_PATH => SQL1992 | SQL1999 | SQL2003,
CURRENT_ROLE => SQL1999 | SQL2003,
CURRENT_TIME => SQL1992 | SQL1999 | SQL2003,
CURRENT_TIMESTAMP => SQL1992 | SQL1999 | SQL2003,
CURRENT_TRANSFORM_GROUP_FOR_TYPE => SQL1999 | SQL2003,
CURRENT_USER => SQL1992 | SQL1999 | SQL2003,
CURSOR => SQL1992 | SQL1999 | SQL2003,
CYCLE => SQL1999 | SQL2003,
DATA => SQL1999,
DATE => SQL1992 | SQL1999 | SQL2003,
DAY => SQL1992 | SQL1999 | SQL2003,
DEALLOCATE => SQL1992 | SQL1999 | SQL2003,
DEC => SQL1992 | SQL1999 | SQL2003,
DECIMAL => SQL1992 | SQL1999 | SQL2003,
DECLARE => SQL1992 | SQL1999 | SQL2003,
DEFAULT => SQL1992 | SQL1999 | SQL2003,
DEFERRABLE => SQL1992 | SQL1999,
DEFERRED => SQL1992 | SQL1999,
DELETE => SQL1992 | SQL1999 | SQL2003,
DEPTH => SQL1999,
DEREF => SQL1999 | SQL2003,
DESC => SQL1992 | SQL1999,
DESCRIBE => SQL1992 | SQL1999 | SQL2003,
DESCRIPTOR => SQL1992 | SQL1999,
DETERMINISTIC => SQL1992 | SQL1999 | SQL2003,
DIAGNOSTICS => SQL1992 | SQL1999,
DISCONNECT => SQL1992 | SQL1999 | SQL2003,
DISTINCT => SQL1992 | SQL1999 | SQL2003,
DO => SQL1992 | SQL1999 | SQL2003,
DOMAIN => SQL1992 | SQL1999,
DOUBLE => SQL1992 | SQL1999 | SQL2003,
DROP => SQL1992 | SQL1999 | SQL2003,
DYNAMIC => SQL1999 | SQL2003,
EACH => SQL1999 | SQL2003,
ELEMENT => SQL2003,
ELSE => SQL1992 | SQL1999 | SQL2003,
ELSEIF => SQL1992 | SQL1999 | SQL2003,
END => SQL1992 | SQL1999 | SQL2003,
EQUALS => SQL1999,
ESCAPE => SQL1992 | SQL1999 | SQL2003,
EXCEPT => SQL1992 | SQL1999 | SQL2003,
EXCEPTION => SQL1992 | SQL1999,
EXEC => SQL1992 | SQL1999 | SQL2003,
EXECUTE => SQL1992 | SQL1999 | SQL2003,
EXISTS => SQL1992 | SQL1999 | SQL2003,
EXIT => SQL1992 | SQL1999 | SQL2003,
EXTERNAL => SQL1992 | SQL1999 | SQL2003,
EXTRACT => SQL1992,
FALSE => SQL1992 | SQL1999 | SQL2003,
FETCH => SQL1992 | SQL1999 | SQL2003,
FILTER => SQL1999 | SQL2003,
FIRST => SQL1992 | SQL1999,
FLOAT => SQL1992 | SQL1999 | SQL2003,
FOR => SQL1992 | SQL1999 | SQL2003,
FOREIGN => SQL1992 | SQL1999 | SQL2003,
FOUND => SQL1992 | SQL1999,
FREE => SQL1999 | SQL2003,
FROM => SQL1992 | SQL1999 | SQL2003,
FULL => SQL1992 | SQL1999 | SQL2003,
FUNCTION => SQL1992 | SQL1999 | SQL2003,
GENERAL => SQL1999,
GET => SQL1992 | SQL1999 | SQL2003,
GLOBAL => SQL1992 | SQL1999 | SQL2003,
GO => SQL1992 | SQL1999,
GOTO => SQL1992 | SQL1999,
GRANT => SQL1992 | SQL1999 | SQL2003,
GROUP => SQL1992 | SQL1999 | SQL2003,
GROUPING => SQL1999 | SQL2003,
HANDLER => SQL1992 | SQL1999 | SQL2003,
HAVING => SQL1992 | SQL1999 | SQL2003,
HOLD => SQL1999 | SQL2003,
HOUR => SQL1992 | SQL1999 | SQL2003,
IDENTITY => SQL1992 | SQL1999 | SQL2003,
IF => SQL1992 | SQL1999 | SQL2003,
IMMEDIATE => SQL1992 | SQL1999 | SQL2003,
IN => SQL1992 | SQL1999 | SQL2003,
INDICATOR => SQL1992 | SQL1999 | SQL2003,
INITIALLY => SQL1992 | SQL1999,
INNER => SQL1992 | SQL1999 | SQL2003,
INOUT => SQL1992 | SQL1999 | SQL2003,
INPUT => SQL1992 | SQL1999 | SQL2003,
INSENSITIVE => SQL1992 | SQL1999 | SQL2003,
INSERT => SQL1992 | SQL1999 | SQL2003,
INT => SQL1992 | SQL1999 | SQL2003,
INTEGER => SQL1992 | SQL1999 | SQL2003,
INTERSECT => SQL1992 | SQL1999 | SQL2003,
INTERVAL => SQL1992 | SQL1999 | SQL2003,
INTO => SQL1992 | SQL1999 | SQL2003,
IS => SQL1992 | SQL1999 | SQL2003,
ISOLATION => SQL1992 | SQL1999,
ITERATE => SQL1999 | SQL2003,
JOIN => SQL1992 | SQL1999 | SQL2003,
KEY => SQL1992 | SQL1999,
LANGUAGE => SQL1992 | SQL1999 | SQL2003,
LARGE => SQL1999 | SQL2003,
LAST => SQL1992 | SQL1999,
LATERAL => SQL1999 | SQL2003,
LEADING => SQL1992 | SQL1999 | SQL2003,
LEAVE => SQL1992 | SQL1999 | SQL2003,
LEFT => SQL1992 | SQL1999 | SQL2003,
LEVEL => SQL1992 | SQL1999,
LIKE => SQL1992 | SQL1999 | SQL2003,
LOCAL => SQL1992 | SQL1999 | SQL2003,
LOCALTIME => SQL1999 | SQL2003,
LOCALTIMESTAMP => SQL1999 | SQL2003,
LOCATOR => SQL1999,
LOOP => SQL1992 | SQL1999 | SQL2003,
LOWER => SQL1992,
MAP => SQL1999,
MATCH => SQL1992 | SQL1999 | SQL2003,
MAX => SQL1992,
MEMBER => SQL2003,
MERGE => SQL2003,
METHOD => SQL1999 | SQL2003,
MIN => SQL1992,
MINUTE => SQL1992 | SQL1999 | SQL2003,
MODIFIES => SQL1999 | SQL2003,
MODULE => SQL1992 | SQL1999 | SQL2003,
MONTH => SQL1992 | SQL1999 | SQL2003,
MULTISET => SQL2003,
NAMES => SQL1992 | SQL1999,
NATIONAL => SQL1992 | SQL1999 | SQL2003,
NATURAL => SQL1992 | SQL1999 | SQL2003,
NCHAR => SQL1992 | SQL1999 | SQL2003,
NCLOB => SQL1999 | SQL2003,
NEW => SQL1999 | SQL2003,
NEXT => SQL1992 | SQL1999,
NO => SQL1992 | SQL1999 | SQL2003,
NONE => SQL1999 | SQL2003,
NOT => SQL1992 | SQL1999 | SQL2003,
NULL => SQL1992 | SQL1999 | SQL2003,
NULLIF => SQL1992,
NUMERIC => SQL1992 | SQL1999 | SQL2003,
OBJECT => SQL1999,
OCTET_LENGTH => SQL1992,
OF => SQL1992 | SQL1999 | SQL2003,
OLD => SQL1999 | SQL2003,
ON => SQL1992 | SQL1999 | SQL2003,
ONLY => SQL1992 | SQL1999 | SQL2003,
OPEN => SQL1992 | SQL1999 | SQL2003,
OPTION => SQL1992 | SQL1999,
OR => SQL1992 | SQL1999 | SQL2003,
ORDER => SQL1992 | SQL1999 | SQL2003,
ORDINALITY => SQL1999,
OUT => SQL1992 | SQL1999 | SQL2003,
OUTER => SQL1992 | SQL1999 | SQL2003,
OUTPUT => SQL1992 | SQL1999 | SQL2003,
OVER => SQL1999 | SQL2003,
OVERLAPS => SQL1992 | SQL1999 | SQL2003,
PAD => SQL1992 | SQL1999,
PARAMETER => SQL1992 | SQL1999 | SQL2003,
PARTIAL => SQL1992 | SQL1999,
PARTITION => SQL1999 | SQL2003,
PATH => SQL1992 | SQL1999,
POSITION => SQL1992,
PRECISION => SQL1992 | SQL1999 | SQL2003,
PREPARE => SQL1992 | SQL1999 | SQL2003,
PRESERVE => SQL1992 | SQL1999,
PRIMARY => SQL1992 | SQL1999 | SQL2003,
PRIOR => SQL1992 | SQL1999,
PRIVILEGES => SQL1992 | SQL1999,
PROCEDURE => SQL1992 | SQL1999 | SQL2003,
PUBLIC => SQL1992 | SQL1999,
RANGE => SQL1999 | SQL2003,
READ => SQL1992 | SQL1999,
READS => SQL1999 | SQL2003,
REAL => SQL1992 | SQL1999 | SQL2003,
RECURSIVE => SQL1999 | SQL2003,
REF => SQL1999 | SQL2003,
REFERENCES => SQL1992 | SQL1999 | SQL2003,
REFERENCING => SQL1999 | SQL2003,
RELATIVE => SQL1992 | SQL1999,
RELEASE => SQL1999 | SQL2003,
REPEAT => SQL1992 | SQL1999 | SQL2003,
RESIGNAL => SQL1992 | SQL1999 | SQL2003,
RESTRICT => SQL1992 | SQL1999,
RESULT => SQL1999 | SQL2003,
RETURN => SQL1992 | SQL1999 | SQL2003,
RETURNS => SQL1992 | SQL1999 | SQL2003,
REVOKE => SQL1992 | SQL1999 | SQL2003,
RIGHT => SQL1992 | SQL1999 | SQL2003,
ROLE => SQL1999,
ROLLBACK => SQL1992 | SQL1999 | SQL2003,
ROLLUP => SQL1999 | SQL2003,
ROUTINE => SQL1992 | SQL1999,
ROW => SQL1999 | SQL2003,
ROWS => SQL1992 | SQL1999 | SQL2003,
SAVEPOINT => SQL1999 | SQL2003,
SCHEMA => SQL1992 | SQL1999,
SCOPE => SQL1999 | SQL2003,
SCROLL => SQL1992 | SQL1999 | SQL2003,
SEARCH => SQL1999 | SQL2003,
SECOND => SQL1992 | SQL1999 | SQL2003,
SECTION => SQL1992 | SQL1999,
SELECT => SQL1992 | SQL1999 | SQL2003,
SENSITIVE => SQL1999 | SQL2003,
SESSION => SQL1992 | SQL1999,
SESSION_USER => SQL1992 | SQL1999 | SQL2003,
SET => SQL1992 | SQL1999 | SQL2003,
SETS => SQL1999,
SIGNAL => SQL1992 | SQL1999 | SQL2003,
SIMILAR => SQL1999 | SQL2003,
SIZE => SQL1992 | SQL1999,
SMALLINT => SQL1992 | SQL1999 | SQL2003,
SOME => SQL1992 | SQL1999 | SQL2003,
SPACE => SQL1992 | SQL1999,
SPECIFIC => SQL1992 | SQL1999 | SQL2003,
SPECIFICTYPE => SQL1999 | SQL2003,
SQL => SQL1992 | SQL1999 | SQL2003,
SQLCODE => SQL1992,
SQLERROR => SQL1992,
SQLEXCEPTION => SQL1992 | SQL1999 | SQL2003,
SQLSTATE => SQL1992 | SQL1999 | SQL2003,
SQLWARNING => SQL1992 | SQL1999 | SQL2003,
START => SQL1999 | SQL2003,
STATE => SQL1999,
STATIC => SQL1999 | SQL2003,
SUBMULTISET => SQL2003,
SUBSTRING => SQL1992,
SUM => SQL1992,
SYMMETRIC => SQL1999 | SQL2003,
SYSTEM => SQL1999 | SQL2003,
SYSTEM_USER => SQL1992 | SQL1999 | SQL2003,
TABLE => SQL1992 | SQL1999 | SQL2003,
TABLESAMPLE => SQL2003,
TEMPORARY => SQL1992 | SQL1999,
THEN => SQL1992 | SQL1999 | SQL2003,
TIME => SQL1992 | SQL1999 | SQL2003,
TIMESTAMP => SQL1992 | SQL1999 | SQL2003,
TIMEZONE_HOUR => SQL1992 | SQL1999 | SQL2003,
TIMEZONE_MINUTE => SQL1992 | SQL1999 | SQL2003,
TO => SQL1992 | SQL1999 | SQL2003,
TRAILING => SQL1992 | SQL1999 | SQL2003,
TRANSACTION => SQL1992 | SQL1999,
TRANSLATE => SQL1992,
TRANSLATION => SQL1992 | SQL1999 | SQL2003,
TREAT => SQL1999 | SQL2003,
TRIGGER => SQL1999 | SQL2003,
TRIM => SQL1992,
TRUE => SQL1992 | SQL1999 | SQL2003,
UNDER => SQL1999,
UNDO => SQL1992 | SQL1999 | SQL2003,
UNION => SQL1992 | SQL1999 | SQL2003,
UNIQUE => SQL1992 | SQL1999 | SQL2003,
UNKNOWN => SQL1992 | SQL1999 | SQL2003,
UNNEST => SQL1999 | SQL2003,
UNTIL => SQL1992 | SQL1999 | SQL2003,
UPDATE => SQL1992 | SQL1999 | SQL2003,
UPPER => SQL1992,
USAGE => SQL1992 | SQL1999,
USER => SQL1992 | SQL1999 | SQL2003,
USING => SQL1992 | SQL1999 | SQL2003,
VALUE => SQL1992 | SQL1999 | SQL2003,
VALUES => SQL1992 | SQL1999 | SQL2003,
VARCHAR => SQL1992 | SQL1999 | SQL2003,
VARYING => SQL1992 | SQL1999 | SQL2003,
VIEW => SQL1992 | SQL1999,
WHEN => SQL1992 | SQL1999 | SQL2003,
WHENEVER => SQL1992 | SQL1999 | SQL2003,
WHERE => SQL1992 | SQL1999 | SQL2003,
WHILE => SQL1992 | SQL1999 | SQL2003,
WINDOW => SQL1999 | SQL2003,
WITH => SQL1992 | SQL1999 | SQL2003,
WITHIN => SQL1999 | SQL2003,
WITHOUT => SQL1999 | SQL2003,
WORK => SQL1992 | SQL1999,
WRITE => SQL1992 | SQL1999,
YEAR => SQL1992 | SQL1999 | SQL2003,
ZONE => SQL1992 | SQL1999
);
sub is_reserved {
return $WORDS{ uc(pop || '') } || 0;
}
sub is_reserved_by_sql1992 {
return &is_reserved & SQL1992;
}
sub is_reserved_by_sql1999 {
return &is_reserved & SQL1999;
}
sub is_reserved_by_sql2003 {
return &is_reserved & SQL2003;
}
sub reserved_by {
my $flags = &is_reserved;
my @reserved_by = ();
push @reserved_by, 'SQL:1992' if $flags & SQL1992;
push @reserved_by, 'SQL:1999' if $flags & SQL1999;
push @reserved_by, 'SQL:2003' if $flags & SQL2003;
return @reserved_by;
}
sub words {
return sort keys %WORDS;
}
}
1;
__END__
=head1 NAME
SQL::ReservedWords - Reserved SQL words by ANSI/ISO
=head1 SYNOPSIS
if ( SQL::ReservedWords->is_reserved( $word ) ) {
print "$word is a reserved SQL word!";
}
=head1 DESCRIPTION
Determine if words are reserved by ANSI/ISO SQL standard.
=head1 METHODS
=over 4
=item is_reserved( $word )
Returns a boolean indicating if C<$word> is reserved by either C<SQL:1992>,
C<SQL:1999> or C<SQL:2003>.
=item is_reserved_by_sql1992( $word )
Returns a boolean indicating if C<$word> is reserved by C<SQL:1992>.
=item is_reserved_by_sql1999( $word )
Returns a boolean indicating if C<$word> is reserved by C<SQL:1999>.
=item is_reserved_by_sql2003( $word )
Returns a boolean indicating if C<$word> is reserved by C<SQL:2003>.
=item reserved_by( $word )
Returns a list with SQL standards that reserves C<$word>.
=item words
Returns a list with all reserved words.
=back
=head1 EXPORTS
Nothing by default. Following subroutines can be exported:
=over 4
=item is_reserved
=item is_reserved_by_sql1992
=item is_reserved_by_sql1999
=item is_reserved_by_sql2003
=item reserved_by
=item words
=back
=head1 SEE ALSO
L<SQL::ReservedWords::DB2>
L<SQL::ReservedWords::MySQL>
L<SQL::ReservedWords::ODBC>
L<SQL::ReservedWords::Oracle>
L<SQL::ReservedWords::PostgreSQL>
L<SQL::ReservedWords::SQLite>
L<SQL::ReservedWords::SQLServer>
ISO/IEC 9075:1992 Database languages -- SQL
ISO/IEC 9075-2:1999 Database languages -- SQL -- Part 2: Foundation (SQL/Foundation)
ISO/IEC 9075-2:2003 Database languages -- SQL -- Part 2: Foundation (SQL/Foundation)
=head1 AUTHOR
Christian Hansen C<chansen@cpan.org>
=head1 COPYRIGHT
This program is free software, you can redistribute it and/or modify
it under the same terms as Perl itself.
=cut