|
| 1 | +import Formatter from "../core/Formatter"; |
| 2 | +import Tokenizer from "../core/Tokenizer"; |
| 3 | + |
| 4 | +const reservedWords = [ |
| 5 | + "ABS", "ACTIVATE", "ALIAS", "ALL", "ALLOCATE", "ALLOW", "ALTER", "ANY", "ARE", "ARRAY", "AS", "ASC", |
| 6 | + "ASENSITIVE", "ASSOCIATE", "ASUTIME", "ASYMMETRIC", "AT", "ATOMIC", "ATTRIBUTES", "AUDIT", "AUTHORIZATION", "AUX", "AUXILIARY", "AVG", |
| 7 | + "BEFORE", "BEGIN", "BETWEEN", "BIGINT", "BINARY", "BLOB", "BOOLEAN", "BOTH", "BUFFERPOOL", "BY", |
| 8 | + "CACHE", "CALL", "CALLED", "CAPTURE", "CARDINALITY", "CASCADED", "CASE", "CAST", "CCSID", "CEIL", "CEILING", "CHAR", "CHARACTER", |
| 9 | + "CHARACTER_LENGTH", "CHAR_LENGTH", "CHECK", "CLOB", "CLONE", "CLOSE", "CLUSTER", "COALESCE", "COLLATE", "COLLECT", "COLLECTION", |
| 10 | + "COLLID", "COLUMN", "COMMENT", "COMMIT", "CONCAT", "CONDITION", "CONNECT", "CONNECTION", "CONSTRAINT", "CONTAINS", "CONTINUE", |
| 11 | + "CONVERT", "CORR", "CORRESPONDING", "COUNT", "COUNT_BIG", "COVAR_POP", "COVAR_SAMP", "CREATE", "CROSS", "CUBE", "CUME_DIST", "CURRENT", |
| 12 | + "CURRENT_DATE", "CURRENT_DEFAULT_TRANSFORM_GROUP", "CURRENT_LC_CTYPE", "CURRENT_PATH", "CURRENT_ROLE", "CURRENT_SCHEMA", |
| 13 | + "CURRENT_SERVER", "CURRENT_TIME", "CURRENT_TIMESTAMP", "CURRENT_TIMEZONE", "CURRENT_TRANSFORM_GROUP_FOR_TYPE", "CURRENT_USER", "CURSOR", |
| 14 | + "CYCLE", |
| 15 | + "DATA", "DATABASE", "DATAPARTITIONNAME", "DATAPARTITIONNUM", "DATE", "DAY", "DAYS", "DB2GENERAL", "DB2GENRL", "DB2SQL", "DBINFO", |
| 16 | + "DBPARTITIONNAME", "DBPARTITIONNUM", "DEALLOCATE", "DEC", "DECIMAL", "DECLARE", "DEFAULT", "DEFAULTS", "DEFINITION", "DELETE", |
| 17 | + "DENSERANK", "DENSE_RANK", "DEREF", "DESCRIBE", "DESCRIPTOR", "DETERMINISTIC", "DIAGNOSTICS", "DISABLE", "DISALLOW", "DISCONNECT", |
| 18 | + "DISTINCT", "DO", "DOCUMENT", "DOUBLE", "DROP", "DSSIZE", "DYNAMIC", |
| 19 | + "EACH", "EDITPROC", "ELEMENT", "ELSE", "ELSEIF", "ENABLE", "ENCODING", "ENCRYPTION", "END", "END-EXEC", "ENDING", "ERASE", "ESCAPE", |
| 20 | + "EVERY", "EXCEPTION", "EXCLUDING", "EXCLUSIVE", "EXEC", "EXECUTE", "EXISTS", "EXIT", "EXP", "EXPLAIN", "EXTENDED", "EXTERNAL", |
| 21 | + "EXTRACT", |
| 22 | + "FALSE", "FENCED", "FETCH", "FIELDPROC", "FILE", "FILTER", "FINAL", "FLOAT", "FLOOR", "FOR", "FOREIGN", "FREE", "FULL", |
| 23 | + "FUNCTION", "FUSION", |
| 24 | + "GENERAL", "GENERATED", "GET", "GLOBAL", "GOTO", "GRANT", "GRAPHIC", "GROUP", "GROUPING", |
| 25 | + "HANDLER", "HASH", "HASHED_VALUE", "HINT", "HOLD", "HOUR", "HOURS", |
| 26 | + "IDENTITY", "IF", "IMMEDIATE", "IN", "INCLUDING", "INCLUSIVE", "INCREMENT", "INDEX", "INDICATOR", "INDICATORS", "INF", "INFINITY", |
| 27 | + "INHERIT", "INNER", "INOUT", "INSENSITIVE", "INSERT", "INT", "INTEGER", "INTEGRITY", "INTERSECTION", "INTERVAL", "INTO", |
| 28 | + "IS", "ISOBID", "ISOLATION", "ITERATE", |
| 29 | + "JAR", "JAVA", |
| 30 | + "KEEP", "KEY", |
| 31 | + "LABEL", "LANGUAGE", "LARGE", "LATERAL", "LC_CTYPE", "LEADING", "LEAVE", "LEFT", "LIKE", "LINKTYPE", "LN", "LOCAL", |
| 32 | + "LOCALDATE", "LOCALE", "LOCALTIME", "LOCALTIMESTAMP", "LOCATOR", "LOCATORS", "LOCK", "LOCKMAX", "LOCKSIZE", "LONG", "LOOP", "LOWER", |
| 33 | + "MAINTAINED", "MATCH", "MATERIALIZED", "MAX", "MAXVALUE", "MEMBER", "MERGE", "METHOD", "MICROSECOND", "MICROSECONDS", "MIN", "MINUTE", |
| 34 | + "MINUTES", "MINVALUE", "MOD", "MODE", "MODIFIES", "MODULE", "MONTH", "MONTHS", "MULTISET", |
| 35 | + "NAN", "NATIONAL", "NATURAL", "NCHAR", "NCLOB", "NEW", "NEW_TABLE", "NEXTVAL", "NO", "NOCACHE", "NOCYCLE", "NODENAME", "NODENUMBER", |
| 36 | + "NOMAXVALUE", "NOMINVALUE", "NONE", "NOORDER", "NORMALIZE", "NORMALIZED", "NOT", "NULL", "NULLIF", "NULLS", "NUMERIC", "NUMPARTS", |
| 37 | + "OBID", "OCTET_LENGTH", "OF", "OFFSET", "OLD", "OLD_TABLE", "ON", "ONLY", "OPEN", "OPTIMIZATION", "OPTIMIZE", "OPTION", "ORDER", |
| 38 | + "OUT", "OUTER", "OVER", "OVERLAPS", "OVERLAY", "OVERRIDING", |
| 39 | + "PACKAGE", "PADDED", "PAGESIZE", "PARAMETER", "PART", "PARTITION", "PARTITIONED", "PARTITIONING", "PARTITIONS", "PASSWORD", "PATH", |
| 40 | + "PERCENTILE_CONT", "PERCENTILE_DISC", "PERCENT_RANK", "PIECESIZE", "PLAN", "POSITION", "POWER", "PRECISION", "PREPARE", "PREVVAL", |
| 41 | + "PRIMARY", "PRIQTY", "PRIVILEGES", "PROCEDURE", "PROGRAM", "PSID", "PUBLIC", |
| 42 | + "QUERY", "QUERYNO", |
| 43 | + "RANGE", "RANK", "READ", "READS", "REAL", "RECOVERY", "RECURSIVE", "REF", "REFERENCES", "REFERENCING", "REFRESH", "REGR_AVGX", |
| 44 | + "REGR_AVGY", "REGR_COUNT", "REGR_INTERCEPT", "REGR_R2", "REGR_SLOPE", "REGR_SXX", "REGR_SXY", "REGR_SYY", "RELEASE", "RENAME", "REPEAT", |
| 45 | + "RESET", "RESIGNAL", "RESTART", "RESTRICT", "RESULT", "RESULT_SET_LOCATOR", "RETURN", "RETURNS", "REVOKE", "RIGHT", "ROLE", "ROLLBACK", |
| 46 | + "ROLLUP", "ROUND_CEILING", "ROUND_DOWN", "ROUND_FLOOR", "ROUND_HALF_DOWN", "ROUND_HALF_EVEN", "ROUND_HALF_UP", "ROUND_UP", "ROUTINE", |
| 47 | + "ROW", "ROWNUMBER", "ROWS", "ROWSET", "ROW_NUMBER", "RRN", "RUN", |
| 48 | + "SAVEPOINT", "SCHEMA", "SCOPE", "SCRATCHPAD", "SCROLL", "SEARCH", "SECOND", "SECONDS", "SECQTY", "SECURITY", "SENSITIVE", |
| 49 | + "SEQUENCE", "SESSION", "SESSION_USER", "SIGNAL", "SIMILAR", "SIMPLE", "SMALLINT", "SNAN", "SOME", "SOURCE", "SPECIFIC", |
| 50 | + "SPECIFICTYPE", "SQL", "SQLEXCEPTION", "SQLID", "SQLSTATE", "SQLWARNING", "SQRT", "STACKED", "STANDARD", "START", "STARTING", |
| 51 | + "STATEMENT", "STATIC", "STATMENT", "STAY", "STDDEV_POP", "STDDEV_SAMP", "STOGROUP", "STORES", "STYLE", "SUBMULTISET", "SUBSTRING", |
| 52 | + "SUM", "SUMMARY", "SYMMETRIC", "SYNONYM", "SYSFUN", "SYSIBM", "SYSPROC", "SYSTEM", "SYSTEM_USER", |
| 53 | + "TABLE", "TABLESAMPLE", "TABLESPACE", "THEN", "TIME", "TIMESTAMP", "TIMEZONE_HOUR", "TIMEZONE_MINUTE", "TO", "TRAILING", "TRANSACTION", |
| 54 | + "TRANSLATE", "TRANSLATION", "TREAT", "TRIGGER", "TRIM", "TRUE", "TRUNCATE", "TYPE", |
| 55 | + "UESCAPE", "UNDO", "UNIQUE", "UNKNOWN", "UNNEST", "UNTIL", "UPPER", "USAGE", "USER", "USING", |
| 56 | + "VALIDPROC", "VALUE", "VARCHAR", "VARIABLE", "VARIANT", "VARYING", "VAR_POP", "VAR_SAMP", "VCAT", "VERSION", "VIEW", |
| 57 | + "VOLATILE", "VOLUMES", "WHEN", "WHENEVER", "WHILE", "WIDTH_BUCKET", "WINDOW", "WITH", "WITHIN", "WITHOUT", "WLM", "WRITE", |
| 58 | + "XMLELEMENT", "XMLEXISTS", "XMLNAMESPACES", |
| 59 | + "YEAR", "YEARS" |
| 60 | +]; |
| 61 | + |
| 62 | +const reservedToplevelWords = [ |
| 63 | + "ADD", "AFTER", "ALTER COLUMN", "ALTER TABLE", |
| 64 | + "DELETE FROM", |
| 65 | + "EXCEPT", |
| 66 | + "FETCH FIRST", "FROM", |
| 67 | + "GROUP BY", "GO", |
| 68 | + "HAVING", |
| 69 | + "INSERT INTO", "INTERSECT", |
| 70 | + "LIMIT", |
| 71 | + "ORDER BY", |
| 72 | + "SELECT", "SET CURRENT SCHEMA", "SET SCHEMA", "SET", |
| 73 | + "UNION ALL", "UPDATE", |
| 74 | + "VALUES", |
| 75 | + "WHERE" |
| 76 | +]; |
| 77 | + |
| 78 | +const reservedNewlineWords = [ |
| 79 | + "AND", |
| 80 | + "CROSS JOIN", |
| 81 | + "INNER JOIN", |
| 82 | + "JOIN", |
| 83 | + "LEFT JOIN", "LEFT OUTER JOIN", |
| 84 | + "OR", "OUTER JOIN", |
| 85 | + "RIGHT JOIN", "RIGHT OUTER JOIN" |
| 86 | +]; |
| 87 | + |
| 88 | +let tokenizer; |
| 89 | + |
| 90 | +export default class Db2Formatter { |
| 91 | + /** |
| 92 | + * @param {Object} cfg Different set of configurations |
| 93 | + */ |
| 94 | + constructor(cfg) { |
| 95 | + this.cfg = cfg; |
| 96 | + } |
| 97 | + |
| 98 | + /** |
| 99 | + * Formats DB2 query to make it easier to read |
| 100 | + * |
| 101 | + * @param {String} query The DB2 query string |
| 102 | + * @return {String} formatted string |
| 103 | + */ |
| 104 | + format(query) { |
| 105 | + if (!tokenizer) { |
| 106 | + tokenizer = new Tokenizer({ |
| 107 | + reservedWords, |
| 108 | + reservedToplevelWords, |
| 109 | + reservedNewlineWords, |
| 110 | + stringTypes: [`""`, "''", "``", "[]"], |
| 111 | + openParens: ["("], |
| 112 | + closeParens: [")"], |
| 113 | + indexedPlaceholderTypes: ["?"], |
| 114 | + namedPlaceholderTypes: [":"], |
| 115 | + lineCommentTypes: ["--"], |
| 116 | + specialWordChars: ["#", "@"] |
| 117 | + }); |
| 118 | + } |
| 119 | + return new Formatter(this.cfg, tokenizer).format(query); |
| 120 | + } |
| 121 | +} |
0 commit comments