squawk-syntax 2.48.0

Linter for Postgres migrations & SQL
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
---
source: crates/squawk_syntax/src/test.rs
input_file: crates/squawk_syntax/test_data/validation/join_clauses.sql
---
SOURCE_FILE@0..523
  COMMENT@0..7 "-- errs"
  WHITESPACE@7..8 "\n"
  SELECT@8..30
    SELECT_CLAUSE@8..16
      SELECT_KW@8..14 "select"
      WHITESPACE@14..15 " "
      TARGET_LIST@15..16
        TARGET@15..16
          STAR@15..16 "*"
    WHITESPACE@16..17 " "
    FROM_CLAUSE@17..30
      FROM_KW@17..21 "from"
      WHITESPACE@21..22 " "
      JOIN_EXPR@22..30
        FROM_ITEM@22..23
          NAME_REF@22..23
            IDENT@22..23 "t"
        WHITESPACE@23..24 " "
        JOIN@24..30
          JOIN_INNER@24..28
            JOIN_KW@24..28 "join"
          WHITESPACE@28..29 " "
          FROM_ITEM@29..30
            NAME_REF@29..30
              IDENT@29..30 "u"
  SEMICOLON@30..31 ";"
  WHITESPACE@31..33 "\n\n"
  SELECT@33..60
    SELECT_CLAUSE@33..41
      SELECT_KW@33..39 "select"
      WHITESPACE@39..40 " "
      TARGET_LIST@40..41
        TARGET@40..41
          STAR@40..41 "*"
    WHITESPACE@41..42 " "
    FROM_CLAUSE@42..60
      FROM_KW@42..46 "from"
      WHITESPACE@46..47 " "
      JOIN_EXPR@47..60
        FROM_ITEM@47..48
          NAME_REF@47..48
            IDENT@47..48 "t"
        WHITESPACE@48..49 " "
        JOIN@49..60
          JOIN_LEFT@49..58
            LEFT_KW@49..53 "left"
            WHITESPACE@53..54 " "
            JOIN_KW@54..58 "join"
          WHITESPACE@58..59 " "
          FROM_ITEM@59..60
            NAME_REF@59..60
              IDENT@59..60 "u"
  SEMICOLON@60..61 ";"
  WHITESPACE@61..63 "\n\n"
  SELECT@63..91
    SELECT_CLAUSE@63..71
      SELECT_KW@63..69 "select"
      WHITESPACE@69..70 " "
      TARGET_LIST@70..71
        TARGET@70..71
          STAR@70..71 "*"
    WHITESPACE@71..72 " "
    FROM_CLAUSE@72..91
      FROM_KW@72..76 "from"
      WHITESPACE@76..77 " "
      JOIN_EXPR@77..91
        FROM_ITEM@77..78
          NAME_REF@77..78
            IDENT@77..78 "t"
        WHITESPACE@78..79 " "
        JOIN@79..91
          JOIN_RIGHT@79..89
            RIGHT_KW@79..84 "right"
            WHITESPACE@84..85 " "
            JOIN_KW@85..89 "join"
          WHITESPACE@89..90 " "
          FROM_ITEM@90..91
            NAME_REF@90..91
              IDENT@90..91 "u"
  SEMICOLON@91..92 ";"
  WHITESPACE@92..94 "\n\n"
  SELECT@94..121
    SELECT_CLAUSE@94..102
      SELECT_KW@94..100 "select"
      WHITESPACE@100..101 " "
      TARGET_LIST@101..102
        TARGET@101..102
          STAR@101..102 "*"
    WHITESPACE@102..103 " "
    FROM_CLAUSE@103..121
      FROM_KW@103..107 "from"
      WHITESPACE@107..108 " "
      JOIN_EXPR@108..121
        FROM_ITEM@108..109
          NAME_REF@108..109
            IDENT@108..109 "t"
        WHITESPACE@109..110 " "
        JOIN@110..121
          JOIN_FULL@110..119
            FULL_KW@110..114 "full"
            WHITESPACE@114..115 " "
            JOIN_KW@115..119 "join"
          WHITESPACE@119..120 " "
          FROM_ITEM@120..121
            NAME_REF@120..121
              IDENT@120..121 "u"
  SEMICOLON@121..122 ";"
  WHITESPACE@122..125 "\n\n\n"
  COMMENT@125..171 "-- err, can't use con ..."
  WHITESPACE@171..172 "\n"
  SELECT@172..213
    SELECT_CLAUSE@172..180
      SELECT_KW@172..178 "select"
      WHITESPACE@178..179 " "
      TARGET_LIST@179..180
        TARGET@179..180
          STAR@179..180 "*"
    WHITESPACE@180..181 " "
    FROM_CLAUSE@181..213
      FROM_KW@181..185 "from"
      WHITESPACE@185..186 " "
      JOIN_EXPR@186..213
        FROM_ITEM@186..187
          NAME_REF@186..187
            IDENT@186..187 "t"
        WHITESPACE@187..188 " "
        JOIN@188..213
          NATURAL_KW@188..195 "natural"
          WHITESPACE@195..196 " "
          JOIN_INNER@196..200
            JOIN_KW@196..200 "join"
          WHITESPACE@200..201 " "
          FROM_ITEM@201..202
            NAME_REF@201..202
              IDENT@201..202 "u"
          WHITESPACE@202..203 " "
          JOIN_USING_CLAUSE@203..213
            USING_KW@203..208 "using"
            WHITESPACE@208..209 " "
            COLUMN_LIST@209..213
              L_PAREN@209..210 "("
              COLUMN@210..212
                NAME_REF@210..212
                  IDENT@210..212 "id"
              R_PAREN@212..213 ")"
  SEMICOLON@213..214 ";"
  WHITESPACE@214..216 "\n\n"
  COMMENT@216..261 "-- err, can't use con ..."
  WHITESPACE@261..262 "\n"
  SELECT@262..301
    SELECT_CLAUSE@262..270
      SELECT_KW@262..268 "select"
      WHITESPACE@268..269 " "
      TARGET_LIST@269..270
        TARGET@269..270
          STAR@269..270 "*"
    WHITESPACE@270..271 " "
    FROM_CLAUSE@271..301
      FROM_KW@271..275 "from"
      WHITESPACE@275..276 " "
      JOIN_EXPR@276..301
        FROM_ITEM@276..277
          NAME_REF@276..277
            IDENT@276..277 "t"
        WHITESPACE@277..278 " "
        JOIN@278..301
          JOIN_CROSS@278..288
            CROSS_KW@278..283 "cross"
            WHITESPACE@283..284 " "
            JOIN_KW@284..288 "join"
          WHITESPACE@288..289 " "
          FROM_ITEM@289..290
            NAME_REF@289..290
              IDENT@289..290 "u"
          WHITESPACE@290..291 " "
          JOIN_USING_CLAUSE@291..301
            USING_KW@291..296 "using"
            WHITESPACE@296..297 " "
            COLUMN_LIST@297..301
              L_PAREN@297..298 "("
              COLUMN@298..300
                NAME_REF@298..300
                  IDENT@298..300 "id"
              R_PAREN@300..301 ")"
  SEMICOLON@301..302 ";"
  WHITESPACE@302..304 "\n\n"
  COMMENT@304..309 "-- ok"
  WHITESPACE@309..310 "\n"
  SELECT@310..340
    SELECT_CLAUSE@310..318
      SELECT_KW@310..316 "select"
      WHITESPACE@316..317 " "
      TARGET_LIST@317..318
        TARGET@317..318
          STAR@317..318 "*"
    WHITESPACE@318..319 " "
    FROM_CLAUSE@319..340
      FROM_KW@319..323 "from"
      WHITESPACE@323..324 " "
      JOIN_EXPR@324..340
        FROM_ITEM@324..325
          NAME_REF@324..325
            IDENT@324..325 "t"
        WHITESPACE@325..326 " "
        JOIN@326..340
          NATURAL_KW@326..333 "natural"
          WHITESPACE@333..334 " "
          JOIN_INNER@334..338
            JOIN_KW@334..338 "join"
          WHITESPACE@338..339 " "
          FROM_ITEM@339..340
            NAME_REF@339..340
              IDENT@339..340 "u"
  SEMICOLON@340..341 ";"
  WHITESPACE@341..343 "\n\n"
  SELECT@343..391
    SELECT_CLAUSE@343..351
      SELECT_KW@343..349 "select"
      WHITESPACE@349..350 " "
      TARGET_LIST@350..351
        TARGET@350..351
          STAR@350..351 "*"
    WHITESPACE@351..352 " "
    FROM_CLAUSE@352..391
      FROM_KW@352..356 "from"
      WHITESPACE@356..357 " "
      JOIN_EXPR@357..371
        FROM_ITEM@357..358
          NAME_REF@357..358
            IDENT@357..358 "t"
        WHITESPACE@358..359 " "
        JOIN@359..371
          JOIN_CROSS@359..369
            CROSS_KW@359..364 "cross"
            WHITESPACE@364..365 " "
            JOIN_KW@365..369 "join"
          WHITESPACE@369..370 " "
          FROM_ITEM@370..371
            NAME_REF@370..371
              IDENT@370..371 "u"
      COMMA@371..372 ","
      WHITESPACE@372..373 " "
      JOIN_EXPR@373..391
        FROM_ITEM@373..374
          NAME_REF@373..374
            IDENT@373..374 "b"
        WHITESPACE@374..375 " "
        JOIN@375..391
          JOIN_INNER@375..379
            JOIN_KW@375..379 "join"
          WHITESPACE@379..380 " "
          FROM_ITEM@380..381
            NAME_REF@380..381
              IDENT@380..381 "c"
          WHITESPACE@381..382 " "
          JOIN_USING_CLAUSE@382..391
            USING_KW@382..387 "using"
            COLUMN_LIST@387..391
              L_PAREN@387..388 "("
              COLUMN@388..390
                NAME_REF@388..390
                  IDENT@388..390 "id"
              R_PAREN@390..391 ")"
  SEMICOLON@391..392 ";"
  WHITESPACE@392..394 "\n\n"
  SELECT@394..431
    SELECT_CLAUSE@394..402
      SELECT_KW@394..400 "select"
      WHITESPACE@400..401 " "
      TARGET_LIST@401..402
        TARGET@401..402
          STAR@401..402 "*"
    WHITESPACE@402..403 " "
    FROM_CLAUSE@403..431
      FROM_KW@403..407 "from"
      WHITESPACE@407..408 " "
      JOIN_EXPR@408..431
        FROM_ITEM@408..409
          NAME_REF@408..409
            IDENT@408..409 "t"
        WHITESPACE@409..410 " "
        JOIN@410..431
          JOIN_INNER@410..414
            JOIN_KW@410..414 "join"
          WHITESPACE@414..415 " "
          FROM_ITEM@415..416
            NAME_REF@415..416
              IDENT@415..416 "u"
          WHITESPACE@416..417 " "
          ON_CLAUSE@417..431
            ON_KW@417..419 "on"
            WHITESPACE@419..420 " "
            BIN_EXPR@420..431
              FIELD_EXPR@420..424
                NAME_REF@420..421
                  IDENT@420..421 "u"
                DOT@421..422 "."
                NAME_REF@422..424
                  IDENT@422..424 "id"
              WHITESPACE@424..425 " "
              EQ@425..426 "="
              WHITESPACE@426..427 " "
              FIELD_EXPR@427..431
                NAME_REF@427..428
                  IDENT@427..428 "t"
                DOT@428..429 "."
                NAME_REF@429..431
                  IDENT@429..431 "id"
  SEMICOLON@431..432 ";"
  WHITESPACE@432..433 "\n"
  SELECT@433..463
    SELECT_CLAUSE@433..441
      SELECT_KW@433..439 "select"
      WHITESPACE@439..440 " "
      TARGET_LIST@440..441
        TARGET@440..441
          STAR@440..441 "*"
    WHITESPACE@441..442 " "
    FROM_CLAUSE@442..463
      FROM_KW@442..446 "from"
      WHITESPACE@446..447 " "
      JOIN_EXPR@447..463
        FROM_ITEM@447..448
          NAME_REF@447..448
            IDENT@447..448 "t"
        WHITESPACE@448..449 " "
        JOIN@449..463
          JOIN_INNER@449..453
            JOIN_KW@449..453 "join"
          WHITESPACE@453..454 " "
          FROM_ITEM@454..455
            NAME_REF@454..455
              IDENT@454..455 "u"
          WHITESPACE@455..456 " "
          ON_CLAUSE@456..463
            ON_KW@456..458 "on"
            WHITESPACE@458..459 " "
            LITERAL@459..463
              TRUE_KW@459..463 "true"
  SEMICOLON@463..464 ";"
  WHITESPACE@464..466 "\n\n"
  SELECT@466..521
    SELECT_CLAUSE@466..474
      SELECT_KW@466..472 "select"
      WHITESPACE@472..473 " "
      TARGET_LIST@473..474
        TARGET@473..474
          STAR@473..474 "*"
    WHITESPACE@474..475 " "
    FROM_CLAUSE@475..521
      FROM_KW@475..479 "from"
      WHITESPACE@479..480 " "
      JOIN_EXPR@480..521
        JOIN_EXPR@480..501
          FROM_ITEM@480..481
            NAME_REF@480..481
              IDENT@480..481 "t"
          WHITESPACE@481..484 "\n  "
          JOIN@484..501
            JOIN_INNER@484..488
              JOIN_KW@484..488 "join"
            WHITESPACE@488..489 " "
            FROM_ITEM@489..490
              NAME_REF@489..490
                IDENT@489..490 "u"
            WHITESPACE@490..491 " "
            JOIN_USING_CLAUSE@491..501
              USING_KW@491..496 "using"
              WHITESPACE@496..497 " "
              COLUMN_LIST@497..501
                L_PAREN@497..498 "("
                COLUMN@498..500
                  NAME_REF@498..500
                    IDENT@498..500 "id"
                R_PAREN@500..501 ")"
        WHITESPACE@501..504 "\n  "
        JOIN@504..521
          JOIN_INNER@504..508
            JOIN_KW@504..508 "join"
          WHITESPACE@508..509 " "
          FROM_ITEM@509..510
            NAME_REF@509..510
              IDENT@509..510 "c"
          WHITESPACE@510..511 " "
          JOIN_USING_CLAUSE@511..521
            USING_KW@511..516 "using"
            WHITESPACE@516..517 " "
            COLUMN_LIST@517..521
              L_PAREN@517..518 "("
              COLUMN@518..520
                NAME_REF@518..520
                  IDENT@518..520 "id"
              R_PAREN@520..521 ")"
  SEMICOLON@521..522 ";"
  WHITESPACE@522..523 "\n"

error[syntax-error]: Join missing condition.
  ╭▸ 
2 │ select * from t join u;
  ╰╴                      ━
error[syntax-error]: Join missing condition.
  ╭▸ 
4 │ select * from t left join u;
  ╰╴                           ━
error[syntax-error]: Join missing condition.
  ╭▸ 
6 │ select * from t right join u;
  ╰╴                            ━
error[syntax-error]: Join missing condition.
  ╭▸ 
8 │ select * from t full join u;
  ╰╴                           ━
error[syntax-error]: Join `using` clause is not allowed for natural joins.
   ╭▸ 
12 │ select * from t natural join u using (id);
   ╰╴                               ━━━━━━━━━━
error[syntax-error]: Join `using` clause is not allowed for cross joins.
   ╭▸ 
15 │ select * from t cross join u using (id);
   ╰╴                             ━━━━━━━━━━