squawk-syntax 2.66.0

Linter for Postgres migrations & SQL
Documentation
---
source: crates/squawk_syntax/src/test.rs
input_file: crates/squawk_parser/tests/data/plpgsql/err/if_stmt.sql
---
PLPGSQL@0..248
  WHITESPACE@0..1 "\n"
  PLPGSQL_BLOCK@1..247
    BEGIN_KW@1..6 "begin"
    WHITESPACE@6..9 "\n  "
    PLPGSQL_BODY@9..243
      PLPGSQL_IF_STMT@9..37
        IF_KW@9..11 "if"
        WHITESPACE@11..12 " "
        PLPGSQL_EXPR@12..26
          TARGET_LIST@12..26
            TARGET@12..26
              BIN_EXPR@12..17
                LITERAL@12..13
                  INT_NUMBER@12..13 "1"
                WHITESPACE@13..14 " "
                EQ@14..15 "="
                WHITESPACE@15..16 " "
                LITERAL@16..17
                  INT_NUMBER@16..17 "1"
              WHITESPACE@17..22 "\n    "
              AS_NAME@22..26
                COLUMN_NAME@22..26
                  NULL_KW@22..26 "null"
        PLPGSQL_BODY@26..27
          ERROR@26..27
            SEMICOLON@26..27 ";"
        WHITESPACE@27..30 "\n  "
        END_KW@30..33 "end"
        WHITESPACE@33..34 " "
        IF_KW@34..36 "if"
        SEMICOLON@36..37 ";"
      WHITESPACE@37..41 "\n\n  "
      PLPGSQL_IF_STMT@41..120
        IF_KW@41..43 "if"
        WHITESPACE@43..44 " "
        PLPGSQL_EXPR@44..49
          TARGET_LIST@44..49
            TARGET@44..49
              BIN_EXPR@44..49
                LITERAL@44..45
                  INT_NUMBER@44..45 "1"
                WHITESPACE@45..46 " "
                EQ@46..47 "="
                WHITESPACE@47..48 " "
                LITERAL@48..49
                  INT_NUMBER@48..49 "1"
        WHITESPACE@49..50 " "
        THEN_KW@50..54 "then"
        WHITESPACE@54..59 "\n    "
        PLPGSQL_BODY@59..64
          PLPGSQL_NULL_STMT@59..64
            NULL_KW@59..63 "null"
            SEMICOLON@63..64 ";"
        WHITESPACE@64..67 "\n  "
        PLPGSQL_ELSE_CLAUSE@67..110
          ELSE_KW@67..71 "else"
          WHITESPACE@71..76 "\n    "
          PLPGSQL_BODY@76..110
            PLPGSQL_NULL_STMT@76..81
              NULL_KW@76..80 "null"
              SEMICOLON@80..81 ";"
            WHITESPACE@81..84 "\n  "
            PLPGSQL_EXEC_SQL_STMT@84..110
              ERROR@84..89
                IDENT@84..89 "elsif"
              WHITESPACE@89..90 " "
              ERROR@90..109
                INT_NUMBER@90..91 "1"
                WHITESPACE@91..92 " "
                EQ@92..93 "="
                WHITESPACE@93..94 " "
                INT_NUMBER@94..95 "2"
                WHITESPACE@95..96 " "
                THEN_KW@96..100 "then"
                WHITESPACE@100..105 "\n    "
                NULL_KW@105..109 "null"
              SEMICOLON@109..110 ";"
        WHITESPACE@110..113 "\n  "
        END_KW@113..116 "end"
        WHITESPACE@116..117 " "
        IF_KW@117..119 "if"
        SEMICOLON@119..120 ";"
      WHITESPACE@120..124 "\n\n  "
      PLPGSQL_IF_STMT@124..234
        IF_KW@124..126 "if"
        WHITESPACE@126..127 " "
        PLPGSQL_EXPR@127..156
          TARGET_LIST@127..156
            TARGET@127..156
              BIN_EXPR@127..156
                CASE_EXPR@127..152
                  CASE_KW@127..131 "case"
                  WHITESPACE@131..132 " "
                  WHEN_CLAUSE_LIST@132..148
                    WHEN_CLAUSE@132..148
                      WHEN_KW@132..136 "when"
                      WHITESPACE@136..137 " "
                      LITERAL@137..141
                        TRUE_KW@137..141 "true"
                      WHITESPACE@141..142 " "
                      THEN_KW@142..146 "then"
                      WHITESPACE@146..147 " "
                      LITERAL@147..148
                        INT_NUMBER@147..148 "1"
                  WHITESPACE@148..149 " "
                  END_KW@149..152 "end"
                WHITESPACE@152..153 " "
                EQ@153..154 "="
                WHITESPACE@154..155 " "
                LITERAL@155..156
                  INT_NUMBER@155..156 "1"
        WHITESPACE@156..157 " "
        THEN_KW@157..161 "then"
        WHITESPACE@161..166 "\n    "
        PLPGSQL_BODY@166..171
          PLPGSQL_NULL_STMT@166..171
            NULL_KW@166..170 "null"
            SEMICOLON@170..171 ";"
        WHITESPACE@171..174 "\n  "
        PLPGSQL_ELSIF_CLAUSE@174..224
          ELSIF_KW@174..179 "elsif"
          WHITESPACE@179..180 " "
          PLPGSQL_EXPR@180..209
            TARGET_LIST@180..209
              TARGET@180..209
                BIN_EXPR@180..209
                  LITERAL@180..181
                    INT_NUMBER@180..181 "1"
                  WHITESPACE@181..182 " "
                  EQ@182..183 "="
                  WHITESPACE@183..184 " "
                  CASE_EXPR@184..209
                    CASE_KW@184..188 "case"
                    WHITESPACE@188..189 " "
                    WHEN_CLAUSE_LIST@189..205
                      WHEN_CLAUSE@189..205
                        WHEN_KW@189..193 "when"
                        WHITESPACE@193..194 " "
                        LITERAL@194..198
                          TRUE_KW@194..198 "true"
                        WHITESPACE@198..199 " "
                        THEN_KW@199..203 "then"
                        WHITESPACE@203..204 " "
                        LITERAL@204..205
                          INT_NUMBER@204..205 "1"
                    WHITESPACE@205..206 " "
                    END_KW@206..209 "end"
          WHITESPACE@209..210 " "
          THEN_KW@210..214 "then"
          WHITESPACE@214..219 "\n    "
          PLPGSQL_BODY@219..224
            PLPGSQL_NULL_STMT@219..224
              NULL_KW@219..223 "null"
              SEMICOLON@223..224 ";"
        WHITESPACE@224..227 "\n  "
        END_KW@227..230 "end"
        WHITESPACE@230..231 " "
        IF_KW@231..233 "if"
        SEMICOLON@233..234 ";"
      WHITESPACE@234..238 "\n\n  "
      PLPGSQL_NULL_STMT@238..243
        NULL_KW@238..242 "null"
        SEMICOLON@242..243 ";"
    WHITESPACE@243..244 "\n"
    END_KW@244..247 "end"
  WHITESPACE@247..248 "\n"

error[syntax-error]: expected THEN_KW
  ╭▸ 
4 │     null;
  ╰╴        ━
error[syntax-error]: expected a statement, got SEMICOLON
  ╭▸ 
4 │     null;
  ╰╴        ━
error[syntax-error]: expected command, found IDENT
   ╭▸ 
11 │   elsif 1 = 2 then
   ╰╴  ━
error[syntax-error]: expected SEMICOLON, got INT_NUMBER
   ╭▸ 
11 │   elsif 1 = 2 then
   ╰╴        ━
error[syntax-error]: CASE expression must be parenthesized
   ╭▸ 
15 │   if case when true then 1 end = 1 then
   ╰╴     ━━━━━━━━━━━━━━━━━━━━━━━━━
error[syntax-error]: CASE expression must be parenthesized
   ╭▸ 
17 │   elsif 1 = case when true then 1 end then
   ╰╴            ━━━━━━━━━━━━━━━━━━━━━━━━━