Skip to content
This repository was archived by the owner on Aug 30, 2024. It is now read-only.

Commit e495d13

Browse files
Merge pull request #201 from Trivadis/bugfix/issue-198-indent-return
Bugfix/issue 198 indent return
2 parents 8a96070 + e18d4c4 commit e495d13

File tree

2 files changed

+123
-2
lines changed

2 files changed

+123
-2
lines changed

settings/sql_developer/trivadis_custom_format.arbori

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -550,7 +550,8 @@ i5_define_global_functions:
550550
"merge",
551551
"block_stmt",
552552
"pkg_body",
553-
"create_plsql"
553+
"create_plsql",
554+
"stmt"
554555
]);
555556
}
556557

@@ -1124,10 +1125,19 @@ a13_short_nodes:
11241125
return false;
11251126
}
11261127

1128+
var containsCase = function(node) {
1129+
for (var i=node.from+1; i < node.to; i++) {
1130+
if (target.src.get(i).content.toLowerCase() == 'case') {
1131+
return true;
1132+
}
1133+
}
1134+
return false;
1135+
}
1136+
11271137
var maxLen = maxCharLineSize / 2;
11281138
var node = tuple.get("node");
11291139
if (getNodeLength(node) <= maxLen) {
1130-
if (breaksConcat == Format$Breaks.None || !containsConcat(node)) {
1140+
if ((breaksConcat == Format$Breaks.None || !containsConcat(node)) && !containsCase(node)) {
11311141
reduceNodeIndents(node);
11321142
}
11331143
}
@@ -2783,6 +2793,7 @@ r2_common:
27832793
| [node^) bulk_loop_stmt & ![node) 'FORALL'
27842794
| [node) analytic_clause & ![node^) over_clause
27852795
| [node) 'RETURN' & [node^) subprg_spec
2796+
| [node-1) 'RETURN' & [node^) stmt
27862797
| [node) plsql_declarations & ([node^) with_clause | [node^) with_clause[12,20))
27872798
;
27882799

@@ -3160,6 +3171,22 @@ r2_fix_indent_for_subquery_in_paren:
31603171
}
31613172
}
31623173

3174+
r2_fix_indent_for_case_expr:
3175+
([parent) case_expr | [parent) case_expression)
3176+
& [endcase) 'END'
3177+
& endcase^ = parent
3178+
-> {
3179+
var parent = tuple.get("parent");
3180+
if (getIndent(parent.from).indexOf("\n") == -1) {
3181+
var endcase = tuple.get("endcase");
3182+
var marginDiff = getColumn(parent.from) - getColumn(endcase.from);
3183+
if (marginDiff > 0) {
3184+
addIndent(parent, marginDiff);
3185+
logger.fine(struct.getClass(), "r2_fix_indent_for_case_expr: at " + parent.from + ".");
3186+
}
3187+
}
3188+
}
3189+
31633190
-- --------------------------------------------------------------------------------------------------------------------
31643191
-- R7: SQL keywords are right aligned within a SQL command.
31653192
-- --------------------------------------------------------------------------------------------------------------------
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package com.trivadis.plsql.formatter.settings.tests.issues;
2+
3+
import com.trivadis.plsql.formatter.settings.ConfiguredTestFormatter;
4+
import org.junit.jupiter.api.Test;
5+
6+
import java.io.IOException;
7+
8+
public class Issue_198_indent_return extends ConfiguredTestFormatter {
9+
10+
@Test
11+
public void line_break_after_return() throws IOException {
12+
var input = """
13+
function bool_to_int(in_bool in boolean) return integer
14+
deterministic
15+
is
16+
begin
17+
return
18+
case
19+
when in_bool then
20+
1
21+
else
22+
0
23+
end;
24+
end bool_to_int;
25+
""";
26+
var expected = """
27+
function bool_to_int(in_bool in boolean) return integer
28+
deterministic
29+
is
30+
begin
31+
return case
32+
when in_bool then
33+
1
34+
else
35+
0
36+
end;
37+
end bool_to_int;
38+
""";
39+
var actual = formatter.format(input);
40+
assertEquals(expected, actual);
41+
}
42+
43+
@Test
44+
public void parenthesis_after_return() {
45+
var sql = """
46+
function bool_to_int(in_bool in boolean) return integer
47+
deterministic
48+
is
49+
begin
50+
return (
51+
case
52+
when in_bool then
53+
1
54+
else
55+
0
56+
end
57+
);
58+
end bool_to_int;
59+
""";
60+
formatAndAssert(sql);
61+
}
62+
63+
@Test
64+
public void terse_min_max_select() {
65+
var sql = """
66+
select max(min(case
67+
when job = 'CLERK' then
68+
sal
69+
else
70+
null
71+
end))
72+
from emp;
73+
""";
74+
formatAndAssert(sql);
75+
}
76+
77+
@Test
78+
public void verbose_min_max_select() {
79+
var sql = """
80+
select max(
81+
min(
82+
case
83+
when job = 'CLERK' then
84+
sal
85+
else
86+
null
87+
end
88+
)
89+
)
90+
from emp;
91+
""";
92+
formatAndAssert(sql);
93+
}
94+
}

0 commit comments

Comments
 (0)