Skip to content

Commit 19cf1d5

Browse files
committed
Correctly format array index notation
1 parent 6ee4c26 commit 19cf1d5

File tree

2 files changed

+23
-4
lines changed

2 files changed

+23
-4
lines changed

src/formatter.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,8 @@ impl<'a> Formatter<'a> {
387387
];
388388

389389
const ADD_WHITESPACE_BETWEEN: &[TokenKind] = &[TokenKind::CloseParen, TokenKind::Reserved];
390-
390+
const BEFORE_ARRAY: &[TokenKind] =
391+
&[TokenKind::CloseParen, TokenKind::Word, TokenKind::Reserved];
391392
let inlined = self.inline_block.begin_if_possible(self.tokens, self.index);
392393
let previous_non_whitespace_token = self.previous_non_whitespace_token(1);
393394
let fold_in_top_level = !inlined
@@ -406,13 +407,16 @@ impl<'a> Formatter<'a> {
406407
// Take out the preceding space unless there was whitespace there in the original query
407408
// or another opening parens or line comment
408409
let previous_token = self.previous_token(1);
409-
if previous_token.is_none()
410-
|| !PRESERVE_WHITESPACE_FOR.contains(&previous_token.unwrap().kind)
410+
if previous_token.is_none_or(|t| !PRESERVE_WHITESPACE_FOR.contains(&t.kind))
411+
|| previous_non_whitespace_token
412+
.is_some_and(|t| token.value == "[" && BEFORE_ARRAY.contains(&t.kind))
411413
{
412414
self.trim_spaces_end(query);
413415
}
414416

415-
if previous_non_whitespace_token.is_some_and(|t| ADD_WHITESPACE_BETWEEN.contains(&t.kind)) {
417+
if previous_non_whitespace_token
418+
.is_some_and(|t| token.value != "[" && ADD_WHITESPACE_BETWEEN.contains(&t.kind))
419+
{
416420
self.trim_spaces_end(query);
417421
query.push(' ');
418422
}

src/lib.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,21 @@ mod tests {
575575
assert_eq!(format(input, &QueryParams::None, &options), expected);
576576
}
577577

578+
#[test]
579+
fn it_formats_array_index_notation() {
580+
let input = "SELECT a [ 1 ] + b [ 2 ] [ 5+1 ] > c [3] ;";
581+
let options = FormatOptions {
582+
dialect: Dialect::PostgreSql,
583+
..Default::default()
584+
};
585+
let expected = indoc!(
586+
"
587+
SELECT
588+
a[1] + b[2][5 + 1] > c[3];"
589+
);
590+
591+
assert_eq!(format(input, &QueryParams::None, &options), expected);
592+
}
578593
#[test]
579594
fn it_formats_limit_of_single_value_and_offset() {
580595
let input = "LIMIT 5 OFFSET 8;";

0 commit comments

Comments
 (0)