Skip to content

Commit d192a2c

Browse files
committed
Merge PR #658: Add SQL dialect for DB2 for IBM i
2 parents f907e99 + 31e7b7e commit d192a2c

File tree

13 files changed

+1212
-2
lines changed

13 files changed

+1212
-2
lines changed

AUTHORS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Andrew
1010
Benjamin Bellamy
1111
bingou
1212
Boris Verkhovskiy <[email protected]>
13+
Christian Jorgensen <[email protected]>
1314
Christopher Manouvrier <[email protected]>
1415
Damon Davison <[email protected]>
1516
Davut Can Abacigil <[email protected]>

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ sql-formatter -h
9595

9696
```
9797
usage: sql-formatter [-h] [-o OUTPUT] \
98-
[-l {bigquery,db2,hive,mariadb,mysql,n1ql,plsql,postgresql,redshift,singlestoredb,snowflake,spark,sql,sqlite,transactsql,trino,tsql}] [-c CONFIG] [--version] [FILE]
98+
[-l {bigquery,db2,db2i,hive,mariadb,mysql,n1ql,plsql,postgresql,redshift,singlestoredb,snowflake,spark,sql,sqlite,transactsql,trino,tsql}] [-c CONFIG] [--version] [FILE]
9999
100100
SQL Formatter
101101
@@ -107,7 +107,7 @@ optional arguments:
107107
-o, --output OUTPUT
108108
File to write SQL output (defaults to stdout)
109109
--fix Update the file in-place
110-
-l, --language {bigquery,db2,hive,mariadb,mysql,n1ql,plsql,postgresql,redshift,singlestoredb,snowflake,spark,sql,sqlite,trino,tsql}
110+
-l, --language {bigquery,db2,db2i,hive,mariadb,mysql,n1ql,plsql,postgresql,redshift,singlestoredb,snowflake,spark,sql,sqlite,trino,tsql}
111111
SQL dialect (defaults to basic sql)
112112
-c, --config CONFIG
113113
Path to config json file (will use default configs if unspecified)

docs/dialect.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ The following dialects can be imported from `"sql-formatter"` module:
2323
- `sql` - [Standard SQL][]
2424
- `bigquery` - [GCP BigQuery][]
2525
- `db2` - [IBM DB2][]
26+
- `db2i` - [IBM DB2i][] (experimental)
2627
- `hive` - [Apache Hive][]
2728
- `mariadb` - [MariaDB][]
2829
- `mysql` - [MySQL][]
@@ -69,6 +70,7 @@ You likely only want to use this if your other alternative is to fork SQL Format
6970
[standard sql]: https://en.wikipedia.org/wiki/SQL:2011
7071
[gcp bigquery]: https://cloud.google.com/bigquery
7172
[ibm db2]: https://www.ibm.com/analytics/us/en/technology/db2/
73+
[ibm db2i]: https://www.ibm.com/docs/en/i/7.5?topic=overview-db2-i
7274
[apache hive]: https://hive.apache.org/
7375
[mariadb]: https://mariadb.com/
7476
[mysql]: https://www.mysql.com/

docs/language.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ const result = format('SELECT * FROM tbl', { dialect: 'sqlite' });
1515
- `"sql"` - (default) [Standard SQL][]
1616
- `"bigquery"` - [GCP BigQuery][]
1717
- `"db2"` - [IBM DB2][]
18+
- `"db2i"` - [IBM DB2i][] (experimental)
1819
- `"hive"` - [Apache Hive][]
1920
- `"mariadb"` - [MariaDB][]
2021
- `"mysql"` - [MySQL][]
@@ -47,6 +48,7 @@ See docs for [dialect][] option.
4748
[standard sql]: https://en.wikipedia.org/wiki/SQL:2011
4849
[gcp bigquery]: https://cloud.google.com/bigquery
4950
[ibm db2]: https://www.ibm.com/analytics/us/en/technology/db2/
51+
[ibm db2i]: https://www.ibm.com/docs/en/i/7.5?topic=overview-db2-i
5052
[apache hive]: https://hive.apache.org/
5153
[mariadb]: https://mariadb.com/
5254
[mysql]: https://www.mysql.com/

docs/params.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ The placeholder types available by default depend on SQL dialect used:
110110
- sql - `?`
111111
- bigquery - `?`, `@name`, `` @`name` ``
112112
- db2 - `?`, `:name`
113+
- db2i - `?`, `:name`
113114
- hive - _no support_
114115
- mariadb - `?`
115116
- mysql - `?`

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
"pl/sql",
3636
"transact-sql",
3737
"db2",
38+
"db2i",
3839
"sqlite",
3940
"trino",
4041
"presto",

src/allDialects.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
export { bigquery } from './languages/bigquery/bigquery.formatter.js';
22
export { db2 } from './languages/db2/db2.formatter.js';
3+
export { db2i } from './languages/db2i/db2i.formatter.js';
34
export { hive } from './languages/hive/hive.formatter.js';
45
export { mariadb } from './languages/mariadb/mariadb.formatter.js';
56
export { mysql } from './languages/mysql/mysql.formatter.js';
Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
import { DialectOptions } from '../../dialect.js';
2+
import { expandPhrases } from '../../expandPhrases.js';
3+
import { functions } from './db2i.functions.js';
4+
import { keywords } from './db2i.keywords.js';
5+
6+
const reservedSelect = expandPhrases(['SELECT [ALL | DISTINCT]']);
7+
8+
const reservedClauses = expandPhrases([
9+
// queries
10+
'WITH',
11+
'INTO',
12+
'FROM',
13+
'WHERE',
14+
'GROUP BY',
15+
'HAVING',
16+
'PARTITION BY',
17+
'ORDER [SIBLINGS] BY [INPUT SEQUENCE]',
18+
'OFFSET',
19+
'FETCH {FIRST | NEXT}',
20+
'LIMIT',
21+
'FOR UPDATE [OF]',
22+
'FOR READ ONLY',
23+
'OPTIMIZE FOR',
24+
// Data modification
25+
// - insert:
26+
'INSERT INTO',
27+
'VALUES',
28+
// - update:
29+
'SET',
30+
// - merge:
31+
'MERGE INTO',
32+
'WHEN [NOT] MATCHED [THEN]',
33+
'UPDATE SET',
34+
'DELETE',
35+
'INSERT',
36+
// Data definition - table
37+
'CREATE [OR REPLACE] TABLE',
38+
'FOR SYSTEM NAME',
39+
// Data definition - view
40+
'CREATE [OR REPLACE] [RECURSIVE] VIEW',
41+
]);
42+
43+
const onelineClauses = expandPhrases([
44+
// - update:
45+
'UPDATE',
46+
'WHERE CURRENT OF',
47+
'WITH {NC | RR | RS | CS | UR}',
48+
// - delete:
49+
'DELETE FROM',
50+
// - drop table:
51+
'DROP TABLE',
52+
// alter table:
53+
'ALTER TABLE',
54+
'ADD [COLUMN]',
55+
'ALTER [COLUMN]',
56+
'DROP [COLUMN]',
57+
'RENAME [COLUMN]',
58+
'SET DATA TYPE', // for alter column
59+
'SET {GENERATED ALWAYS | GENERATED BY DEFAULT}', // for alter column
60+
'SET NOT NULL', // for alter column
61+
'SET {NOT HIDDEN | IMPLICITLY HIDDEN}', // for alter column
62+
'SET FIELDPROC', // for alter column
63+
'DROP {DEFAULT | NOT NULL | GENERATED | IDENTITY | ROW CHANGE TIMESTAMP | FIELDPROC}', // for alter column
64+
// - truncate:
65+
'TRUNCATE [TABLE]',
66+
// other
67+
'SET [CURRENT] SCHEMA',
68+
'SET CURRENT_SCHEMA',
69+
// https://www.ibm.com/docs/en/i/7.5?topic=reference-statements
70+
'ALLOCATE CURSOR',
71+
'ALLOCATE [SQL] DESCRIPTOR [LOCAL | GLOBAL] SQL',
72+
'ALTER [SPECIFIC] {FUNCTION | PROCEDURE}',
73+
'ALTER {MASK | PERMISSION | SEQUENCE | TRIGGER}',
74+
'ASSOCIATE [RESULT SET] {LOCATOR | LOCATORS}',
75+
'BEGIN DECLARE SECTION',
76+
'CALL',
77+
'CLOSE',
78+
'COMMENT ON {ALIAS | COLUMN | CONSTRAINT | INDEX | MASK | PACKAGE | PARAMETER | PERMISSION | SEQUENCE | TABLE | TRIGGER | VARIABLE | XSROBJECT}',
79+
'COMMENT ON [SPECIFIC] {FUNCTION | PROCEDURE | ROUTINE}',
80+
'COMMENT ON PARAMETER SPECIFIC {FUNCTION | PROCEDURE | ROUTINE}',
81+
'COMMENT ON [TABLE FUNCTION] RETURN COLUMN',
82+
'COMMENT ON [TABLE FUNCTION] RETURN COLUMN SPECIFIC [PROCEDURE | ROUTINE]',
83+
'COMMIT [WORK] [HOLD]',
84+
'CONNECT [TO | RESET] USER',
85+
'CREATE [OR REPLACE] {ALIAS | FUNCTION | MASK | PERMISSION | PROCEDURE | SEQUENCE | TRIGGER | VARIABLE}',
86+
'CREATE [ENCODED VECTOR] INDEX',
87+
'CREATE UNIQUE [WHERE NOT NULL] INDEX',
88+
'CREATE SCHEMA',
89+
'CREATE TYPE',
90+
'DEALLOCATE [SQL] DESCRIPTOR [LOCAL | GLOBAL]',
91+
'DECLARE CURSOR',
92+
'DECLARE GLOBAL TEMPORARY TABLE',
93+
'DECLARE',
94+
'DESCRIBE CURSOR',
95+
'DESCRIBE INPUT',
96+
'DESCRIBE [OUTPUT]',
97+
'DESCRIBE {PROCEDURE | ROUTINE}',
98+
'DESCRIBE TABLE',
99+
'DISCONNECT ALL [SQL]',
100+
'DISCONNECT [CURRENT]',
101+
'DROP {ALIAS | INDEX | MASK | PACKAGE | PERMISSION | SCHEMA | SEQUENCE | TABLE | TYPE | VARIABLE | XSROBJECT} [IF EXISTS]',
102+
'DROP [SPECIFIC] {FUNCTION | PROCEDURE | ROUTINE} [IF EXISTS]',
103+
'END DECLARE SECTION',
104+
'EXECUTE [IMMEDIATE]',
105+
// 'FETCH {NEXT | PRIOR | FIRST | LAST | BEFORE | AFTER | CURRENT} [FROM]',
106+
'FREE LOCATOR',
107+
'GET [SQL] DESCRIPTOR [LOCAL | GLOBAL]',
108+
'GET [CURRENT | STACKED] DIAGNOSTICS',
109+
'GRANT {ALL [PRIVILEGES] | ALTER | EXECUTE} ON {FUNCTION | PROCEDURE | ROUTINE | PACKAGE | SCHEMA | SEQUENCE | TABLE | TYPE | VARIABLE | XSROBJECT}',
110+
'HOLD LOCATOR',
111+
'INCLUDE',
112+
'LABEL ON {ALIAS | COLUMN | CONSTRAINT | INDEX | MASK | PACKAGE | PERMISSION | SEQUENCE | TABLE | TRIGGER | VARIABLE | XSROBJECT}',
113+
'LABEL ON [SPECIFIC] {FUNCTION | PROCEDURE | ROUTINE}',
114+
'LOCK TABLE',
115+
'OPEN',
116+
'PREPARE',
117+
'REFRESH TABLE',
118+
'RELEASE',
119+
'RELEASE [TO] SAVEPOINT',
120+
'RENAME [TABLE | INDEX] TO',
121+
'REVOKE {ALL [PRIVILEGES] | ALTER | EXECUTE} ON {FUNCTION | PROCEDURE | ROUTINE | PACKAGE | SCHEMA | SEQUENCE | TABLE | TYPE | VARIABLE | XSROBJECT}',
122+
'ROLLBACK [WORK] [HOLD | TO SAVEPOINT]',
123+
'SAVEPOINT',
124+
'SET CONNECTION',
125+
'SET CURRENT {DEBUG MODE | DECFLOAT ROUNDING MODE | DEGREE | IMPLICIT XMLPARSE OPTION | TEMPORAL SYSTEM_TIME}',
126+
'SET [SQL] DESCRIPTOR [LOCAL | GLOBAL]',
127+
'SET ENCRYPTION PASSWORD',
128+
'SET OPTION',
129+
'SET {[CURRENT [FUNCTION]] PATH | CURRENT_PATH}',
130+
'SET RESULT SETS [WITH RETURN [TO CALLER | TO CLIENT]',
131+
'SET SESSION AUTHORIZATION',
132+
'SET SESSION_USER',
133+
'SET TRANSACTION',
134+
'SIGNAL SQLSTATE [VALUE]',
135+
'TAG',
136+
'TRANSFER OWNERSHIP OF',
137+
'WHENEVER {NOT FOUND | SQLERROR | SQLWARNING}',
138+
]);
139+
140+
const reservedSetOperations = expandPhrases(['UNION [ALL]', 'EXCEPT [ALL]', 'INTERSECT [ALL]']);
141+
142+
const reservedJoins = expandPhrases([
143+
'JOIN',
144+
'{LEFT | RIGHT | FULL} [OUTER] JOIN',
145+
'{LEFT | RIGHT } EXCEPTION JOIN',
146+
'{INNER | CROSS} JOIN',
147+
]);
148+
149+
const reservedPhrases = expandPhrases([
150+
'ON DELETE',
151+
'ON UPDATE',
152+
'SET NULL',
153+
'{ROWS | RANGE} BETWEEN',
154+
]);
155+
156+
// https://www.ibm.com/docs/en/i/7.5?topic=reference-sql
157+
export const db2i: DialectOptions = {
158+
tokenizerOptions: {
159+
reservedSelect,
160+
reservedClauses: [...reservedClauses, ...onelineClauses],
161+
reservedSetOperations,
162+
reservedJoins,
163+
reservedPhrases,
164+
reservedKeywords: keywords,
165+
reservedFunctionNames: functions,
166+
stringTypes: [
167+
{ quote: "''-qq", prefixes: ['G', 'N', 'U&'] },
168+
{ quote: "''-raw", prefixes: ['X', 'BX', 'GX', 'UX'], requirePrefix: true },
169+
],
170+
identTypes: [`""-qq`],
171+
identChars: { first: '@#$' },
172+
paramTypes: { positional: true, named: [':'] },
173+
paramChars: { first: '@#$', rest: '@#$' },
174+
operators: ['**', '¬=', '¬>', '¬<', '!>', '!<', '||'],
175+
},
176+
formatOptions: {
177+
onelineClauses,
178+
},
179+
};

0 commit comments

Comments
 (0)