squawk-syntax 2.62.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
---
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..31
    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
        RELATION_FROM_ITEM@22..23
          RELATION_NAME_REF@22..23
            PATH_REF@22..23
              PATH_SEGMENT_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 " "
          RELATION_FROM_ITEM@29..30
            RELATION_NAME_REF@29..30
              PATH_REF@29..30
                PATH_SEGMENT_REF@29..30
                  IDENT@29..30 "u"
    SEMICOLON@30..31 ";"
  WHITESPACE@31..33 "\n\n"
  SELECT@33..61
    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
        RELATION_FROM_ITEM@47..48
          RELATION_NAME_REF@47..48
            PATH_REF@47..48
              PATH_SEGMENT_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 " "
          RELATION_FROM_ITEM@59..60
            RELATION_NAME_REF@59..60
              PATH_REF@59..60
                PATH_SEGMENT_REF@59..60
                  IDENT@59..60 "u"
    SEMICOLON@60..61 ";"
  WHITESPACE@61..63 "\n\n"
  SELECT@63..92
    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
        RELATION_FROM_ITEM@77..78
          RELATION_NAME_REF@77..78
            PATH_REF@77..78
              PATH_SEGMENT_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 " "
          RELATION_FROM_ITEM@90..91
            RELATION_NAME_REF@90..91
              PATH_REF@90..91
                PATH_SEGMENT_REF@90..91
                  IDENT@90..91 "u"
    SEMICOLON@91..92 ";"
  WHITESPACE@92..94 "\n\n"
  SELECT@94..122
    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
        RELATION_FROM_ITEM@108..109
          RELATION_NAME_REF@108..109
            PATH_REF@108..109
              PATH_SEGMENT_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 " "
          RELATION_FROM_ITEM@120..121
            RELATION_NAME_REF@120..121
              PATH_REF@120..121
                PATH_SEGMENT_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..214
    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
        RELATION_FROM_ITEM@186..187
          RELATION_NAME_REF@186..187
            PATH_REF@186..187
              PATH_SEGMENT_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 " "
          RELATION_FROM_ITEM@201..202
            RELATION_NAME_REF@201..202
              PATH_REF@201..202
                PATH_SEGMENT_REF@201..202
                  IDENT@201..202 "u"
          WHITESPACE@202..203 " "
          JOIN_USING_CLAUSE@203..213
            USING_KW@203..208 "using"
            WHITESPACE@208..209 " "
            COLUMN_REF_LIST@209..213
              L_PAREN@209..210 "("
              COLUMN_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..302
    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
        RELATION_FROM_ITEM@276..277
          RELATION_NAME_REF@276..277
            PATH_REF@276..277
              PATH_SEGMENT_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 " "
          RELATION_FROM_ITEM@289..290
            RELATION_NAME_REF@289..290
              PATH_REF@289..290
                PATH_SEGMENT_REF@289..290
                  IDENT@289..290 "u"
          WHITESPACE@290..291 " "
          JOIN_USING_CLAUSE@291..301
            USING_KW@291..296 "using"
            WHITESPACE@296..297 " "
            COLUMN_REF_LIST@297..301
              L_PAREN@297..298 "("
              COLUMN_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..341
    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
        RELATION_FROM_ITEM@324..325
          RELATION_NAME_REF@324..325
            PATH_REF@324..325
              PATH_SEGMENT_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 " "
          RELATION_FROM_ITEM@339..340
            RELATION_NAME_REF@339..340
              PATH_REF@339..340
                PATH_SEGMENT_REF@339..340
                  IDENT@339..340 "u"
    SEMICOLON@340..341 ";"
  WHITESPACE@341..343 "\n\n"
  SELECT@343..392
    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
        RELATION_FROM_ITEM@357..358
          RELATION_NAME_REF@357..358
            PATH_REF@357..358
              PATH_SEGMENT_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 " "
          RELATION_FROM_ITEM@370..371
            RELATION_NAME_REF@370..371
              PATH_REF@370..371
                PATH_SEGMENT_REF@370..371
                  IDENT@370..371 "u"
      COMMA@371..372 ","
      WHITESPACE@372..373 " "
      JOIN_EXPR@373..391
        RELATION_FROM_ITEM@373..374
          RELATION_NAME_REF@373..374
            PATH_REF@373..374
              PATH_SEGMENT_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 " "
          RELATION_FROM_ITEM@380..381
            RELATION_NAME_REF@380..381
              PATH_REF@380..381
                PATH_SEGMENT_REF@380..381
                  IDENT@380..381 "c"
          WHITESPACE@381..382 " "
          JOIN_USING_CLAUSE@382..391
            USING_KW@382..387 "using"
            COLUMN_REF_LIST@387..391
              L_PAREN@387..388 "("
              COLUMN_NAME_REF@388..390
                IDENT@388..390 "id"
              R_PAREN@390..391 ")"
    SEMICOLON@391..392 ";"
  WHITESPACE@392..394 "\n\n"
  SELECT@394..432
    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
        RELATION_FROM_ITEM@408..409
          RELATION_NAME_REF@408..409
            PATH_REF@408..409
              PATH_SEGMENT_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 " "
          RELATION_FROM_ITEM@415..416
            RELATION_NAME_REF@415..416
              PATH_REF@415..416
                PATH_SEGMENT_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..464
    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
        RELATION_FROM_ITEM@447..448
          RELATION_NAME_REF@447..448
            PATH_REF@447..448
              PATH_SEGMENT_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 " "
          RELATION_FROM_ITEM@454..455
            RELATION_NAME_REF@454..455
              PATH_REF@454..455
                PATH_SEGMENT_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..522
    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
          RELATION_FROM_ITEM@480..481
            RELATION_NAME_REF@480..481
              PATH_REF@480..481
                PATH_SEGMENT_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 " "
            RELATION_FROM_ITEM@489..490
              RELATION_NAME_REF@489..490
                PATH_REF@489..490
                  PATH_SEGMENT_REF@489..490
                    IDENT@489..490 "u"
            WHITESPACE@490..491 " "
            JOIN_USING_CLAUSE@491..501
              USING_KW@491..496 "using"
              WHITESPACE@496..497 " "
              COLUMN_REF_LIST@497..501
                L_PAREN@497..498 "("
                COLUMN_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 " "
          RELATION_FROM_ITEM@509..510
            RELATION_NAME_REF@509..510
              PATH_REF@509..510
                PATH_SEGMENT_REF@509..510
                  IDENT@509..510 "c"
          WHITESPACE@510..511 " "
          JOIN_USING_CLAUSE@511..521
            USING_KW@511..516 "using"
            WHITESPACE@516..517 " "
            COLUMN_REF_LIST@517..521
              L_PAREN@517..518 "("
              COLUMN_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);
   ╰╴                             ━━━━━━━━━━