-
Notifications
You must be signed in to change notification settings - Fork 391
/
db2.formatter.ts
207 lines (199 loc) · 4.85 KB
/
db2.formatter.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
import { expandPhrases } from '../../expandPhrases.js';
import Formatter from '../../formatter/Formatter.js';
import { DialectFormatOptions } from '../../formatter/ExpressionFormatter.js';
import Tokenizer from '../../lexer/Tokenizer.js';
import { functions } from './db2.functions.js';
import { keywords } from './db2.keywords.js';
const reservedSelect = expandPhrases(['SELECT [ALL | DISTINCT]']);
const reservedClauses = expandPhrases([
// queries
'WITH',
'FROM',
'WHERE',
'GROUP BY',
'HAVING',
'PARTITION BY',
'ORDER BY [INPUT SEQUENCE]',
'FETCH FIRST',
// Data modification
// - insert:
'INSERT INTO',
'VALUES',
// - update:
'SET',
// - merge:
'MERGE INTO',
'WHEN [NOT] MATCHED [THEN]',
'UPDATE SET',
'INSERT',
// Data definition
'CREATE [OR REPLACE] VIEW',
'CREATE [GLOBAL TEMPORARY] TABLE',
]);
const onelineClauses = expandPhrases([
// - update:
'UPDATE',
'WHERE CURRENT OF',
'WITH {RR | RS | CS | UR}',
// - delete:
'DELETE FROM',
// - drop table:
'DROP TABLE [HIERARCHY]',
// alter table:
'ALTER TABLE',
'ADD [COLUMN]',
'DROP [COLUMN]',
'RENAME [COLUMN]',
'ALTER [COLUMN]',
'SET DATA TYPE', // for alter column
'SET NOT NULL', // for alter column
'DROP {IDENTITY | EXPRESSION | DEFAULT | NOT NULL}', // for alter column
// - truncate:
'TRUNCATE [TABLE]',
// other
'SET [CURRENT] SCHEMA',
'AFTER',
'GO',
// https://www.ibm.com/docs/en/db2-for-zos/11?topic=statements-list-supported
'ALLOCATE CURSOR',
'ALTER DATABASE',
'ALTER FUNCTION',
'ALTER INDEX',
'ALTER MASK',
'ALTER PERMISSION',
'ALTER PROCEDURE',
'ALTER SEQUENCE',
'ALTER STOGROUP',
'ALTER TABLESPACE',
'ALTER TRIGGER',
'ALTER TRUSTED CONTEXT',
'ALTER VIEW',
'ASSOCIATE LOCATORS',
'BEGIN DECLARE SECTION',
'CALL',
'CLOSE',
'COMMENT',
'COMMIT',
'CONNECT',
'CREATE ALIAS',
'CREATE AUXILIARY TABLE',
'CREATE DATABASE',
'CREATE FUNCTION',
'CREATE GLOBAL TEMPORARY TABLE',
'CREATE INDEX',
'CREATE LOB TABLESPACE',
'CREATE MASK',
'CREATE PERMISSION',
'CREATE PROCEDURE',
'CREATE ROLE',
'CREATE SEQUENCE',
'CREATE STOGROUP',
'CREATE SYNONYM',
'CREATE TABLESPACE',
'CREATE TRIGGER',
'CREATE TRUSTED CONTEXT',
'CREATE TYPE',
'CREATE VARIABLE',
'DECLARE CURSOR',
'DECLARE GLOBAL TEMPORARY TABLE',
'DECLARE STATEMENT',
'DECLARE TABLE',
'DECLARE VARIABLE',
'DESCRIBE CURSOR',
'DESCRIBE INPUT',
'DESCRIBE OUTPUT',
'DESCRIBE PROCEDURE',
'DESCRIBE TABLE',
'DROP',
'END DECLARE SECTION',
'EXCHANGE',
'EXECUTE',
'EXECUTE IMMEDIATE',
'EXPLAIN',
'FETCH',
'FREE LOCATOR',
'GET DIAGNOSTICS',
'GRANT',
'HOLD LOCATOR',
'INCLUDE',
'LABEL',
'LOCK TABLE',
'OPEN',
'PREPARE',
'REFRESH',
'RELEASE',
'RELEASE SAVEPOINT',
'RENAME',
'REVOKE',
'ROLLBACK',
'SAVEPOINT',
'SELECT INTO',
'SET CONNECTION',
'SET CURRENT ACCELERATOR',
'SET CURRENT APPLICATION COMPATIBILITY',
'SET CURRENT APPLICATION ENCODING SCHEME',
'SET CURRENT DEBUG MODE',
'SET CURRENT DECFLOAT ROUNDING MODE',
'SET CURRENT DEGREE',
'SET CURRENT EXPLAIN MODE',
'SET CURRENT GET_ACCEL_ARCHIVE',
'SET CURRENT LOCALE LC_CTYPE',
'SET CURRENT MAINTAINED TABLE TYPES FOR OPTIMIZATION',
'SET CURRENT OPTIMIZATION HINT',
'SET CURRENT PACKAGE PATH',
'SET CURRENT PACKAGESET',
'SET CURRENT PRECISION',
'SET CURRENT QUERY ACCELERATION',
'SET CURRENT QUERY ACCELERATION WAITFORDATA',
'SET CURRENT REFRESH AGE',
'SET CURRENT ROUTINE VERSION',
'SET CURRENT RULES',
'SET CURRENT SQLID',
'SET CURRENT TEMPORAL BUSINESS_TIME',
'SET CURRENT TEMPORAL SYSTEM_TIME',
'SET ENCRYPTION PASSWORD',
'SET PATH',
'SET SESSION TIME ZONE',
'SIGNAL',
'VALUES INTO',
'WHENEVER',
]);
const reservedSetOperations = expandPhrases(['UNION [ALL]', 'EXCEPT [ALL]', 'INTERSECT [ALL]']);
const reservedJoins = expandPhrases([
'JOIN',
'{LEFT | RIGHT | FULL} [OUTER] JOIN',
'{INNER | CROSS} JOIN',
]);
const reservedPhrases = expandPhrases([
'ON DELETE',
'ON UPDATE',
'SET NULL',
'{ROWS | RANGE} BETWEEN',
]);
// https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_72/db2/rbafzintro.htm
export default class Db2Formatter extends Formatter {
tokenizer() {
return new Tokenizer({
reservedSelect,
reservedClauses: [...reservedClauses, ...onelineClauses],
reservedSetOperations,
reservedJoins,
reservedPhrases,
reservedKeywords: keywords,
reservedFunctionNames: functions,
stringTypes: [
{ quote: "''-qq", prefixes: ['G', 'N', 'U&'] },
{ quote: "''-raw", prefixes: ['X', 'BX', 'GX', 'UX'], requirePrefix: true },
],
identTypes: [`""-qq`],
paramTypes: { positional: true, named: [':'] },
paramChars: { first: '@#$', rest: '@#$' },
operators: ['**', '¬=', '¬>', '¬<', '!>', '!<', '||'],
});
}
formatOptions(): DialectFormatOptions {
return {
onelineClauses,
};
}
}