|
| 1 | +import Formatter from "../core/Formatter"; |
| 2 | +import Tokenizer from "../core/Tokenizer"; |
| 3 | + |
| 4 | +const reservedWords = [ |
| 5 | + "A", "ACCESSIBLE", "AGENT", "AGGREGATE", "ALL", "ALTER", "ANY", "ARRAY", "AS", "ASC", "AT", "ATTRIBUTE", "AUTHID", "AVG", |
| 6 | + "BETWEEN", "BFILE_BASE", "BINARY_INTEGER", "BINARY", "BLOB_BASE", "BLOCK", "BODY", "BOOLEAN", "BOTH", "BOUND", |
| 7 | + "BULK", "BY", "BYTE", |
| 8 | + "C", "CALL", "CALLING", "CASCADE", "CASE", "CHAR_BASE", "CHAR", "CHARACTER", "CHARSET", "CHARSETFORM", "CHARSETID", |
| 9 | + "CHECK", "CLOB_BASE", "CLONE", "CLOSE", "CLUSTER", "CLUSTERS", "COALESCE", "COLAUTH", "COLLECT", "COLUMNS", "COMMENT", |
| 10 | + "COMMIT", "COMMITTED", "COMPILED", "COMPRESS", "CONNECT", "CONSTANT", "CONSTRUCTOR", "CONTEXT", "CONTINUE", "CONVERT", |
| 11 | + "COUNT", "CRASH", "CREATE", "CREDENTIAL", "CURRENT", "CURRVAL", "CURSOR", "CUSTOMDATUM", |
| 12 | + "DANGLING", "DATA", "DATE_BASE", "DATE", "DAY", "DECIMAL", "DEFAULT", "DEFINE", "DELETE", "DESC", |
| 13 | + "DETERMINISTIC", "DIRECTORY", "DISTINCT", "DO", "DOUBLE", "DROP", "DURATION", |
| 14 | + "ELEMENT", "ELSIF", "EMPTY", "ESCAPE", "EXCEPTIONS", "EXCLUSIVE", "EXECUTE", "EXISTS", |
| 15 | + "EXIT", "EXTENDS", "EXTERNAL", "EXTRACT", |
| 16 | + "FALSE", "FETCH", "FINAL", "FIRST", "FIXED", "FLOAT", "FOR", "FORALL", "FORCE", "FROM", "FUNCTION", |
| 17 | + "GENERAL", "GOTO", "GRANT", "GROUP", "HASH", "HEAP", "HIDDEN", "HOUR", |
| 18 | + "IDENTIFIED", "IF", "IMMEDIATE", "IN", "INCLUDING", "INDEX", "INDEXES", "INDICATOR", "INDICES", "INFINITE", |
| 19 | + "INSTANTIABLE", "INT", "INTEGER", "INTERFACE", "INTERVAL", "INTO", "INVALIDATE", "IS", "ISOLATION", |
| 20 | + "JAVA", |
| 21 | + "LANGUAGE", "LARGE", "LEADING", "LENGTH", "LEVEL", "LIBRARY", "LIKE", "LIKE2", "LIKE4", "LIKEC", "LIMITED", "LOCAL", |
| 22 | + "LOCK", "LONG", |
| 23 | + "MAP", "MAX", "MAXLEN", "MEMBER", "MERGE", "MIN", "MINUS", "MINUTE", "MLSLABEL", "MOD", "MODE", "MONTH", "MULTISET", |
| 24 | + "NAME", "NAN", "NATIONAL", "NATIVE", "NATURAL", "NATURALN", "NCHAR", "NEW", "NEXTVAL", "NOCOMPRESS", "NOCOPY", "NOT", |
| 25 | + "NOWAIT", "NULL", "NULLIF", "NUMBER_BASE", "NUMBER", |
| 26 | + "OBJECT", "OCICOLL", "OCIDATE", "OCIDATETIME", "OCIDURATION", "OCIINTERVAL", "OCILOBLOCATOR", "OCINUMBER", "OCIRAW", |
| 27 | + "OCIREF", "OCIREFCURSOR", "OCIROWID", "OCISTRING", "OCITYPE", "OF", "OLD", "ON", "ONLY", "OPAQUE", "OPEN", "OPERATOR", |
| 28 | + "OPTION", "ORACLE", "ORADATA", "ORDER", "ORGANIZATION", "ORLANY", "ORLVARY", "OTHERS", "OUT", "OVERLAPS", |
| 29 | + "OVERRIDING", |
| 30 | + "PACKAGE", "PARALLEL_ENABLE", "PARAMETER", "PARAMETERS", "PARENT", "PARTITION", "PASCAL", "PCTFREE", "PIPE", "PIPELINED", |
| 31 | + "PLS_INTEGER", "PLUGGABLE", "POSITIVE", "POSITIVEN", "PRAGMA", "PRECISION", "PRIOR", "PRIVATE", "PROCEDURE", "PUBLIC", |
| 32 | + "RAISE", "RANGE", "RAW", "READ", "REAL", "RECORD", "REF", "REFERENCE", "RELEASE", "RELIES_ON", "REM", "REMAINDER", |
| 33 | + "RENAME", "RESOURCE", "RESULT_CACHE", "RESULT", "RETURN", "RETURNING", "REVERSE", "REVOKE", "ROLLBACK", "ROW", "ROWID", |
| 34 | + "ROWNUM", "ROWTYPE", |
| 35 | + "SAMPLE", "SAVE", "SAVEPOINT", "SB1", "SB2", "SB4", "SECOND", "SEGMENT", "SELF", "SEPARATE", "SEQUENCE", |
| 36 | + "SERIALIZABLE", "SHARE", "SHORT", "SIZE_T", "SIZE", "SMALLINT", "SOME", "SPACE", "SPARSE", "SQL", "SQLCODE", |
| 37 | + "SQLDATA", "SQLERRM", "SQLNAME", "SQLSTATE", "STANDARD", "START", "STATIC", "STDDEV", "STORED", "STRING", "STRUCT", |
| 38 | + "STYLE", "SUBMULTISET", "SUBPARTITION", "SUBSTITUTABLE", "SUBTYPE", "SUCCESSFUL", "SUM", "SYNONYM", "SYSDATE", |
| 39 | + "TABAUTH", "TABLE", "TDO", "THE", "THEN", "TIME", "TIMESTAMP", "TIMEZONE_ABBR", "TIMEZONE_HOUR", "TIMEZONE_MINUTE", |
| 40 | + "TIMEZONE_REGION", "TO", "TRAILING", "TRANSACTION", "TRANSACTIONAL", "TRIGGER", "TRUE", "TRUSTED", "TYPE", |
| 41 | + "UB1", "UB2", "UB4", "UID", "UNDER", "UNIQUE", "UNPLUG", "UNSIGNED", "UNTRUSTED", "USE", "USER", "USING", |
| 42 | + "VALIDATE", "VALIST", "VALUE", "VARCHAR", "VARCHAR2", "VARIABLE", "VARIANCE", "VARRAY", "VARYING", "VIEW", "VIEWS", "VOID", |
| 43 | + "WHENEVER", "WHILE", "WITH", "WORK", "WRAPPED", "WRITE", |
| 44 | + "YEAR", |
| 45 | + "ZONE", |
| 46 | +]; |
| 47 | + |
| 48 | +const reservedToplevelWords = [ |
| 49 | + "ADD", "ALTER COLUMN", "ALTER TABLE", |
| 50 | + "BEGIN", |
| 51 | + "CONNECT BY", |
| 52 | + "DECLARE", "DELETE FROM", "DELETE", |
| 53 | + "END", "EXCEPT", "EXCEPTION", |
| 54 | + "FETCH FIRST", "FROM", |
| 55 | + "GROUP BY", |
| 56 | + "HAVING", |
| 57 | + "INSERT INTO", "INSERT", "INTERSECT", |
| 58 | + "LIMIT", "LOOP", |
| 59 | + "MODIFY", |
| 60 | + "ORDER BY", |
| 61 | + "SELECT", "SET CURRENT SCHEMA", "SET SCHEMA", "SET", "START WITH", |
| 62 | + "UNION ALL", "UNION", "UPDATE", |
| 63 | + "VALUES", |
| 64 | + "WHERE" |
| 65 | +]; |
| 66 | + |
| 67 | +const reservedNewlineWords = [ |
| 68 | + "AND", |
| 69 | + "CROSS APPLY", "CROSS JOIN", |
| 70 | + "ELSE", "END", |
| 71 | + "INNER JOIN", |
| 72 | + "JOIN", |
| 73 | + "LEFT JOIN", "LEFT OUTER JOIN", |
| 74 | + "OR", "OUTER APPLY", "OUTER JOIN", |
| 75 | + "RIGHT JOIN", "RIGHT OUTER JOIN", |
| 76 | + "WHEN", |
| 77 | + "XOR" |
| 78 | +]; |
| 79 | + |
| 80 | +let tokenizer; |
| 81 | + |
| 82 | +export default class PlSqlFormatter { |
| 83 | + /** |
| 84 | + * @param {Object} cfg Different set of configurations |
| 85 | + */ |
| 86 | + constructor(cfg) { |
| 87 | + this.cfg = cfg; |
| 88 | + } |
| 89 | + |
| 90 | + /** |
| 91 | + * Format the whitespace in a PL/SQL string to make it easier to read |
| 92 | + * |
| 93 | + * @param {String} query The PL/SQL string |
| 94 | + * @return {String} formatted string |
| 95 | + */ |
| 96 | + format(query) { |
| 97 | + if (!tokenizer) { |
| 98 | + tokenizer = new Tokenizer({ |
| 99 | + reservedWords, |
| 100 | + reservedToplevelWords, |
| 101 | + reservedNewlineWords, |
| 102 | + stringTypes: [`""`, "N''", "''", "``"], |
| 103 | + openParens: ["(", "CASE"], |
| 104 | + closeParens: [")", "END"], |
| 105 | + indexedPlaceholderTypes: ["?"], |
| 106 | + namedPlaceholderTypes: [":"], |
| 107 | + lineCommentTypes: ["--"], |
| 108 | + specialWordChars: ["_", "$", "#", ".", "@"] |
| 109 | + }); |
| 110 | + } |
| 111 | + return new Formatter(this.cfg, tokenizer).format(query); |
| 112 | + } |
| 113 | +} |
0 commit comments