Skip to content

Commit 40a1433

Browse files
authored
Merge pull request #318 from sql-formatter-org/params-in-between
Fix parameters replacement in BETWEEN expressions
2 parents 8dcf1c2 + 19ff50b commit 40a1433

3 files changed

Lines changed: 30 additions & 18 deletions

File tree

src/formatter/ExpressionFormatter.ts

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { equalizeWhitespace } from 'src/utils';
33

44
import Params from 'src/formatter/Params';
55
import { isTabularStyle } from 'src/formatter/config';
6-
import { isReserved, type Token, TokenType } from 'src/lexer/token';
6+
import { isReserved, type Token, TokenType, isParameter } from 'src/lexer/token';
77
import {
88
AllColumnsAsterisk,
99
ArraySubscript,
@@ -206,11 +206,6 @@ export default class ExpressionFormatter {
206206
return this.formatCaseStart(token);
207207
case TokenType.RESERVED_CASE_END:
208208
return this.formatCaseEnd(token);
209-
case TokenType.NAMED_PARAMETER:
210-
case TokenType.QUOTED_PARAMETER:
211-
case TokenType.INDEXED_PARAMETER:
212-
case TokenType.POSITIONAL_PARAMETER:
213-
return this.formatParameter(token);
214209
case TokenType.COMMA:
215210
return this.formatComma(token);
216211
case TokenType.OPERATOR:
@@ -220,16 +215,18 @@ export default class ExpressionFormatter {
220215
case TokenType.STRING:
221216
case TokenType.NUMBER:
222217
case TokenType.VARIABLE:
223-
return this.formatWord(token);
218+
case TokenType.NAMED_PARAMETER:
219+
case TokenType.QUOTED_PARAMETER:
220+
case TokenType.INDEXED_PARAMETER:
221+
case TokenType.POSITIONAL_PARAMETER:
222+
return this.formatLiteral(token);
224223
default:
225224
throw new Error(`Unexpected token type: ${token.type}`);
226225
}
227226
}
228227

229-
/**
230-
* Formats ident/string/number/variable tokens
231-
*/
232-
private formatWord(token: Token) {
228+
/** Default formatting for most token types */
229+
private formatLiteral(token: Token) {
233230
this.layout.add(this.show(token), WS.SPACE);
234231
}
235232

@@ -355,13 +352,6 @@ export default class ExpressionFormatter {
355352
this.layout.add(WS.NEWLINE, WS.INDENT, this.show(token), WS.SPACE);
356353
}
357354

358-
/**
359-
* Formats a parameter placeholder item onto query, to be replaced with the value of the placeholder
360-
*/
361-
private formatParameter(token: Token) {
362-
this.layout.add(this.params.get(token), WS.SPACE);
363-
}
364-
365355
/**
366356
* Formats a comma Operator onto query, ending line unless in an Inline Block
367357
*/
@@ -392,6 +382,8 @@ export default class ExpressionFormatter {
392382
case 'lower':
393383
return token.value.toLowerCase();
394384
}
385+
} else if (isParameter(token)) {
386+
return this.params.get(token);
395387
} else {
396388
return token.value;
397389
}

src/lexer/token.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,10 @@ export const isReserved = (token: Token): boolean =>
8585
token.type === TokenType.RESERVED_JOIN ||
8686
token.type === TokenType.RESERVED_CASE_START ||
8787
token.type === TokenType.RESERVED_CASE_END;
88+
89+
/** checks if token is one of the parameter tokens */
90+
export const isParameter = (token: Token): boolean =>
91+
token.type === TokenType.INDEXED_PARAMETER ||
92+
token.type === TokenType.NAMED_PARAMETER ||
93+
token.type === TokenType.POSITIONAL_PARAMETER ||
94+
token.type === TokenType.QUOTED_PARAMETER;

test/options/param.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,19 @@ export default function supportsParams(format: FormatFn, params: ParamsTypes) {
3333
third;
3434
`);
3535
});
36+
37+
// Regression test for issue #316
38+
it('replaces ? positional placeholders inside BETWEEN expression', () => {
39+
const result = format('SELECT name WHERE age BETWEEN ? AND ?;', {
40+
params: ['5', '10'],
41+
});
42+
expect(result).toBe(dedent`
43+
SELECT
44+
name
45+
WHERE
46+
age BETWEEN 5 AND 10;
47+
`);
48+
});
3649
}
3750

3851
if (params.numbered?.includes('?')) {

0 commit comments

Comments
 (0)