Skip to content

Commit 285278d

Browse files
committed
Also support underscores in PostgreSQL numbers
1 parent e68d5fb commit 285278d

18 files changed

+48
-14
lines changed

src/languages/postgresql/postgresql.formatter.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,9 @@ export const postgresql: DialectOptions = {
277277
reservedFunctionNames: functions,
278278
nestedBlockComments: true,
279279
extraParens: ['[]'],
280+
// Support underscore separators in numeric literals (e.g., 1_000_000)
281+
numberRegex:
282+
/(?:0x[0-9a-fA-F_]+|0b[01_]+|(?:-\s*)?(?:[0-9_]*\.[0-9_]+|[0-9_]+(?:\.[0-9_]*)?)(?:[eE][-+]?[0-9_]+(?:\.[0-9_]+)?)?)(?![\w\p{Alphabetic}])/uy,
280283
stringTypes: [
281284
'$$',
282285
{ quote: "''-qq", prefixes: ['U&'] },

test/behavesLikeDb2Formatter.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@ import supportsMergeInto from './features/mergeInto.js';
1919
import supportsCreateView from './features/createView.js';
2020
import supportsArrayLiterals from './features/arrayLiterals.js';
2121
import supportsArrayAndMapAccessors from './features/arrayAndMapAccessors.js';
22+
import supportsNumbers from './features/numbers.js';
2223

2324
/**
2425
* Shared tests for DB2 and DB2i
2526
*/
2627
export default function behavesLikeDb2Formatter(format: FormatFn) {
2728
behavesLikeSqlFormatter(format);
29+
supportsNumbers(format);
2830
supportsCommentOn(format);
2931
supportsCreateView(format, { orReplace: true });
3032
supportsConstraints(format, ['NO ACTION', 'RESTRICT', 'CASCADE', 'SET NULL']);

test/behavesLikeMariaDbFormatter.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ import supportsIdentifiers from './features/identifiers.js';
1212
import supportsInsertInto from './features/insertInto.js';
1313
import supportsUpdate from './features/update.js';
1414
import supportsTruncateTable from './features/truncateTable.js';
15+
import supportsNumbers from './features/numbers.js';
1516

1617
/**
1718
* Shared tests for MySQL and MariaDB
1819
*/
1920
export default function behavesLikeMariaDbFormatter(format: FormatFn) {
2021
behavesLikeSqlFormatter(format);
22+
supportsNumbers(format);
2123
supportsComments(format, { hashComments: true });
2224
supportsStrings(format, ["''-qq", "''-bs", '""-qq', '""-bs', "X''"]);
2325
supportsIdentifiers(format, ['``']);

test/behavesLikePostgresqlFormatter.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@ import supportsIsDistinctFrom from './features/isDistinctFrom.js';
1313
import supportsReturning from './features/returning.js';
1414
import supportsWindow from './features/window.js';
1515
import supportsDataTypeCase from './options/dataTypeCase.js';
16+
import supportsNumbers from './features/numbers.js';
1617

1718
/**
1819
* Shared tests for PostgreSQL and DuckDB
1920
*/
2021
export default function behavesLikePostgresqlFormatter(format: FormatFn) {
2122
behavesLikeSqlFormatter(format);
23+
supportsNumbers(format, { underscore: true });
2224
supportsComments(format, { nestedBlockComments: true });
2325
supportsCommentOn(format);
2426
supportsArrayAndMapAccessors(format);

test/behavesLikeSqlFormatter.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import dedent from 'dedent-js';
33
import { FormatFn } from '../src/sqlFormatter.js';
44

55
import supportsCase from './features/case.js';
6-
import supportsNumbers from './features/numbers.js';
76
import supportsWith from './features/with.js';
87
import supportsTabWidth from './options/tabWidth.js';
98
import supportsUseTabs from './options/useTabs.js';
@@ -25,7 +24,6 @@ import supportsDisableComment from './features/disableComment.js';
2524
export default function behavesLikeSqlFormatter(format: FormatFn) {
2625
supportsDisableComment(format);
2726
supportsCase(format);
28-
supportsNumbers(format);
2927
supportsWith(format);
3028

3129
supportsTabWidth(format);

test/bigquery.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,14 @@ import supportsCreateView from './features/createView.js';
2525
import supportsAlterTable from './features/alterTable.js';
2626
import supportsIsDistinctFrom from './features/isDistinctFrom.js';
2727
import supportsDataTypeCase from './options/dataTypeCase.js';
28+
import supportsNumbers from './features/numbers.js';
2829

2930
describe('BigQueryFormatter', () => {
3031
const language = 'bigquery';
3132
const format: FormatFn = (query, cfg = {}) => originalFormat(query, { ...cfg, language });
3233

3334
behavesLikeSqlFormatter(format);
35+
supportsNumbers(format);
3436
supportsComments(format, { hashComments: true });
3537
supportsCreateView(format, { orReplace: true, materialized: true, ifNotExists: true });
3638
supportsCreateTable(format, { orReplace: true, ifNotExists: true });

test/duckdb.test.ts

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -214,15 +214,4 @@ describe('DuckDBFormatter', () => {
214214
1 IS NOT NULL;
215215
`);
216216
});
217-
218-
it('supports underscore separators in numeric literals', () => {
219-
expect(format('SELECT 1_000_000, 3.14_159, 0x1A_2B_3C, 0b1010_0001, 1.5e+1_0;')).toBe(dedent`
220-
SELECT
221-
1_000_000,
222-
3.14_159,
223-
0x1A_2B_3C,
224-
0b1010_0001,
225-
1.5e+1_0;
226-
`);
227-
});
228217
});

test/features/numbers.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ import dedent from 'dedent-js';
22

33
import { FormatFn } from '../../src/sqlFormatter.js';
44

5-
export default function supportsNumbers(format: FormatFn) {
5+
export default function supportsNumbers(
6+
format: FormatFn,
7+
{ underscore }: { underscore?: boolean } = {}
8+
) {
69
it('supports decimal numbers', () => {
710
const result = format('SELECT 42, -35.04, 105., 2.53E+3, 1.085E-5;');
811
expect(result).toBe(dedent`
@@ -59,4 +62,17 @@ export default function supportsNumbers(format: FormatFn) {
5962
.456 AS foo;
6063
`);
6164
});
65+
66+
if (underscore) {
67+
it('supports underscore separators in numeric literals', () => {
68+
expect(format('SELECT 1_000_000, 3.14_159, 0x1A_2B_3C, 0b1010_0001, 1.5e+1_0;')).toBe(dedent`
69+
SELECT
70+
1_000_000,
71+
3.14_159,
72+
0x1A_2B_3C,
73+
0b1010_0001,
74+
1.5e+1_0;
75+
`);
76+
});
77+
}
6278
}

test/hive.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,14 @@ import supportsTruncateTable from './features/truncateTable.js';
2323
import supportsMergeInto from './features/mergeInto.js';
2424
import supportsCreateView from './features/createView.js';
2525
import supportsDataTypeCase from './options/dataTypeCase.js';
26+
import supportsNumbers from './features/numbers.js';
2627

2728
describe('HiveFormatter', () => {
2829
const language = 'hive';
2930
const format: FormatFn = (query, cfg = {}) => originalFormat(query, { ...cfg, language });
3031

3132
behavesLikeSqlFormatter(format);
33+
supportsNumbers(format);
3234
supportsComments(format);
3335
supportsCreateView(format, { materialized: true, ifNotExists: true });
3436
supportsCreateTable(format, { ifNotExists: true });

test/n1ql.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@ import supportsLimiting from './features/limiting.js';
2121
import supportsInsertInto from './features/insertInto.js';
2222
import supportsUpdate from './features/update.js';
2323
import supportsMergeInto from './features/mergeInto.js';
24+
import supportsNumbers from './features/numbers.js';
2425

2526
describe('N1qlFormatter', () => {
2627
const language = 'n1ql';
2728
const format: FormatFn = (query, cfg = {}) => originalFormat(query, { ...cfg, language });
2829

2930
behavesLikeSqlFormatter(format);
31+
supportsNumbers(format);
3032
supportsComments(format, { hashComments: true });
3133
supportsDeleteFrom(format);
3234
supportsStrings(format, [`""-bs`]);

0 commit comments

Comments
 (0)