From 8f2546efdebe820ed1c0f077098d444ed7240c0f Mon Sep 17 00:00:00 2001 From: LucaCappelletti94 Date: Sat, 19 Sep 2026 20:14:48 +0200 Subject: [PATCH 1/2] PostgreSQL: Render prefix @ operator with a space --- src/ast/mod.rs | 1 + tests/sqlparser_postgres.rs | 26 ++++++++++++++++++++------ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/ast/mod.rs b/src/ast/mod.rs index 20058b83a..b6d67df5b 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -1964,6 +1964,7 @@ impl fmt::Display for Expr { | UnaryOperator::Hash | UnaryOperator::AtDashAt | UnaryOperator::DoubleAt + | UnaryOperator::PGAbs | UnaryOperator::QuestionDash | UnaryOperator::QuestionPipe ) { diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index d71e49b27..14f845f66 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -2623,13 +2623,13 @@ fn parse_ampersand_arobase() { #[test] fn parse_pg_unary_ops() { let pg_unary_ops = &[ - ("|/", UnaryOperator::PGSquareRoot), - ("||/", UnaryOperator::PGCubeRoot), - ("!!", UnaryOperator::PGPrefixFactorial), - ("@", UnaryOperator::PGAbs), + ("SELECT |/a", UnaryOperator::PGSquareRoot), + ("SELECT ||/a", UnaryOperator::PGCubeRoot), + ("SELECT !!a", UnaryOperator::PGPrefixFactorial), + ("SELECT @ a", UnaryOperator::PGAbs), ]; - for (str_op, op) in pg_unary_ops { - let select = pg().verified_only_select(&format!("SELECT {}a", str_op)); + for (sql, op) in pg_unary_ops { + let select = pg().verified_only_select(sql); assert_eq!( SelectItem::UnnamedExpr(Expr::UnaryOp { op: *op, @@ -9953,3 +9953,17 @@ fn parse_insert_by_name_keywords_as_table_and_alias() { statement => panic!("Expected INSERT statement, got: {statement:?}"), } } + +#[test] +fn parse_pg_abs_space_before_negative_operand() { + // `@-` tokenizes as a geometric operator prefix, so displaying PGAbs + // without a space breaks re-parsing of a negative operand. + pg().verified_stmt("SELECT @ -2"); + let err = pg().parse_sql_statements("SELECT @-2").unwrap_err(); + assert_eq!( + ParserError::TokenizerError( + "Expected a valid binary operator after '@-' at Line: 1, Column: 10".to_string(), + ), + err + ); +} From 51080fb81b1fd68ca52e89a548beddd9609c5971 Mon Sep 17 00:00:00 2001 From: LucaCappelletti94 Date: Sat, 19 Sep 2026 20:35:56 +0200 Subject: [PATCH 2/2] PostgreSQL: Pin canonical rendering of no-space prefix @ --- tests/sqlparser_postgres.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index 14f845f66..c85cb26fa 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -9959,6 +9959,7 @@ fn parse_pg_abs_space_before_negative_operand() { // `@-` tokenizes as a geometric operator prefix, so displaying PGAbs // without a space breaks re-parsing of a negative operand. pg().verified_stmt("SELECT @ -2"); + pg().one_statement_parses_to("SELECT @a", "SELECT @ a"); let err = pg().parse_sql_statements("SELECT @-2").unwrap_err(); assert_eq!( ParserError::TokenizerError(