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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,4 @@ biome-main/
.review/
pglinter_repo/
.review/
.opencode-session-id
1 change: 1 addition & 0 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 10 additions & 4 deletions crates/pgls_pretty_print/src/nodes/string.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use pgls_query::protobuf::String as PgString;

use crate::{
TokenKind,
emitter::{EventEmitter, GroupKind},
emitter::{EventEmitter, GroupKind, LineType},
};

const RESERVED_KEYWORDS: &[&str] = &[
Expand Down Expand Up @@ -160,9 +160,15 @@ pub(super) fn emit_dollar_quoted_str_with_hint(
hint: DollarQuoteHint,
) {
let delimiter = pick_dollar_delimiter(value, hint);
e.token(TokenKind::DOLLAR_QUOTED_STRING(format!(
"{delimiter}{value}{delimiter}"
)));
// Trim leading/trailing whitespace from the body for cleaner formatting,
// then emit: delimiter, newline, body, newline, delimiter
// This puts the function body on its own lines for readability
let trimmed_body = value.trim();
e.token(TokenKind::DOLLAR_QUOTE_DELIMITER(delimiter.clone()));
e.line(LineType::Hard);
e.token(TokenKind::DOLLAR_QUOTE_BODY(trimmed_body.to_string()));
e.line(LineType::Hard);
e.token(TokenKind::DOLLAR_QUOTE_DELIMITER(delimiter));
}

fn needs_quoting(value: &str) -> bool {
Expand Down
42 changes: 42 additions & 0 deletions crates/pgls_pretty_print/src/normalize.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ pub fn normalize_ast(node: &mut NodeEnum) {
normalize_foreign_table_partbound(node);
normalize_merge_support_func(node);
normalize_sql_value_function(node);
normalize_function_body(node);
}

/// Clear location fields in AST nodes.
Expand Down Expand Up @@ -1204,6 +1205,47 @@ fn sql_value_to_func_call(
})
}

/// Normalize function body strings by trimming whitespace.
///
/// The formatter emits function bodies on separate lines from the dollar-quote delimiters,
/// which adds leading/trailing newlines to the body. This normalization trims these
/// so that semantically equivalent bodies compare equal.
fn normalize_function_body(node: &mut NodeEnum) {
match node {
NodeEnum::CreateFunctionStmt(stmt) => {
for opt in &mut stmt.options {
if let Some(NodeEnum::DefElem(def)) = opt.node.as_mut()
&& def.defname.eq_ignore_ascii_case("as")
&& let Some(ref mut arg) = def.arg
&& let Some(NodeEnum::List(list)) = arg.node.as_mut()
{
// Trim whitespace from each string in the list (function body)
for item in &mut list.items {
if let Some(NodeEnum::String(s)) = item.node.as_mut() {
s.sval = s.sval.trim().to_string();
}
}
}
}
}
NodeEnum::DoStmt(stmt) => {
for arg in &mut stmt.args {
if let Some(NodeEnum::DefElem(def)) = arg.node.as_mut()
&& def.defname.eq_ignore_ascii_case("as")
&& let Some(ref mut arg) = def.arg
&& let Some(NodeEnum::String(s)) = arg.node.as_mut()
{
s.sval = s.sval.trim().to_string();
}
}
}
NodeEnum::InlineCodeBlock(block) => {
block.source_text = block.source_text.trim().to_string();
}
_ => {}
}
}

#[cfg(test)]
mod tests {
use super::*;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
---
source: crates/pgls_pretty_print/tests/tests.rs
input_file: crates/pgls_pretty_print/tests/data/multi/aggregates.sql
snapshot_kind: text
---
set extra_float_digits = 0;

Expand Down Expand Up @@ -1978,7 +1977,8 @@ BEGIN
RAISE 'erroneously called with NULL argument';
END IF;
RETURN NULL;
END$function$;
END
$function$;

create aggregate balk (
int
Expand Down Expand Up @@ -2145,7 +2145,8 @@ BEGIN
RAISE 'erroneously called with NULL argument';
END IF;
RETURN NULL;
END$function$;
END
$function$;

create aggregate balk (
int
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
---
source: crates/pgls_pretty_print/tests/tests.rs
input_file: crates/pgls_pretty_print/tests/data/multi/aggregates.sql
snapshot_kind: text
---
set extra_float_digits = 0;

Expand Down Expand Up @@ -2380,7 +2379,8 @@ BEGIN
RAISE 'erroneously called with NULL argument';
END IF;
RETURN NULL;
END$function$;
END
$function$;

create aggregate balk (
int
Expand Down Expand Up @@ -2567,7 +2567,8 @@ BEGIN
RAISE 'erroneously called with NULL argument';
END IF;
RETURN NULL;
END$function$;
END
$function$;

create aggregate balk (
int
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
---
source: crates/pgls_pretty_print/tests/tests.rs
input_file: crates/pgls_pretty_print/tests/data/multi/alter_generic.sql
snapshot_kind: text
---
create function test_opclass_options_func(internal)
returns void
Expand Down Expand Up @@ -37,12 +36,16 @@ set session authorization regress_alter_generic_user1;
create function alt_func1(int)
returns int
language sql
as $function$SELECT $1 + 1$function$;
as $function$
SELECT $1 + 1
$function$;

create function alt_func2(int)
returns int
language sql
as $function$SELECT $1 - 1$function$;
as $function$
SELECT $1 - 1
$function$;

create aggregate alt_agg1 (sfunc1 = int4pl, basetype = int, stype1 = int, initcond = 0);

Expand Down Expand Up @@ -81,12 +84,16 @@ set session authorization regress_alter_generic_user2;
create function alt_func1(int)
returns int
language sql
as $function$SELECT $1 + 2$function$;
as $function$
SELECT $1 + 2
$function$;

create function alt_func2(int)
returns int
language sql
as $function$SELECT $1 - 2$function$;
as $function$
SELECT $1 - 2
$function$;

create aggregate alt_agg1 (sfunc1 = int4pl, basetype = int, stype1 = int, initcond = 100);

Expand Down Expand Up @@ -519,7 +526,9 @@ create operator family alt_opf12 using btree;

create function fn_opf12(int, smallint)
returns bigint
as $function$SELECT NULL::BIGINT;$function$
as $function$
SELECT NULL::BIGINT;
$function$
language sql;

alter operator family alt_opf12 using btree add function 1 fn_opf12(int, smallint);
Expand All @@ -534,7 +543,9 @@ create operator family alt_opf13 using hash;

create function fn_opf13(int)
returns bigint
as $function$SELECT NULL::BIGINT;$function$
as $function$
SELECT NULL::BIGINT;
$function$
language sql;

alter operator family alt_opf13 using hash add function 1 fn_opf13(int);
Expand All @@ -549,7 +560,9 @@ create operator family alt_opf14 using btree;

create function fn_opf14(int)
returns bigint
as $function$SELECT NULL::BIGINT;$function$
as $function$
SELECT NULL::BIGINT;
$function$
language sql;

alter operator family alt_opf14 using btree add function 1 fn_opf14(int);
Expand All @@ -564,7 +577,9 @@ create operator family alt_opf15 using hash;

create function fn_opf15(int, smallint)
returns bigint
as $function$SELECT NULL::BIGINT;$function$
as $function$
SELECT NULL::BIGINT;
$function$
language sql;

alter operator family alt_opf15 using hash add function 1 fn_opf15(int, smallint);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
---
source: crates/pgls_pretty_print/tests/tests.rs
input_file: crates/pgls_pretty_print/tests/data/multi/alter_generic.sql
snapshot_kind: text
---
create function test_opclass_options_func(internal)
returns void
Expand Down Expand Up @@ -37,12 +36,16 @@ set session authorization regress_alter_generic_user1;
create function alt_func1(int)
returns int
language sql
as $function$SELECT $1 + 1$function$;
as $function$
SELECT $1 + 1
$function$;

create function alt_func2(int)
returns int
language sql
as $function$SELECT $1 - 1$function$;
as $function$
SELECT $1 - 1
$function$;

create aggregate alt_agg1 (
sfunc1 = int4pl,
Expand Down Expand Up @@ -91,12 +94,16 @@ set session authorization regress_alter_generic_user2;
create function alt_func1(int)
returns int
language sql
as $function$SELECT $1 + 2$function$;
as $function$
SELECT $1 + 2
$function$;

create function alt_func2(int)
returns int
language sql
as $function$SELECT $1 - 2$function$;
as $function$
SELECT $1 - 2
$function$;

create aggregate alt_agg1 (
sfunc1 = int4pl,
Expand Down Expand Up @@ -548,7 +555,9 @@ create operator family alt_opf12 using btree;

create function fn_opf12(int, smallint)
returns bigint
as $function$SELECT NULL::BIGINT;$function$
as $function$
SELECT NULL::BIGINT;
$function$
language sql;

alter operator family alt_opf12 using btree
Expand All @@ -564,7 +573,9 @@ create operator family alt_opf13 using hash;

create function fn_opf13(int)
returns bigint
as $function$SELECT NULL::BIGINT;$function$
as $function$
SELECT NULL::BIGINT;
$function$
language sql;

alter operator family alt_opf13 using hash add function 1 fn_opf13(int);
Expand All @@ -579,7 +590,9 @@ create operator family alt_opf14 using btree;

create function fn_opf14(int)
returns bigint
as $function$SELECT NULL::BIGINT;$function$
as $function$
SELECT NULL::BIGINT;
$function$
language sql;

alter operator family alt_opf14 using btree add function 1 fn_opf14(int);
Expand All @@ -594,7 +607,9 @@ create operator family alt_opf15 using hash;

create function fn_opf15(int, smallint)
returns bigint
as $function$SELECT NULL::BIGINT;$function$
as $function$
SELECT NULL::BIGINT;
$function$
language sql;

alter operator family alt_opf15 using hash
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
---
source: crates/pgls_pretty_print/tests/tests.rs
input_file: crates/pgls_pretty_print/tests/data/multi/alter_operator.sql
snapshot_kind: text
---
create function alter_op_test_fn(boolean, boolean)
returns boolean
as $function$ SELECT NULL::BOOLEAN; $function$
as $function$
SELECT NULL::BOOLEAN;
$function$
language sql
immutable;

create function customcontsel(internal, oid, internal, int)
returns double precision
as $function$contsel$function$
as $function$
contsel
$function$
language internal
stable
strict;
Expand Down Expand Up @@ -169,13 +172,17 @@ reset session_authorization;

create function alter_op_test_fn_bool_real(boolean, real)
returns boolean
as $function$ SELECT NULL::BOOLEAN; $function$
as $function$
SELECT NULL::BOOLEAN;
$function$
language sql
immutable;

create function alter_op_test_fn_real_bool(real, boolean)
returns boolean
as $function$ SELECT NULL::BOOLEAN; $function$
as $function$
SELECT NULL::BOOLEAN;
$function$
language sql
immutable;

Expand Down
Loading
Loading