| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Oracle has at least three categories of keywords:
1. reserved words (can't be used in unquoted identifiers)
2. "non-reserved" keywords (which have a specific syntactic meaning, but which
*can* be used in unquoted identifiers… which is insane)
3. reserved words which are specific to PL/SQL (so probably shouldn't be
considered special by sqlparse)
This PR adds everything from #1 which sqlparse didn't already include. Some of
these are used in other SQL databases as well (e.g. SYNONYM, ENABLE, DISABLE)
while most are Oracle-specific.
I referred to the Oracle 11g docs for these lists:
http://docs.oracle.com/cd/B28359_01/appdev.111/b31231/appb.htm#BABGHAFH
And I used the following script to find the ones that were missing from sqlparse:
import sqlparse
import textwrap
# Oracle 11g reserved words: http://docs.oracle.com/cd/B28359_01/appdev.111/b31231/appb.htm#BABGHAFH
reserved = {
'ACCESS', 'ELSE', 'MODIFY', 'START', 'ADD',
'EXCLUSIVE', 'NOAUDIT', 'SELECT', 'ALL', 'EXISTS', 'NOCOMPRESS',
'SESSION', 'ALTER', 'FILE', 'NOT', 'SET', 'AND', 'FLOAT', 'NOTFOUND',
'SHARE', 'ANY', 'FOR', 'NOWAIT', 'SIZE', 'ARRAYLEN', 'FROM', 'NULL',
'SMALLINT', 'AS', 'GRANT', 'NUMBER', 'SQLBUF', 'ASC', 'GROUP', 'OF',
'SUCCESSFUL', 'AUDIT', 'HAVING', 'OFFLINE', 'SYNONYM', 'BETWEEN',
'IDENTIFIED', 'ON', 'SYSDATE', 'BY', 'IMMEDIATE', 'ONLINE', 'TABLE',
'CHAR', 'IN', 'OPTION', 'THEN', 'CHECK', 'INCREMENT', 'OR', 'TO',
'CLUSTER', 'INDEX', 'ORDER', 'TRIGGER', 'COLUMN', 'INITIAL',
'PCTFREE', 'UID', 'COMMENT', 'INSERT', 'PRIOR', 'UNION', 'COMPRESS',
'INTEGER', 'PRIVILEGES', 'UNIQUE', 'CONNECT', 'INTERSECT', 'PUBLIC',
'UPDATE', 'CREATE', 'INTO', 'RAW', 'USER', 'CURRENT', 'IS', 'RENAME',
'VALIDATE', 'DATE', 'LEVEL', 'RESOURCE', 'VALUES', 'DECIMAL', 'LIKE',
'REVOKE', 'VARCHAR', 'DEFAULT', 'LOCK', 'ROW', 'VARCHAR2', 'DELETE',
'LONG', 'ROWID', 'VIEW', 'DESC', 'MAXEXTENTS', 'ROWLABEL', 'WHENEVER',
'DISTINCT', 'MINUS', 'ROWNUM', 'WHERE', 'DROP', 'MODE', 'ROWS',
'WITH',
}
# Oracle 11g "non-reserved" keywords (don't blame me, I didn't come up with this insane concept):
# http://docs.oracle.com/cd/B28359_01/appdev.111/b31231/appb.htm#BABHJHFE
keywords = {
'ADMIN', 'CURSOR', 'FOUND', 'MOUNT', 'AFTER', 'CYCLE',
'FUNCTION', 'NEXT', 'ALLOCATE', 'DATABASE', 'GO', 'NEW',
'ANALYZE', 'DATAFILE', 'GOTO', 'NOARCHIVELOG', 'ARCHIVE', 'DBA',
'GROUPS', 'NOCACHE', 'ARCHIVELOG', 'DEC', 'INCLUDING', 'NOCYCLE',
'AUTHORIZATION', 'DECLARE', 'INDICATOR', 'NOMAXVALUE', 'AVG',
'DISABLE', 'INITRANS', 'NOMINVALUE', 'BACKUP', 'DISMOUNT',
'INSTANCE', 'NONE', 'BEGIN', 'DOUBLE', 'INT', 'NOORDER', 'BECOME',
'DUMP', 'KEY', 'NORESETLOGS', 'BEFORE', 'EACH', 'LANGUAGE',
'NORMAL', 'BLOCK', 'ENABLE', 'LAYER', 'NOSORT', 'BODY', 'END',
'LINK', 'NUMERIC', 'CACHE', 'ESCAPE', 'LISTS', 'OFF', 'CANCEL',
'EVENTS', 'LOGFILE', 'OLD', 'CASCADE', 'EXCEPT', 'MANAGE', 'ONLY',
'CHANGE', 'EXCEPTIONS', 'MANUAL', 'OPEN', 'CHARACTER', 'EXEC',
'MAX', 'OPTIMAL', 'CHECKPOINT', 'EXPLAIN', 'MAXDATAFILES', 'OWN',
'CLOSE', 'EXECUTE', 'MAXINSTANCES', 'PACKAGE', 'COBOL', 'EXTENT',
'MAXLOGFILES', 'PARALLEL', 'COMMIT', 'EXTERNALLY',
'MAXLOGHISTORY', 'PCTINCREASE', 'COMPILE', 'FETCH',
'MAXLOGMEMBERS', 'PCTUSED', 'CONSTRAINT', 'FLUSH', 'MAXTRANS',
'PLAN', 'CONSTRAINTS', 'FREELIST', 'MAXVALUE', 'PLI', 'CONTENTS',
'FREELISTS', 'MIN', 'PRECISION', 'CONTINUE', 'FORCE',
'MINEXTENTS', 'PRIMARY', 'CONTROLFILE', 'FOREIGN', 'MINVALUE',
'PRIVATE', 'COUNT', 'FORTRAN', 'MODULE', 'PROCEDURE', 'PROFILE',
'SAVEPOINT', 'SQLSTATE', 'TRACING', 'QUOTA', 'SCHEMA',
'STATEMENT_ID', 'TRANSACTION', 'READ', 'SCN', 'STATISTICS',
'TRIGGERS', 'REAL', 'SECTION', 'STOP', 'TRUNCATE', 'RECOVER',
'SEGMENT', 'STORAGE', 'UNDER', 'REFERENCES', 'SEQUENCE', 'SUM',
'UNLIMITED', 'REFERENCING', 'SHARED', 'SWITCH', 'UNTIL',
'RESETLOGS', 'SNAPSHOT', 'SYSTEM', 'USE', 'RESTRICTED', 'SOME',
'TABLES', 'USING', 'REUSE', 'SORT', 'TABLESPACE', 'WHEN', 'ROLE',
'SQL', 'TEMPORARY', 'WRITE', 'ROLES', 'SQLCODE', 'THREAD', 'WORK',
'ROLLBACK', 'SQLERROR', 'TIME'
}
# Oracle 11g reserved words for PL/SQL only:
# http://docs.oracle.com/cd/B28359_01/appdev.111/b31231/appb.htm#BABDFFBA
plsql_reserved = {
'ABORT', 'BETWEEN', 'CRASH', 'DIGITS', 'ACCEPT',
'BINARY_INTEGER', 'CREATE', 'DISPOSE', 'ACCESS', 'BODY', 'CURRENT',
'DISTINCT', 'ADD', 'BOOLEAN', 'CURRVAL', 'DO', 'ALL', 'BY', 'CURSOR',
'DROP', 'ALTER', 'CASE', 'DATABASE', 'ELSE', 'AND', 'CHAR',
'DATA_BASE', 'ELSIF', 'ANY', 'CHAR_BASE', 'DATE', 'END', 'ARRAY',
'CHECK', 'DBA', 'ENTRY', 'ARRAYLEN', 'CLOSE', 'DEBUGOFF', 'EXCEPTION',
'AS', 'CLUSTER', 'DEBUGON', 'EXCEPTION_INIT', 'ASC', 'CLUSTERS',
'DECLARE', 'EXISTS', 'ASSERT', 'COLAUTH', 'DECIMAL', 'EXIT', 'ASSIGN',
'COLUMNS', 'DEFAULT', 'FALSE', 'AT', 'COMMIT', 'DEFINITION', 'FETCH',
'AUTHORIZATION', 'COMPRESS', 'DELAY', 'FLOAT', 'AVG', 'CONNECT',
'DELETE', 'FOR', 'BASE_TABLE', 'CONSTANT', 'DELTA', 'FORM', 'BEGIN',
'COUNT', 'DESC', 'FROM', 'FUNCTION', 'NEW', 'RELEASE', 'SUM',
'GENERIC', 'NEXTVAL', 'REMR', 'TABAUTH', 'GOTO', 'NOCOMPRESS',
'RENAME', 'TABLE', 'GRANT', 'NOT', 'RESOURCE', 'TABLES', 'GROUP',
'NULL', 'RETURN', 'TASK', 'HAVING', 'NUMBER', 'REVERSE', 'TERMINATE',
'IDENTIFIED', 'NUMBER_BASE', 'REVOKE', 'THEN', 'IF', 'OF', 'ROLLBACK',
'TO', 'IN', 'ON', 'ROWID', 'TRUE', 'INDEX', 'OPEN', 'ROWLABEL',
'TYPE', 'INDEXES', 'OPTION', 'ROWNUM', 'UNION', 'INDICATOR', 'OR',
'ROWTYPE', 'UNIQUE', 'INSERT', 'ORDER', 'RUN', 'UPDATE', 'INTEGER',
'OTHERS', 'SAVEPOINT', 'USE', 'INTERSECT', 'OUT', 'SCHEMA', 'VALUES',
'INTO', 'PACKAGE', 'SELECT', 'VARCHAR', 'IS', 'PARTITION', 'SEPARATE',
'VARCHAR2', 'LEVEL', 'PCTFREE', 'SET', 'VARIANCE', 'LIKE', 'POSITIVE',
'SIZE', 'VIEW', 'LIMITED', 'PRAGMA', 'SMALLINT', 'VIEWS', 'LOOP',
'PRIOR', 'SPACE', 'WHEN', 'MAX', 'PRIVATE', 'SQL', 'WHERE', 'MIN',
'PROCEDURE', 'SQLCODE', 'WHILE', 'MINUS', 'PUBLIC', 'SQLERRM', 'WITH',
'MLSLABEL', 'RAISE', 'START', 'WORK', 'MOD', 'RANGE', 'STATEMENT',
'XOR', 'MODE', 'REAL', 'STDDEV', 'NATURAL', 'RECORD', 'SUBTYPE'
} - reserved
for batch, name in ((reserved, 'Oracle 11g reserved words'),
(keywords, 'Oracle 11g "non-reserved" keywords'),
(plsql_reserved, 'Oracle 11g reserved words for PL/SQL only'),):
missing = batch - set(sqlparse.keywords.KEYWORDS) - set(sqlparse.keywords.KEYWORDS_COMMON)
if missing:
print("{} out of {} {} are missing from sqlparse.keywords.KEYWORDS (v{}):".format(len(missing), len(batch), name, sqlparse.__version__))
print(textwrap.fill(repr(missing), initial_indent=' ', subsequent_indent=' '))
else:
print("All {} {} are in from sqlparse.keywords.KEYWORDS (v{}).".format(len(batch), name, sqlparse.__version__))
|