Skip to content

Commit d5a5bb9

Browse files
committed
Add rules for PL/SQL.
1 parent a645e18 commit d5a5bb9

File tree

3 files changed

+422
-0
lines changed

3 files changed

+422
-0
lines changed

src/languages/PlSqlFormatter.js

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
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+
}

src/sqlFormatter.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import Db2Formatter from "./languages/Db2Formatter";
22
import N1qlFormatter from "./languages/N1qlFormatter";
3+
import PlSqlFormatter from "./languages/PlSqlFormatter";
34
import StandardSqlFormatter from "./languages/StandardSqlFormatter";
45

56
export default {
@@ -21,6 +22,8 @@ export default {
2122
return new Db2Formatter(cfg).format(query);
2223
case "n1ql":
2324
return new N1qlFormatter(cfg).format(query);
25+
case "PL/SQL":
26+
return new PlSqlFormatter(cfg).format(query);
2427
case "sql":
2528
case undefined:
2629
return new StandardSqlFormatter(cfg).format(query);

0 commit comments

Comments
 (0)