Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .sqlfluff-sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
25ff42a977cd3b7fbce2d1e211af2fa366cb62ec
b8f99fd9d4acb2a9df139f183df7025fef4906aa
5 changes: 5 additions & 0 deletions crates/lib-dialects/src/postgres.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9171,6 +9171,11 @@ pub fn raw_dialect() -> Dialect {
.copy(
Some(vec![
position_function_contents(true),
Sequence::new(vec![
Ref::keyword("VARIADIC").to_matchable(),
Ref::new("ExpressionSegment").to_matchable(),
])
Comment on lines +9174 to +9177

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Include VARIADIC expressions in delimited argument lists

When a general variadic expression follows one or more fixed arguments, such as concat_ws(',', VARIADIC make_values()), this alternative cannot be reached because it is only a top-level FunctionContentsGrammar element; the existing delimited argument matcher stops when the reserved VARIADIC token cannot start an ExpressionSegment. The added multi-argument fixture passes only because VARIADIC ARRAY[...] is already consumed as a TypedArrayLiteralSegment. Add the variadic form to the delimited argument alternatives so PostgreSQL's valid fixed-arguments-plus-variadic-expression form parses.

Useful? React with 👍 / 👎.

.to_matchable(),
Delimited::new(vec![
Sequence::new(vec![
Ref::new("ExpressionSegment").to_matchable(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,25 @@ $$ LANGUAGE SQL;
CREATE FUNCTION concat_values(text, VARIADIC anyarray) RETURNS text AS $$
SELECT array_to_string($2, $1);
$$ LANGUAGE SQL;

SELECT my_function(other_function(
VARIADIC ARRAY_REMOVE(ARRAY[
a.value1,
b.value2,
c.value3
], NULL)
))
FROM a
FULL OUTER JOIN b USING (id)
FULL OUTER JOIN c USING (id);

SELECT json_extract_path_text(t.col::json, VARIADIC ARRAY['foo'::text])
FROM t;

SELECT my_function(VARIADIC ARRAY[
CASE WHEN x > 0 THEN x ELSE 0 END,
y + z,
'literal'
]);

SELECT my_function(VARIADIC ARRAY(SELECT value FROM table1));
Original file line number Diff line number Diff line change
Expand Up @@ -172,3 +172,220 @@ file:
- keyword: LANGUAGE
- naked_identifier: SQL
- statement_terminator: ;
- statement:
- select_statement:
- select_clause:
- keyword: SELECT
- select_clause_element:
- function:
- function_name:
- function_name_identifier: my_function
- function_contents:
- bracketed:
- start_bracket: (
- expression:
- function:
- function_name:
- function_name_identifier: other_function
- function_contents:
- bracketed:
- start_bracket: (
- keyword: VARIADIC
- expression:
- function:
- function_name:
- function_name_identifier: ARRAY_REMOVE
- function_contents:
- bracketed:
- start_bracket: (
- expression:
- typed_array_literal:
- array_type:
- keyword: ARRAY
- array_literal:
- start_square_bracket: '['
- column_reference:
- naked_identifier: a
- dot: .
- naked_identifier: value1
- comma: ','
- column_reference:
- naked_identifier: b
- dot: .
- naked_identifier: value2
- comma: ','
- column_reference:
- naked_identifier: c
- dot: .
- naked_identifier: value3
- end_square_bracket: ']'
- comma: ','
- expression:
- null_literal: 'NULL'
- end_bracket: )
- end_bracket: )
- end_bracket: )
- from_clause:
- keyword: FROM
- from_expression:
- from_expression_element:
- table_expression:
- table_reference:
- naked_identifier: a
- join_clause:
- keyword: FULL
- keyword: OUTER
- keyword: JOIN
- from_expression_element:
- table_expression:
- table_reference:
- naked_identifier: b
- keyword: USING
- bracketed:
- start_bracket: (
- naked_identifier: id
- end_bracket: )
- join_clause:
- keyword: FULL
- keyword: OUTER
- keyword: JOIN
- from_expression_element:
- table_expression:
- table_reference:
- naked_identifier: c
- keyword: USING
- bracketed:
- start_bracket: (
- naked_identifier: id
- end_bracket: )
- statement_terminator: ;
- statement:
- select_statement:
- select_clause:
- keyword: SELECT
- select_clause_element:
- function:
- function_name:
- function_name_identifier: json_extract_path_text
- function_contents:
- bracketed:
- start_bracket: (
- expression:
- cast_expression:
- column_reference:
- naked_identifier: t
- dot: .
- naked_identifier: col
- casting_operator: '::'
- data_type:
- keyword: json
- comma: ','
- expression:
- typed_array_literal:
- keyword: VARIADIC
- array_type:
- keyword: ARRAY
- array_literal:
- start_square_bracket: '['
- expression:
- cast_expression:
- quoted_literal: '''foo'''
- casting_operator: '::'
- data_type:
- keyword: text
- end_square_bracket: ']'
- end_bracket: )
- from_clause:
- keyword: FROM
- from_expression:
- from_expression_element:
- table_expression:
- table_reference:
- naked_identifier: t
- statement_terminator: ;
- statement:
- select_statement:
- select_clause:
- keyword: SELECT
- select_clause_element:
- function:
- function_name:
- function_name_identifier: my_function
- function_contents:
- bracketed:
- start_bracket: (
- expression:
- typed_array_literal:
- keyword: VARIADIC
- array_type:
- keyword: ARRAY
- array_literal:
- start_square_bracket: '['
- expression:
- case_expression:
- keyword: CASE
- when_clause:
- keyword: WHEN
- expression:
- column_reference:
- naked_identifier: x
- comparison_operator:
- raw_comparison_operator: '>'
- numeric_literal: '0'
- keyword: THEN
- expression:
- column_reference:
- naked_identifier: x
- else_clause:
- keyword: ELSE
- expression:
- numeric_literal: '0'
- keyword: END
- comma: ','
- expression:
- column_reference:
- naked_identifier: y
- binary_operator: +
- column_reference:
- naked_identifier: z
- comma: ','
- quoted_literal: '''literal'''
- end_square_bracket: ']'
- end_bracket: )
- statement_terminator: ;
- statement:
- select_statement:
- select_clause:
- keyword: SELECT
- select_clause_element:
- function:
- function_name:
- function_name_identifier: my_function
- function_contents:
- bracketed:
- start_bracket: (
- keyword: VARIADIC
- expression:
- function:
- function_name:
- function_name_identifier: ARRAY
- function_contents:
- bracketed:
- start_bracket: (
- expression:
- select_statement:
- select_clause:
- keyword: SELECT
- select_clause_element:
- column_reference:
- naked_identifier: value
- from_clause:
- keyword: FROM
- from_expression:
- from_expression_element:
- table_expression:
- table_reference:
- naked_identifier: table1
- end_bracket: )
- end_bracket: )
- statement_terminator: ;
Loading