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/ok/perform_stmt.sql
---
PLPGSQL@0..297
  WHITESPACE@0..1 "\n"
  PLPGSQL_BLOCK@1..296
    PLPGSQL_DECLARE_SECTION@1..28
      DECLARE_KW@1..8 "declare"
      WHITESPACE@8..11 "\n  "
      PLPGSQL_VAR_DECL@11..28
        PLPGSQL_VAR_NAME@11..18
          IDENT@11..18 "perform"
        WHITESPACE@18..19 " "
        PATH_TYPE@19..22
          PATH_REF@19..22
            PATH_SEGMENT_REF@19..22
              INT_KW@19..22 "int"
        WHITESPACE@22..23 " "
        PLPGSQL_VAR_INIT@23..27
          COLON_EQ@23..25 ":="
          WHITESPACE@25..26 " "
          PLPGSQL_EXPR@26..27
            TARGET_LIST@26..27
              TARGET@26..27
                LITERAL@26..27
                  INT_NUMBER@26..27 "1"
        SEMICOLON@27..28 ";"
    WHITESPACE@28..29 "\n"
    BEGIN_KW@29..34 "begin"
    WHITESPACE@34..37 "\n  "
    PLPGSQL_BODY@37..292
      PLPGSQL_PERFORM_STMT@37..47
        SELECT@37..46
          SELECT_CLAUSE@37..46
            PERFORM_KW@37..44 "perform"
            WHITESPACE@44..45 " "
            TARGET_LIST@45..46
              TARGET@45..46
                LITERAL@45..46
                  INT_NUMBER@45..46 "1"
        SEMICOLON@46..47 ";"
      WHITESPACE@47..50 "\n  "
      PLPGSQL_PERFORM_STMT@50..58
        SELECT@50..57
          SELECT_CLAUSE@50..57
            PERFORM_KW@50..57 "perform"
        SEMICOLON@57..58 ";"
      WHITESPACE@58..61 "\n  "
      PLPGSQL_PERFORM_STMT@61..93
        SELECT@61..92
          SELECT_CLAUSE@61..80
            PERFORM_KW@61..68 "perform"
            WHITESPACE@68..69 " "
            DISTINCT_CLAUSE@69..77
              DISTINCT_KW@69..77 "distinct"
            WHITESPACE@77..78 " "
            TARGET_LIST@78..80
              TARGET@78..80
                NAME_REF@78..80
                  IDENT@78..80 "f1"
          WHITESPACE@80..81 " "
          FROM_CLAUSE@81..92
            FROM_KW@81..85 "from"
            WHITESPACE@85..86 " "
            RELATION_FROM_ITEM@86..92
              RELATION_NAME_REF@86..92
                PATH_REF@86..92
                  PATH_SEGMENT_REF@86..92
                    IDENT@86..92 "onecol"
        SEMICOLON@92..93 ";"
      WHITESPACE@93..96 "\n  "
      PLPGSQL_PERFORM_STMT@96..137
        SELECT@96..136
          SELECT_CLAUSE@96..105
            PERFORM_KW@96..103 "perform"
            WHITESPACE@103..104 " "
            TARGET_LIST@104..105
              TARGET@104..105
                STAR@104..105 "*"
          WHITESPACE@105..106 " "
          FROM_CLAUSE@106..117
            FROM_KW@106..110 "from"
            WHITESPACE@110..111 " "
            RELATION_FROM_ITEM@111..117
              RELATION_NAME_REF@111..117
                PATH_REF@111..117
                  PATH_SEGMENT_REF@111..117
                    IDENT@111..117 "onecol"
          WHITESPACE@117..118 " "
          ORDER_BY_CLAUSE@118..128
            ORDER_KW@118..123 "order"
            WHITESPACE@123..124 " "
            BY_KW@124..126 "by"
            WHITESPACE@126..127 " "
            SORT_BY_LIST@127..128
              SORT_BY@127..128
                LITERAL@127..128
                  INT_NUMBER@127..128 "1"
          WHITESPACE@128..129 " "
          LIMIT_CLAUSE@129..136
            LIMIT_KW@129..134 "limit"
            WHITESPACE@134..135 " "
            LITERAL@135..136
              INT_NUMBER@135..136 "1"
        SEMICOLON@136..137 ";"
      WHITESPACE@137..140 "\n  "
      PLPGSQL_PERFORM_STMT@140..165
        COMPOUND_SELECT@140..164
          SELECT@140..149
            SELECT_CLAUSE@140..149
              PERFORM_KW@140..147 "perform"
              WHITESPACE@147..148 " "
              TARGET_LIST@148..149
                TARGET@148..149
                  LITERAL@148..149
                    INT_NUMBER@148..149 "1"
          WHITESPACE@149..150 " "
          UNION@150..155
            UNION_KW@150..155 "union"
          WHITESPACE@155..156 " "
          SELECT@156..164
            SELECT_CLAUSE@156..164
              SELECT_KW@156..162 "select"
              WHITESPACE@162..163 " "
              TARGET_LIST@163..164
                TARGET@163..164
                  LITERAL@163..164
                    INT_NUMBER@163..164 "2"
        SEMICOLON@164..165 ";"
      WHITESPACE@165..168 "\n  "
      PLPGSQL_PERFORM_STMT@168..205
        SELECT@168..204
          SELECT_CLAUSE@168..204
            PERFORM_KW@168..175 "perform"
            WHITESPACE@175..176 " "
            TARGET_LIST@176..204
              TARGET@176..204
                PAREN_EXPR@176..204
                  L_PAREN@176..177 "("
                  SELECT@177..203
                    SELECT_CLAUSE@177..191
                      SELECT_KW@177..183 "select"
                      WHITESPACE@183..184 " "
                      TARGET_LIST@184..191
                        TARGET@184..191
                          CALL_EXPR@184..191
                            NAME_REF@184..187
                              IDENT@184..187 "max"
                            ARG_LIST@187..191
                              L_PAREN@187..188 "("
                              ARG@188..190
                                NAME_REF@188..190
                                  IDENT@188..190 "f1"
                              R_PAREN@190..191 ")"
                    WHITESPACE@191..192 " "
                    FROM_CLAUSE@192..203
                      FROM_KW@192..196 "from"
                      WHITESPACE@196..197 " "
                      RELATION_FROM_ITEM@197..203
                        RELATION_NAME_REF@197..203
                          PATH_REF@197..203
                            PATH_SEGMENT_REF@197..203
                              IDENT@197..203 "onecol"
                  R_PAREN@203..204 ")"
        SEMICOLON@204..205 ";"
      WHITESPACE@205..208 "\n  "
      PLPGSQL_PERFORM_STMT@208..276
        SELECT@208..275
          SELECT_CLAUSE@208..218
            PERFORM_KW@208..215 "perform"
            WHITESPACE@215..216 " "
            TARGET_LIST@216..218
              TARGET@216..218
                NAME_REF@216..218
                  IDENT@216..218 "f1"
          WHITESPACE@218..219 " "
          FROM_CLAUSE@219..230
            FROM_KW@219..223 "from"
            WHITESPACE@223..224 " "
            RELATION_FROM_ITEM@224..230
              RELATION_NAME_REF@224..230
                PATH_REF@224..230
                  PATH_SEGMENT_REF@224..230
                    IDENT@224..230 "onecol"
          WHITESPACE@230..231 " "
          WHERE_CLAUSE@231..243
            WHERE_KW@231..236 "where"
            WHITESPACE@236..237 " "
            BIN_EXPR@237..243
              NAME_REF@237..239
                IDENT@237..239 "f1"
              WHITESPACE@239..240 " "
              R_ANGLE@240..241 ">"
              WHITESPACE@241..242 " "
              LITERAL@242..243
                INT_NUMBER@242..243 "0"
          WHITESPACE@243..244 " "
          GROUP_BY_CLAUSE@244..255
            GROUP_KW@244..249 "group"
            WHITESPACE@249..250 " "
            BY_KW@250..252 "by"
            WHITESPACE@252..253 " "
            GROUP_BY_LIST@253..255
              GROUPING_EXPR@253..255
                NAME_REF@253..255
                  IDENT@253..255 "f1"
          WHITESPACE@255..256 " "
          HAVING_CLAUSE@256..275
            HAVING_KW@256..262 "having"
            WHITESPACE@262..263 " "
            BIN_EXPR@263..275
              CALL_EXPR@263..271
                NAME_REF@263..268
                  IDENT@263..268 "count"
                ARG_LIST@268..271
                  L_PAREN@268..269 "("
                  STAR@269..270 "*"
                  R_PAREN@270..271 ")"
              WHITESPACE@271..272 " "
              R_ANGLE@272..273 ">"
              WHITESPACE@273..274 " "
              LITERAL@274..275
                INT_NUMBER@274..275 "1"
        SEMICOLON@275..276 ";"
      WHITESPACE@276..279 "\n  "
      PLPGSQL_ASSIGN_STMT@279..292
        PLPGSQL_ASSIGN_TARGET@279..286
          PLPGSQL_VAR_NAME_REF@279..286
            IDENT@279..286 "perform"
        WHITESPACE@286..287 " "
        COLON_EQ@287..289 ":="
        WHITESPACE@289..290 " "
        PLPGSQL_EXPR@290..291
          TARGET_LIST@290..291
            TARGET@290..291
              LITERAL@290..291
                INT_NUMBER@290..291 "2"
        SEMICOLON@291..292 ";"
    WHITESPACE@292..293 "\n"
    END_KW@293..296 "end"
  WHITESPACE@296..297 "\n"