diff --git a/crates/formatter/src/rules.rs b/crates/formatter/src/rules.rs index 89ef798..4e67189 100644 --- a/crates/formatter/src/rules.rs +++ b/crates/formatter/src/rules.rs @@ -476,6 +476,20 @@ impl Lowerer { break_before = &["on", "using", "include"]; indent_continuations = true; } + Some("sequence") => { + break_before = &[ + "as", + "start", + "increment", + "no", + "minvalue", + "maxvalue", + "cache", + "cycle", + "owned", + ]; + indent_continuations = true; + } Some("function" | "procedure") => { // Declarations always break: `returns`, `language`, // and friends land in consistent positions rather @@ -683,6 +697,7 @@ impl Lowerer { let mut pending_sls = false; let mut tight = false; let mut prev_name = false; + let mut after_no = false; for &element in elements { match element { SyntaxElement::Token(token) if token.kind().is_trivia() => self.trivia(docs, token), @@ -708,8 +723,14 @@ impl Lowerer { ) || (tight_call_parens && token.kind() == SyntaxKind::LParen && prev_name); // `RAISE ... USING` / `EXECUTE ... USING` can break - // before the USING keyword. + // before the USING keyword. When `no` is itself a + // break keyword (CREATE SEQUENCE), the word after it + // completes a phrase (`no minvalue`) — never break + // inside it. + let in_no_phrase = + after_no && break_before.iter().any(|kw| kw.eq_ignore_ascii_case("no")); let soft_break = token.kind() == SyntaxKind::Ident + && !in_no_phrase && break_before .iter() .any(|kw| token.text().eq_ignore_ascii_case(kw)); @@ -727,6 +748,8 @@ impl Lowerer { | SyntaxKind::ColonColon ); prev_name = matches!(token.kind(), SyntaxKind::Ident | SyntaxKind::QuotedIdent); + after_no = token.kind() == SyntaxKind::Ident + && token.text().eq_ignore_ascii_case("no"); let leaf = match token.kind() { SyntaxKind::QuotedIdent => name_leaf(token, IdentPos::ColumnOrTable), _ => token_leaf(token), diff --git a/crates/formatter/tests/snapshots/snapshots__migrations__000519_chatd_core_state_machine.up.snap b/crates/formatter/tests/snapshots/snapshots__migrations__000519_chatd_core_state_machine.up.snap index 9f5ea4e..19d721a 100644 --- a/crates/formatter/tests/snapshots/snapshots__migrations__000519_chatd_core_state_machine.up.snap +++ b/crates/formatter/tests/snapshots/snapshots__migrations__000519_chatd_core_state_machine.up.snap @@ -79,7 +79,9 @@ alter table chat_queued_messages -- 9. Default sequence for new queued-message positions. -- A global sequence is acceptable because ordering only needs to be -- stable within a chat. -create sequence if not exists chat_queued_messages_position_seq as bigint start with 1; +create sequence if not exists chat_queued_messages_position_seq + as bigint + start with 1; select setval( 'chat_queued_messages_position_seq',