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 @@ 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/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