diff --git a/src/SqlFormatter.php b/src/SqlFormatter.php index 10fd1a2..4b2fab2 100644 --- a/src/SqlFormatter.php +++ b/src/SqlFormatter.php @@ -261,6 +261,15 @@ public function format(string $string, string $indentString = ' '): string if (strtoupper($token->value()) === 'LIMIT' && ! $inlineParentheses) { $clauseLimit = true; } + } elseif ($token->value() === ';') { + // If the last indent type was special, decrease the special indent for this round + reset($indentTypes); + if (current($indentTypes) === self::INDENT_TYPE_SPECIAL) { + $indentLevel--; + array_shift($indentTypes); + } + + $newline = true; } elseif (strtoupper($token->value()) === 'CASE') { $increaseBlockIndent = true; } elseif (in_array(strtoupper($token->value()), ['WHEN', 'THEN', 'ELSE', 'END'], true)) { diff --git a/tests/clihighlight.txt b/tests/clihighlight.txt index fe0d17a..0011cfb 100644 --- a/tests/clihighlight.txt +++ b/tests/clihighlight.txt @@ -1010,6 +1010,31 @@ [37mSELECT[0m [32;1m1[0m ::[0m text[0m;[0m --- +[30;1m-- semicolon must decrease special indentation level[0m +MY_NON_TOP_LEVEL_KEYWORD_FX_1[0m();[0m +MY_NON_TOP_LEVEL_KEYWORD_FX_2[0m();[0m +[37mSELECT[0m + x[0m +[37mFROM[0m + ( + [37mSELECT[0m + [32;1m1[0m [37mas[0m x[0m + );[0m +MY_NON_TOP_LEVEL_KEYWORD_FX_3[0m();[0m +[37mBEGIN[0m MY_NON_TOP_LEVEL_KEYWORD_FX_4[0m();[0m +MY_NON_TOP_LEVEL_KEYWORD_FX_5[0m();[0m +[37mEND[0m;[0m +[37mBEGIN[0m +[37mSELECT[0m + x[0m +[37mFROM[0m + ( + [37mSELECT[0m + [32;1m1[0m [37mas[0m x[0m + );[0m +MY_NON_TOP_LEVEL_KEYWORD_FX_6[0m();[0m +[37mEND[0m;[0m +--- [37mSELECT[0m [37mcase[0m [37mwhen[0m name[0m =[0m [32;1m1[0m [37mthen[0m [32;1m10[0m diff --git a/tests/compress.txt b/tests/compress.txt index 148399e..7bf959d 100644 --- a/tests/compress.txt +++ b/tests/compress.txt @@ -94,4 +94,6 @@ SELECT a, GROUP_CONCAT(b, '.') OVER (ORDER BY c GROUPS BETWEEN UNBOUNDED PRECEDI --- SELECT 1::text; --- +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; +--- SELECT case when name = 1 then 10 when name = 2 then 20 when name = 3 then case when age > 10 then 30 else 31 end else 40 end AS case1, (SELECT case name when 1 then 10 when 2 then 20 when 3 then case age when 10 then 30 else 31 end else 40 end) case2, name FROM user diff --git a/tests/format-highlight.html b/tests/format-highlight.html index f941626..c6f6fed 100644 --- a/tests/format-highlight.html +++ b/tests/format-highlight.html @@ -1010,6 +1010,31 @@
SELECT 1 :: text;--- +
-- semicolon must decrease special indentation level +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;+---
SELECT case when name = 1 then 10 diff --git a/tests/format.txt b/tests/format.txt index 743f841..95421ec 100644 --- a/tests/format.txt +++ b/tests/format.txt @@ -1008,6 +1008,31 @@ WINDOW SELECT 1 :: text; --- +-- semicolon must decrease special indentation level +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; +--- SELECT case when name = 1 then 10 diff --git a/tests/highlight.html b/tests/highlight.html index dd1f908..a13cbf7 100644 --- a/tests/highlight.html +++ b/tests/highlight.html @@ -305,6 +305,24 @@ ---SELECT 1::text;--- +-- semicolon must decrease special indentation level +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;+---SELECT case when name = 1 then 10 diff --git a/tests/sql.sql b/tests/sql.sql index 3ed0dfd..263f87d 100644 --- a/tests/sql.sql +++ b/tests/sql.sql @@ -305,6 +305,24 @@ WINDOW w1 AS (PARTITION BY department, division), w2 AS (w1 ORDER BY hire_date); --- SELECT 1::text; --- +-- semicolon must decrease special indentation level +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; +--- SELECT case when name = 1 then 10