正则表达式/解析 PostgreSQL 名称

vit*_*y-t 4 regex sql postgresql node.js

通过 PostgreSQL名称和标识符,我试图找出以下内容:

\n\n

是否可以实现正则表达式(或以其他方式解析它)来检查 PostgreSQL 名称/标识符是否需要用双引号引起来?如果可能的话,还要检查它是否是 Unicode 样式的名称。

\n\n

我需要将标识符名称注入 SQL 查询中,并且仅当名称需要时,我才想将其括在双引号中,因为我读到,在不需要的地方添加引号实际上会更改名称格式(请参阅下面的更新) )。

\n\n

更新1:

\n\n

最终,我需要实现以下功能:

\n\n
function prepareSQLName(name) {\n\n    if (/* this is a regular name*/) {\n        return name;\n    }\n\n    if (/* this is a unicode name */) {\n        return \'U&"\' + name + \'"\';\n    } else {\n        /* needs double quotes only */\n        return \'"\' + name + \'"\';\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

主要关注点之一 - 处理非英文名称。例如,以下是一个完全有效的 PostgreSQL(俄语),不需要将任何内容括在双引号中:

\n\n
create table \xd0\xb6\xd0\xb8\xd1\x80\xd0\xb0\xd1\x84\xd1\x8b(\xd0\xb2\xd0\xb5\xd1\x81 int, \xd1\x80\xd0\xbe\xd1\x81\xd1\x82 int, \xd0\xb2\xd0\xbe\xd0\xb7\xd1\x80\xd0\xb0\xd1\x81\xd1\x82 int, \xd0\xb8\xd0\xbc\xd1\x8f text);\nselect \xd0\xb8\xd0\xbc\xd1\x8f, \xd0\xb2\xd0\xb5\xd1\x81 from \xd0\xb6\xd0\xb8\xd1\x80\xd0\xb0\xd1\x84\xd1\x8b order by \xd1\x80\xd0\xbe\xd1\x81\xd1\x82;\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新2:

\n\n

举例说明为什么它如此重要......

\n\n
CREATE TABLE Test1(name text);\n\n-- can be queried as:\nSELECT * FROM Test1\nSELECT * FROM test1\nSELECT * FROM "test1"\n\n-- but not as:\nSELECT * FROM "Test1"\n
Run Code Online (Sandbox Code Playgroud)\n\n

另一个:

\n\n
CREATE TABLE "Test2"(name text);\n\n-- can be queried only as:\nSELECT * FROM "Test2"\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于 Unicode 格式的名称(需要U&在前面),情况会变得更加棘手。

\n

Sas*_*sha 5

var XRegExp = require(\'xregexp\');\n\nvar isUnquotedIdentifier = new XRegExp(\'^[\\pL_][\\pL\\pM_0-9$]*$\');\nvar reservedWords = new Set([\'A\', \'ABORT\', \'ABS\', \'ABSENT\', \'ABSOLUTE\', \'ACCESS\', \'ACCORDING\', \'ACTION\', \'ADA\', \'ADD\', \'ADMIN\', \'AFTER\', \'AGGREGATE\', \'ALL\', \'ALLOCATE\', \'ALSO\', \'ALTER\', \'ALWAYS\', \'ANALYSE\', \'ANALYZE\', \'AND\', \'ANY\', \'ARE\', \'ARRAY\', \'ARRAY_AGG\', \'ARRAY_MAX_CARDINALITY\', \'AS\', \'ASC\', \'ASENSITIVE\', \'ASSERTION\', \'ASSIGNMENT\', \'ASYMMETRIC\', \'AT\', \'ATOMIC\', \'ATTRIBUTE\', \'ATTRIBUTES\', \'AUTHORIZATION\', \'AVG\', \'BACKWARD\', \'BASE64\', \'BEFORE\', \'BEGIN\', \'BEGIN_FRAME\', \'BEGIN_PARTITION\', \'BERNOULLI\', \'BETWEEN\', \'BIGINT\', \'BINARY\', \'BIT\', \'BIT_LENGTH\', \'BLOB\', \'BLOCKED\', \'BOM\', \'BOOLEAN\', \'BOTH\', \'BREADTH\', \'BY\', \'C\', \'CACHE\', \'CALL\', \'CALLED\', \'CARDINALITY\', \'CASCADE\', \'CASCADED\', \'CASE\', \'CAST\', \'CATALOG\', \'CATALOG_NAME\', \'CEIL\', \'CEILING\', \'CHAIN\', \'CHAR\', \'CHARACTER\', \'CHARACTERISTICS\', \'CHARACTERS\', \'CHARACTER_LENGTH\', \'CHARACTER_SET_CATALOG\', \'CHARACTER_SET_NAME\', \'CHARACTER_SET_SCHEMA\', \'CHAR_LENGTH\', \'CHECK\', \'CHECKPOINT\', \'CLASS\', \'CLASS_ORIGIN\', \'CLOB\', \'CLOSE\', \'CLUSTER\', \'COALESCE\', \'COBOL\', \'COLLATE\', \'COLLATION\', \'COLLATION_CATALOG\', \'COLLATION_NAME\', \'COLLATION_SCHEMA\', \'COLLECT\', \'COLUMN\', \'COLUMNS\', \'COLUMN_NAME\', \'COMMAND_FUNCTION\', \'COMMAND_FUNCTION_CODE\', \'COMMENT\', \'COMMENTS\', \'COMMIT\', \'COMMITTED\', \'CONCURRENTLY\', \'CONDITION\', \'CONDITION_NUMBER\', \'CONFIGURATION\', \'CONFLICT\', \'CONNECT\', \'CONNECTION\', \'CONNECTION_NAME\', \'CONSTRAINT\', \'CONSTRAINTS\', \'CONSTRAINT_CATALOG\', \'CONSTRAINT_NAME\', \'CONSTRAINT_SCHEMA\', \'CONSTRUCTOR\', \'CONTAINS\', \'CONTENT\', \'CONTINUE\', \'CONTROL\', \'CONVERSION\', \'CONVERT\', \'COPY\', \'CORR\', \'CORRESPONDING\', \'COST\', \'COUNT\', \'COVAR_POP\', \'COVAR_SAMP\', \'CREATE\', \'CROSS\', \'CSV\', \'CUBE\', \'CUME_DIST\', \'CURRENT\', \'CURRENT_CATALOG\', \'CURRENT_DATE\', \'CURRENT_DEFAULT_TRANSFORM_GROUP\', \'CURRENT_PATH\', \'CURRENT_ROLE\', \'CURRENT_ROW\', \'CURRENT_SCHEMA\', \'CURRENT_TIME\', \'CURRENT_TIMESTAMP\', \'CURRENT_TRANSFORM_GROUP_FOR_TYPE\', \'CURRENT_USER\', \'CURSOR\', \'CURSOR_NAME\', \'CYCLE\', \'DATA\', \'DATABASE\', \'DATALINK\', \'DATE\', \'DATETIME_INTERVAL_CODE\', \'DATETIME_INTERVAL_PRECISION\', \'DAY\', \'DB\', \'DEALLOCATE\', \'DEC\', \'DECIMAL\', \'DECLARE\', \'DEFAULT\', \'DEFAULTS\', \'DEFERRABLE\', \'DEFERRED\', \'DEFINED\', \'DEFINER\', \'DEGREE\', \'DELETE\', \'DELIMITER\', \'DELIMITERS\', \'DENSE_RANK\', \'DEPTH\', \'DEREF\', \'DERIVED\', \'DESC\', \'DESCRIBE\', \'DESCRIPTOR\', \'DETERMINISTIC\', \'DIAGNOSTICS\', \'DICTIONARY\', \'DISABLE\', \'DISCARD\', \'DISCONNECT\', \'DISPATCH\', \'DISTINCT\', \'DLNEWCOPY\', \'DLPREVIOUSCOPY\', \'DLURLCOMPLETE\', \'DLURLCOMPLETEONLY\', \'DLURLCOMPLETEWRITE\', \'DLURLPATH\', \'DLURLPATHONLY\', \'DLURLPATHWRITE\', \'DLURLSCHEME\', \'DLURLSERVER\', \'DLVALUE\', \'DO\', \'DOCUMENT\', \'DOMAIN\', \'DOUBLE\', \'DROP\', \'DYNAMIC\', \'DYNAMIC_FUNCTION\', \'DYNAMIC_FUNCTION_CODE\', \'EACH\', \'ELEMENT\', \'ELSE\', \'EMPTY\', \'ENABLE\', \'ENCODING\', \'ENCRYPTED\', \'END\', \'END-EXEC\', \'END_FRAME\', \'END_PARTITION\', \'ENFORCED\', \'ENUM\', \'EQUALS\', \'ESCAPE\', \'EVENT\', \'EVERY\', \'EXCEPT\', \'EXCEPTION\', \'EXCLUDE\', \'EXCLUDING\', \'EXCLUSIVE\', \'EXEC\', \'EXECUTE\', \'EXISTS\', \'EXP\', \'EXPLAIN\', \'EXPRESSION\', \'EXTENSION\', \'EXTERNAL\', \'EXTRACT\', \'FALSE\', \'FAMILY\', \'FETCH\', \'FILE\', \'FILTER\', \'FINAL\', \'FIRST\', \'FIRST_VALUE\', \'FLAG\', \'FLOAT\', \'FLOOR\', \'FOLLOWING\', \'FOR\', \'FORCE\', \'FOREIGN\', \'FORTRAN\', \'FORWARD\', \'FOUND\', \'FRAME_ROW\', \'FREE\', \'FREEZE\', \'FROM\', \'FS\', \'FULL\', \'FUNCTION\', \'FUNCTIONS\', \'FUSION\', \'G\', \'GENERAL\', \'GENERATED\', \'GET\', \'GLOBAL\', \'GO\', \'GOTO\', \'GRANT\', \'GRANTED\', \'GREATEST\', \'GROUP\', \'GROUPING\', \'GROUPS\', \'HANDLER\', \'HAVING\', \'HEADER\', \'HEX\', \'HIERARCHY\', \'HOLD\', \'HOUR\', \'ID\', \'IDENTITY\', \'IF\', \'IGNORE\', \'ILIKE\', \'IMMEDIATE\', \'IMMEDIATELY\', \'IMMUTABLE\', \'IMPLEMENTATION\', \'IMPLICIT\', \'IMPORT\', \'IN\', \'INCLUDING\', \'INCREMENT\', \'INDENT\', \'INDEX\', \'INDEXES\', \'INDICATOR\', \'INHERIT\', \'INHERITS\', \'INITIALLY\', \'INLINE\', \'INNER\', \'INOUT\', \'INPUT\', \'INSENSITIVE\', \'INSERT\', \'INSTANCE\', \'INSTANTIABLE\', \'INSTEAD\', \'INT\', \'INTEGER\', \'INTEGRITY\', \'INTERSECT\', \'INTERSECTION\', \'INTERVAL\', \'INTO\', \'INVOKER\', \'IS\', \'ISNULL\', \'ISOLATION\', \'JOIN\', \'K\', \'KEY\', \'KEY_MEMBER\', \'KEY_TYPE\', \'LABEL\', \'LAG\', \'LANGUAGE\', \'LARGE\', \'LAST\', \'LAST_VALUE\', \'LATERAL\', \'LEAD\', \'LEADING\', \'LEAKPROOF\', \'LEAST\', \'LEFT\', \'LENGTH\', \'LEVEL\', \'LIBRARY\', \'LIKE\', \'LIKE_REGEX\', \'LIMIT\', \'LINK\', \'LISTEN\', \'LN\', \'LOAD\', \'LOCAL\', \'LOCALTIME\', \'LOCALTIMESTAMP\', \'LOCATION\', \'LOCATOR\', \'LOCK\', \'LOCKED\', \'LOGGED\', \'LOWER\', \'M\', \'MAP\', \'MAPPING\', \'MATCH\', \'MATCHED\', \'MATERIALIZED\', \'MAX\', \'MAXVALUE\', \'MAX_CARDINALITY\', \'MEMBER\', \'MERGE\', \'MESSAGE_LENGTH\', \'MESSAGE_OCTET_LENGTH\', \'MESSAGE_TEXT\', \'METHOD\', \'MIN\', \'MINUTE\', \'MINVALUE\', \'MOD\', \'MODE\', \'MODIFIES\', \'MODULE\', \'MONTH\', \'MORE\', \'MOVE\', \'MULTISET\', \'MUMPS\', \'NAME\', \'NAMES\', \'NAMESPACE\', \'NATIONAL\', \'NATURAL\', \'NCHAR\', \'NCLOB\', \'NESTING\', \'NEW\', \'NEXT\', \'NFC\', \'NFD\', \'NFKC\', \'NFKD\', \'NIL\', \'NO\', \'NONE\', \'NORMALIZE\', \'NORMALIZED\', \'NOT\', \'NOTHING\', \'NOTIFY\', \'NOTNULL\', \'NOWAIT\', \'NTH_VALUE\', \'NTILE\', \'NULL\', \'NULLABLE\', \'NULLIF\', \'NULLS\', \'NUMBER\', \'NUMERIC\', \'OBJECT\', \'OCCURRENCES_REGEX\', \'OCTETS\', \'OCTET_LENGTH\', \'OF\', \'OFF\', \'OFFSET\', \'OIDS\', \'OLD\', \'ON\', \'ONLY\', \'OPEN\', \'OPERATOR\', \'OPTION\', \'OPTIONS\', \'OR\', \'ORDER\', \'ORDERING\', \'ORDINALITY\', \'OTHERS\', \'OUT\', \'OUTER\', \'OUTPUT\', \'OVER\', \'OVERLAPS\', \'OVERLAY\', \'OVERRIDING\', \'OWNED\', \'OWNER\', \'P\', \'PAD\', \'PARAMETER\', \'PARAMETER_MODE\', \'PARAMETER_NAME\', \'PARAMETER_ORDINAL_POSITION\', \'PARAMETER_SPECIFIC_CATALOG\', \'PARAMETER_SPECIFIC_NAME\', \'PARAMETER_SPECIFIC_SCHEMA\', \'PARSER\', \'PARTIAL\', \'PARTITION\', \'PASCAL\', \'PASSING\', \'PASSTHROUGH\', \'PASSWORD\', \'PATH\', \'PERCENT\', \'PERCENTILE_CONT\', \'PERCENTILE_DISC\', \'PERCENT_RANK\', \'PERIOD\', \'PERMISSION\', \'PLACING\', \'PLANS\', \'PLI\', \'POLICY\', \'PORTION\', \'POSITION\', \'POSITION_REGEX\', \'POWER\', \'PRECEDES\', \'PRECEDING\', \'PRECISION\', \'PREPARE\', \'PREPARED\', \'PRESERVE\', \'PRIMARY\', \'PRIOR\', \'PRIVILEGES\', \'PROCEDURAL\', \'PROCEDURE\', \'PROGRAM\', \'PUBLIC\', \'QUOTE\', \'RANGE\', \'RANK\', \'READ\', \'READS\', \'REAL\', \'REASSIGN\', \'RECHECK\', \'RECOVERY\', \'RECURSIVE\', \'REF\', \'REFERENCES\', \'REFERENCING\', \'REFRESH\', \'REGR_AVGX\', \'REGR_AVGY\', \'REGR_COUNT\', \'REGR_INTERCEPT\', \'REGR_R2\', \'REGR_SLOPE\', \'REGR_SXX\', \'REGR_SXY\', \'REGR_SYY\', \'REINDEX\', \'RELATIVE\', \'RELEASE\', \'RENAME\', \'REPEATABLE\', \'REPLACE\', \'REPLICA\', \'REQUIRING\', \'RESET\', \'RESPECT\', \'RESTART\', \'RESTORE\', \'RESTRICT\', \'RESULT\', \'RETURN\', \'RETURNED_CARDINALITY\', \'RETURNED_LENGTH\', \'RETURNED_OCTET_LENGTH\', \'RETURNED_SQLSTATE\', \'RETURNING\', \'RETURNS\', \'REVOKE\', \'RIGHT\', \'ROLE\', \'ROLLBACK\', \'ROLLUP\', \'ROUTINE\', \'ROUTINE_CATALOG\', \'ROUTINE_NAME\', \'ROUTINE_SCHEMA\', \'ROW\', \'ROWS\', \'ROW_COUNT\', \'ROW_NUMBER\', \'RULE\', \'SAVEPOINT\', \'SCALE\', \'SCHEMA\', \'SCHEMA_NAME\', \'SCOPE\', \'SCOPE_CATALOG\', \'SCOPE_NAME\', \'SCOPE_SCHEMA\', \'SCROLL\', \'SEARCH\', \'SECOND\', \'SECTION\', \'SECURITY\', \'SELECT\', \'SELECTIVE\', \'SELF\', \'SENSITIVE\', \'SEQUENCE\', \'SEQUENCES\', \'SERIALIZABLE\', \'SERVER\', \'SERVER_NAME\', \'SESSION\', \'SESSION_USER\', \'SET\', \'SETOF\', \'SETS\', \'SHARE\', \'SHOW\', \'SIMILAR\', \'SIMPLE\', \'SIZE\', \'SKIP\', \'SMALLINT\', \'SNAPSHOT\', \'SOME\', \'SOURCE\', \'SPACE\', \'SPECIFIC\', \'SPECIFICTYPE\', \'SPECIFIC_NAME\', \'SQL\', \'SQLCODE\', \'SQLERROR\', \'SQLEXCEPTION\', \'SQLSTATE\', \'SQLWARNING\', \'SQRT\', \'STABLE\', \'STANDALONE\', \'START\', \'STATE\', \'STATEMENT\', \'STATIC\', \'STATISTICS\', \'STDDEV_POP\', \'STDDEV_SAMP\', \'STDIN\', \'STDOUT\', \'STORAGE\', \'STRICT\', \'STRIP\', \'STRUCTURE\', \'STYLE\', \'SUBCLASS_ORIGIN\', \'SUBMULTISET\', \'SUBSTRING\', \'SUBSTRING_REGEX\', \'SUCCEEDS\', \'SUM\', \'SYMMETRIC\', \'SYSID\', \'SYSTEM\', \'SYSTEM_TIME\', \'SYSTEM_USER\', \'T\', \'TABLE\', \'TABLES\', \'TABLESAMPLE\', \'TABLESPACE\', \'TABLE_NAME\', \'TEMP\', \'TEMPLATE\', \'TEMPORARY\', \'TEXT\', \'THEN\', \'TIES\', \'TIME\', \'TIMESTAMP\', \'TIMEZONE_HOUR\', \'TIMEZONE_MINUTE\', \'TO\', \'TOKEN\', \'TOP_LEVEL_COUNT\', \'TRAILING\', \'TRANSACTION\', \'TRANSACTIONS_COMMITTED\', \'TRANSACTIONS_ROLLED_BACK\', \'TRANSACTION_ACTIVE\', \'TRANSFORM\', \'TRANSFORMS\', \'TRANSLATE\', \'TRANSLATE_REGEX\', \'TRANSLATION\', \'TREAT\', \'TRIGGER\', \'TRIGGER_CATALOG\', \'TRIGGER_NAME\', \'TRIGGER_SCHEMA\', \'TRIM\', \'TRIM_ARRAY\', \'TRUE\', \'TRUNCATE\', \'TRUSTED\', \'TYPE\', \'TYPES\', \'UESCAPE\', \'UNBOUNDED\', \'UNCOMMITTED\', \'UNDER\', \'UNENCRYPTED\', \'UNION\', \'UNIQUE\', \'UNKNOWN\', \'UNLINK\', \'UNLISTEN\', \'UNLOGGED\', \'UNNAMED\', \'UNNEST\', \'UNTIL\', \'UNTYPED\', \'UPDATE\', \'UPPER\', \'URI\', \'USAGE\', \'USER\', \'USER_DEFINED_TYPE_CATALOG\', \'USER_DEFINED_TYPE_CODE\', \'USER_DEFINED_TYPE_NAME\', \'USER_DEFINED_TYPE_SCHEMA\', \'USING\', \'VACUUM\', \'VALID\', \'VALIDATE\', \'VALIDATOR\', \'VALUE\', \'VALUES\', \'VALUE_OF\', \'VARBINARY\', \'VARCHAR\', \'VARIADIC\', \'VARYING\', \'VAR_POP\', \'VAR_SAMP\', \'VERBOSE\', \'VERSION\', \'VERSIONING\', \'VIEW\', \'VIEWS\', \'VOLATILE\', \'WHEN\', \'WHENEVER\', \'WHERE\', \'WHITESPACE\', \'WIDTH_BUCKET\', \'WINDOW\', \'WITH\', \'WITHIN\', \'WITHOUT\', \'WORK\', \'WRAPPER\', \'WRITE\', \'XML\', \'XMLAGG\', \'XMLATTRIBUTES\', \'XMLBINARY\', \'XMLCAST\', \'XMLCOMMENT\', \'XMLCONCAT\', \'XMLDECLARATION\', \'XMLDOCUMENT\', \'XMLELEMENT\', \'XMLEXISTS\', \'XMLFOREST\', \'XMLITERATE\', \'XMLNAMESPACES\', \'XMLPARSE\', \'XMLPI\', \'XMLQUERY\', \'XMLROOT\', \'XMLSCHEMA\', \'XMLSERIALIZE\', \'XMLTABLE\', \'XMLTEXT\', \'XMLVALIDATE\', \'YEAR\', \'YES\', \'ZONE\']);\nfunction prepareSQLName(name) {\n    if (isUnquotedIdentifier.test(name) && !reservedWords.has(name.toUpperCase()))\n        return name;\n\n    // Let\'s quote name:\n    return \'"\' + name.replace(/"/g, \'""\') + \'"\';\n}\n\nconsole.log(prepareSQLName(\'simple\')); //simple\nconsole.log(prepareSQLName(\'to "quote\')); //"to ""quote"\nconsole.log(prepareSQLName(\'\xd0\xbf\xd1\x80\xd0\xbe\xd1\x81\xd1\x82\xd0\xb8\xd0\xb9\')); //\xd0\xbf\xd1\x80\xd0\xbe\xd1\x81\xd1\x82\xd0\xb8\xd0\xb9\nconsole.log(prepareSQLName(\'\xd0\xb2 "\xd0\xbb\xd0\xb0\xd0\xbf\xd0\xba\xd0\xb8\')); //"\xd0\xb2 ""\xd0\xbb\xd0\xb0\xd0\xbf\xd0\xba\xd0\xb8"\n
Run Code Online (Sandbox Code Playgroud)\n\n

笔记:

\n\n
    \n
  1. 我们需要xregexp模块,因为内置RegExp类不支持Unicode 类别\\pLakap{L}\\pMaka\\p{M})的测试。尽管如此,检测字母并不是 100% 清晰(请参阅“检测字母的详细信息”)。
  2. \n
  3. 关键词列表取自此处。使用此列表可能不是理想的解决方案,因为并非所有这些标识符实际上都被禁止在所有可能的情况下使用(即有时它可能引用允许不加引号的表名称,例如abs)。另一方面,如果不向函数添加namePurpose第二个参数,则无法理想地解决此任务prepareSQLName(因为其中一些标识符仅允许在特定情况下使用)。
  4. \n
  5. 如果您希望非英语字母保持非转义,则不需要对非 ASCII 进行特殊处理(它们可能是非转义的,如 中所示SELECT "\xd1\x96\xd0\xbc\'\xd1\x8f" FROM \xd0\xba\xd0\xbe\xd1\x80\xd0\xb8\xd1\x81\xd1\x82\xd1\x83\xd0\xb2\xd0\xb0\xd1\x87\xd1\x96)。唯一需要检查的是包含字母/数字/ _/以外的内容的标识符$应该被引用(如"\xd1\x96\xd0\xbc\'\xd1\x8f")。但如果您愿意,您还可以转义所有非 ASCII 字符:

    \n\n
    var isUnquotedIdentifier = new RegExp(\'^[A-Za-z_][A-Za-z_0-9$]*$\');\nvar reservedWords = new Set([\'A\', \'ABORT\', \'ABS\', \'ABSENT\', \'ABSOLUTE\', \'ACCESS\', \'ACCORDING\', \'ACTION\', \'ADA\', \'ADD\', \'ADMIN\', \'AFTER\', \'AGGREGATE\', \'ALL\', \'ALLOCATE\', \'ALSO\', \'ALTER\', \'ALWAYS\', \'ANALYSE\', \'ANALYZE\', \'AND\', \'ANY\', \'ARE\', \'ARRAY\', \'ARRAY_AGG\', \'ARRAY_MAX_CARDINALITY\', \'AS\', \'ASC\', \'ASENSITIVE\', \'ASSERTION\', \'ASSIGNMENT\', \'ASYMMETRIC\', \'AT\', \'ATOMIC\', \'ATTRIBUTE\', \'ATTRIBUTES\', \'AUTHORIZATION\', \'AVG\', \'BACKWARD\', \'BASE64\', \'BEFORE\', \'BEGIN\', \'BEGIN_FRAME\', \'BEGIN_PARTITION\', \'BERNOULLI\', \'BETWEEN\', \'BIGINT\', \'BINARY\', \'BIT\', \'BIT_LENGTH\', \'BLOB\', \'BLOCKED\', \'BOM\', \'BOOLEAN\', \'BOTH\', \'BREADTH\', \'BY\', \'C\', \'CACHE\', \'CALL\', \'CALLED\', \'CARDINALITY\', \'CASCADE\', \'CASCADED\', \'CASE\', \'CAST\', \'CATALOG\', \'CATALOG_NAME\', \'CEIL\', \'CEILING\', \'CHAIN\', \'CHAR\', \'CHARACTER\', \'CHARACTERISTICS\', \'CHARACTERS\', \'CHARACTER_LENGTH\', \'CHARACTER_SET_CATALOG\', \'CHARACTER_SET_NAME\', \'CHARACTER_SET_SCHEMA\', \'CHAR_LENGTH\', \'CHECK\', \'CHECKPOINT\', \'CLASS\', \'CLASS_ORIGIN\', \'CLOB\', \'CLOSE\', \'CLUSTER\', \'COALESCE\', \'COBOL\', \'COLLATE\', \'COLLATION\', \'COLLATION_CATALOG\', \'COLLATION_NAME\', \'COLLATION_SCHEMA\', \'COLLECT\', \'COLUMN\', \'COLUMNS\', \'COLUMN_NAME\', \'COMMAND_FUNCTION\', \'COMMAND_FUNCTION_CODE\', \'COMMENT\', \'COMMENTS\', \'COMMIT\', \'COMMITTED\', \'CONCURRENTLY\', \'CONDITION\', \'CONDITION_NUMBER\', \'CONFIGURATION\', \'CONFLICT\', \'CONNECT\', \'CONNECTION\', \'CONNECTION_NAME\', \'CONSTRAINT\', \'CONSTRAINTS\', \'CONSTRAINT_CATALOG\', \'CONSTRAINT_NAME\', \'CONSTRAINT_SCHEMA\', \'CONSTRUCTOR\', \'CONTAINS\', \'CONTENT\', \'CONTINUE\', \'CONTROL\', \'CONVERSION\', \'CONVERT\', \'COPY\', \'CORR\', \'CORRESPONDING\', \'COST\', \'COUNT\', \'COVAR_POP\', \'COVAR_SAMP\', \'CREATE\', \'CROSS\', \'CSV\', \'CUBE\', \'CUME_DIST\', \'CURRENT\', \'CURRENT_CATALOG\', \'CURRENT_DATE\', \'CURRENT_DEFAULT_TRANSFORM_GROUP\', \'CURRENT_PATH\', \'CURRENT_ROLE\', \'CURRENT_ROW\', \'CURRENT_SCHEMA\', \'CURRENT_TIME\', \'CURRENT_TIMESTAMP\', \'CURRENT_TRANSFORM_GROUP_FOR_TYPE\', \'CURRENT_USER\', \'CURSOR\', \'CURSOR_NAME\', \'CYCLE\', \'DATA\', \'DATABASE\', \'DATALINK\', \'DATE\', \'DATETIME_INTERVAL_CODE\', \'DATETIME_INTERVAL_PRECISION\', \'DAY\', \'DB\', \'DEALLOCATE\', \'DEC\', \'DECIMAL\', \'DECLARE\', \'DEFAULT\', \'DEFAULTS\', \'DEFERRABLE\', \'DEFERRED\', \'DEFINED\', \'DEFINER\', \'DEGREE\', \'DELETE\', \'DELIMITER\', \'DELIMITERS\', \'DENSE_RANK\', \'DEPTH\', \'DEREF\', \'DERIVED\', \'DESC\', \'DESCRIBE\', \'DESCRIPTOR\', \'DETERMINISTIC\', \'DIAGNOSTICS\', \'DICTIONARY\', \'DISABLE\', \'DISCARD\', \'DISCONNECT\', \'DISPATCH\', \'DISTINCT\', \'DLNEWCOPY\', \'DLPREVIOUSCOPY\', \'DLURLCOMPLETE\', \'DLURLCOMPLETEONLY\', \'DLURLCOMPLETEWRITE\', \'DLURLPATH\', \'DLURLPATHONLY\', \'DLURLPATHWRITE\', \'DLURLSCHEME\', \'DLURLSERVER\', \'DLVALUE\', \'DO\', \'DOCUMENT\', \'DOMAIN\', \'DOUBLE\', \'DROP\', \'DYNAMIC\', \'DYNAMIC_FUNCTION\', \'DYNAMIC_FUNCTION_CODE\', \'EACH\', \'ELEMENT\', \'ELSE\', \'EMPTY\', \'ENABLE\', \'ENCODING\', \'ENCRYPTED\', \'END\', \'END-EXEC\', \'END_FRAME\', \'END_PARTITION\', \'ENFORCED\', \'ENUM\', \'EQUALS\', \'ESCAPE\', \'EVENT\', \'EVERY\', \'EXCEPT\', \'EXCEPTION\', \'EXCLUDE\', \'EXCLUDING\', \'EXCLUSIVE\', \'EXEC\', \'EXECUTE\', \'EXISTS\', \'EXP\', \'EXPLAIN\', \'EXPRESSION\', \'EXTENSION\', \'EXTERNAL\', \'EXTRACT\', \'FALSE\', \'FAMILY\', \'FETCH\', \'FILE\', \'FILTER\', \'FINAL\', \'FIRST\', \'FIRST_VALUE\', \'FLAG\', \'FLOAT\', \'FLOOR\', \'FOLLOWING\', \'FOR\', \'FORCE\', \'FOREIGN\', \'FORTRAN\', \'FORWARD\', \'FOUND\', \'FRAME_ROW\', \'FREE\', \'FREEZE\', \'FROM\', \'FS\', \'FULL\', \'FUNCTION\', \'FUNCTIONS\', \'FUSION\', \'G\', \'GENERAL\', \'GENERATED\', \'GET\', \'GLOBAL\', \'GO\', \'GOTO\', \'GRANT\', \'GRANTED\', \'GREATEST\', \'GROUP\', \'GROUPING\', \'GROUPS\', \'HANDLER\', \'HAVING\', \'HEADER\', \'HEX\', \'HIERARCHY\', \'HOLD\', \'HOUR\', \'ID\', \'IDENTITY\', \'IF\', \'IGNORE\', \'ILIKE\', \'IMMEDIATE\', \'IMMEDIATELY\', \'IMMUTABLE\', \'IMPLEMENTATION\', \'IMPLICIT\', \'IMPORT\', \'IN\', \'INCLUDING\', \'INCREMENT\', \'INDENT\', \'INDEX\', \'INDEXES\', \'INDICATOR\', \'INHERIT\', \'INHERITS\', \'INITIALLY\', \'INLINE\', \'INNER\', \'INOUT\', \'INPUT\', \'INSENSITIVE\', \'INSERT\', \'INSTANCE\', \'INSTANTIABLE\', \'INSTEAD\', \'INT\', \'INTEGER\', \'INTEGRITY\', \'INTERSECT\', \'INTERSECTION\', \'INTERVAL\', \'INTO\', \'INVOKER\', \'IS\', \'ISNULL\', \'ISOLATION\', \'JOIN\', \'K\', \'KEY\', \'KEY_MEMBER\', \'KEY_TYPE\', \'LABEL\', \'LAG\', \'LANGUAGE\', \'LARGE\', \'LAST\', \'LAST_VALUE\', \'LATERAL\', \'LEAD\', \'LEADING\', \'LEAKPROOF\', \'LEAST\', \'LEFT\', \'LENGTH\', \'LEVEL\', \'LIBRARY\', \'LIKE\', \'LIKE_REGEX\', \'LIMIT\', \'LINK\', \'LISTEN\', \'LN\', \'LOAD\', \'LOCAL\', \'LOCALTIME\', \'LOCALTIMESTAMP\', \'LOCATION\', \'LOCATOR\', \'LOCK\', \'LOCKED\', \'LOGGED\', \'LOWER\', \'M\', \'MAP\', \'MAPPING\', \'MATCH\', \'MATCHED\', \'MATERIALIZED\', \'MAX\', \'MAXVALUE\', \'MAX_CARDINALITY\', \'MEMBER\', \'MERGE\', \'MESSAGE_LENGTH\', \'MESSAGE_OCTET_LENGTH\', \'MESSAGE_TEXT\', \'METHOD\', \'MIN\', \'MINUTE\', \'MINVALUE\', \'MOD\', \'MODE\', \'MODIFIES\', \'MODULE\', \'MONTH\', \'MORE\', \'MOVE\', \'MULTISET\', \'MUMPS\', \'NAME\', \'NAMES\', \'NAMESPACE\', \'NATIONAL\', \'NATURAL\', \'NCHAR\', \'NCLOB\', \'NESTING\', \'NEW\', \'NEXT\', \'NFC\', \'NFD\', \'NFKC\', \'NFKD\', \'NIL\', \'NO\', \'NONE\', \'NORMALIZE\', \'NORMALIZED\', \'NOT\', \'NOTHING\', \'NOTIFY\', \'NOTNULL\', \'NOWAIT\', \'NTH_VALUE\', \'NTILE\', \'NULL\', \'NULLABLE\', \'NULLIF\', \'NULLS\', \'NUMBER\', \'NUMERIC\', \'OBJECT\', \'OCCURRENCES_REGEX\', \'OCTETS\', \'OCTET_LENGTH\', \'OF\', \'OFF\', \'OFFSET\', \'OIDS\', \'OLD\', \'ON\', \'ONLY\', \'OPEN\', \'OPERATOR\', \'OPTION\', \'OPTIONS\', \'OR\', \'ORDER\', \'ORDERING\', \'ORDINALITY\', \'OTHERS\', \'OUT\', \'OUTER\', \'OUTPUT\', \'OVER\', \'OVERLAPS\', \'OVERLAY\', \'OVERRIDING\', \'OWNED\', \'OWNER\', \'P\', \'PAD\', \'PARAMETER\', \'PARAMETER_MODE\', \'PARAMETER_NAME\', \'PARAMETER_ORDINAL_POSITION\', \'PARAMETER_SPECIFIC_CATALOG\', \'PARAMETER_SPECIFIC_NAME\', \'PARAMETER_SPECIFIC_SCHEMA\', \'PARSER\', \'PARTIAL\', \'PARTITION\', \'PASCAL\', \'PASSING\', \'PASSTHROUGH\', \'PASSWORD\', \'PATH\', \'PERCENT\', \'PERCENTILE_CONT\', \'PERCENTILE_DISC\', \'PERCENT_RANK\', \'PERIOD\', \'PERMISSION\', \'PLACING\', \'PLANS\', \'PLI\', \'POLICY\', \'PORTION\', \'POSITION\', \'POSITION_REGEX\', \'POWER\', \'PRECEDES\', \'PRECEDING\', \'PRECISION\', \'PREPARE\', \'PREPARED\', \'PRESERVE\', \'PRIMARY\', \'PRIOR\', \'PRIVILEGES\', \'PROCEDURAL\', \'PROCEDURE\', \'PROGRAM\', \'PUBLIC\', \'QUOTE\', \'RANGE\', \'RANK\', \'READ\', \'READS\', \'REAL\', \'REASSIGN\', \'RECHECK\', \'RECOVERY\', \'RECURSIVE\', \'REF\', \'REFERENCES\', \'REFERENCING\', \'REFRESH\', \'REGR_AVGX\', \'REGR_AVGY\', \'REGR_COUNT\', \'REGR_INTERCEPT\', \'REGR_R2\', \'REGR_SLOPE\', \'REGR_SXX\', \'REGR_SXY\', \'REGR_SYY\', \'REINDEX\', \'RELATIVE\', \'RELEASE\', \'RENAME\', \'REPEATABLE\', \'REPLACE\', \'REPLICA\', \'REQUIRING\', \'RESET\', \'RESPECT\', \'RESTART\', \'RESTORE\', \'RESTRICT\', \'RESULT\', \'RETURN\', \'RETURNED_CARDINALITY\', \'RETURNED_LENGTH\', \'RETURNED_OCTET_LENGTH\', \'RETURNED_SQLSTATE\', \'RETURNING\', \'RETURNS\', \'REVOKE\', \'RIGHT\', \'ROLE\', \'ROLLBACK\', \'ROLLUP\', \'ROUTINE\', \'ROUTINE_CATALOG\', \'ROUTINE_NAME\', \'