Skip to content

Commit b487944

Browse files
JohnFitzpatrick44wendigo
authored andcommitted
Fix incorrect arithmethic unary negation formatting
1 parent 1ee52f1 commit b487944

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

core/trino-parser/src/main/java/io/trino/sql/ExpressionFormatter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -572,8 +572,8 @@ protected String visitArithmeticUnary(ArithmeticUnaryExpression node, Void conte
572572

573573
return switch (node.getSign()) {
574574
// Unary is ambiguous with respect to negative numbers. "-1" parses as a number, but "-(1)" parses as "unaryMinus(number)"
575-
// The parentheses are needed to ensure the parsing roundtrips properly.
576-
case MINUS -> "-(" + value + ")";
575+
// When parentheses are not present, adding them is necessary to ensure the parsing round trips properly.
576+
case MINUS -> value.startsWith("(") ? "-" + value : "-(" + value + ")";
577577
case PLUS -> "+" + value;
578578
};
579579
}

core/trino-parser/src/test/java/io/trino/sql/TestSqlFormatter.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import com.google.common.collect.ImmutableList;
1717
import io.trino.sql.tree.AddColumn;
1818
import io.trino.sql.tree.AllColumns;
19+
import io.trino.sql.tree.ArithmeticUnaryExpression;
1920
import io.trino.sql.tree.BooleanLiteral;
2021
import io.trino.sql.tree.ColumnDefinition;
2122
import io.trino.sql.tree.ColumnPosition;
@@ -52,6 +53,7 @@
5253
import io.trino.sql.tree.ShowSession;
5354
import io.trino.sql.tree.ShowTables;
5455
import io.trino.sql.tree.StringLiteral;
56+
import io.trino.sql.tree.SubqueryExpression;
5557
import io.trino.sql.tree.Table;
5658
import io.trino.sql.tree.Update;
5759
import io.trino.sql.tree.UpdateAssignment;
@@ -66,6 +68,8 @@
6668
import static io.trino.sql.QueryUtil.simpleQuery;
6769
import static io.trino.sql.QueryUtil.table;
6870
import static io.trino.sql.SqlFormatter.formatSql;
71+
import static io.trino.sql.tree.ArithmeticUnaryExpression.Sign.MINUS;
72+
import static io.trino.sql.tree.ArithmeticUnaryExpression.Sign.PLUS;
6973
import static io.trino.sql.tree.CreateView.Security.DEFINER;
7074
import static io.trino.sql.tree.SaveMode.FAIL;
7175
import static io.trino.sql.tree.SaveMode.IGNORE;
@@ -832,4 +836,28 @@ public void testShowBranches()
832836
new ShowBranches(new NodeLocation(1, 1), QualifiedName.of("a"))))
833837
.isEqualTo("SHOW BRANCHES FROM TABLE a");
834838
}
839+
840+
@Test
841+
public void testArithmeticUnary()
842+
{
843+
assertThat(formatSql(
844+
new ArithmeticUnaryExpression(new NodeLocation(1, 1), PLUS, new LongLiteral(new NodeLocation(1, 2), "1"))))
845+
.isEqualTo("+1");
846+
847+
assertThat(formatSql(
848+
new ArithmeticUnaryExpression(new NodeLocation(1, 1), MINUS, new LongLiteral(new NodeLocation(1, 3), "1"))))
849+
.isEqualTo("-(1)");
850+
851+
assertThat(formatSql(
852+
new ArithmeticUnaryExpression(new NodeLocation(1, 1), PLUS, new SubqueryExpression(
853+
new NodeLocation(1, 3),
854+
simpleQuery(selectList(new LongLiteral(new NodeLocation(1, 10), "1")))))))
855+
.isEqualTo("+(SELECT 1\n\n)");
856+
857+
assertThat(formatSql(
858+
new ArithmeticUnaryExpression(new NodeLocation(1, 1), MINUS, new SubqueryExpression(
859+
new NodeLocation(1, 3),
860+
simpleQuery(selectList(new LongLiteral(new NodeLocation(1, 10), "1")))))))
861+
.isEqualTo("-(SELECT 1\n\n)");
862+
}
835863
}

0 commit comments

Comments
 (0)