You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
proxysql/deps/libinjection/sqlparse_map.py

1555 lines
47 KiB

#!/usr/bin/env python
# pylint: disable=C0301,C0302
# Turn off line-too-long, and too-many-lines warnings
#
# Copyright 2012, 2013 Nick Galbreath
# nickg@client9.com
# BSD License -- see COPYING.txt for details
#
"""
Data for libinjection. These are simple data structures
which are exported to JSON. This is done so comments can be
added to the data directly (JSON doesn't support comments).
"""
KEYWORDS = {
'_BIG5': 't',
'_DEC8': 't',
'_CP850': 't',
'_HP8': 't',
'_KOI8R': 't',
'_LATIN1': 't',
'_LATIN2': 't',
'_SWE7': 't',
'_ASCII': 't',
'_UJIS': 't',
'_SJIS': 't',
'_HEBREW': 't',
'_TIS620': 't',
'_EUCKR': 't',
'_KOI8U': 't',
'_GB2312': 't',
'_GREEK': 't',
'_CP1250': 't',
'_GBK': 't',
'_LATIN5': 't',
'_ARMSCII8': 't',
'_UTF8': 't',
'_USC2': 't',
'_CP866': 't',
'_KEYBCS2': 't',
'_MACCE': 't',
'_MACROMAN': 't',
'_CP852': 't',
'_LATIN7': 't',
'_CP1251': 't',
'_CP1257': 't',
'_BINARY': 't',
'_GEOSTD8': 't',
'_CP932': 't',
'_EUCJPMS': 't',
'AUTOINCREMENT' : 'k',
'UTL_INADDR.GET_HOST_ADDRESS': 'f',
'UTL_INADDR.GET_HOST_NAME' : 'f',
'UTL_HTTP.REQUEST' : 'f',
# ORACLE
# http://blog.red-database-security.com/
# /2009/01/17/tutorial-oracle-sql-injection-in-webapps-part-i/print/
'DBMS_PIPE.RECEIVE_MESSAGE': 'f',
'CTXSYS.DRITHSX.SN': 'f',
'SYS.STRAGG': 'f',
'SYS.FN_BUILTIN_PERMISSIONS' : 'f',
'SYS.FN_GET_AUDIT_FILE' : 'f',
'SYS.FN_MY_PERMISSIONS' : 'f',
'SYS.DATABASE_NAME' : 'n',
'ABORT' : 'k',
'ABS' : 'f',
'ACCESSIBLE' : 'k',
'ACOS' : 'f',
'ADD' : 'k',
'ADDDATE' : 'f',
'ADDTIME' : 'f',
'AES_DECRYPT' : 'f',
'AES_ENCRYPT' : 'f',
'AGAINST' : 'k',
'AGE' : 'f',
'ALTER' : 'k',
# 'ALL_USERS' - oracle
'ALL_USERS' : 'k',
'ANALYZE' : 'k',
'AND' : '&',
# ANY -- acts like a function
# http://dev.mysql.com/doc/refman/5.0/en/any-in-some-subqueries.html
'ANY' : 'f',
# pgsql
'ANYELEMENT' : 't',
'ANYARRAY' : 't',
'ANYNONARRY' : 't',
'CSTRING' : 't',
# array_... pgsql
'ARRAY_AGG' : 'f',
'ARRAY_CAT' : 'f',
'ARRAY_NDIMS' : 'f',
'ARRAY_DIM' : 'f',
'ARRAY_FILL' : 'f',
'ARRAY_LENGTH' : 'f',
'ARRAY_LOWER' : 'f',
'ARRAY_UPPER' : 'f',
'ARRAY_PREPEND' : 'f',
'ARRAY_TO_STRING' : 'f',
'ARRAY_TO_JSON' : 'f',
'APP_NAME' : 'f',
'APPLOCK_MODE' : 'f',
'APPLOCK_TEST' : 'f',
'ASSEMBLYPROPERTY' : 'f',
'AS' : 'k',
'ASC' : 'k',
'ASCII' : 'f',
'ASENSITIVE' : 'k',
'ASIN' : 'f',
'ASYMKEY_ID' : 'f',
'ATAN' : 'f',
'ATAN2' : 'f',
'AVG' : 'f',
'BEFORE' : 'k',
'BEGIN' : 'T',
'COMMIT' : 'T',
'BENCHMARK' : 'f',
'BETWEEN' : 'o',
'BIGINT' : 't',
'BIGSERIAL' : 't',
'BIN' : 'f',
# "select binary 1" forward type operator
'BINARY' : 't',
'BINARY_DOUBLE_INFINITY' : '1',
'BINARY_DOUBLE_NAN' : '1',
'BINARY_FLOAT_INFINITY' : '1',
'BINARY_FLOAT_NAN' : '1',
'BINBINARY' : 'f',
'BIT_AND' : 'f',
'BIT_COUNT' : 'f',
'BIT_LENGTH' : 'f',
'BIT_OR' : 'f',
'BIT_XOR' : 'f',
'BLOB' : 'k',
# pgsql
'BOOL_AND' : 'f',
# pgsql
'BOOL_OR' : 'f',
'BOOLEAN' : 't',
'BOTH' : 'k',
# pgsql
'BTRIM' : 'f',
'BY' : 'n',
'BYTEA' : 't',
# MS ACCESS
#
#
'CBOOL' : 'f',
'CBYTE' : 'f',
'CCUR' : 'f',
'CDATE' : 'f',
'CDBL' : 'f',
'CINT' : 'f',
'CLNG' : 'f',
'CSNG' : 'f',
'CVAR' : 'f',
# CHANGES: sqlite3
'CHANGES' : 'f',
'CHDIR' : 'f',
'CHDRIVE' : 'f',
'CURDIR' : 'f',
'FILEDATETIME' : 'f',
'FILELEN' : 'f',
'GETATTR' : 'f',
'MKDIR' : 'f',
'SETATTR' : 'f',
'DAVG' : 'f',
'DCOUNT' : 'f',
'DFIRST' : 'f',
'DLAST' : 'f',
'DLOOKUP' : 'f',
'DMAX' : 'f',
'DMIN' : 'f',
'DSUM' : 'f',
# TBD
'DO' : 'n',
'CALL' : 'T',
'CASCADE' : 'k',
'CASE' : 'E',
'CAST' : 'f',
# pgsql 'cube root' lol
'CBRT' : 'f',
'CEIL' : 'f',
'CEILING' : 'f',
'CERTENCODED' : 'f',
'CERTPRIVATEKEY' : 'f',
'CERT_ID' : 'f',
'CERT_PROPERTY' : 'f',
'CHANGE' : 'k',
# 'CHAR'
# sometimes a function too
# TBD
'CHAR' : 'f',
'CHARACTER' : 't',
'CHARACTER_LENGTH' : 'f',
'CHARINDEX' : 'f',
'CHARSET' : 'f',
'CHAR_LENGTH' : 'f',
'CHECK' : 'k',
'CHECKSUM_AGG' : 'f',
'CHOOSE' : 'f',
'CHR' : 'f',
'CLOCK_TIMESTAMP' : 'f',
'COALESCE' : 'f',
'COERCIBILITY' : 'f',
'COL_LENGTH' : 'f',
'COL_NAME' : 'f',
'COLLATE' : 'A',
'COLLATION' : 'f',
'COLLATIONPROPERTY' : 'f',
# TBD
'COLUMN' : 'k',
'COLUMNPROPERTY' : 'f',
'COLUMNS_UPDATED' : 'f',
'COMPRESS' : 'f',
'CONCAT' : 'f',
'CONCAT_WS' : 'f',
'CONDITION' : 'k',
'CONNECTION_ID' : 'f',
'CONSTRAINT' : 'k',
'CONTINUE' : 'k',
'CONV' : 'f',
'CONVERT' : 'f',
# pgsql
'CONVERT_FROM' : 'f',
# pgsql
'CONVERT_TO' : 'f',
'CONVERT_TZ' : 'f',
'COS' : 'f',
'COT' : 'f',
'COUNT' : 'f',
'COUNT_BIG' : 'k',
'CRC32' : 'f',
'CREATE' : 'E',
'CREATE OR' : 'n',
'CREATE OR REPLACE' : 'T',
'CROSS' : 'n',
'CUME_DIST' : 'f',
'CURDATE' : 'f',
'CURRENT_DATABASE' : 'f',
# MYSQL Dual, function or variable-like
# And IBM
# http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=%2Fsqlp%2Frbafykeyu.htm
'CURRENT_DATE' : 'v',
'CURRENT_TIME' : 'v',
'CURRENT_TIMESTAMP' : 'v',
'CURRENT_QUERY' : 'f',
'CURRENT_SCHEMA' : 'f',
'CURRENT_SCHEMAS' : 'f',
'CURRENT_SETTING' : 'f',
# current_user sometimes acts like a variable
# other times it acts like a function depending
# on database. This is converted in the right
# type in the folding code
# mysql = function
# ?? = variable
'CURRENT_USER' : 'v',
'CURRENTUSER' : 'f',
#
# DB2 'Special Registers'
# These act like variables
# http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=%2Fsqlp%2Frbafykeyu.htm
'CURRENT DATE' : 'v',
'CURRENT DEGREE' : 'v',
'CURRENT_PATH' : 'v',
'CURRENT PATH' : 'v',
'CURRENT FUNCTION' : 'v',
'CURRENT SCHEMA' : 'v',
'CURRENT_SERVER' : 'v',
'CURRENT SERVER' : 'v',
'CURRENT TIME' : 'v',
'CURRENT_TIMEZONE' : 'v',
'CURRENT TIMEZONE' : 'v',
'CURRENT FUNCTION PATH': 'v',
# pgsql
'CURRVAL' : 'f',
'CURSOR' : 'k',
'CURSOR_STATUS' : 'f',
'CURTIME' : 'f',
# this might be a function
'DATABASE' : 'n',
'DATABASE_PRINCIPAL_ID' : 'f',
'DATABASEPROPERTYEX' : 'f',
'DATABASES' : 'k',
'DATALENGTH' : 'f',
'DATE' : 'f',
'DATEDIFF' : 'f',
# sqlserver
'DATENAME' : 'f',
#sqlserver
'DATEPART' : 'f',
'DATEADD' : 'f',
'DATESERIAL' : 'f',
'DATEVALUE' : 'f',
'DATEFROMPARTS' : 'f',
'DATETIME2FROMPARTS' : 'f',
'DATETIMEFROMPARTS' : 'f',
# sqlserver
'DATETIMEOFFSETFROMPARTS' : 'f',
'DATE_ADD' : 'f',
'DATE_FORMAT' : 'f',
'DATE_PART' : 'f',
'DATE_SUB' : 'f',
'DATE_TRUNC' : 'f',
'DAY' : 'f',
'DAYNAME' : 'f',
'DAYOFMONTH' : 'f',
'DAYOFWEEK' : 'f',
'DAYOFYEAR' : 'f',
'DAY_HOUR' : 'k',
'DAY_MICROSECOND' : 'k',
'DAY_MINUTE' : 'k',
'DAY_SECOND' : 'k',
'DB_ID' : 'f',
'DB_NAME' : 'f',
'DEC' : 'k',
'DECIMAL' : 't',
# can only be used after a ';'
'DECLARE' : 'T',
'DECODE' : 'f',
'DECRYPTBYASMKEY' : 'f',
'DECRYPTBYCERT' : 'f',
'DECRYPTBYKEY' : 'f',
'DECRYPTBYKEYAUTOCERT' : 'f',
'DECRYPTBYPASSPHRASE' : 'f',
'DEFAULT' : 'k',
'DEGREES' : 'f',
'DELAY' : 'k',
'DELAYED' : 'k',
'DELETE' : 'T',
'DENSE_RANK' : 'f',
'DESC' : 'k',
'DESCRIBE' : 'k',
'DES_DECRYPT' : 'f',
'DES_ENCRYPT' : 'f',
'DETERMINISTIC' : 'k',
'DIFFERENCE' : 'f',
'DISTINCTROW' : 'k',
'DISTINCT' : 'k',
'DIV' : 'o',
'DOUBLE' : 't',
'DROP' : 'T',
'DUAL' : 'n',
'EACH' : 'k',
'ELSE' : 'k',
'ELSEIF' : 'k',
'ELT' : 'f',
'ENCLOSED' : 'k',
'ENCODE' : 'f',
'ENCRYPT' : 'f',
'ENCRYPTBYASMKEY' : 'f',
'ENCRYPTBYCERT' : 'f',
'ENCRYPTBYKEY' : 'f',
'ENCRYPTBYPASSPHRASE' : 'f',
#
# sqlserver
'EOMONTH' : 'f',
# pgsql
'ENUM_FIRST' : 'f',
'ENUM_LAST' : 'f',
'ENUM_RANGE' : 'f',
# special MS-ACCESS operator
# http://office.microsoft.com/en-001/access-help/table-of-operators-HA010235862.aspx
'EQV' : 'o',
'ESCAPED' : 'k',
# DB2, others..
# http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=%2Fsqlp%2Frbafykeyu.htm
'EXCEPT' : 'U',
# TBD
#'END' : 'k',
# 'EXEC', 'EXECUTE' - MSSQL
# http://msdn.microsoft.com/en-us/library/ms175046.aspx
'EXEC' : 'T',
'EXECUTE' : 'T',
'EXISTS' : 'f',
'EXIT' : 'k',
'EXP' : 'f',
'EXPLAIN' : 'k',
'EXPORT_SET' : 'f',
'EXTRACT' : 'f',
'EXTRACTVALUE' : 'f',
'EXTRACT_VALUE' : 'f',
'EVENTDATA' : 'f',
'FALSE' : '1',
'FETCH' : 'k',
'FIELD' : 'f',
'FILE_ID' : 'f',
'FILE_IDEX' : 'f',
'FILE_NAME' : 'f',
'FILEGROUP_ID' : 'f',
'FILEGROUP_NAME' : 'f',
'FILEGROUPPROPERTY' : 'f',
'FILEPROPERTY' : 'f',
'FIND_IN_SET' : 'f',
'FIRST_VALUE' : 'f',
'FLOAT' : 't',
'FLOAT4' : 't',
'FLOAT8' : 't',
'FLOOR' : 'f',
'FN_VIRTUALFILESTATS' : 'f',
'FORCE' : 'k',
'FOREIGN' : 'k',
'FOR' : 'n',
'FORMAT' : 'f',
'FOUND_ROWS' : 'f',
'FROM' : 'k',
# MySQL 5.6
'FROM_BASE64' : 'f',
'FROM_DAYS' : 'f',
'FROM_UNIXTIME' : 'f',
'FUNCTION' : 'k',
'FULLTEXT' : 'k',
'FULLTEXTCATALOGPROPERTY' : 'f',
'FULLTEXTSERVICEPROPERTY' : 'f',
# pgsql
'GENERATE_SERIES' : 'f',
# pgsql
'GENERATE_SUBSCRIPTS' : 'f',
# sqlserver
'GETDATE' : 'f',
# sqlserver
'GETUTCDATE' : 'f',
# pgsql
'GET_BIT' : 'f',
# pgsql
'GET_BYTE' : 'f',
'GET_FORMAT' : 'f',
'GET_LOCK' : 'f',
'GO' : 'T',
'GOTO' : 'T',
'GRANT' : 'k',
'GREATEST' : 'f',
'GROUP' : 'n',
'GROUPING' : 'f',
'GROUPING_ID' : 'f',
'GROUP_CONCAT' : 'f',
# MYSQL http://dev.mysql.com/doc/refman/5.6/en/handler.html
'HANDLER' : 'T',
'HAS_PERMS_BY_NAME' : 'f',
'HASHBYTES' : 'f',
#
# 'HAVING' - MSSQL
'HAVING' : 'B',
'HEX' : 'f',
'HIGH_PRIORITY' : 'k',
'HOUR' : 'f',
'HOUR_MICROSECOND' : 'k',
'HOUR_MINUTE' : 'k',
'HOUR_SECOND' : 'k',
# 'HOST_NAME' -- transact-sql
'HOST_NAME' : 'f',
'IDENT_CURRENT' : 'f',
'IDENT_INCR' : 'f',
'IDENT_SEED' : 'f',
'IDENTIFY' : 'f',
# 'IF - if is normally a function, except in TSQL
# http://msdn.microsoft.com/en-us/library/ms182717.aspx
'IF' : 'f',
'IF EXISTS' : 'f',
'IF NOT' :'n',
'IF NOT EXISTS' : 'f',
'IFF' : 'f',
'IFNULL' : 'f',
'IGNORE' : 'k',
'IIF' : 'f',
# IN is a special case.. sometimes a function, sometimes a keyword
# corrected inside the folding code
'IN' : 'k',
'INDEX' : 'k',
'INDEX_COL' : 'f',
'INDEXKEY_PROPERTY' : 'f',
'INDEXPROPERTY' : 'f',
'INET_ATON' : 'f',
'INET_NTOA' : 'f',
'INFILE' : 'k',
# pgsql
'INITCAP' : 'f',
'INNER' : 'k',
'INOUT' : 'k',
'INSENSITIVE' : 'k',
'INSERT' : 'E',
'INSERT INTO' : 'T',
'INSERT IGNORE' : 'E',
'INSERT LOW_PRIORITY INTO' : 'T',
'INSERT LOW_PRIORITY' : 'E',
'INSERT DELAYED INTO' : 'T',
'INSERT DELAYED' : 'E',
'INSERT HIGH_PRIORITY INTO' : 'T',
'INSERT HIGH_PRIORITY' : 'E',
'INSERT IGNORE INTO' : 'T',
'INSTR' : 'f',
'INSTRREV' : 'f',
'INT' : 't',
'INT1' : 't',
'INT2' : 't',
'INT3' : 't',
'INT4' : 't',
'INT8' : 't',
'INTEGER' : 't',
# INTERSECT - IBM DB2, others
# http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=%2Fsqlp%2Frbafykeyu.htm
'INTERSECT' : 'U',
'INTERVAL' : 'k',
'INTO' : 'k',
'IS' : 'o',
#sqlserver
'ISDATE' : 'f',
'ISEMPTY' : 'f',
# pgsql
'ISFINITE' : 'f',
'ISNULL' : 'f',
'ISNUMERIC' : 'f',
'IS_FREE_LOCK' : 'f',
#
# 'IS_MEMBER' - MSSQL
'IS_MEMBER' : 'f',
'IS_ROLEMEMBER' : 'f',
'IS_OBJECTSIGNED' : 'f',
# 'IS_SRV...' MSSQL
'IS_SRVROLEMEMBER' : 'f',
'IS_USED_LOCK' : 'f',
'ITERATE' : 'k',
'JOIN' : 'k',
'JULIANDAY' : 'f',
# pgsql
'JUSTIFY_DAYS' : 'f',
'JUSTIFY_HOURS' : 'f',
'JUSTIFY_INTERVAL' : 'f',
'KEY_ID' : 'f',
'KEY_GUID' : 'f',
'KEYS' : 'k',
'KILL' : 'k',
'LAG' : 'f',
'LAST_INSERT_ID' : 'f',
'LAST_INSERT_ROWID' : 'f',
'LAST_VALUE' : 'f',
'LASTVAL' : 'f',
'LCASE' : 'f',
'LEAD' : 'f',
'LEADING' : 'k',
'LEAST' : 'f',
'LEAVE' : 'k',
'LEFT' : 'n',
'LENGTH' : 'f',
'LIKE' : 'o',
'LIMIT' : 'B',
'LINEAR' : 'k',
'LINES' : 'k',
'LN' : 'f',
'LOAD' : 'k',
'LOAD_EXTENSION' : 'f',
'LOAD_FILE' : 'f',
# MYSQL http://dev.mysql.com/doc/refman/5.6/en/load-data.html
'LOAD DATA' : 'T',
'LOAD XML' : 'T',
# MYSQL function vs. variable
'LOCALTIME' : 'v',
'LOCALTIMESTAMP' : 'v',
'LOCATE' : 'f',
'LOCK' : 'n',
'LOG' : 'f',
'LOG10' : 'f',
'LOG2' : 'f',
'LONGBLOB' : 'k',
'LONGTEXT' : 'k',
'LOOP' : 'k',
'LOWER' : 'f',
'LOWER_INC' : 'f',
'LOWER_INF' : 'f',
'LOW_PRIORITY' : 'k',
'LPAD' : 'f',
'LTRIM' : 'f',
'MAKEDATE' : 'f',
'MAKE_SET' : 'f',
'MASKLEN' : 'f',
'MASTER_BIND' : 'k',
'MASTER_POS_WAIT' : 'f',
'MASTER_SSL_VERIFY_SERVER_CERT': 'k',
'MATCH' : 'k',
'MAX' : 'f',
'MAXVALUE' : 'k',
'MD5' : 'f',
'MEDIUMBLOB' : 'k',
'MEDIUMINT' : 'k',
'MEDIUMTEXT' : 'k',
'MERGE' : 'k',
'MICROSECOND' : 'f',
'MID' : 'f',
'MIDDLEINT' : 'k',
'MIN' : 'f',
'MINUTE' : 'f',
'MINUTE_MICROSECOND' : 'k',
'MINUTE_SECOND' : 'k',
'MOD' : 'o',
'MODE' : 'n',
'MODIFIES' : 'k',
'MONEY' : 't',
'MONTH' : 'f',
'MONTHNAME' : 'f',
'NAME_CONST' : 'f',
'NATURAL' : 'n',
'NETMASK' : 'f',
'NEXTVAL' : 'f',
'NOT' : 'o', # UNARY OPERATOR
'NOTNULL' : 'k',
'NOW' : 'f',
# oracle http://www.shift-the-oracle.com/sql/select-for-update.html
'NOWAIT' : 'k',
'NO_WRITE_TO_BINLOG' : 'k',
'NTH_VALUE' : 'f',
'NTILE' : 'f',
# NULL is treated as "variable" type
# Sure it's a keyword, but it's really more
# like a number or value.
# but we don't want it folded away
# since it's a good indicator of SQL
# ('true' and 'false' are also similar)
'NULL' : 'v',
# unknown is mysql keyword, again treat
# as 'v' type
'UNKNOWN' : 'v',
'NULLIF' : 'f',
'NUMERIC' : 't',
# MSACCESS
'NZ' : 'f',
'OBJECT_DEFINITION' : 'f',
'OBJECT_ID' : 'f',
'OBJECT_NAME' : 'f',
'OBJECT_SCHEMA_NAME' : 'f',
'OBJECTPROPERTY' : 'f',
'OBJECTPROPERTYEX' : 'f',
'OCT' : 'f',
'OCTET_LENGTH' : 'f',
'OFFSET' : 'k',
'OID' : 't',
'OLD_PASSWORD' : 'f',
# need to investigate how used
#'ON' : 'k',
'ONE_SHOT' : 'k',
# obviously not SQL but used in attacks
'OWN3D' : 'k',
# 'OPEN'
# http://msdn.microsoft.com/en-us/library/ms190500.aspx
'OPEN' : 'k',
# 'OPENDATASOURCE'
# http://msdn.microsoft.com/en-us/library/ms179856.aspx
'OPENDATASOURCE' : 'f',
'OPENXML' : 'f',
'OPENQUERY' : 'f',
'OPENROWSET' : 'f',
'OPTIMIZE' : 'k',
'OPTION' : 'k',
'OPTIONALLY' : 'k',
'OR' : '&',
'ORD' : 'f',
'ORDER' : 'n',
'ORIGINAL_DB_NAME' : 'f',
'ORIGINAL_LOGIN' : 'f',
'OUT' : 'k',
'OUTER' : 'n',
'OUTFILE' : 'k',
# unusual PGSQL operator that looks like a function
'OVERLAPS' : 'f',
# pgsql
'OVERLAY' : 'f',
'PARSENAME' : 'f',
'PARTITION' : 'k',
# 'PARTITION BY' IBM DB2
# http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=%2Fsqlp%2Frbafykeyu.htm
'PARTITION BY' : 'B',
# keyword "SET PASSWORD", and a function
'PASSWORD' : 'n',
'PATINDEX' : 'f',
'PATHINDEX' : 'f',
'PERCENT_RANK' : 'f',
'PERCENTILE_COUNT' : 'f',
'PERCENTILE_DISC' : 'f',
'PERCENTILE_RANK' : 'f',
'PERIOD_ADD' : 'f',
'PERIOD_DIFF' : 'f',
'PERMISSIONS' : 'f',
'PG_ADVISORY_LOCK' : 'f',
'PG_BACKEND_PID' : 'f',
'PG_CANCEL_BACKEND' : 'f',
'PG_CREATE_RESTORE_POINT' : 'f',
'PG_RELOAD_CONF' : 'f',
'PG_CLIENT_ENCODING' : 'f',
'PG_CONF_LOAD_TIME' : 'f',
'PG_LISTENING_CHANNELS' : 'f',
'PG_HAS_ROLE' : 'f',
'PG_IS_IN_RECOVERY' : 'f',
'PG_IS_OTHER_TEMP_SCHEMA' : 'f',
'PG_LS_DIR' : 'f',
'PG_MY_TEMP_SCHEMA' : 'f',
'PG_POSTMASTER_START_TIME' : 'f',
'PG_READ_FILE' : 'f',
'PG_READ_BINARY_FILE' : 'f',
'PG_ROTATE_LOGFILE' : 'f',
'PG_STAT_FILE' : 'f',
'PG_SLEEP' : 'f',
'PG_START_BACKUP' : 'f',
'PG_STOP_BACKUP' : 'f',
'PG_SWITCH_XLOG' : 'f',
'PG_TERMINATE_BACKEND' : 'f',
'PG_TRIGGER_DEPTH' : 'f',
'PI' : 'f',
'POSITION' : 'f',
'POW' : 'f',
'POWER' : 'f',
'PRECISION' : 'k',
# http://msdn.microsoft.com/en-us/library/ms176047.aspx
'PRINT' : 'T',
'PRIMARY' : 'k',
'PROCEDURE' : 'k',
'PROCEDURE ANALYSE' : 'f',
'PUBLISHINGSERVERNAME' : 'f',
'PURGE' : 'k',
'PWDCOMPARE' : 'f',
'PWDENCRYPT' : 'f',
'QUARTER' : 'f',
'QUOTE' : 'f',
# pgsql
'QUOTE_IDENT' : 'f',
'QUOTENAME' : 'f',
# pgsql
'QUOTE_LITERAL' : 'f',
# pgsql
'QUOTE_NULLABLE' : 'f',
'RADIANS' : 'f',
'RAND' : 'f',
'RANDOM' : 'f',
# http://msdn.microsoft.com/en-us/library/ms178592.aspx
'RAISEERROR' : 'E',
# 'RANDOMBLOB' - sqlite3
'RANDOMBLOB' : 'f',
'RANGE' : 'k',
'RANK' : 'f',
'READ' : 'k',
'READS' : 'k',
'READ_WRITE' : 'k',
# 'REAL' only used in data definition
'REAL' : 't',
'REFERENCES' : 'k',
# pgsql, mariadb
'REGEXP' : 'o',
'REGEXP_INSTR' : 'f',
'REGEXP_REPLACE' : 'f',
'REGEXP_MATCHES' : 'f',
'REGEXP_SUBSTR' : 'f',
'REGEXP_SPLIT_TO_TABLE' : 'f',
'REGEXP_SPLIT_TO_ARRAY' : 'f',
'REGPROC' : 't',
'REGPROCEDURE' : 't',
'REGOPER' : 't',
'REGOPERATOR' : 't',
'REGCLASS' : 't',
'REGTYPE' : 't',
'REGCONFIG' : 't',
'REGDICTIONARY' : 't',
'RELEASE' : 'k',
'RELEASE_LOCK' : 'f',
'RENAME' : 'k',
'REPEAT' : 'k',
# keyword and function
'REPLACE' : 'k',
'REPLICATE' : 'f',
'REQUIRE' : 'k',
'RESIGNAL' : 'k',
'RESTRICT' : 'k',
'RETURN' : 'k',
'REVERSE' : 'f',
'REVOKE' : 'k',
# RIGHT JOIN vs. RIGHT()
# tricky since it's a function in pgsql
# needs review
'RIGHT' : 'n',
'RLIKE' : 'o',
'ROUND' : 'f',
'ROW' : 'f',
'ROW_COUNT' : 'f',
'ROW_NUMBER' : 'f',
'ROW_TO_JSON' : 'f',
'RPAD' : 'f',
'RTRIM' : 'f',
'SCHEMA' : 'k',
'SCHEMA_ID' : 'f',
'SCHAMA_NAME' : 'f',
'SCHEMAS' : 'k',
'SCOPE_IDENTITY' : 'f',
'SECOND_MICROSECOND' : 'k',
'SEC_TO_TIME' : 'f',
'SELECT' : 'E',
'SENSITIVE' : 'k',
'SEPARATOR' : 'k',
'SERIAL' : 't',
'SERIAL2' : 't',
'SERIAL4' : 't',
'SERIAL8' : 't',
'SERVERPROPERTY' : 'f',
'SESSION_USER' : 'f',
'SET' : 'E',
'SETSEED' : 'f',
'SETVAL' : 'f',
'SET_BIT' : 'f',
'SET_BYTE' : 'f',
'SET_CONFIG' : 'f',
'SET_MASKLEN' : 'f',
'SHA' : 'f',
'SHA1' : 'f',
'SHA2' : 'f',
#'SHOW' : 'n',
'SHOW' : 'k',
'SHUTDOWN' : 'T',
'SIGN' : 'f',
'SIGNBYASMKEY' : 'f',
'SIGNBYCERT' : 'f',
'SIGNAL' : 'k',
'SIMILAR' : 'k',
'SIN' : 'f',
'SLEEP' : 'f',
#
# sqlserver
'SMALLDATETIMEFROMPARTS' : 'f',
'SMALLINT' : 't',
'SMALLSERIAL' : 't',
# SOME -- acts like a function
# http://dev.mysql.com/doc/refman/5.0/en/any-in-some-subqueries.html
'SOME' : 'f',
'SOUNDEX' : 'f',
'SOUNDS' : 'o',
'SPACE' : 'f',
'SPATIAL' : 'k',
'SPECIFIC' : 'k',
'SPLIT_PART' : 'f',
'SQL' : 'k',
'SQLEXCEPTION' : 'k',
'SQLSTATE' : 'k',
'SQLWARNING' : 'k',
'SQL_BIG_RESULT' : 'k',
'SQL_BUFFER_RESULT' : 'k',
'SQL_CACHE' : 'k',
'SQL_CALC_FOUND_ROWS' : 'k',
'SQL_NO_CACHE' : 'k',
'SQL_SMALL_RESULT' : 'k',
'SQL_VARIANT_PROPERTY' : 'f',
'SQRT' : 'f',
'SSL' : 'k',
'STARTING' : 'k',
#pgsql
'STATEMENT_TIMESTAMP' : 'f',
'STATS_DATE' : 'f',
'STDDEV' : 'f',
'STDDEV_POP' : 'f',
'STDDEV_SAMP' : 'f',
'STRAIGHT_JOIN' : 'k',
'STRCMP' : 'f',
# STRCOMP: MS ACCESS
'STRCOMP' : 'f',
'STRCONV' : 'f',
# pgsql
'STRING_AGG' : 'f',
'STRING_TO_ARRAY' : 'f',
'STRPOS' : 'f',
'STR_TO_DATE' : 'f',
'STUFF' : 'f',
'SUBDATE' : 'f',
'SUBSTR' : 'f',
'SUBSTRING' : 'f',
'SUBSTRING_INDEX' : 'f',
'SUBTIME' : 'f',
'SUM' : 'f',
'SUSER_ID' : 'f',
'SUSER_SID' : 'f',
'SUSER_SNAME' : 'f',
'SUSER_NAME' : 'f',
'SYSDATE' : 'f',
# sql server
'SYSDATETIME' : 'f',
# sql server
'SYSDATETIMEOFFSET' : 'f',
# 'SYSCOLUMNS'
# http://msdn.microsoft.com/en-us/library/aa26039s8(v=sql.80).aspx
'SYSCOLUMNS' : 'k',
# 'SYSOBJECTS'
# http://msdn.microsoft.com/en-us/library/aa260447(v=sql.80).aspx
'SYSOBJECTS' : 'k',
# 'SYSUSERS' - MSSQL
# TBD
'SYSUSERS' : 'k',
# sqlserver
'SYSUTCDATETME' : 'f',
'SYSTEM_USER' : 'f',
'SWITCHOFFET' : 'f',
# 'TABLE'
# because SQLi really can't use 'TABLE'
'TABLE' : 'k',
'TAN' : 'f',
'TERMINATED' : 'k',
'TERTIARY_WEIGHTS' : 'f',
'TEXT' : 't',
# TEXTPOS PGSQL 6.0
# remnamed to strpos in 7.0
# http://www.postgresql.org/message-id/20000601091055.A20245@rice.edu
'TEXTPOS' : 'f',
'TEXTPTR' : 'f',
'TEXTVALID' : 'f',
'THEN' : 'k',
# TBD
'TIME' : 'k',
'TIMEDIFF' : 'f',
'TIMEFROMPARTS' : 'f',
# pgsql
'TIMEOFDAY' : 'f',
# ms access
'TIMESERIAL' : 'f',
'TIMEVALUE' : 'f',
'TIMESTAMP' : 't',
'TIMESTAMPADD' : 'f',
'TIME_FORMAT' : 'f',
'TIME_TO_SEC' : 'f',
'TINYBLOB' : 'k',
'TINYINT' : 'k',
'TINYTEXT' : 'k',
#
# sqlserver
'TODATETIMEOFFSET' : 'f',
# pgsql
'TO_ASCII' : 'f',
# MySQL 5.6
'TO_BASE64' : 'f',
# 'TO_CHAR' -- oracle, pgsql
'TO_CHAR' : 'f',
# pgsql
'TO_HEX' : 'f',
'TO_DAYS' : 'f',
'TO_DATE' : 'f',
'TO_NUMBER' : 'f',
'TO_SECONDS' : 'f',
'TO_TIMESTAMP' : 'f',
# sqlite3
'TOTAL' : 'f',
'TOTAL_CHANGES' : 'f',
'TOP' : 'k',
# 'TRAILING' -- only used in TRIM(TRAILING
# http://www.w3resource.com/sql/character-functions/trim.php
'TRAILING' : 'n',
# pgsql
'TRANSACTION_TIMESTAMP' : 'f',
'TRANSLATE' : 'f',
'TRIGGER' : 'k',
'TRIGGER_NESTLEVEL' : 'f',
'TRIM' : 'f',
'TRUE' : '1',
'TRUNC' : 'f',
'TRUNCATE' : 'f',
'TRY_CAST' : 'f',
'TRY_CONVERT' : 'f',
'TRY_PARSE' : 'f',
'TYPE_ID' : 'f',
'TYPE_NAME' : 'f',
'TYPEOF' : 'f',
'TYPEPROPERTY' : 'f',
'UCASE' : 'f',
# pgsql -- used in weird unicode string
# it's an operator so its' gets folded away
'UESCAPE' : 'o',
'UNCOMPRESS' : 'f',
'UNCOMPRESS_LENGTH' : 'f',
'UNDO' : 'k',
'UNHEX' : 'f',
'UNICODE' : 'f',
'UNION' : 'U',
# 'UNI_ON' -- odd variation that comes up
'UNI_ON' : 'U',
# 'UNIQUE'
# only used as a function (DB2) or as "CREATE UNIQUE"
'UNIQUE' : 'n',
'UNIX_TIMESTAMP' : 'f',
'UNLOCK' : 'k',
'UNNEST' : 'f',
'UNSIGNED' : 'k',
'UPDATE' : 'E',
'UPDATEXML' : 'f',
'UPPER' : 'f',
'UPPER_INC' : 'f',
'UPPER_INF' : 'f',
'USAGE' : 'k',
'USE' : 'T',
# transact-sql function
# however treating as a 'none' type
# since 'user_id' is such a common column name
# TBD
'USER_ID' : 'n',
'USER_NAME' : 'n',
# 'USER' -- a MySQL function
# handled in folding step
'USER' : 'n',
'USING' : 'f',
# next 3 TBD
'UTC_DATE' : 'k',
'UTC_TIME' : 'k',
'UTC_TIMESTAMP' : 'k',
'UUID' : 'f',
'UUID_SHORT' : 'f',
'VALUES' : 'k',
'VARBINARY' : 'k',
'VARCHAR' : 't',
'VARCHARACTER' : 'k',
'VARIANCE' : 'f',
'VAR' : 'f',
'VARP' : 'f',
'VARYING' : 'k',
'VAR_POP' : 'f',
'VAR_SAMP' : 'f',
'VERIFYSIGNEDBYASMKEY' : 'f',
'VERIFYSIGNEDBYCERT' : 'f',
'VERSION' : 'f',
'VOID' : 't',
# oracle http://www.shift-the-oracle.com/sql/select-for-update.html
'WAIT' : 'k',
'WAITFOR' : 'n',
'WEEK' : 'f',
'WEEKDAY' : 'f',
'WEEKDAYNAME' : 'f',
'WEEKOFYEAR' : 'f',
'WHEN' : 'k',
'WHERE' : 'k',
'WHILE' : 'T',
# pgsql
'WIDTH_BUCKET' : 'f',
# it's a keyword, but it's too ordinary in English
'WITH' : 'n',
# XML... oracle, pgsql
'XMLAGG' : 'f',
'XMLELEMENT' : 'f',
'XMLCOMMENT' : 'f',
'XMLCONCAT' : 'f',
'XMLFOREST' : 'f',
'XMLFORMAT' : 'f',
'XMLTYPE' : 'f',
'XMLPI' : 'f',
'XMLROOT' : 'f',
'XMLEXISTS' : 'f',
'XML_IS_WELL_FORMED' : 'f',
'XPATH' : 'f',
'XPATH_EXISTS' : 'f',
'XOR' : '&',
'XP_EXECRESULTSET' : 'k',
'YEAR' : 'f',
'YEARWEEK' : 'f',
'YEAR_MONTH' : 'k',
'ZEROBLOB' : 'f',
'ZEROFILL' : 'k',
'DBMS_LOCK.SLEEP' : 'f',
'USER_LOCK.SLEEP' : 'f',
#
'!=': 'o', # oracle
'||': '&',
'&&': '&',
'>=': 'o',
'>>': 'o',
'<=': 'o',
'<>': 'o',
':=': 'o',
'::': 'o',
'<<': 'o',
'!<': 'o', # http://msdn.microsoft.com/en-us/library/ms188074.aspx
'!>': 'o', # http://msdn.microsoft.com/en-us/library/ms188074.aspx
'+=': 'o',
'-=': 'o',
'*=': 'o',
'/=': 'o',
'%=': 'o',
'|=': 'o',
'&=': 'o',
'^=': 'o',
'|/': 'o', # http://www.postgresql.org/docs/9.1/static/functions-math.html
'!!': 'o', # http://www.postgresql.org/docs/9.1/static/functions-math.html
'~*': 'o', # http://www.postgresql.org/docs/9.1/static/functions-matching.html
# problematic since ! and ~ are both unary operators in other db engines
# converting to one unary operator is probably ok
# '!~', # http://www.postgresql.org/docs/9.1/static/functions-matching.html
'@>': 'o',
'<@': 'o',
# '!~*'
# pgsql "AT TIME ZONE"
'AT TIME' : 'n',
'AT TIME ZONE' : 'k',
'IN BOOLEAN' : 'n',
'IN BOOLEAN MODE' : 'k',
# IS DISTINCT - IBM DB2
# http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=%2Fsqlp%2Frbafykeyu.htm
'IS DISTINCT FROM' : 'o',
'IS DISTINCT' : 'n',
'IS NOT DISTINCT FROM' : 'o',
'IS NOT DISTINCT' : 'n',
'CROSS JOIN' : 'k',
'INNER JOIN' : 'k',
'ALTER DOMAIN' : 'k',
'ALTER TABLE' : 'k',
'GROUP BY' : 'B',
'ORDER BY' : 'B',
'OWN3D BY' : 'B',
'READ WRITE' : 'k',
# 'LOCAL TABLE' pgsql/oracle
# http://www.postgresql.org/docs/current/static/sql-lock.html
'LOCK TABLE' : 'k',
# 'LOCK TABLES' MYSQL
# http://dev.mysql.com/doc/refman/4.1/en/lock-tables.html
'LOCK TABLES' : 'k',
'LEFT OUTER' : 'k',
'LEFT OUTER JOIN' : 'k',
'LEFT JOIN' : 'k',
'RIGHT OUTER' : 'k',
'RIGHT OUTER JOIN' : 'k',
'RIGHT JOIN' : 'k',
# http://technet.microsoft.com/en-us/library/ms187518(v=sql.105).aspx
'FULL JOIN' : 'k',
'FULL OUTER' : 'k',
'FULL OUTER JOIN' : 'k',
'NATURAL JOIN' : 'k',
'NATURAL INNER' : 'k',
'NATURAL OUTER' : 'k',
'NATURAL LEFT' : 'k',
'NATURAL LEFT OUTER': 'k',
'NATURAL LEFT OUTER JOIN': 'k',
'NATURAL RIGHT OUTER JOIN': 'k',
'NATURAL FULL OUTER JOIN': 'k',
'NATURAL RIGHT' : 'k',
'NATURAL FULL' : 'k',
'SOUNDS LIKE' : 'o',
'IS NOT' : 'o',
# IBM DB2
# http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=%2Fsqlp%2Frbafykeyu.htm
'NEXT VALUE' : 'n',
'NEXT VALUE FOR' : 'k',
'PREVIOUS VALUE' : 'n',
'PREVIOUS VALUE FOR' : 'k',
'NOT LIKE' : 'o',
'NOT BETWEEN' : 'o',
'NOT SIMILAR' : 'o',
# 'NOT RLIKE' -- MySQL
'NOT RLIKE' : 'o',
'NOT REGEXP' : 'o',
'NOT IN' : 'k',
'SIMILAR TO' : 'o',
'NOT SIMILAR TO' : 'o',
'SELECT DISTINCT' : 'E',
'UNION ALL' : 'U',
'UNION DISTINCT' : 'U',
'UNION DISTINCT ALL' : 'U',
'UNION ALL DISTINCT' : 'U',
# INTO..
# http://dev.mysql.com/doc/refman/5.0/en/select.html
'INTO OUTFILE' : 'k',
'INTO DUMPFILE' : 'k',
'WAITFOR DELAY' : 'E',
'WAITFOR TIME' : 'E',
'WAITFOR RECEIVE' : 'E',
'WITH ROLLUP' : 'k',
# 'INTERSECT ALL' -- ORACLE
'INTERSECT ALL' : 'U',
# hacker mistake
'SELECT ALL' : 'E',
# types
'DOUBLE PRECISION': 't',
'CHARACTER VARYING': 't',
# MYSQL
# http://dev.mysql.com/doc/refman/5.1/en/innodb-locking-reads.html
'LOCK IN': 'n',
'LOCK IN SHARE': 'n',
'LOCK IN SHARE MODE': 'k',
# MYSQL
# http://dev.mysql.com/doc/refman/5.1/en/innodb-locking-reads.html
'FOR UPDATE': 'k',
# TSQL (MS)
# http://msdn.microsoft.com/en-us/library/ms175046.aspx
'EXECUTE AS': 'E',
'EXECUTE AS LOGIN': 'E',
# ORACLE
# http://www.shift-the-oracle.com/sql/select-for-update.html
'FOR UPDATE OF': 'k',
'FOR UPDATE WAIT': 'k',
'FOR UPDATE NOWAIT': 'k',
'FOR UPDATE SKIP': 'k',
'FOR UPDATE SKIP LOCKED': 'k'
}
CHARMAP = [
'CHAR_WHITE', # 0
'CHAR_WHITE', # 1
'CHAR_WHITE', # 2
'CHAR_WHITE', # 3
'CHAR_WHITE', # 4
'CHAR_WHITE', # 5
'CHAR_WHITE', # 6
'CHAR_WHITE', # 7
'CHAR_WHITE', # 8
'CHAR_WHITE', # 9
'CHAR_WHITE', # 10
'CHAR_WHITE',
'CHAR_WHITE',
'CHAR_WHITE',
'CHAR_WHITE',
'CHAR_WHITE',
'CHAR_WHITE',
'CHAR_WHITE',
'CHAR_WHITE',
'CHAR_WHITE',
'CHAR_WHITE', # 20
'CHAR_WHITE',
'CHAR_WHITE',
'CHAR_WHITE',
'CHAR_WHITE',
'CHAR_WHITE',
'CHAR_WHITE',
'CHAR_WHITE',
'CHAR_WHITE',
'CHAR_WHITE',
'CHAR_WHITE', # 30
'CHAR_WHITE', # 31
'CHAR_WHITE', # 32
'CHAR_BANG', # 33 !
'CHAR_STR', # 34 "
'CHAR_HASH', # 35 "#"
'CHAR_MONEY', # 36 $
'CHAR_OP1', # 37 %
'CHAR_OP2', # 38 &
'CHAR_STR', # 39 '
'CHAR_LEFTPARENS', # 40 (
'CHAR_RIGHTPARENS', # 41 )
'CHAR_OP2', # 42 *
'CHAR_UNARY', # 43 +
'CHAR_COMMA', # 44 ,
'CHAR_DASH', # 45 -
'CHAR_NUM', # 46 .
'CHAR_SLASH', # 47 /
'CHAR_NUM', # 48 0
'CHAR_NUM', # 49 1
'CHAR_NUM', # 50 2
'CHAR_NUM', # 51 3
'CHAR_NUM', # 52 4
'CHAR_NUM', # 53 5
'CHAR_NUM', # 54 6
'CHAR_NUM', # 55 7
'CHAR_NUM', # 56 8
'CHAR_NUM', # 57 9
'CHAR_OP2', # 58 : colon
'CHAR_SEMICOLON', # 59 ; semiclon
'CHAR_OP2', # 60 <
'CHAR_OP2', # 61 =
'CHAR_OP2', # 62 >
'CHAR_OTHER', # 63 ? BEEP BEEP
'CHAR_VAR', # 64 @
'CHAR_WORD', # 65 A
'CHAR_BSTRING', # 66 B
'CHAR_WORD', # 67 C
'CHAR_WORD', # 68 D
'CHAR_ESTRING', # 69 E
'CHAR_WORD', # 70 F
'CHAR_WORD', # 71 G
'CHAR_WORD', # 72 H
'CHAR_WORD', # 73 I
'CHAR_WORD', # 74 J
'CHAR_WORD', # 75 K
'CHAR_WORD', # 76 L
'CHAR_WORD', # 77 M
'CHAR_NQSTRING', # 78 N
'CHAR_WORD', # 79 O
'CHAR_WORD', # 80 P
'CHAR_QSTRING', # 81 Q
'CHAR_WORD', # 82 R
'CHAR_WORD', # 83 S
'CHAR_WORD', # 84 T
'CHAR_USTRING', # 85 U special pgsql unicode
'CHAR_WORD', # 86 V
'CHAR_WORD', # 87 W
'CHAR_XSTRING', # 88 X
'CHAR_WORD', # 89 Y
'CHAR_WORD', # 90 Z
'CHAR_BWORD', # 91 [ B for Bracket, for Microsoft SQL SERVER
'CHAR_BACK', # 92 \\
'CHAR_OTHER', # 93 ]
'CHAR_OP1', # 94 ^
'CHAR_WORD', # 95 _ underscore
'CHAR_TICK', # 96 ` backtick
'CHAR_WORD', # 97 a
'CHAR_BSTRING', # 98 b
'CHAR_WORD', # 99 c
'CHAR_WORD', # 100 d
'CHAR_ESTRING', # 101 e
'CHAR_WORD', # 102 f
'CHAR_WORD', # 103 g
'CHAR_WORD', # 104 h
'CHAR_WORD', # 105 i
'CHAR_WORD', # 106 j
'CHAR_WORD', # 107 k
'CHAR_WORD', # 108 l
'CHAR_WORD', # 109 m
'CHAR_NQSTRING', # 110 n special oracle code
'CHAR_WORD', # 111 o
'CHAR_WORD', # 112 p
'CHAR_QSTRING', # 113 q special oracle code
'CHAR_WORD', # 114 r
'CHAR_WORD', # 115 s
'CHAR_WORD', # 116 t
'CHAR_USTRING', # 117 u special pgsql unicode
'CHAR_WORD', # 118 v
'CHAR_WORD', # 119 w
'CHAR_XSTRING', # 120 x
'CHAR_WORD', # 121 y
'CHAR_WORD', # 122 z
'CHAR_LEFTBRACE', # 123 { left brace
'CHAR_OP2', # 124 | pipe
'CHAR_RIGHTBRACE', # 125 } right brace
'CHAR_UNARY', # 126 ~
'CHAR_WHITE', # 127
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD', # 130
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD', #140
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD', #150
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WHITE', #160 0xA0 latin1 whitespace
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD', #170
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD', #180
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD', #190
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD', #200
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD', #210
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD', #220
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD', #230
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD', #240
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD', #250
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD',
'CHAR_WORD'
]
import json
def get_fingerprints():
"""
fingerprints are stored in plain text file, one fingerprint per file
the result is sorted
"""
with open('fingerprints.txt', 'r') as lines:
sqlipat = [line.strip() for line in lines]
return sorted(sqlipat)
def dump():
"""
generates a JSON file, sorted keys
"""
objs = {
'keywords': KEYWORDS,
'charmap': CHARMAP,
'fingerprints': get_fingerprints()
}
return json.dumps(objs, sort_keys=True, indent=4)
if __name__ == '__main__':
import sys
if len(CHARMAP) != 256:
sys.stderr.write("Assert failed: charmap is %d characters\n" % len(CHARMAP))
sys.exit(1)
print dump()
# pylint: disable=C0301,C0302