squawk-syntax 2.29.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
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
---
source: crates/squawk_syntax/src/test.rs
input_file: crates/squawk_syntax/test_data/validation/join_clauses.sql
---
SOURCE_FILE@0..653
  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..215 "\n"
  SELECT@215..260
    SELECT_CLAUSE@215..223
      SELECT_KW@215..221 "select"
      WHITESPACE@221..222 " "
      TARGET_LIST@222..223
        TARGET@222..223
          STAR@222..223 "*"
    WHITESPACE@223..224 " "
    FROM_CLAUSE@224..260
      FROM_KW@224..228 "from"
      WHITESPACE@228..229 " "
      JOIN_EXPR@229..260
        FROM_ITEM@229..230
          NAME_REF@229..230
            IDENT@229..230 "t"
        WHITESPACE@230..231 " "
        JOIN@231..260
          NATURAL_KW@231..238 "natural"
          WHITESPACE@238..239 " "
          JOIN_INNER@239..243
            JOIN_KW@239..243 "join"
          WHITESPACE@243..244 " "
          FROM_ITEM@244..245
            NAME_REF@244..245
              IDENT@244..245 "u"
          WHITESPACE@245..246 " "
          ON_CLAUSE@246..260
            ON_KW@246..248 "on"
            WHITESPACE@248..249 " "
            BIN_EXPR@249..260
              FIELD_EXPR@249..253
                NAME_REF@249..250
                  IDENT@249..250 "u"
                DOT@250..251 "."
                NAME_REF@251..253
                  IDENT@251..253 "id"
              WHITESPACE@253..254 " "
              EQ@254..255 "="
              WHITESPACE@255..256 " "
              FIELD_EXPR@256..260
                NAME_REF@256..257
                  IDENT@256..257 "t"
                DOT@257..258 "."
                NAME_REF@258..260
                  IDENT@258..260 "id"
  SEMICOLON@260..261 ";"
  WHITESPACE@261..263 "\n\n"
  COMMENT@263..308 "-- err, can't use con ..."
  WHITESPACE@308..309 "\n"
  SELECT@309..348
    SELECT_CLAUSE@309..317
      SELECT_KW@309..315 "select"
      WHITESPACE@315..316 " "
      TARGET_LIST@316..317
        TARGET@316..317
          STAR@316..317 "*"
    WHITESPACE@317..318 " "
    FROM_CLAUSE@318..348
      FROM_KW@318..322 "from"
      WHITESPACE@322..323 " "
      JOIN_EXPR@323..348
        FROM_ITEM@323..324
          NAME_REF@323..324
            IDENT@323..324 "t"
        WHITESPACE@324..325 " "
        JOIN@325..348
          JOIN_CROSS@325..335
            CROSS_KW@325..330 "cross"
            WHITESPACE@330..331 " "
            JOIN_KW@331..335 "join"
          WHITESPACE@335..336 " "
          FROM_ITEM@336..337
            NAME_REF@336..337
              IDENT@336..337 "u"
          WHITESPACE@337..338 " "
          JOIN_USING_CLAUSE@338..348
            USING_KW@338..343 "using"
            WHITESPACE@343..344 " "
            COLUMN_LIST@344..348
              L_PAREN@344..345 "("
              COLUMN@345..347
                NAME_REF@345..347
                  IDENT@345..347 "id"
              R_PAREN@347..348 ")"
  SEMICOLON@348..349 ";"
  WHITESPACE@349..350 "\n"
  SELECT@350..393
    SELECT_CLAUSE@350..358
      SELECT_KW@350..356 "select"
      WHITESPACE@356..357 " "
      TARGET_LIST@357..358
        TARGET@357..358
          STAR@357..358 "*"
    WHITESPACE@358..359 " "
    FROM_CLAUSE@359..393
      FROM_KW@359..363 "from"
      WHITESPACE@363..364 " "
      JOIN_EXPR@364..393
        FROM_ITEM@364..365
          NAME_REF@364..365
            IDENT@364..365 "t"
        WHITESPACE@365..366 " "
        JOIN@366..393
          JOIN_CROSS@366..376
            CROSS_KW@366..371 "cross"
            WHITESPACE@371..372 " "
            JOIN_KW@372..376 "join"
          WHITESPACE@376..377 " "
          FROM_ITEM@377..378
            NAME_REF@377..378
              IDENT@377..378 "u"
          WHITESPACE@378..379 " "
          ON_CLAUSE@379..393
            ON_KW@379..381 "on"
            WHITESPACE@381..382 " "
            BIN_EXPR@382..393
              FIELD_EXPR@382..386
                NAME_REF@382..383
                  IDENT@382..383 "u"
                DOT@383..384 "."
                NAME_REF@384..386
                  IDENT@384..386 "id"
              WHITESPACE@386..387 " "
              EQ@387..388 "="
              WHITESPACE@388..389 " "
              FIELD_EXPR@389..393
                NAME_REF@389..390
                  IDENT@389..390 "t"
                DOT@390..391 "."
                NAME_REF@391..393
                  IDENT@391..393 "id"
  SEMICOLON@393..394 ";"
  WHITESPACE@394..395 "\n"
  SELECT@395..431
    SELECT_CLAUSE@395..403
      SELECT_KW@395..401 "select"
      WHITESPACE@401..402 " "
      TARGET_LIST@402..403
        TARGET@402..403
          STAR@402..403 "*"
    WHITESPACE@403..404 " "
    FROM_CLAUSE@404..431
      FROM_KW@404..408 "from"
      WHITESPACE@408..409 " "
      JOIN_EXPR@409..431
        FROM_ITEM@409..410
          NAME_REF@409..410
            IDENT@409..410 "t"
        WHITESPACE@410..411 " "
        JOIN@411..431
          JOIN_CROSS@411..421
            CROSS_KW@411..416 "cross"
            WHITESPACE@416..417 " "
            JOIN_KW@417..421 "join"
          WHITESPACE@421..422 " "
          FROM_ITEM@422..423
            NAME_REF@422..423
              IDENT@422..423 "u"
          WHITESPACE@423..424 " "
          ON_CLAUSE@424..431
            ON_KW@424..426 "on"
            WHITESPACE@426..427 " "
            LITERAL@427..431
              TRUE_KW@427..431 "true"
  SEMICOLON@431..432 ";"
  WHITESPACE@432..434 "\n\n"
  COMMENT@434..439 "-- ok"
  WHITESPACE@439..440 "\n"
  SELECT@440..470
    SELECT_CLAUSE@440..448
      SELECT_KW@440..446 "select"
      WHITESPACE@446..447 " "
      TARGET_LIST@447..448
        TARGET@447..448
          STAR@447..448 "*"
    WHITESPACE@448..449 " "
    FROM_CLAUSE@449..470
      FROM_KW@449..453 "from"
      WHITESPACE@453..454 " "
      JOIN_EXPR@454..470
        FROM_ITEM@454..455
          NAME_REF@454..455
            IDENT@454..455 "t"
        WHITESPACE@455..456 " "
        JOIN@456..470
          NATURAL_KW@456..463 "natural"
          WHITESPACE@463..464 " "
          JOIN_INNER@464..468
            JOIN_KW@464..468 "join"
          WHITESPACE@468..469 " "
          FROM_ITEM@469..470
            NAME_REF@469..470
              IDENT@469..470 "u"
  SEMICOLON@470..471 ";"
  WHITESPACE@471..473 "\n\n"
  SELECT@473..521
    SELECT_CLAUSE@473..481
      SELECT_KW@473..479 "select"
      WHITESPACE@479..480 " "
      TARGET_LIST@480..481
        TARGET@480..481
          STAR@480..481 "*"
    WHITESPACE@481..482 " "
    FROM_CLAUSE@482..521
      FROM_KW@482..486 "from"
      WHITESPACE@486..487 " "
      JOIN_EXPR@487..501
        FROM_ITEM@487..488
          NAME_REF@487..488
            IDENT@487..488 "t"
        WHITESPACE@488..489 " "
        JOIN@489..501
          JOIN_CROSS@489..499
            CROSS_KW@489..494 "cross"
            WHITESPACE@494..495 " "
            JOIN_KW@495..499 "join"
          WHITESPACE@499..500 " "
          FROM_ITEM@500..501
            NAME_REF@500..501
              IDENT@500..501 "u"
      COMMA@501..502 ","
      WHITESPACE@502..503 " "
      JOIN_EXPR@503..521
        FROM_ITEM@503..504
          NAME_REF@503..504
            IDENT@503..504 "b"
        WHITESPACE@504..505 " "
        JOIN@505..521
          JOIN_INNER@505..509
            JOIN_KW@505..509 "join"
          WHITESPACE@509..510 " "
          FROM_ITEM@510..511
            NAME_REF@510..511
              IDENT@510..511 "c"
          WHITESPACE@511..512 " "
          JOIN_USING_CLAUSE@512..521
            USING_KW@512..517 "using"
            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..524 "\n\n"
  SELECT@524..561
    SELECT_CLAUSE@524..532
      SELECT_KW@524..530 "select"
      WHITESPACE@530..531 " "
      TARGET_LIST@531..532
        TARGET@531..532
          STAR@531..532 "*"
    WHITESPACE@532..533 " "
    FROM_CLAUSE@533..561
      FROM_KW@533..537 "from"
      WHITESPACE@537..538 " "
      JOIN_EXPR@538..561
        FROM_ITEM@538..539
          NAME_REF@538..539
            IDENT@538..539 "t"
        WHITESPACE@539..540 " "
        JOIN@540..561
          JOIN_INNER@540..544
            JOIN_KW@540..544 "join"
          WHITESPACE@544..545 " "
          FROM_ITEM@545..546
            NAME_REF@545..546
              IDENT@545..546 "u"
          WHITESPACE@546..547 " "
          ON_CLAUSE@547..561
            ON_KW@547..549 "on"
            WHITESPACE@549..550 " "
            BIN_EXPR@550..561
              FIELD_EXPR@550..554
                NAME_REF@550..551
                  IDENT@550..551 "u"
                DOT@551..552 "."
                NAME_REF@552..554
                  IDENT@552..554 "id"
              WHITESPACE@554..555 " "
              EQ@555..556 "="
              WHITESPACE@556..557 " "
              FIELD_EXPR@557..561
                NAME_REF@557..558
                  IDENT@557..558 "t"
                DOT@558..559 "."
                NAME_REF@559..561
                  IDENT@559..561 "id"
  SEMICOLON@561..562 ";"
  WHITESPACE@562..563 "\n"
  SELECT@563..593
    SELECT_CLAUSE@563..571
      SELECT_KW@563..569 "select"
      WHITESPACE@569..570 " "
      TARGET_LIST@570..571
        TARGET@570..571
          STAR@570..571 "*"
    WHITESPACE@571..572 " "
    FROM_CLAUSE@572..593
      FROM_KW@572..576 "from"
      WHITESPACE@576..577 " "
      JOIN_EXPR@577..593
        FROM_ITEM@577..578
          NAME_REF@577..578
            IDENT@577..578 "t"
        WHITESPACE@578..579 " "
        JOIN@579..593
          JOIN_INNER@579..583
            JOIN_KW@579..583 "join"
          WHITESPACE@583..584 " "
          FROM_ITEM@584..585
            NAME_REF@584..585
              IDENT@584..585 "u"
          WHITESPACE@585..586 " "
          ON_CLAUSE@586..593
            ON_KW@586..588 "on"
            WHITESPACE@588..589 " "
            LITERAL@589..593
              TRUE_KW@589..593 "true"
  SEMICOLON@593..594 ";"
  WHITESPACE@594..596 "\n\n"
  SELECT@596..651
    SELECT_CLAUSE@596..604
      SELECT_KW@596..602 "select"
      WHITESPACE@602..603 " "
      TARGET_LIST@603..604
        TARGET@603..604
          STAR@603..604 "*"
    WHITESPACE@604..605 " "
    FROM_CLAUSE@605..651
      FROM_KW@605..609 "from"
      WHITESPACE@609..610 " "
      JOIN_EXPR@610..651
        JOIN_EXPR@610..631
          FROM_ITEM@610..611
            NAME_REF@610..611
              IDENT@610..611 "t"
          WHITESPACE@611..614 "\n  "
          JOIN@614..631
            JOIN_INNER@614..618
              JOIN_KW@614..618 "join"
            WHITESPACE@618..619 " "
            FROM_ITEM@619..620
              NAME_REF@619..620
                IDENT@619..620 "u"
            WHITESPACE@620..621 " "
            JOIN_USING_CLAUSE@621..631
              USING_KW@621..626 "using"
              WHITESPACE@626..627 " "
              COLUMN_LIST@627..631
                L_PAREN@627..628 "("
                COLUMN@628..630
                  NAME_REF@628..630
                    IDENT@628..630 "id"
                R_PAREN@630..631 ")"
        WHITESPACE@631..634 "\n  "
        JOIN@634..651
          JOIN_INNER@634..638
            JOIN_KW@634..638 "join"
          WHITESPACE@638..639 " "
          FROM_ITEM@639..640
            NAME_REF@639..640
              IDENT@639..640 "c"
          WHITESPACE@640..641 " "
          JOIN_USING_CLAUSE@641..651
            USING_KW@641..646 "using"
            WHITESPACE@646..647 " "
            COLUMN_LIST@647..651
              L_PAREN@647..648 "("
              COLUMN@648..650
                NAME_REF@648..650
                  IDENT@648..650 "id"
              R_PAREN@650..651 ")"
  SEMICOLON@651..652 ";"
  WHITESPACE@652..653 "\n"

ERROR@30 "Join missing condition."
ERROR@60 "Join missing condition."
ERROR@91 "Join missing condition."
ERROR@121 "Join missing condition."
ERROR@203:213 "Join `using` clause is not allowed for natural joins."
ERROR@246:260 "Join condition is not allowed for natural joins."
ERROR@338:348 "Join `using` clause is not allowed for cross joins."
ERROR@379:393 "Join condition is not allowed for cross joins."
ERROR@424:431 "Join condition is not allowed for cross joins."