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/case_stmt.sql
---
PLPGSQL@0..425
  WHITESPACE@0..1 "\n"
  PLPGSQL_BLOCK@1..424
    PLPGSQL_DECLARE_SECTION@1..22
      DECLARE_KW@1..8 "declare"
      WHITESPACE@8..11 "\n  "
      PLPGSQL_VAR_DECL@11..22
        PLPGSQL_VAR_NAME@11..12
          IDENT@11..12 "x"
        WHITESPACE@12..13 " "
        PATH_TYPE@13..16
          PATH_REF@13..16
            PATH_SEGMENT_REF@13..16
              INT_KW@13..16 "int"
        WHITESPACE@16..17 " "
        PLPGSQL_VAR_INIT@17..21
          COLON_EQ@17..19 ":="
          WHITESPACE@19..20 " "
          PLPGSQL_EXPR@20..21
            TARGET_LIST@20..21
              TARGET@20..21
                LITERAL@20..21
                  INT_NUMBER@20..21 "1"
        SEMICOLON@21..22 ";"
    WHITESPACE@22..23 "\n"
    BEGIN_KW@23..28 "begin"
    WHITESPACE@28..31 "\n  "
    PLPGSQL_BODY@31..420
      PLPGSQL_CASE_STMT@31..70
        CASE_KW@31..35 "case"
        WHITESPACE@35..36 " "
        PLPGSQL_EXPR@36..37
          TARGET_LIST@36..37
            TARGET@36..37
              NAME_REF@36..37
                IDENT@36..37 "x"
        WHITESPACE@37..42 "\n    "
        PLPGSQL_ELSE_CLAUSE@42..58
          ELSE_KW@42..46 "else"
          WHITESPACE@46..53 "\n      "
          PLPGSQL_BODY@53..58
            PLPGSQL_NULL_STMT@53..58
              NULL_KW@53..57 "null"
              SEMICOLON@57..58 ";"
        WHITESPACE@58..61 "\n  "
        END_KW@61..64 "end"
        WHITESPACE@64..65 " "
        CASE_KW@65..69 "case"
        SEMICOLON@69..70 ";"
      WHITESPACE@70..74 "\n\n  "
      PLPGSQL_CASE_STMT@74..119
        CASE_KW@74..78 "case"
        WHITESPACE@78..79 " "
        PLPGSQL_EXPR@79..80
          TARGET_LIST@79..80
            TARGET@79..80
              NAME_REF@79..80
                IDENT@79..80 "x"
        WHITESPACE@80..85 "\n    "
        PLPGSQL_CASE_WHEN@85..108
          WHEN_KW@85..89 "when"
          WHITESPACE@89..90 " "
          PLPGSQL_EXPR@90..91
            TARGET_LIST@90..91
              TARGET@90..91
                LITERAL@90..91
                  INT_NUMBER@90..91 "1"
          WHITESPACE@91..92 " "
          THEN_KW@92..96 "then"
          WHITESPACE@96..103 "\n      "
          PLPGSQL_BODY@103..108
            PLPGSQL_NULL_STMT@103..108
              NULL_KW@103..107 "null"
              SEMICOLON@107..108 ";"
        WHITESPACE@108..111 "\n  "
        END_KW@111..114 "end"
        WHITESPACE@114..115 " "
        CASE_KW@115..119 "case"
      WHITESPACE@119..123 "\n\n  "
      PLPGSQL_CASE_STMT@123..194
        CASE_KW@123..127 "case"
        WHITESPACE@127..128 " "
        PLPGSQL_EXPR@128..154
          TARGET_LIST@128..154
            TARGET@128..154
              CASE_EXPR@128..154
                CASE_KW@128..132 "case"
                WHITESPACE@132..133 " "
                WHEN_CLAUSE_LIST@133..150
                  WHEN_CLAUSE@133..150
                    WHEN_KW@133..137 "when"
                    WHITESPACE@137..138 " "
                    BIN_EXPR@138..143
                      NAME_REF@138..139
                        IDENT@138..139 "x"
                      WHITESPACE@139..140 " "
                      EQ@140..141 "="
                      WHITESPACE@141..142 " "
                      LITERAL@142..143
                        INT_NUMBER@142..143 "1"
                    WHITESPACE@143..144 " "
                    THEN_KW@144..148 "then"
                    WHITESPACE@148..149 " "
                    LITERAL@149..150
                      INT_NUMBER@149..150 "1"
                WHITESPACE@150..151 " "
                END_KW@151..154 "end"
        WHITESPACE@154..159 "\n    "
        PLPGSQL_CASE_WHEN@159..182
          WHEN_KW@159..163 "when"
          WHITESPACE@163..164 " "
          PLPGSQL_EXPR@164..165
            TARGET_LIST@164..165
              TARGET@164..165
                LITERAL@164..165
                  INT_NUMBER@164..165 "1"
          WHITESPACE@165..166 " "
          THEN_KW@166..170 "then"
          WHITESPACE@170..177 "\n      "
          PLPGSQL_BODY@177..182
            PLPGSQL_NULL_STMT@177..182
              NULL_KW@177..181 "null"
              SEMICOLON@181..182 ";"
        WHITESPACE@182..185 "\n  "
        END_KW@185..188 "end"
        WHITESPACE@188..189 " "
        CASE_KW@189..193 "case"
        SEMICOLON@193..194 ";"
      WHITESPACE@194..198 "\n\n  "
      PLPGSQL_CASE_STMT@198..420
        CASE_KW@198..202 "case"
        WHITESPACE@202..207 "\n    "
        PLPGSQL_CASE_WHEN@207..258
          WHEN_KW@207..211 "when"
          WHITESPACE@211..212 " "
          PLPGSQL_EXPR@212..241
            TARGET_LIST@212..241
              TARGET@212..241
                CASE_EXPR@212..241
                  CASE_KW@212..216 "case"
                  WHITESPACE@216..217 " "
                  WHEN_CLAUSE_LIST@217..237
                    WHEN_CLAUSE@217..237
                      WHEN_KW@217..221 "when"
                      WHITESPACE@221..222 " "
                      BIN_EXPR@222..227
                        NAME_REF@222..223
                          IDENT@222..223 "x"
                        WHITESPACE@223..224 " "
                        EQ@224..225 "="
                        WHITESPACE@225..226 " "
                        LITERAL@226..227
                          INT_NUMBER@226..227 "1"
                      WHITESPACE@227..228 " "
                      THEN_KW@228..232 "then"
                      WHITESPACE@232..233 " "
                      LITERAL@233..237
                        TRUE_KW@233..237 "true"
                  WHITESPACE@237..238 " "
                  END_KW@238..241 "end"
          WHITESPACE@241..242 " "
          THEN_KW@242..246 "then"
          WHITESPACE@246..253 "\n      "
          PLPGSQL_BODY@253..258
            PLPGSQL_NULL_STMT@253..258
              NULL_KW@253..257 "null"
              SEMICOLON@257..258 ";"
        WHITESPACE@258..263 "\n    "
        PLPGSQL_CASE_WHEN@263..321
          WHEN_KW@263..267 "when"
          WHITESPACE@267..268 " "
          PLPGSQL_EXPR@268..304
            TARGET_LIST@268..304
              TARGET@268..273
                BIN_EXPR@268..273
                  NAME_REF@268..269
                    IDENT@268..269 "x"
                  WHITESPACE@269..270 " "
                  EQ@270..271 "="
                  WHITESPACE@271..272 " "
                  LITERAL@272..273
                    INT_NUMBER@272..273 "2"
              COMMA@273..274 ","
              WHITESPACE@274..275 " "
              TARGET@275..304
                CASE_EXPR@275..304
                  CASE_KW@275..279 "case"
                  WHITESPACE@279..280 " "
                  WHEN_CLAUSE_LIST@280..300
                    WHEN_CLAUSE@280..300
                      WHEN_KW@280..284 "when"
                      WHITESPACE@284..285 " "
                      BIN_EXPR@285..290
                        NAME_REF@285..286
                          IDENT@285..286 "x"
                        WHITESPACE@286..287 " "
                        EQ@287..288 "="
                        WHITESPACE@288..289 " "
                        LITERAL@289..290
                          INT_NUMBER@289..290 "3"
                      WHITESPACE@290..291 " "
                      THEN_KW@291..295 "then"
                      WHITESPACE@295..296 " "
                      LITERAL@296..300
                        TRUE_KW@296..300 "true"
                  WHITESPACE@300..301 " "
                  END_KW@301..304 "end"
          WHITESPACE@304..305 " "
          THEN_KW@305..309 "then"
          WHITESPACE@309..316 "\n      "
          PLPGSQL_BODY@316..321
            PLPGSQL_NULL_STMT@316..321
              NULL_KW@316..320 "null"
              SEMICOLON@320..321 ";"
        WHITESPACE@321..326 "\n    "
        PLPGSQL_CASE_WHEN@326..408
          WHEN_KW@326..330 "when"
          WHITESPACE@330..331 " "
          PLPGSQL_EXPR@331..391
            TARGET_LIST@331..391
              TARGET@331..360
                CASE_EXPR@331..360
                  CASE_KW@331..335 "case"
                  WHITESPACE@335..336 " "
                  WHEN_CLAUSE_LIST@336..356
                    WHEN_CLAUSE@336..356
                      WHEN_KW@336..340 "when"
                      WHITESPACE@340..341 " "
                      BIN_EXPR@341..346
                        NAME_REF@341..342
                          IDENT@341..342 "x"
                        WHITESPACE@342..343 " "
                        EQ@343..344 "="
                        WHITESPACE@344..345 " "
                        LITERAL@345..346
                          INT_NUMBER@345..346 "4"
                      WHITESPACE@346..347 " "
                      THEN_KW@347..351 "then"
                      WHITESPACE@351..352 " "
                      LITERAL@352..356
                        TRUE_KW@352..356 "true"
                  WHITESPACE@356..357 " "
                  END_KW@357..360 "end"
              COMMA@360..361 ","
              WHITESPACE@361..362 " "
              TARGET@362..391
                CASE_EXPR@362..391
                  CASE_KW@362..366 "case"
                  WHITESPACE@366..367 " "
                  WHEN_CLAUSE_LIST@367..387
                    WHEN_CLAUSE@367..387
                      WHEN_KW@367..371 "when"
                      WHITESPACE@371..372 " "
                      BIN_EXPR@372..377
                        NAME_REF@372..373
                          IDENT@372..373 "x"
                        WHITESPACE@373..374 " "
                        EQ@374..375 "="
                        WHITESPACE@375..376 " "
                        LITERAL@376..377
                          INT_NUMBER@376..377 "5"
                      WHITESPACE@377..378 " "
                      THEN_KW@378..382 "then"
                      WHITESPACE@382..383 " "
                      LITERAL@383..387
                        TRUE_KW@383..387 "true"
                  WHITESPACE@387..388 " "
                  END_KW@388..391 "end"
          WHITESPACE@391..392 " "
          THEN_KW@392..396 "then"
          WHITESPACE@396..403 "\n      "
          PLPGSQL_BODY@403..408
            PLPGSQL_NULL_STMT@403..408
              NULL_KW@403..407 "null"
              SEMICOLON@407..408 ";"
        WHITESPACE@408..411 "\n  "
        END_KW@411..414 "end"
        WHITESPACE@414..415 " "
        CASE_KW@415..419 "case"
        SEMICOLON@419..420 ";"
    WHITESPACE@420..421 "\n"
    END_KW@421..424 "end"
  WHITESPACE@424..425 "\n"

error[syntax-error]: expected `when`
  ╭▸ 
5 │   case x
  ╰╴        ━
error[syntax-error]: expected SEMICOLON
   ╭▸ 
13 │   end case
   ╰╴          ━
error[syntax-error]: CASE expression must be parenthesized
   ╭▸ 
15 │   case case when x = 1 then 1 end
   ╰╴       ━━━━━━━━━━━━━━━━━━━━━━━━━━
error[syntax-error]: CASE expression must be parenthesized
   ╭▸ 
21 │     when case when x = 1 then true end then
   ╰╴         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
error[syntax-error]: CASE expression must be parenthesized
   ╭▸ 
23 │     when x = 2, case when x = 3 then true end then
   ╰╴                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
error[syntax-error]: CASE expression must be parenthesized
   ╭▸ 
25 │     when case when x = 4 then true end, case when x = 5 then true end then
   ╰╴         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
error[syntax-error]: CASE expression must be parenthesized
   ╭▸ 
25 │     when case when x = 4 then true end, case when x = 5 then true end then
   ╰╴                                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━