Skip to content

Commit 7e6e03e

Browse files
authored
Merge pull request #41 from rahelest/plsql-support
Add rules for PL/SQL.
2 parents a645e18 + 6a0ff72 commit 7e6e03e

File tree

5 files changed

+423
-11
lines changed

5 files changed

+423
-11
lines changed

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
**SQL Formatter** is a JavaScript library for pretty-printing SQL queries.
44
It started as a port of a [PHP Library][], but has since considerably diverged.
5-
It supports [Standard SQL][], [Couchbase N1QL][] and [IBM DB2][] dialects.
5+
It supports [Standard SQL][], [Couchbase N1QL][], [IBM DB2][] and [Oracle PL/SQL][] dialects.
66

77
→ [Try the demo.](https://zeroturnaround.github.io/sql-formatter/)
88

@@ -40,11 +40,12 @@ sqlFormatter.format("SELECT *", {
4040
});
4141
```
4242

43-
Currently just three SQL dialects are supported:
43+
Currently just four SQL dialects are supported:
4444

4545
- **sql** - [Standard SQL][]
4646
- **n1ql** - [Couchbase N1QL][]
4747
- **db2** - [IBM DB2][]
48+
- **pl/sql** - [Oracle PL/SQL][]
4849

4950
### Placeholders replacement
5051

@@ -93,3 +94,4 @@ $ npm run check
9394
[Standard SQL]: https://en.wikipedia.org/wiki/SQL:2011
9495
[Couchbase N1QL]: http://www.couchbase.com/n1ql
9596
[IBM DB2]: https://www.ibm.com/analytics/us/en/technology/db2/
97+
[Oracle PL/SQL]: http://www.oracle.com/technetwork/database/features/plsql/index.html

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)