Skip to content

Commit e0763e1

Browse files
committed
Initial DuckDB configuration
(for start using PostgreSQL keywords and function names lists)
1 parent f5e283e commit e0763e1

File tree

6 files changed

+498
-1
lines changed

6 files changed

+498
-1
lines changed

src/allDialects.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
export { bigquery } from './languages/bigquery/bigquery.formatter.js';
22
export { db2 } from './languages/db2/db2.formatter.js';
33
export { db2i } from './languages/db2i/db2i.formatter.js';
4+
export { duckdb } from './languages/duckdb/duckdb.formatter.js';
45
export { hive } from './languages/hive/hive.formatter.js';
56
export { mariadb } from './languages/mariadb/mariadb.formatter.js';
67
export { mysql } from './languages/mysql/mysql.formatter.js';

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export { ConfigError } from './validateConfig.js';
66
export { bigquery } from './languages/bigquery/bigquery.formatter.js';
77
export { db2 } from './languages/db2/db2.formatter.js';
88
export { db2i } from './languages/db2i/db2i.formatter.js';
9+
export { duckdb } from './languages/duckdb/duckdb.formatter.js';
910
export { hive } from './languages/hive/hive.formatter.js';
1011
export { mariadb } from './languages/mariadb/mariadb.formatter.js';
1112
export { mysql } from './languages/mysql/mysql.formatter.js';
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
import { DialectOptions } from '../../dialect.js';
2+
import { expandPhrases } from '../../expandPhrases.js';
3+
import { functions } from '../postgresql/postgresql.functions.js';
4+
import { dataTypes, keywords } from '../postgresql/postgresql.keywords.js';
5+
6+
const reservedSelect = expandPhrases(['SELECT [ALL | DISTINCT]']);
7+
8+
const reservedClauses = expandPhrases([
9+
// queries
10+
'WITH [RECURSIVE]',
11+
'FROM',
12+
'WHERE',
13+
'GROUP BY [ALL]',
14+
'HAVING',
15+
'WINDOW',
16+
'PARTITION BY',
17+
'ORDER BY [ALL]',
18+
'LIMIT',
19+
'OFFSET',
20+
// 'USING' (conflicts with 'USING' in JOIN)
21+
'USING SAMPLE',
22+
'QUALIFY',
23+
// Data manipulation
24+
// - insert:
25+
'INSERT [OR REPLACE] INTO',
26+
'VALUES',
27+
'DEFAULT VALUES',
28+
// - update:
29+
'SET',
30+
// other:
31+
'RETURNING',
32+
]);
33+
34+
const standardOnelineClauses = expandPhrases([
35+
'CREATE [OR REPLACE] [TEMPORARY | TEMP] TABLE [IF NOT EXISTS]',
36+
]);
37+
38+
const tabularOnelineClauses = expandPhrases([
39+
// - create:
40+
'CREATE [OR REPLACE] [TEMPORARY | TEMP] VIEW [IF NOT EXISTS]',
41+
// - update:
42+
'UPDATE',
43+
// - insert:
44+
'ON CONFLICT',
45+
// - delete:
46+
'DELETE FROM',
47+
// - drop table:
48+
'DROP TABLE [IF EXISTS]',
49+
// - truncate
50+
'TRUNCATE',
51+
// - alter table:
52+
'ALTER TABLE',
53+
'ADD [COLUMN] [IF NOT EXISTS]',
54+
'ADD PRIMARY KEY',
55+
'DROP [COLUMN] [IF EXISTS]',
56+
'ALTER [COLUMN]',
57+
'RENAME [COLUMN]',
58+
'RENAME TO',
59+
'SET [DATA] TYPE', // for alter column
60+
'{SET | DROP} DEFAULT', // for alter column
61+
'{SET | DROP} NOT NULL', // for alter column
62+
]);
63+
64+
const reservedSetOperations = expandPhrases([
65+
'UNION [ALL | BY NAME]',
66+
'EXCEPT [ALL]',
67+
'INTERSECT [ALL]',
68+
]);
69+
70+
const reservedJoins = expandPhrases([
71+
'JOIN',
72+
'{LEFT | RIGHT | FULL} [OUTER] JOIN',
73+
'{INNER | CROSS} JOIN',
74+
'{NATURAL | ASOF} [INNER] JOIN',
75+
'{NATURAL | ASOF} {LEFT | RIGHT | FULL} [OUTER] JOIN',
76+
'POSITIONAL JOIN',
77+
]);
78+
79+
const reservedPhrases = expandPhrases([
80+
'{ROWS | RANGE | GROUPS} BETWEEN',
81+
'SIMILAR TO',
82+
'IS [NOT] DISTINCT FROM',
83+
'TIMESTAMP WITH TIME ZONE',
84+
]);
85+
86+
export const duckdb: DialectOptions = {
87+
name: 'duckdb',
88+
tokenizerOptions: {
89+
reservedSelect,
90+
reservedClauses: [...reservedClauses, ...standardOnelineClauses, ...tabularOnelineClauses],
91+
reservedSetOperations,
92+
reservedJoins,
93+
reservedPhrases,
94+
supportsXor: true,
95+
reservedKeywords: keywords,
96+
reservedDataTypes: dataTypes,
97+
reservedFunctionNames: functions,
98+
nestedBlockComments: true,
99+
extraParens: ['[]', '{}'],
100+
stringTypes: [
101+
'$$',
102+
"''-qq",
103+
{ quote: "''-qq-bs", prefixes: ['E'], requirePrefix: true },
104+
{ quote: "''-raw", prefixes: ['B', 'X'], requirePrefix: true },
105+
],
106+
identTypes: [`""-qq`],
107+
identChars: { rest: '$' },
108+
paramTypes: { positional: true, numbered: ['$'], named: ['$'], quoted: ['$'] },
109+
operators: [
110+
// Arithmetic:
111+
'//',
112+
'%',
113+
'**',
114+
'^',
115+
'!',
116+
// Bitwise:
117+
'&',
118+
'|',
119+
'~',
120+
'<<',
121+
'>>',
122+
// Cast:
123+
'::',
124+
// Comparison:
125+
'==',
126+
// Lambda:
127+
'->',
128+
// key-value separator:
129+
':',
130+
// Named function params:
131+
':=',
132+
'=>',
133+
// Pattern matching:
134+
'~~',
135+
'!~~',
136+
'~~*',
137+
'!~~*',
138+
'~~~',
139+
// Regular expressions:
140+
'~',
141+
'!~',
142+
'~*',
143+
'!~*',
144+
// String:
145+
'^@',
146+
'||',
147+
// INET extension:
148+
'>>=',
149+
'<<=',
150+
],
151+
},
152+
formatOptions: {
153+
alwaysDenseOperators: ['::', ':'],
154+
onelineClauses: [...standardOnelineClauses, ...tabularOnelineClauses],
155+
tabularOnelineClauses,
156+
},
157+
};

src/sqlFormatter.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const dialectNameMap: Record<keyof typeof allDialects | 'tsql', keyof typeof all
99
bigquery: 'bigquery',
1010
db2: 'db2',
1111
db2i: 'db2i',
12+
duckdb: 'duckdb',
1213
hive: 'hive',
1314
mariadb: 'mariadb',
1415
mysql: 'mysql',

0 commit comments

Comments
 (0)