Skip to content

Commit 51e2d67

Browse files
authored
Merge pull request #110 from mvorisek/fix_semicolon_toplevel
Fix semicolon must decrease special indentation level
2 parents 6eb85e0 + 0590175 commit 51e2d67

7 files changed

+122
-0
lines changed

src/SqlFormatter.php

+9
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,15 @@ public function format(string $string, string $indentString = ' '): string
256256
if ($token->value() === 'LIMIT' && ! $inlineParentheses) {
257257
$clauseLimit = true;
258258
}
259+
} elseif ($token->value() === ';') {
260+
// If the last indent type was 'special', decrease the special indent for this round
261+
reset($indentTypes);
262+
if (current($indentTypes) === 'special') {
263+
$indentLevel--;
264+
array_shift($indentTypes);
265+
}
266+
267+
$newline = true;
259268
} elseif (
260269
$clauseLimit &&
261270
$token->value() !== ',' &&

tests/clihighlight.txt

+25
Original file line numberDiff line numberDiff line change
@@ -1009,3 +1009,28 @@
10091009
---
10101010
SELECT
10111011
1 :: text;
1012+
---
1013+
-- semicolon must decrease special indentation level
1014+
MY_NON_TOP_LEVEL_KEYWORD_FX_1();
1015+
MY_NON_TOP_LEVEL_KEYWORD_FX_2();
1016+
SELECT
1017+
x
1018+
FROM
1019+
(
1020+
SELECT
1021+
1 as x
1022+
);
1023+
MY_NON_TOP_LEVEL_KEYWORD_FX_3();
1024+
BEGIN MY_NON_TOP_LEVEL_KEYWORD_FX_4();
1025+
MY_NON_TOP_LEVEL_KEYWORD_FX_5();
1026+
END;
1027+
BEGIN
1028+
SELECT
1029+
x
1030+
FROM
1031+
(
1032+
SELECT
1033+
1 as x
1034+
);
1035+
MY_NON_TOP_LEVEL_KEYWORD_FX_6();
1036+
END;

tests/compress.txt

+2
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,5 @@ WITH cte1 AS (SELECT a, b FROM table1), cte2 AS (SELECT c, d FROM table2) SELECT
9393
SELECT a, GROUP_CONCAT(b, '.') OVER (ORDER BY c GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE NO OTHERS) AS no_others, GROUP_CONCAT(b, '.') OVER (ORDER BY c GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW) AS current_row, GROUP_CONCAT(b, '.') OVER (ORDER BY c GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE GROUP) AS grp, GROUP_CONCAT(b, '.') OVER (ORDER BY c GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES) AS tie, GROUP_CONCAT(b, '.') FILTER (WHERE c != 'two') OVER (ORDER BY a) AS filtered, CONVERT(VARCHAR(20), AVG(SalesYTD) OVER (PARTITION BY TerritoryID ORDER BY DATEPART(yy, ModifiedDate)), 1) AS MovingAvg, AVG(starting_salary) OVER w2 AVG, MIN(starting_salary) OVER w2 MIN_STARTING_SALARY, MAX(starting_salary) OVER (w1 ORDER BY hire_date), LISTAGG(arg, ',') OVER (PARTITION BY part ORDER BY ord ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS LISTAGG_ROWS, LISTAGG(arg, ',') OVER (PARTITION BY part ORDER BY ord RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS LISTAGG_RANGE, MIN(Revenue) OVER (PARTITION BY DepartmentID ORDER BY RevenueYear ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS MinRevenueBeyond FROM t1 WINDOW w1 AS (PARTITION BY department, division), w2 AS (w1 ORDER BY hire_date);
9494
---
9595
SELECT 1::text;
96+
---
97+
MY_NON_TOP_LEVEL_KEYWORD_FX_1(); MY_NON_TOP_LEVEL_KEYWORD_FX_2(); SELECT x FROM (SELECT 1 as x); MY_NON_TOP_LEVEL_KEYWORD_FX_3(); BEGIN MY_NON_TOP_LEVEL_KEYWORD_FX_4(); MY_NON_TOP_LEVEL_KEYWORD_FX_5(); END; BEGIN SELECT x FROM (SELECT 1 as x); MY_NON_TOP_LEVEL_KEYWORD_FX_6(); END;

tests/format-highlight.html

+25
Original file line numberDiff line numberDiff line change
@@ -1009,3 +1009,28 @@
10091009
---
10101010
<pre style="color: black; background-color: white;"><span style="font-weight:bold;">SELECT</span>
10111011
<span style="color: green;">1</span> <span >::</span> <span style="color: #333;">text</span><span >;</span></pre>
1012+
---
1013+
<pre style="color: black; background-color: white;"><span style="color: #aaa;">-- semicolon must decrease special indentation level</span>
1014+
<span style="color: #333;">MY_NON_TOP_LEVEL_KEYWORD_FX_1</span>()<span >;</span>
1015+
<span style="color: #333;">MY_NON_TOP_LEVEL_KEYWORD_FX_2</span>()<span >;</span>
1016+
<span style="font-weight:bold;">SELECT</span>
1017+
<span style="color: #333;">x</span>
1018+
<span style="font-weight:bold;">FROM</span>
1019+
(
1020+
<span style="font-weight:bold;">SELECT</span>
1021+
<span style="color: green;">1</span> <span style="font-weight:bold;">as</span> <span style="color: #333;">x</span>
1022+
)<span >;</span>
1023+
<span style="color: #333;">MY_NON_TOP_LEVEL_KEYWORD_FX_3</span>()<span >;</span>
1024+
<span style="font-weight:bold;">BEGIN</span> <span style="color: #333;">MY_NON_TOP_LEVEL_KEYWORD_FX_4</span>()<span >;</span>
1025+
<span style="color: #333;">MY_NON_TOP_LEVEL_KEYWORD_FX_5</span>()<span >;</span>
1026+
<span style="font-weight:bold;">END</span><span >;</span>
1027+
<span style="font-weight:bold;">BEGIN</span>
1028+
<span style="font-weight:bold;">SELECT</span>
1029+
<span style="color: #333;">x</span>
1030+
<span style="font-weight:bold;">FROM</span>
1031+
(
1032+
<span style="font-weight:bold;">SELECT</span>
1033+
<span style="color: green;">1</span> <span style="font-weight:bold;">as</span> <span style="color: #333;">x</span>
1034+
)<span >;</span>
1035+
<span style="color: #333;">MY_NON_TOP_LEVEL_KEYWORD_FX_6</span>()<span >;</span>
1036+
<span style="font-weight:bold;">END</span><span >;</span></pre>

tests/format.txt

+25
Original file line numberDiff line numberDiff line change
@@ -1007,3 +1007,28 @@ WINDOW
10071007
---
10081008
SELECT
10091009
1 :: text;
1010+
---
1011+
-- semicolon must decrease special indentation level
1012+
MY_NON_TOP_LEVEL_KEYWORD_FX_1();
1013+
MY_NON_TOP_LEVEL_KEYWORD_FX_2();
1014+
SELECT
1015+
x
1016+
FROM
1017+
(
1018+
SELECT
1019+
1 as x
1020+
);
1021+
MY_NON_TOP_LEVEL_KEYWORD_FX_3();
1022+
BEGIN MY_NON_TOP_LEVEL_KEYWORD_FX_4();
1023+
MY_NON_TOP_LEVEL_KEYWORD_FX_5();
1024+
END;
1025+
BEGIN
1026+
SELECT
1027+
x
1028+
FROM
1029+
(
1030+
SELECT
1031+
1 as x
1032+
);
1033+
MY_NON_TOP_LEVEL_KEYWORD_FX_6();
1034+
END;

tests/highlight.html

+18
Original file line numberDiff line numberDiff line change
@@ -304,3 +304,21 @@
304304
<span style="font-weight:bold;">WINDOW</span> <span style="color: #333;">w1</span> <span style="font-weight:bold;">AS</span> (<span style="font-weight:bold;">PARTITION BY</span> <span style="color: #333;">department</span><span >,</span> <span style="color: #333;">division</span>)<span >,</span> <span style="color: #333;">w2</span> <span style="font-weight:bold;">AS</span> (<span style="color: #333;">w1</span> <span style="font-weight:bold;">ORDER BY</span> <span style="color: #333;">hire_date</span>)<span >;</span></pre>
305305
---
306306
<pre style="color: black; background-color: white;"><span style="font-weight:bold;">SELECT</span> <span style="color: green;">1</span><span >::</span><span style="color: #333;">text</span><span >;</span></pre>
307+
---
308+
<pre style="color: black; background-color: white;"><span style="color: #aaa;">-- semicolon must decrease special indentation level</span>
309+
<span style="color: #333;">MY_NON_TOP_LEVEL_KEYWORD_FX_1</span>()<span >;</span>
310+
<span style="color: #333;">MY_NON_TOP_LEVEL_KEYWORD_FX_2</span>()<span >;</span>
311+
<span style="font-weight:bold;">SELECT</span> <span style="color: #333;">x</span>
312+
<span style="font-weight:bold;">FROM</span>
313+
(<span style="font-weight:bold;">SELECT</span> <span style="color: green;">1</span> <span style="font-weight:bold;">as</span> <span style="color: #333;">x</span>)<span >;</span>
314+
<span style="color: #333;">MY_NON_TOP_LEVEL_KEYWORD_FX_3</span>()<span >;</span>
315+
<span style="font-weight:bold;">BEGIN</span>
316+
<span style="color: #333;">MY_NON_TOP_LEVEL_KEYWORD_FX_4</span>()<span >;</span>
317+
<span style="color: #333;">MY_NON_TOP_LEVEL_KEYWORD_FX_5</span>()<span >;</span>
318+
<span style="font-weight:bold;">END</span><span >;</span>
319+
<span style="font-weight:bold;">BEGIN</span>
320+
<span style="font-weight:bold;">SELECT</span> <span style="color: #333;">x</span>
321+
<span style="font-weight:bold;">FROM</span>
322+
(<span style="font-weight:bold;">SELECT</span> <span style="color: green;">1</span> <span style="font-weight:bold;">as</span> <span style="color: #333;">x</span>)<span >;</span>
323+
<span style="color: #333;">MY_NON_TOP_LEVEL_KEYWORD_FX_6</span>()<span >;</span>
324+
<span style="font-weight:bold;">END</span><span >;</span></pre>

tests/sql.sql

+18
Original file line numberDiff line numberDiff line change
@@ -304,3 +304,21 @@ FROM t1
304304
WINDOW w1 AS (PARTITION BY department, division), w2 AS (w1 ORDER BY hire_date);
305305
---
306306
SELECT 1::text;
307+
---
308+
-- semicolon must decrease special indentation level
309+
MY_NON_TOP_LEVEL_KEYWORD_FX_1();
310+
MY_NON_TOP_LEVEL_KEYWORD_FX_2();
311+
SELECT x
312+
FROM
313+
(SELECT 1 as x);
314+
MY_NON_TOP_LEVEL_KEYWORD_FX_3();
315+
BEGIN
316+
MY_NON_TOP_LEVEL_KEYWORD_FX_4();
317+
MY_NON_TOP_LEVEL_KEYWORD_FX_5();
318+
END;
319+
BEGIN
320+
SELECT x
321+
FROM
322+
(SELECT 1 as x);
323+
MY_NON_TOP_LEVEL_KEYWORD_FX_6();
324+
END;

0 commit comments

Comments
 (0)