Skip to content

Commit 8a95b4f

Browse files
authored
support timezone phrase as datatype not as a keyword (#896)
Fixed SQL formatting for timezone data types like `TIMESTAMP WITH TIME ZONE` - these were incorrectly treated as keywords instead of data types, so `dataTypeCase: 'lower'` settings now work correctly for timestamp phrases.
2 parents 7993174 + 4024e9b commit 8a95b4f

25 files changed

+153
-48
lines changed

src/languages/bigquery/bigquery.formatter.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ const reservedJoins = expandPhrases([
145145
'{INNER | CROSS} JOIN',
146146
]);
147147

148-
const reservedPhrases = expandPhrases([
148+
const reservedKeywordPhrases = expandPhrases([
149149
// https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#tablesample_operator
150150
'TABLESAMPLE SYSTEM',
151151
// From DDL: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language
@@ -158,6 +158,8 @@ const reservedPhrases = expandPhrases([
158158
'IS [NOT] DISTINCT FROM',
159159
]);
160160

161+
const reservedDataTypePhrases = expandPhrases([]);
162+
161163
// https://cloud.google.com/bigquery/docs/reference/#standard-sql-reference
162164
export const bigquery: DialectOptions = {
163165
name: 'bigquery',
@@ -166,7 +168,8 @@ export const bigquery: DialectOptions = {
166168
reservedClauses: [...reservedClauses, ...tabularOnelineClauses, ...standardOnelineClauses],
167169
reservedSetOperations,
168170
reservedJoins,
169-
reservedPhrases,
171+
reservedKeywordPhrases,
172+
reservedDataTypePhrases,
170173
reservedKeywords: keywords,
171174
reservedDataTypes: dataTypes,
172175
reservedFunctionNames: functions,

src/languages/db2/db2.formatter.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -253,21 +253,24 @@ const reservedJoins = expandPhrases([
253253
'{INNER | CROSS} JOIN',
254254
]);
255255

256-
const reservedPhrases = expandPhrases([
256+
const reservedKeywordPhrases = expandPhrases([
257257
'ON DELETE',
258258
'ON UPDATE',
259259
'SET NULL',
260260
'{ROWS | RANGE} BETWEEN',
261261
]);
262262

263+
const reservedDataTypePhrases = expandPhrases([]);
264+
263265
export const db2: DialectOptions = {
264266
name: 'db2',
265267
tokenizerOptions: {
266268
reservedSelect,
267269
reservedClauses: [...reservedClauses, ...standardOnelineClauses, ...tabularOnelineClauses],
268270
reservedSetOperations,
269271
reservedJoins,
270-
reservedPhrases,
272+
reservedKeywordPhrases,
273+
reservedDataTypePhrases,
271274
reservedKeywords: keywords,
272275
reservedDataTypes: dataTypes,
273276
reservedFunctionNames: functions,

src/languages/db2i/db2i.formatter.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,13 +146,15 @@ const reservedJoins = expandPhrases([
146146
'{INNER | CROSS} JOIN',
147147
]);
148148

149-
const reservedPhrases = expandPhrases([
149+
const reservedKeywordPhrases = expandPhrases([
150150
'ON DELETE',
151151
'ON UPDATE',
152152
'SET NULL',
153153
'{ROWS | RANGE} BETWEEN',
154154
]);
155155

156+
const reservedDataTypePhrases = expandPhrases([]);
157+
156158
// https://www.ibm.com/docs/en/i/7.5?topic=reference-sql
157159
export const db2i: DialectOptions = {
158160
name: 'db2i',
@@ -161,7 +163,8 @@ export const db2i: DialectOptions = {
161163
reservedClauses: [...reservedClauses, ...standardOnelineClauses, ...tabularOnelineClauses],
162164
reservedSetOperations,
163165
reservedJoins,
164-
reservedPhrases,
166+
reservedKeywordPhrases,
167+
reservedDataTypePhrases,
165168
reservedKeywords: keywords,
166169
reservedDataTypes: dataTypes,
167170
reservedFunctionNames: functions,

src/languages/duckdb/duckdb.formatter.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,21 +134,23 @@ const reservedJoins = expandPhrases([
134134
'SEMI JOIN',
135135
]);
136136

137-
const reservedPhrases = expandPhrases([
137+
const reservedKeywordPhrases = expandPhrases([
138138
'{ROWS | RANGE | GROUPS} BETWEEN',
139139
'SIMILAR TO',
140140
'IS [NOT] DISTINCT FROM',
141-
'TIMESTAMP WITH TIME ZONE',
142141
]);
143142

143+
const reservedDataTypePhrases = expandPhrases(['TIMESTAMP WITH TIME ZONE']);
144+
144145
export const duckdb: DialectOptions = {
145146
name: 'duckdb',
146147
tokenizerOptions: {
147148
reservedSelect,
148149
reservedClauses: [...reservedClauses, ...standardOnelineClauses, ...tabularOnelineClauses],
149150
reservedSetOperations,
150151
reservedJoins,
151-
reservedPhrases,
152+
reservedKeywordPhrases,
153+
reservedDataTypePhrases,
152154
supportsXor: true,
153155
reservedKeywords: keywords,
154156
reservedDataTypes: dataTypes,

src/languages/hive/hive.formatter.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ const reservedJoins = expandPhrases([
8484

8585
const reservedPhrases = expandPhrases(['{ROWS | RANGE} BETWEEN']);
8686

87+
const reservedDataTypePhrases = expandPhrases([]);
88+
8789
// https://cwiki.apache.org/confluence/display/Hive/LanguageManual
8890
export const hive: DialectOptions = {
8991
name: 'hive',
@@ -92,7 +94,8 @@ export const hive: DialectOptions = {
9294
reservedClauses: [...reservedClauses, ...standardOnelineClauses, ...tabularOnelineClauses],
9395
reservedSetOperations,
9496
reservedJoins,
95-
reservedPhrases,
97+
reservedKeywordPhrases: reservedPhrases,
98+
reservedDataTypePhrases,
9699
reservedKeywords: keywords,
97100
reservedDataTypes: dataTypes,
98101
reservedFunctionNames: functions,

src/languages/mariadb/mariadb.formatter.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -260,13 +260,15 @@ const reservedJoins = expandPhrases([
260260
'STRAIGHT_JOIN',
261261
]);
262262

263-
const reservedPhrases = expandPhrases([
263+
const reservedKeywordPhrases = expandPhrases([
264264
'ON {UPDATE | DELETE} [SET NULL | SET DEFAULT]',
265265
'CHARACTER SET',
266266
'{ROWS | RANGE} BETWEEN',
267267
'IDENTIFIED BY',
268268
]);
269269

270+
const reservedDataTypePhrases = expandPhrases([]);
271+
270272
// For reference: https://mariadb.com/kb/en/sql-statements-structure/
271273
export const mariadb: DialectOptions = {
272274
name: 'mariadb',
@@ -275,7 +277,8 @@ export const mariadb: DialectOptions = {
275277
reservedClauses: [...reservedClauses, ...standardOnelineClauses, ...tabularOnelineClauses],
276278
reservedSetOperations,
277279
reservedJoins,
278-
reservedPhrases,
280+
reservedKeywordPhrases,
281+
reservedDataTypePhrases,
279282
supportsXor: true,
280283
reservedKeywords: keywords,
281284
reservedDataTypes: dataTypes,

src/languages/mysql/mysql.formatter.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,13 +225,15 @@ const reservedJoins = expandPhrases([
225225
'STRAIGHT_JOIN',
226226
]);
227227

228-
const reservedPhrases = expandPhrases([
228+
const reservedKeywordPhrases = expandPhrases([
229229
'ON {UPDATE | DELETE} [SET NULL]',
230230
'CHARACTER SET',
231231
'{ROWS | RANGE} BETWEEN',
232232
'IDENTIFIED BY',
233233
]);
234234

235+
const reservedDataTypePhrases = expandPhrases([]);
236+
235237
// https://dev.mysql.com/doc/refman/8.0/en/
236238
export const mysql: DialectOptions = {
237239
name: 'mysql',
@@ -240,7 +242,8 @@ export const mysql: DialectOptions = {
240242
reservedClauses: [...reservedClauses, ...standardOnelineClauses, ...tabularOnelineClauses],
241243
reservedSetOperations,
242244
reservedJoins,
243-
reservedPhrases,
245+
reservedKeywordPhrases,
246+
reservedDataTypePhrases,
244247
supportsXor: true,
245248
reservedKeywords: keywords,
246249
reservedDataTypes: dataTypes,

src/languages/n1ql/n1ql.formatter.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,9 @@ const reservedSetOperations = expandPhrases(['UNION [ALL]', 'EXCEPT [ALL]', 'INT
8080

8181
const reservedJoins = expandPhrases(['JOIN', '{LEFT | RIGHT} [OUTER] JOIN', 'INNER JOIN']);
8282

83-
const reservedPhrases = expandPhrases(['{ROWS | RANGE | GROUPS} BETWEEN']);
83+
const reservedKeywordPhrases = expandPhrases(['{ROWS | RANGE | GROUPS} BETWEEN']);
84+
85+
const reservedDataTypePhrases = expandPhrases([]);
8486

8587
// For reference: http://docs.couchbase.com.s3-website-us-west-1.amazonaws.com/server/6.0/n1ql/n1ql-language-reference/index.html
8688
export const n1ql: DialectOptions = {
@@ -90,7 +92,8 @@ export const n1ql: DialectOptions = {
9092
reservedClauses: [...reservedClauses, ...onelineClauses],
9193
reservedSetOperations,
9294
reservedJoins,
93-
reservedPhrases,
95+
reservedKeywordPhrases,
96+
reservedDataTypePhrases,
9497
supportsXor: true,
9598
reservedKeywords: keywords,
9699
reservedDataTypes: dataTypes,

src/languages/plsql/plsql.formatter.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,20 +78,23 @@ const reservedJoins = expandPhrases([
7878
'{CROSS | OUTER} APPLY',
7979
]);
8080

81-
const reservedPhrases = expandPhrases([
81+
const reservedKeywordPhrases = expandPhrases([
8282
'ON {UPDATE | DELETE} [SET NULL]',
8383
'ON COMMIT',
8484
'{ROWS | RANGE} BETWEEN',
8585
]);
8686

87+
const reservedDataTypePhrases = expandPhrases([]);
88+
8789
export const plsql: DialectOptions = {
8890
name: 'plsql',
8991
tokenizerOptions: {
9092
reservedSelect,
9193
reservedClauses: [...reservedClauses, ...standardOnelineClauses, ...tabularOnelineClauses],
9294
reservedSetOperations,
9395
reservedJoins,
94-
reservedPhrases,
96+
reservedKeywordPhrases,
97+
reservedDataTypePhrases,
9598
supportsXor: true,
9699
reservedKeywords: keywords,
97100
reservedDataTypes: dataTypes,

src/languages/postgresql/postgresql.formatter.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -248,21 +248,24 @@ const reservedJoins = expandPhrases([
248248
'NATURAL {LEFT | RIGHT | FULL} [OUTER] JOIN',
249249
]);
250250

251-
const reservedPhrases = expandPhrases([
251+
const reservedKeywordPhrases = expandPhrases([
252252
'PRIMARY KEY',
253253
'GENERATED {ALWAYS | BY DEFAULT} AS IDENTITY',
254254
'ON {UPDATE | DELETE} [NO ACTION | RESTRICT | CASCADE | SET NULL | SET DEFAULT]',
255255
'DO {NOTHING | UPDATE}',
256256
'AS MATERIALIZED',
257257
'{ROWS | RANGE | GROUPS} BETWEEN',
258-
// https://www.postgresql.org/docs/current/datatype-datetime.html
259-
'[TIMESTAMP | TIME] {WITH | WITHOUT} TIME ZONE',
260258
// comparison operator
261259
'IS [NOT] DISTINCT FROM',
262260
'NULLS {FIRST | LAST}',
263261
'WITH ORDINALITY',
264262
]);
265263

264+
const reservedDataTypePhrases = expandPhrases([
265+
// https://www.postgresql.org/docs/current/datatype-datetime.html
266+
'[TIMESTAMP | TIME] {WITH | WITHOUT} TIME ZONE',
267+
]);
268+
266269
// https://www.postgresql.org/docs/14/index.html
267270
export const postgresql: DialectOptions = {
268271
name: 'postgresql',
@@ -271,7 +274,8 @@ export const postgresql: DialectOptions = {
271274
reservedClauses: [...reservedClauses, ...standardOnelineClauses, ...tabularOnelineClauses],
272275
reservedSetOperations,
273276
reservedJoins,
274-
reservedPhrases,
277+
reservedKeywordPhrases,
278+
reservedDataTypePhrases,
275279
reservedKeywords: keywords,
276280
reservedDataTypes: dataTypes,
277281
reservedFunctionNames: functions,

0 commit comments

Comments
 (0)