Skip to content
Merged
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
60 changes: 30 additions & 30 deletions crates/squawk_fmt/src/fmt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9888,6 +9888,7 @@ fn build_having_clause<'a>(having: ast::HavingClause) -> Doc<'a> {
}

fn build_window_clause<'a>(window: ast::WindowClause) -> Doc<'a> {
let single_def = window.window_defs().count() == 1;
let defs = window.window_defs().map(|def| {
(
leading_comments(def.syntax()).append(build_window_def(def.clone())),
Expand All @@ -9896,7 +9897,11 @@ fn build_window_clause<'a>(window: ast::WindowClause) -> Doc<'a> {
});
let mut doc = Doc::text("window");
if let Some(defs) = build_comma_separated_docs(defs) {
doc = doc.append(Doc::space()).append(defs.nest(2));
doc = if single_def {
doc.append(Doc::space()).append(defs)
} else {
doc.append(Doc::line_or_space().append(defs).nest(2))
};
}
doc.group()
}
Expand Down Expand Up @@ -9958,20 +9963,20 @@ fn build_select_group_by_clause<'a>(group: ast::GroupByClause) -> Doc<'a> {
if let Some(by_token) = group.by_token() {
doc = doc.append(leading_comments_token(&by_token));
}
doc = doc.append(Doc::text("by")).append(Doc::space());
doc = doc.append(Doc::text("by"));
if let Some(quantifier) = group.all_or_distinct() {
doc = doc
.append(Doc::space())
.append(leading_comments(quantifier.syntax()))
.append(match quantifier {
ast::AllOrDistinct::All(_) => Doc::text("all"),
ast::AllOrDistinct::Distinct(_) => Doc::text("distinct"),
})
.append(Doc::space());
});
}
if let Some(list) = group.group_by_list() {
doc = doc.append(build_group_by_list(list));
}
doc
doc.group()
}

fn build_create_publication<'a>(stmt: &ast::CreatePublication) -> Doc<'a> {
Expand Down Expand Up @@ -16242,14 +16247,8 @@ fn build_select_doc_ungrouped<'a>(select: &ast::Select) -> Doc<'a> {

fn build_from_clause<'a>(from: ast::FromClause) -> Doc<'a> {
let mut single_item = from.items();
let single_nested_table = matches!(
single_item.next(),
Some(ast::FromListItem::FromItem(
ast::FromItem::GraphTableFromItem(_)
| ast::FromItem::JsonTableFromItem(_)
| ast::FromItem::XmlTableFromItem(_)
))
) && single_item.next().is_none();
let single_from_item = matches!(single_item.next(), Some(ast::FromListItem::FromItem(_)))
&& single_item.next().is_none();

let items = from.items().map(|item| {
let syntax = item.syntax().clone();
Expand All @@ -16259,11 +16258,7 @@ fn build_from_clause<'a>(from: ast::FromClause) -> Doc<'a> {
)
});
let body = build_comma_separated_docs(items).unwrap_or_else(Doc::nil);
let body = if single_nested_table {
body
} else {
body.nest(2)
};
let body = if single_from_item { body } else { body.nest(2) };

Doc::text("from").append(Doc::space()).append(body)
}
Expand Down Expand Up @@ -17441,22 +17436,27 @@ fn build_from_alias_column_list<'a>(
}

fn build_group_by_list<'a>(list: ast::GroupByList) -> Doc<'a> {
leading_comments(list.syntax()).append(build_group_bys(list.group_bys()))
}

fn build_group_bys<'a>(group_bys: impl Iterator<Item = ast::GroupBy>) -> Doc<'a> {
Doc::list(
let group_bys: Vec<_> = list
.group_bys()
.map(|group_by| {
let leading = leading_comments(group_by.syntax());
let trailing = trailing_comments(group_by.syntax());
leading.append(build_group_by(group_by)).append(trailing)
})
.collect();
let single_group_by = group_bys.len() == 1;
let body = leading_comments(list.syntax()).append(Doc::list(
Itertools::intersperse(
group_bys.map(|group_by| {
let leading = leading_comments(group_by.syntax());
let trailing = trailing_comments(group_by.syntax());
leading.append(build_group_by(group_by)).append(trailing)
}),
group_bys.into_iter(),
Doc::text(",").append(Doc::line_or_space()),
)
.collect(),
)
.nest(2)
));
if single_group_by {
Doc::space().append(body)
} else {
Doc::line_or_space().append(body).nest(2)
}
}

fn build_group_by<'a>(group_by: ast::GroupBy) -> Doc<'a> {
Expand Down
107 changes: 58 additions & 49 deletions crates/squawk_fmt/tests/after/from.snap
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@ select * from foo as f (id, display_name);
select * from foo f (id int, display_name text collate "C");
select *
from foo /* before alias */ as /* before alias name */ f /* before open paren */ (
/* after open paren */ id /* before comma */,
/* after comma */ display_name /* before close paren */
);
/* after open paren */ id /* before comma */,
/* after comma */ display_name /* before close paren */
);
select * from users tablesample bernoulli (10) repeatable (42);
select t.id from test_tablesample as t tablesample system (50) repeatable (0);
select *
from users /* before alias */ as /* before alias name */ u /* before tablesample */ tablesample /* before method */ bernoulli /* before sample opening paren */(
/* before percentage */ 10 /* before sample closing paren */
) /* before repeatable */ repeatable /* before seed opening paren */(/* before seed */ 42 /* before seed closing paren */);
/* before percentage */ 10 /* before sample closing paren */
) /* before repeatable */ repeatable /* before seed opening paren */(/* before seed */ 42 /* before seed closing paren */);
select * from generate_series(1, 3);
select * from lateral generate_series(1, 3) with ordinality as g (n, ord);
select *
Expand All @@ -30,46 +30,43 @@ from /* before lateral */ lateral /* before call */ generate_series /* before op
other;
select *
from lateral cast(
a_very_long_expression_name as a_very_long_schema_name.a_very_long_type_name
) as converted;
a_very_long_expression_name as a_very_long_schema_name.a_very_long_type_name
) as converted;
select * from collation for (foo) as collation_name;
select *
from /* before lateral */ lateral /* before cast */ cast /* before opening paren */(
/* before expression */ value
/* before as */ as
/* before type */ int8 /* before closing paren */
) /* before alias */ as /* before alias name */ converted;
/* before expression */ value
/* before as */ as
/* before type */ int8 /* before closing paren */
) /* before alias */ as /* before alias name */ converted;
select * from (select 1) as selected;
select *
from lateral (
select a_very_long_parenthesized_select_expression
from a_very_long_parenthesized_select_relation_name
) as a_very_long_parenthesized_select_alias;
select a_very_long_parenthesized_select_expression
from a_very_long_parenthesized_select_relation_name
) as a_very_long_parenthesized_select_alias;
select *
from /* before lateral */ lateral /* before opening paren */ (
/* before select */ select
/* before target */ value /* before closing paren */
) /* before alias */ as /* before alias name */ selected;
/* before select */ select
/* before target */ value /* before closing paren */
) /* before alias */ as /* before alias name */ selected;
select *
from rows from (
generate_series(1, 3),
unnest(array[1, 2]) as (value int8)
) with ordinality as generated (first_value, second_value, ordinality);
generate_series(1, 3),
unnest(array[1, 2]) as (value int8)
) with ordinality as generated (first_value, second_value, ordinality);
select *
from /* before lateral */ lateral /* before rows */ rows /* before from */ from /* before opening paren */(
/* before first argument */ generate_series(
1,
3
) /* before argument comma */,
/* before second argument */ unnest(
array[1, 2]
) /* before as */ as /* before column list */ (
/* before column */ value /* before type */ int8 /* before column list close */
) /* before rows close */
) /* before with */ with /* before ordinality */ ordinality /* before alias */ as /* before alias name */ generated (
value,
ordinality
);
/* before first argument */ generate_series(1, 3) /* before argument comma */,
/* before second argument */ unnest(
array[1, 2]
) /* before as */ as /* before column list */ (
/* before column */ value /* before type */ int8 /* before column list close */
) /* before rows close */
) /* before with */ with /* before ordinality */ ordinality /* before alias */ as /* before alias name */ generated (
value,
ordinality
);
select *
from xmltable(
'/rows/row' passing doc
Expand Down Expand Up @@ -180,28 +177,28 @@ select *

select *
from lateral a_very_long_function_name(
a_very_long_first_argument_name,
a_very_long_second_argument_name,
a_very_long_third_argument_name
) with ordinality as a_very_long_function_alias (
a_very_long_value_column_alias,
a_very_long_ordinality_column_alias
);
a_very_long_first_argument_name,
a_very_long_second_argument_name,
a_very_long_third_argument_name
) with ordinality as a_very_long_function_alias (
a_very_long_value_column_alias,
a_very_long_ordinality_column_alias
);
select *
from a_very_long_schema_name.a_very_long_relation_name as a_very_long_relation_alias (
a_very_long_first_column_alias,
a_very_long_second_column_alias,
a_very_long_third_column_alias
);
a_very_long_first_column_alias,
a_very_long_second_column_alias,
a_very_long_third_column_alias
);
select *
from a_very_long_relation_name a_very_long_relation_alias (
a_very_long_first_column_name a_very_long_type_schema.a_very_long_first_type_name,
a_very_long_second_column_name a_very_long_type_schema.a_very_long_second_type_name collate a_very_long_collation_name
);
a_very_long_first_column_name a_very_long_type_schema.a_very_long_first_type_name,
a_very_long_second_column_name a_very_long_type_schema.a_very_long_second_type_name collate a_very_long_collation_name
);
select *
from a_very_long_relation_name tablesample bernoulli (
a_very_long_sampling_percentage_expression
) repeatable (a_very_long_repeatable_seed_expression);
a_very_long_sampling_percentage_expression
) repeatable (a_very_long_repeatable_seed_expression);
select *
from only a_very_long_schema_name.a_very_long_first_relation_name * as a_very_long_first_alias,
a_very_long_schema_name.a_very_long_second_relation_name as a_very_long_second_alias;
Expand Down Expand Up @@ -276,3 +273,15 @@ from statistics /* before base alias */ s
/* before nested join */ join /* before nested relation */ attributes /* before nested alias */ a /* before on */ on
/* before left operand */ a.attnum /* before equals */
= /* before right operand */ u.attnum;

select *
from generate_series(
1,
30000000000000000000000000000000000000000
) with ordinality as g (n, ord);

select *
from unnest(fooooooooooooooooooooooooooooooooooooooooo) as u (
value int8,
other text
);
98 changes: 73 additions & 25 deletions crates/squawk_fmt/tests/after/group_by.snap
Original file line number Diff line number Diff line change
Expand Up @@ -9,32 +9,80 @@ select 1 group by distinct grouping sets ((), (1, 2), rollup (3), cube (4));
select
1
group by grouping sets (
(first_very_long_grouping_expression, second_very_long_grouping_expression),
rollup (
third_very_long_grouping_expression,
fourth_very_long_grouping_expression
),
cube (
fifth_very_long_grouping_expression,
sixth_very_long_grouping_expression
)
);
(first_very_long_grouping_expression, second_very_long_grouping_expression),
rollup (
third_very_long_grouping_expression,
fourth_very_long_grouping_expression
),
cube (
fifth_very_long_grouping_expression,
sixth_very_long_grouping_expression
)
);

select
1
group /* before by */ by /* before distinct */ distinct /* before grouping */ grouping /* before sets */ sets /* before outer paren */(
/* before rollup */ rollup /* before rollup paren */(
/* before first expression */ 1 /* before expression comma */,
/* before second expression */ 2 /* before rollup close */
) /* before group-by comma */,
/* before cube */ cube /* before cube paren */(
/* before cube expression */ 3 /* before cube close */
) /* before second group-by comma */,
/* before nested grouping */ grouping /* before nested sets */ sets /* before nested paren */(
/* before empty tuple */ () /* before nested comma */,
/* before grouping expression */ (
4 /* before tuple comma */,
/* before tuple expression */ 5 /* before tuple close */
) /* before nested close */
) /* before outer close */
) /* before semicolon */;
/* before rollup */ rollup /* before rollup paren */(
/* before first expression */ 1 /* before expression comma */,
/* before second expression */ 2 /* before rollup close */
) /* before group-by comma */,
/* before cube */ cube /* before cube paren */(
/* before cube expression */ 3 /* before cube close */
) /* before second group-by comma */,
/* before nested grouping */ grouping /* before nested sets */ sets /* before nested paren */(
/* before empty tuple */ () /* before nested comma */,
/* before grouping expression */ (
4 /* before tuple comma */,
/* before tuple expression */ 5 /* before tuple close */
) /* before nested close */
) /* before outer close */
) /* before semicolon */;

select *
from t
group by grouping sets (
(
long,
nameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
),
(long)
)
window w as (
partition by loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong
);

select *
from t
group by rollup (
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
);

select *
from t
group by
cube (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),
rollup (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);

select *
from t
group by a_very_long_column_name_one + a_very_long_column_name_two
+ a_very_long_column_name_three;

select *
from t
group by
grouping sets (
(
long,
nameeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
),
(long)
),
rollup (other, another)
window
w as (
partition by loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong
),
w2 as (partition by shortish order by other_column);
Loading
Loading