package SQL::ReservedWords; use strict; use warnings; use vars '$VERSION'; $VERSION = 0.7; 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, C or C. =item is_reserved_by_sql1992( $word ) Returns a boolean indicating if C<$word> is reserved by C. =item is_reserved_by_sql1999( $word ) Returns a boolean indicating if C<$word> is reserved by C. =item is_reserved_by_sql2003( $word ) Returns a boolean indicating if C<$word> is reserved by C. =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 L L L L L L 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 =head1 COPYRIGHT This program is free software, you can redistribute it and/or modify it under the same terms as Perl itself. =cut