tree-sitter-postgres 1.2.1

Postgres grammar for tree-sitter
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
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
// grammar.js — PostgreSQL tree-sitter grammar
// Generated by script/generate-grammar.js from PostgreSQL source.
// DO NOT EDIT MANUALLY — regenerate with: npm run generate:grammar
//
// Source: src/backend/parser/gram.y + src/include/parser/kwlist.h
// This file is committed to git so the grammar can be used without
// running the generator.

'use strict';

module.exports = grammar({
  name: 'postgres',

  // Whitespace and comments are extras — they can appear anywhere.
  extras: $ => [
    /\s+/,
    $.comment,
  ],

  // 'word' lets tree-sitter know which rule represents bare identifiers.
  // Keywords (prec 1) outrank identifiers (prec 0) on the same text.
  word: $ => $.identifier,

  // External tokens — implemented in postgres/src/scanner.c.
  // dollar_quoted_string must match opening and closing tags exactly,
  // which a tree-sitter regex token cannot enforce.
  externals: $ => [
    $.dollar_quoted_string,
  ],

  // Conflicts: PostgreSQL's grammar has many shift/reduce conflicts that
  // Bison resolves via precedence rules. Tree-sitter (GLR) will handle
  // these as ambiguities. Conflict pairs are stored in script/known-conflicts.json
  // and regenerated into this file automatically via script/harvest-conflicts.sh.
  conflicts: $ => [
    [$.utility_option_name, $.unreserved_keyword],
    [$.ConstDatetime, $.col_name_keyword],
    [$.simple_select, $.simple_select],
    [$.a_expr, $.a_expr],
    [$.target_el, $.target_el],
    [$.ConstDatetime, $.ConstDatetime],
    [$.table_ref, $.table_ref],
    [$.OptTempTableName, $.unreserved_keyword],
    [$.func_table, $.func_table],
  ],

  rules: {
    // Top-level entry: a file is zero or more semicolon-terminated statements.
    source_file: $ => seq(
      repeat(seq(optional($.toplevel_stmt), ';')),
      optional($.toplevel_stmt)
    ),

    toplevel_stmt: $ => choice(
        $.stmt,
        $.TransactionStmtLegacy
      ),
    stmt: $ => choice(
        $.AlterEventTrigStmt,
        $.AlterCollationStmt,
        $.AlterDatabaseStmt,
        $.AlterDatabaseSetStmt,
        $.AlterDefaultPrivilegesStmt,
        $.AlterDomainStmt,
        $.AlterEnumStmt,
        $.AlterExtensionStmt,
        $.AlterExtensionContentsStmt,
        $.AlterFdwStmt,
        $.AlterForeignServerStmt,
        $.AlterFunctionStmt,
        $.AlterGroupStmt,
        $.AlterObjectDependsStmt,
        $.AlterObjectSchemaStmt,
        $.AlterOwnerStmt,
        $.AlterOperatorStmt,
        $.AlterTypeStmt,
        $.AlterPolicyStmt,
        $.AlterSeqStmt,
        $.AlterSystemStmt,
        $.AlterTableStmt,
        $.AlterTblSpcStmt,
        $.AlterCompositeTypeStmt,
        $.AlterPublicationStmt,
        $.AlterRoleSetStmt,
        $.AlterRoleStmt,
        $.AlterSubscriptionStmt,
        $.AlterStatsStmt,
        $.AlterTSConfigurationStmt,
        $.AlterTSDictionaryStmt,
        $.AlterUserMappingStmt,
        $.AnalyzeStmt,
        $.CallStmt,
        $.CheckPointStmt,
        $.ClosePortalStmt,
        $.ClusterStmt,
        $.CommentStmt,
        $.ConstraintsSetStmt,
        $.CopyStmt,
        $.CreateAmStmt,
        $.CreateAsStmt,
        $.CreateAssertionStmt,
        $.CreateCastStmt,
        $.CreateConversionStmt,
        $.CreateDomainStmt,
        $.CreateExtensionStmt,
        $.CreateFdwStmt,
        $.CreateForeignServerStmt,
        $.CreateForeignTableStmt,
        $.CreateFunctionStmt,
        $.CreateGroupStmt,
        $.CreateMatViewStmt,
        $.CreateOpClassStmt,
        $.CreateOpFamilyStmt,
        $.CreatePublicationStmt,
        $.AlterOpFamilyStmt,
        $.CreatePolicyStmt,
        $.CreatePLangStmt,
        $.CreateSchemaStmt,
        $.CreateSeqStmt,
        $.CreateStmt,
        $.CreateSubscriptionStmt,
        $.CreateStatsStmt,
        $.CreateTableSpaceStmt,
        $.CreateTransformStmt,
        $.CreateTrigStmt,
        $.CreateEventTrigStmt,
        $.CreateRoleStmt,
        $.CreateUserStmt,
        $.CreateUserMappingStmt,
        $.CreatedbStmt,
        $.DeallocateStmt,
        $.DeclareCursorStmt,
        $.DefineStmt,
        $.DeleteStmt,
        $.DiscardStmt,
        $.DoStmt,
        $.DropCastStmt,
        $.DropOpClassStmt,
        $.DropOpFamilyStmt,
        $.DropOwnedStmt,
        $.DropStmt,
        $.DropSubscriptionStmt,
        $.DropTableSpaceStmt,
        $.DropTransformStmt,
        $.DropRoleStmt,
        $.DropUserMappingStmt,
        $.DropdbStmt,
        $.ExecuteStmt,
        $.ExplainStmt,
        $.FetchStmt,
        $.GrantStmt,
        $.GrantRoleStmt,
        $.ImportForeignSchemaStmt,
        $.IndexStmt,
        $.InsertStmt,
        $.ListenStmt,
        $.RefreshMatViewStmt,
        $.LoadStmt,
        $.LockStmt,
        $.MergeStmt,
        $.NotifyStmt,
        $.PrepareStmt,
        $.ReassignOwnedStmt,
        $.ReindexStmt,
        $.RemoveAggrStmt,
        $.RemoveFuncStmt,
        $.RemoveOperStmt,
        $.RenameStmt,
        $.RevokeStmt,
        $.RevokeRoleStmt,
        $.RuleStmt,
        $.SecLabelStmt,
        $.SelectStmt,
        $.TransactionStmt,
        $.TruncateStmt,
        $.UnlistenStmt,
        $.UpdateStmt,
        $.VacuumStmt,
        $.VariableResetStmt,
        $.VariableSetStmt,
        $.VariableShowStmt,
        $.ViewStmt
      ),
    opt_single_name: $ => $.ColId,
    opt_qualified_name: $ => $.any_name,
    opt_concurrently: $ => $.kw_concurrently,
    opt_drop_behavior: $ => choice(
        $.kw_cascade,
        $.kw_restrict
      ),
    CallStmt: $ => seq($.kw_call, $.func_application),
    CreateRoleStmt: $ => seq($.kw_create, $.kw_role, $.RoleId, optional($.opt_with), optional($.OptRoleList)),
    opt_with: $ => choice(
        prec.left(11, prec.dynamic(11, $.kw_with)),
        $.kw_with
      ),
    OptRoleList: $ => seq(optional($.OptRoleList), $.CreateOptRoleElem),
    AlterOptRoleList: $ => seq(optional($.AlterOptRoleList), $.AlterOptRoleElem),
    AlterOptRoleElem: $ => choice(
        seq($.kw_password, $.Sconst),
        seq($.kw_password, $.kw_null),
        seq($.kw_encrypted, $.kw_password, $.Sconst),
        seq($.kw_unencrypted, $.kw_password, $.Sconst),
        $.kw_inherit,
        seq($.kw_connection, $.kw_limit, $.SignedIconst),
        seq($.kw_valid, $.kw_until, $.Sconst),
        seq($.kw_user, $.role_list),
        prec.left(11, prec.dynamic(11, $._ident))
      ),
    CreateOptRoleElem: $ => choice(
        $.AlterOptRoleElem,
        seq($.kw_sysid, $.Iconst),
        seq($.kw_admin, $.role_list),
        seq($.kw_role, $.role_list),
        prec.left(8, prec.dynamic(8, seq($.kw_in, $.kw_role, $.role_list))),
        prec.left(8, prec.dynamic(8, seq($.kw_in, $.kw_group, $.role_list)))
      ),
    CreateUserStmt: $ => seq($.kw_create, $.kw_user, $.RoleId, optional($.opt_with), optional($.OptRoleList)),
    AlterRoleStmt: $ => choice(
        seq($.kw_alter, $.kw_role, $.RoleSpec, optional($.opt_with), optional($.AlterOptRoleList)),
        seq($.kw_alter, $.kw_user, $.RoleSpec, optional($.opt_with), optional($.AlterOptRoleList))
      ),
    opt_in_database: $ => prec.left(8, prec.dynamic(8, seq($.kw_in, $.kw_database, $.name))),
    AlterRoleSetStmt: $ => choice(
        seq($.kw_alter, $.kw_role, $.RoleSpec, optional($.opt_in_database), $.SetResetClause),
        seq($.kw_alter, $.kw_role, $.kw_all, optional($.opt_in_database), $.SetResetClause),
        seq($.kw_alter, $.kw_user, $.RoleSpec, optional($.opt_in_database), $.SetResetClause),
        seq($.kw_alter, $.kw_user, $.kw_all, optional($.opt_in_database), $.SetResetClause)
      ),
    DropRoleStmt: $ => choice(
        seq($.kw_drop, $.kw_role, $.role_list),
        seq($.kw_drop, $.kw_role, $.kw_if, $.kw_exists, $.role_list),
        seq($.kw_drop, $.kw_user, $.role_list),
        seq($.kw_drop, $.kw_user, $.kw_if, $.kw_exists, $.role_list),
        seq($.kw_drop, $.kw_group, $.role_list),
        seq($.kw_drop, $.kw_group, $.kw_if, $.kw_exists, $.role_list)
      ),
    CreateGroupStmt: $ => seq($.kw_create, $.kw_group, $.RoleId, optional($.opt_with), optional($.OptRoleList)),
    AlterGroupStmt: $ => seq($.kw_alter, $.kw_group, $.RoleSpec, $.add_drop, $.kw_user, $.role_list),
    add_drop: $ => choice(
        $.kw_add,
        $.kw_drop
      ),
    CreateSchemaStmt: $ => choice(
        seq($.kw_create, $.kw_schema, optional($.opt_single_name), $.kw_authorization, $.RoleSpec, optional($.OptSchemaEltList)),
        seq($.kw_create, $.kw_schema, $.ColId, optional($.OptSchemaEltList)),
        prec.right(5, prec.dynamic(5, seq($.kw_create, $.kw_schema, $.kw_if, $.kw_not, $.kw_exists, optional($.opt_single_name), $.kw_authorization, $.RoleSpec, optional($.OptSchemaEltList)))),
        prec.right(5, prec.dynamic(5, seq($.kw_create, $.kw_schema, $.kw_if, $.kw_not, $.kw_exists, $.ColId, optional($.OptSchemaEltList))))
      ),
    OptSchemaEltList: $ => seq(optional($.OptSchemaEltList), $.schema_stmt),
    schema_stmt: $ => choice(
        $.CreateStmt,
        $.IndexStmt,
        $.CreateSeqStmt,
        $.CreateTrigStmt,
        $.GrantStmt,
        $.ViewStmt
      ),
    VariableSetStmt: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_set, $.set_rest))),
        prec.left(11, prec.dynamic(11, seq($.kw_set, $.kw_local, $.set_rest))),
        prec.left(11, prec.dynamic(11, seq($.kw_set, $.kw_session, $.set_rest)))
      ),
    set_rest: $ => choice(
        seq($.kw_transaction, $.transaction_mode_list),
        seq($.kw_session, $.kw_characteristics, $.kw_as, $.kw_transaction, $.transaction_mode_list),
        $.set_rest_more
      ),
    generic_set: $ => choice(
        seq($.var_name, $.kw_to, $.var_list),
        prec.left(7, prec.dynamic(7, seq($.var_name, '=', $.var_list))),
        seq($.var_name, $.kw_to, $.kw_default),
        prec.left(7, prec.dynamic(7, seq($.var_name, '=', $.kw_default)))
      ),
    set_rest_more: $ => choice(
        $.generic_set,
        seq($.var_name, $.kw_from, $.kw_current),
        seq($.kw_time, $.kw_zone, $.zone_value),
        seq($.kw_catalog, $.Sconst),
        seq($.kw_schema, $.Sconst),
        seq($.kw_names, optional($.opt_encoding)),
        seq($.kw_role, $.NonReservedWord_or_Sconst),
        seq($.kw_session, $.kw_authorization, $.NonReservedWord_or_Sconst),
        seq($.kw_session, $.kw_authorization, $.kw_default),
        seq($.kw_xml, $.kw_option, $.document_or_content),
        seq($.kw_transaction, $.kw_snapshot, $.Sconst)
      ),
    var_name: $ => choice(
        $.ColId,
        prec.left(22, prec.dynamic(22, seq($.var_name, '.', $.ColId)))
      ),
    var_list: $ => choice(
        $.var_value,
        seq($.var_list, ',', $.var_value)
      ),
    var_value: $ => choice(
        $.opt_boolean_or_string,
        $.NumericOnly
      ),
    iso_level: $ => choice(
        seq($.kw_read, $.kw_uncommitted),
        seq($.kw_read, $.kw_committed),
        seq($.kw_repeatable, $.kw_read),
        $.kw_serializable
      ),
    opt_boolean_or_string: $ => choice(
        $.kw_true,
        $.kw_false,
        $.kw_on,
        $.NonReservedWord_or_Sconst
      ),
    zone_value: $ => choice(
        $.Sconst,
        prec.left(11, prec.dynamic(11, $._ident)),
        seq($.ConstInterval, $.Sconst, optional($.opt_interval)),
        prec.left(20, prec.dynamic(20, seq($.ConstInterval, '(', $.Iconst, ')', $.Sconst))),
        $.NumericOnly,
        $.kw_default,
        $.kw_local
      ),
    opt_encoding: $ => choice(
        $.Sconst,
        $.kw_default
      ),
    NonReservedWord_or_Sconst: $ => choice(
        $.NonReservedWord,
        $.Sconst
      ),
    VariableResetStmt: $ => seq($.kw_reset, $.reset_rest),
    reset_rest: $ => choice(
        $.generic_reset,
        seq($.kw_time, $.kw_zone),
        seq($.kw_transaction, $.kw_isolation, $.kw_level),
        seq($.kw_session, $.kw_authorization)
      ),
    generic_reset: $ => choice(
        $.var_name,
        $.kw_all
      ),
    SetResetClause: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_set, $.set_rest))),
        $.VariableResetStmt
      ),
    FunctionSetResetClause: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_set, $.set_rest_more))),
        $.VariableResetStmt
      ),
    VariableShowStmt: $ => choice(
        seq($.kw_show, $.var_name),
        seq($.kw_show, $.kw_time, $.kw_zone),
        seq($.kw_show, $.kw_transaction, $.kw_isolation, $.kw_level),
        seq($.kw_show, $.kw_session, $.kw_authorization),
        seq($.kw_show, $.kw_all)
      ),
    ConstraintsSetStmt: $ => prec.left(11, prec.dynamic(11, seq($.kw_set, $.kw_constraints, $.constraints_set_list, $.constraints_set_mode))),
    constraints_set_list: $ => choice(
        $.kw_all,
        $.qualified_name_list
      ),
    constraints_set_mode: $ => choice(
        $.kw_deferred,
        $.kw_immediate
      ),
    CheckPointStmt: $ => $.kw_checkpoint,
    DiscardStmt: $ => choice(
        seq($.kw_discard, $.kw_all),
        seq($.kw_discard, $.kw_temp),
        seq($.kw_discard, $.kw_temporary),
        seq($.kw_discard, $.kw_plans),
        seq($.kw_discard, $.kw_sequences)
      ),
    AlterTableStmt: $ => choice(
        seq($.kw_alter, $.kw_table, $.relation_expr, $.alter_table_cmds),
        seq($.kw_alter, $.kw_table, $.kw_if, $.kw_exists, $.relation_expr, $.alter_table_cmds),
        seq($.kw_alter, $.kw_table, $.relation_expr, $.partition_cmd),
        seq($.kw_alter, $.kw_table, $.kw_if, $.kw_exists, $.relation_expr, $.partition_cmd),
        prec.left(8, prec.dynamic(8, seq($.kw_alter, $.kw_table, $.kw_all, $.kw_in, $.kw_tablespace, $.name, $.kw_set, $.kw_tablespace, $.name, optional($.opt_nowait)))),
        prec.left(8, prec.dynamic(8, seq($.kw_alter, $.kw_table, $.kw_all, $.kw_in, $.kw_tablespace, $.name, $.kw_owned, $.kw_by, $.role_list, $.kw_set, $.kw_tablespace, $.name, optional($.opt_nowait)))),
        seq($.kw_alter, $.kw_index, $.qualified_name, $.alter_table_cmds),
        seq($.kw_alter, $.kw_index, $.kw_if, $.kw_exists, $.qualified_name, $.alter_table_cmds),
        seq($.kw_alter, $.kw_index, $.qualified_name, $.index_partition_cmd),
        prec.left(8, prec.dynamic(8, seq($.kw_alter, $.kw_index, $.kw_all, $.kw_in, $.kw_tablespace, $.name, $.kw_set, $.kw_tablespace, $.name, optional($.opt_nowait)))),
        prec.left(8, prec.dynamic(8, seq($.kw_alter, $.kw_index, $.kw_all, $.kw_in, $.kw_tablespace, $.name, $.kw_owned, $.kw_by, $.role_list, $.kw_set, $.kw_tablespace, $.name, optional($.opt_nowait)))),
        seq($.kw_alter, $.kw_sequence, $.qualified_name, $.alter_table_cmds),
        seq($.kw_alter, $.kw_sequence, $.kw_if, $.kw_exists, $.qualified_name, $.alter_table_cmds),
        seq($.kw_alter, $.kw_view, $.qualified_name, $.alter_table_cmds),
        seq($.kw_alter, $.kw_view, $.kw_if, $.kw_exists, $.qualified_name, $.alter_table_cmds),
        seq($.kw_alter, $.kw_materialized, $.kw_view, $.qualified_name, $.alter_table_cmds),
        seq($.kw_alter, $.kw_materialized, $.kw_view, $.kw_if, $.kw_exists, $.qualified_name, $.alter_table_cmds),
        prec.left(8, prec.dynamic(8, seq($.kw_alter, $.kw_materialized, $.kw_view, $.kw_all, $.kw_in, $.kw_tablespace, $.name, $.kw_set, $.kw_tablespace, $.name, optional($.opt_nowait)))),
        prec.left(8, prec.dynamic(8, seq($.kw_alter, $.kw_materialized, $.kw_view, $.kw_all, $.kw_in, $.kw_tablespace, $.name, $.kw_owned, $.kw_by, $.role_list, $.kw_set, $.kw_tablespace, $.name, optional($.opt_nowait)))),
        seq($.kw_alter, $.kw_foreign, $.kw_table, $.relation_expr, $.alter_table_cmds),
        seq($.kw_alter, $.kw_foreign, $.kw_table, $.kw_if, $.kw_exists, $.relation_expr, $.alter_table_cmds)
      ),
    alter_table_cmds: $ => choice(
        $.alter_table_cmd,
        seq($.alter_table_cmds, ',', $.alter_table_cmd)
      ),
    partition_cmd: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_attach, $.kw_partition, $.qualified_name, $.PartitionBoundSpec))),
        prec.left(11, prec.dynamic(11, seq($.kw_detach, $.kw_partition, $.qualified_name, optional($.opt_concurrently)))),
        prec.left(11, prec.dynamic(11, seq($.kw_detach, $.kw_partition, $.qualified_name, $.kw_finalize)))
      ),
    index_partition_cmd: $ => prec.left(11, prec.dynamic(11, seq($.kw_attach, $.kw_partition, $.qualified_name))),
    alter_table_cmd: $ => choice(
        seq($.kw_add, $.columnDef),
        prec.right(5, prec.dynamic(5, seq($.kw_add, $.kw_if, $.kw_not, $.kw_exists, $.columnDef))),
        seq($.kw_add, $.kw_column, $.columnDef),
        prec.right(5, prec.dynamic(5, seq($.kw_add, $.kw_column, $.kw_if, $.kw_not, $.kw_exists, $.columnDef))),
        seq($.kw_alter, optional($.opt_column), $.ColId, $.alter_column_default),
        prec.right(5, prec.dynamic(5, seq($.kw_alter, optional($.opt_column), $.ColId, $.kw_drop, $.kw_not, $.kw_null))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, optional($.opt_column), $.ColId, $.kw_set, $.kw_not, $.kw_null))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, optional($.opt_column), $.ColId, $.kw_set, $.kw_expression, $.kw_as, '(', $.a_expr, ')'))),
        seq($.kw_alter, optional($.opt_column), $.ColId, $.kw_drop, $.kw_expression),
        seq($.kw_alter, optional($.opt_column), $.ColId, $.kw_drop, $.kw_expression, $.kw_if, $.kw_exists),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, optional($.opt_column), $.ColId, $.kw_set, $.kw_statistics, $.set_statistics_value))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, optional($.opt_column), $.Iconst, $.kw_set, $.kw_statistics, $.set_statistics_value))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, optional($.opt_column), $.ColId, $.kw_set, $.reloptions))),
        seq($.kw_alter, optional($.opt_column), $.ColId, $.kw_reset, $.reloptions),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, optional($.opt_column), $.ColId, $.kw_set, $.column_storage))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, optional($.opt_column), $.ColId, $.kw_set, $.column_compression))),
        seq($.kw_alter, optional($.opt_column), $.ColId, $.kw_add, $.kw_generated, $.generated_when, $.kw_as, $.kw_identity, optional($.OptParenthesizedSeqOptList)),
        seq($.kw_alter, optional($.opt_column), $.ColId, $.alter_identity_column_option_list),
        seq($.kw_alter, optional($.opt_column), $.ColId, $.kw_drop, $.kw_identity),
        seq($.kw_alter, optional($.opt_column), $.ColId, $.kw_drop, $.kw_identity, $.kw_if, $.kw_exists),
        seq($.kw_drop, optional($.opt_column), $.kw_if, $.kw_exists, $.ColId, optional($.opt_drop_behavior)),
        seq($.kw_drop, optional($.opt_column), $.ColId, optional($.opt_drop_behavior)),
        seq($.kw_alter, optional($.opt_column), $.ColId, optional($.opt_set_data), $.kw_type, $.Typename, optional($.opt_collate_clause), optional($.alter_using)),
        seq($.kw_alter, optional($.opt_column), $.ColId, $.alter_generic_options),
        seq($.kw_add, $.TableConstraint),
        seq($.kw_alter, $.kw_constraint, $.name, optional($.ConstraintAttributeSpec)),
        seq($.kw_alter, $.kw_constraint, $.name, $.kw_inherit),
        seq($.kw_validate, $.kw_constraint, $.name),
        seq($.kw_drop, $.kw_constraint, $.kw_if, $.kw_exists, $.name, optional($.opt_drop_behavior)),
        seq($.kw_drop, $.kw_constraint, $.name, optional($.opt_drop_behavior)),
        prec.left(11, prec.dynamic(11, seq($.kw_set, $.kw_without, $.kw_oids))),
        seq($.kw_cluster, $.kw_on, $.name),
        prec.left(11, prec.dynamic(11, seq($.kw_set, $.kw_without, $.kw_cluster))),
        prec.left(11, prec.dynamic(11, seq($.kw_set, $.kw_logged))),
        prec.left(11, prec.dynamic(11, seq($.kw_set, $.kw_unlogged))),
        seq($.kw_enable, $.kw_trigger, $.name),
        seq($.kw_enable, $.kw_always, $.kw_trigger, $.name),
        seq($.kw_enable, $.kw_replica, $.kw_trigger, $.name),
        seq($.kw_enable, $.kw_trigger, $.kw_all),
        seq($.kw_enable, $.kw_trigger, $.kw_user),
        seq($.kw_disable, $.kw_trigger, $.name),
        seq($.kw_disable, $.kw_trigger, $.kw_all),
        seq($.kw_disable, $.kw_trigger, $.kw_user),
        seq($.kw_enable, $.kw_rule, $.name),
        seq($.kw_enable, $.kw_always, $.kw_rule, $.name),
        seq($.kw_enable, $.kw_replica, $.kw_rule, $.name),
        seq($.kw_disable, $.kw_rule, $.name),
        seq($.kw_inherit, $.qualified_name),
        seq($.kw_no, $.kw_inherit, $.qualified_name),
        seq($.kw_of, $.any_name),
        prec.right(5, prec.dynamic(5, seq($.kw_not, $.kw_of))),
        seq($.kw_owner, $.kw_to, $.RoleSpec),
        prec.left(11, prec.dynamic(11, seq($.kw_set, $.kw_access, $.kw_method, $.set_access_method_name))),
        prec.left(11, prec.dynamic(11, seq($.kw_set, $.kw_tablespace, $.name))),
        prec.left(11, prec.dynamic(11, seq($.kw_set, $.reloptions))),
        seq($.kw_reset, $.reloptions),
        seq($.kw_replica, $.kw_identity, $.replica_identity),
        seq($.kw_enable, $.kw_row, $.kw_level, $.kw_security),
        seq($.kw_disable, $.kw_row, $.kw_level, $.kw_security),
        seq($.kw_force, $.kw_row, $.kw_level, $.kw_security),
        seq($.kw_no, $.kw_force, $.kw_row, $.kw_level, $.kw_security),
        $.alter_generic_options
      ),
    alter_column_default: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_set, $.kw_default, $.a_expr))),
        seq($.kw_drop, $.kw_default)
      ),
    opt_collate_clause: $ => prec.left(17, prec.dynamic(17, seq($.kw_collate, $.any_name))),
    alter_using: $ => seq($.kw_using, $.a_expr),
    replica_identity: $ => choice(
        $.kw_nothing,
        prec.left(23, prec.dynamic(23, $.kw_full)),
        $.kw_default,
        seq($.kw_using, $.kw_index, $.name)
      ),
    reloptions: $ => prec.left(20, prec.dynamic(20, seq('(', $.reloption_list, ')'))),
    opt_reloptions: $ => prec.left(11, prec.dynamic(11, seq($.kw_with, $.reloptions))),
    reloption_list: $ => choice(
        $.reloption_elem,
        seq($.reloption_list, ',', $.reloption_elem)
      ),
    reloption_elem: $ => choice(
        prec.left(7, prec.dynamic(7, seq($.ColLabel, '=', $.def_arg))),
        $.ColLabel,
        prec.left(22, prec.dynamic(22, seq($.ColLabel, '.', $.ColLabel, '=', $.def_arg))),
        prec.left(22, prec.dynamic(22, seq($.ColLabel, '.', $.ColLabel)))
      ),
    alter_identity_column_option_list: $ => choice(
        $.alter_identity_column_option,
        seq($.alter_identity_column_option_list, $.alter_identity_column_option)
      ),
    alter_identity_column_option: $ => choice(
        $.kw_restart,
        seq($.kw_restart, optional($.opt_with), $.NumericOnly),
        prec.left(11, prec.dynamic(11, seq($.kw_set, $.SeqOptElem))),
        prec.left(11, prec.dynamic(11, seq($.kw_set, $.kw_generated, $.generated_when)))
      ),
    set_statistics_value: $ => choice(
        $.SignedIconst,
        $.kw_default
      ),
    set_access_method_name: $ => choice(
        $.ColId,
        $.kw_default
      ),
    PartitionBoundSpec: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_for, $.kw_values, $.kw_with, '(', $.hash_partbound, ')'))),
        prec.left(8, prec.dynamic(8, seq($.kw_for, $.kw_values, $.kw_in, '(', $.expr_list, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_for, $.kw_values, $.kw_from, '(', $.expr_list, ')', $.kw_to, '(', $.expr_list, ')'))),
        $.kw_default
      ),
    hash_partbound_elem: $ => seq($.NonReservedWord, $.Iconst),
    hash_partbound: $ => choice(
        $.hash_partbound_elem,
        seq($.hash_partbound, ',', $.hash_partbound_elem)
      ),
    AlterCompositeTypeStmt: $ => seq($.kw_alter, $.kw_type, $.any_name, $.alter_type_cmds),
    alter_type_cmds: $ => choice(
        $.alter_type_cmd,
        seq($.alter_type_cmds, ',', $.alter_type_cmd)
      ),
    alter_type_cmd: $ => choice(
        seq($.kw_add, $.kw_attribute, $.TableFuncElement, optional($.opt_drop_behavior)),
        seq($.kw_drop, $.kw_attribute, $.kw_if, $.kw_exists, $.ColId, optional($.opt_drop_behavior)),
        seq($.kw_drop, $.kw_attribute, $.ColId, optional($.opt_drop_behavior)),
        seq($.kw_alter, $.kw_attribute, $.ColId, optional($.opt_set_data), $.kw_type, $.Typename, optional($.opt_collate_clause), optional($.opt_drop_behavior))
      ),
    ClosePortalStmt: $ => choice(
        seq($.kw_close, $.cursor_name),
        seq($.kw_close, $.kw_all)
      ),
    CopyStmt: $ => choice(
        seq($.kw_copy, optional($.opt_binary), $.qualified_name, optional($.opt_column_list), $.copy_from, optional($.opt_program), $.copy_file_name, optional($.copy_delimiter), optional($.opt_with), optional($.copy_options), optional($.where_clause)),
        prec.left(20, prec.dynamic(20, seq($.kw_copy, '(', $.PreparableStmt, ')', $.kw_to, optional($.opt_program), $.copy_file_name, optional($.opt_with), optional($.copy_options))))
      ),
    copy_from: $ => choice(
        $.kw_from,
        $.kw_to
      ),
    opt_program: $ => $.kw_program,
    copy_file_name: $ => choice(
        $.Sconst,
        $.kw_stdin,
        $.kw_stdout
      ),
    copy_options: $ => choice(
        $.copy_opt_list,
        prec.left(20, prec.dynamic(20, seq('(', $.copy_generic_opt_list, ')')))
      ),
    copy_opt_list: $ => seq(optional($.copy_opt_list), $.copy_opt_item),
    copy_opt_item: $ => choice(
        $.kw_binary,
        $.kw_freeze,
        seq($.kw_delimiter, optional($.opt_as), $.Sconst),
        seq($.kw_null, optional($.opt_as), $.Sconst),
        $.kw_csv,
        $.kw_header,
        seq($.kw_quote, optional($.opt_as), $.Sconst),
        prec.left(9, prec.dynamic(9, seq($.kw_escape, optional($.opt_as), $.Sconst))),
        seq($.kw_force, $.kw_quote, $.columnList),
        prec.left(14, prec.dynamic(14, seq($.kw_force, $.kw_quote, '*'))),
        prec.right(5, prec.dynamic(5, seq($.kw_force, $.kw_not, $.kw_null, $.columnList))),
        prec.right(5, prec.dynamic(5, seq($.kw_force, $.kw_not, $.kw_null, '*'))),
        seq($.kw_force, $.kw_null, $.columnList),
        prec.left(14, prec.dynamic(14, seq($.kw_force, $.kw_null, '*'))),
        seq($.kw_encoding, $.Sconst)
      ),
    opt_binary: $ => $.kw_binary,
    copy_delimiter: $ => seq(optional($.opt_using), $.kw_delimiters, $.Sconst),
    opt_using: $ => $.kw_using,
    copy_generic_opt_list: $ => choice(
        $.copy_generic_opt_elem,
        seq($.copy_generic_opt_list, ',', $.copy_generic_opt_elem)
      ),
    copy_generic_opt_elem: $ => seq($.ColLabel, optional($.copy_generic_opt_arg)),
    copy_generic_opt_arg: $ => choice(
        $.opt_boolean_or_string,
        $.NumericOnly,
        prec.left(14, prec.dynamic(14, '*')),
        $.kw_default,
        prec.left(20, prec.dynamic(20, seq('(', $.copy_generic_opt_arg_list, ')')))
      ),
    copy_generic_opt_arg_list: $ => choice(
        $.copy_generic_opt_arg_list_item,
        seq($.copy_generic_opt_arg_list, ',', $.copy_generic_opt_arg_list_item)
      ),
    copy_generic_opt_arg_list_item: $ => $.opt_boolean_or_string,
    CreateStmt: $ => choice(
        prec.left(20, prec.dynamic(20, seq($.kw_create, optional($.OptTemp), $.kw_table, $.qualified_name, '(', optional($.OptTableElementList), ')', optional($.OptInherit), optional($.OptPartitionSpec), optional($.table_access_method_clause), optional($.OptWith), optional($.OnCommitOption), optional($.OptTableSpace)))),
        prec.right(5, prec.dynamic(5, seq($.kw_create, optional($.OptTemp), $.kw_table, $.kw_if, $.kw_not, $.kw_exists, $.qualified_name, '(', optional($.OptTableElementList), ')', optional($.OptInherit), optional($.OptPartitionSpec), optional($.table_access_method_clause), optional($.OptWith), optional($.OnCommitOption), optional($.OptTableSpace)))),
        seq($.kw_create, optional($.OptTemp), $.kw_table, $.qualified_name, $.kw_of, $.any_name, optional($.OptTypedTableElementList), optional($.OptPartitionSpec), optional($.table_access_method_clause), optional($.OptWith), optional($.OnCommitOption), optional($.OptTableSpace)),
        prec.right(5, prec.dynamic(5, seq($.kw_create, optional($.OptTemp), $.kw_table, $.kw_if, $.kw_not, $.kw_exists, $.qualified_name, $.kw_of, $.any_name, optional($.OptTypedTableElementList), optional($.OptPartitionSpec), optional($.table_access_method_clause), optional($.OptWith), optional($.OnCommitOption), optional($.OptTableSpace)))),
        prec.left(11, prec.dynamic(11, seq($.kw_create, optional($.OptTemp), $.kw_table, $.qualified_name, $.kw_partition, $.kw_of, $.qualified_name, optional($.OptTypedTableElementList), $.PartitionBoundSpec, optional($.OptPartitionSpec), optional($.table_access_method_clause), optional($.OptWith), optional($.OnCommitOption), optional($.OptTableSpace)))),
        prec.right(5, prec.dynamic(5, seq($.kw_create, optional($.OptTemp), $.kw_table, $.kw_if, $.kw_not, $.kw_exists, $.qualified_name, $.kw_partition, $.kw_of, $.qualified_name, optional($.OptTypedTableElementList), $.PartitionBoundSpec, optional($.OptPartitionSpec), optional($.table_access_method_clause), optional($.OptWith), optional($.OnCommitOption), optional($.OptTableSpace))))
      ),
    OptTemp: $ => choice(
        $.kw_temporary,
        $.kw_temp,
        seq($.kw_local, $.kw_temporary),
        seq($.kw_local, $.kw_temp),
        seq($.kw_global, $.kw_temporary),
        seq($.kw_global, $.kw_temp),
        $.kw_unlogged
      ),
    OptTableElementList: $ => $.TableElementList,
    OptTypedTableElementList: $ => prec.left(20, prec.dynamic(20, seq('(', $.TypedTableElementList, ')'))),
    TableElementList: $ => choice(
        $.TableElement,
        seq($.TableElementList, ',', $.TableElement)
      ),
    TypedTableElementList: $ => choice(
        $.TypedTableElement,
        seq($.TypedTableElementList, ',', $.TypedTableElement)
      ),
    TableElement: $ => choice(
        $.columnDef,
        $.TableLikeClause,
        $.TableConstraint
      ),
    TypedTableElement: $ => choice(
        $.columnOptions,
        $.TableConstraint
      ),
    columnDef: $ => seq($.ColId, $.Typename, optional($.opt_column_storage), optional($.opt_column_compression), optional($.create_generic_options), optional($.ColQualList)),
    columnOptions: $ => choice(
        seq($.ColId, optional($.ColQualList)),
        prec.left(11, prec.dynamic(11, seq($.ColId, $.kw_with, $.kw_options, optional($.ColQualList))))
      ),
    column_compression: $ => choice(
        seq($.kw_compression, $.ColId),
        seq($.kw_compression, $.kw_default)
      ),
    opt_column_compression: $ => $.column_compression,
    column_storage: $ => choice(
        seq($.kw_storage, $.ColId),
        seq($.kw_storage, $.kw_default)
      ),
    opt_column_storage: $ => $.column_storage,
    ColQualList: $ => seq(optional($.ColQualList), $.ColConstraint),
    ColConstraint: $ => choice(
        seq($.kw_constraint, $.name, $.ColConstraintElem),
        $.ColConstraintElem,
        $.ConstraintAttr,
        prec.left(17, prec.dynamic(17, seq($.kw_collate, $.any_name)))
      ),
    ColConstraintElem: $ => choice(
        prec.right(5, prec.dynamic(5, seq($.kw_not, $.kw_null, optional($.opt_no_inherit)))),
        $.kw_null,
        seq($.kw_unique, optional($.opt_unique_null_treatment), optional($.opt_definition), optional($.OptConsTableSpace)),
        seq($.kw_primary, $.kw_key, optional($.opt_definition), optional($.OptConsTableSpace)),
        prec.left(20, prec.dynamic(20, seq($.kw_check, '(', $.a_expr, ')', optional($.opt_no_inherit)))),
        seq($.kw_default, $.b_expr),
        seq($.kw_generated, $.generated_when, $.kw_as, $.kw_identity, optional($.OptParenthesizedSeqOptList)),
        prec.left(20, prec.dynamic(20, seq($.kw_generated, $.generated_when, $.kw_as, '(', $.a_expr, ')', optional($.opt_virtual_or_stored)))),
        seq($.kw_references, $.qualified_name, optional($.opt_column_list), optional($.key_match), optional($.key_actions))
      ),
    opt_unique_null_treatment: $ => choice(
        seq($.kw_nulls, $.kw_distinct),
        prec.right(5, prec.dynamic(5, seq($.kw_nulls, $.kw_not, $.kw_distinct)))
      ),
    generated_when: $ => choice(
        $.kw_always,
        seq($.kw_by, $.kw_default)
      ),
    opt_virtual_or_stored: $ => choice(
        $.kw_stored,
        $.kw_virtual
      ),
    ConstraintAttr: $ => choice(
        $.kw_deferrable,
        prec.right(5, prec.dynamic(5, seq($.kw_not, $.kw_deferrable))),
        seq($.kw_initially, $.kw_deferred),
        seq($.kw_initially, $.kw_immediate),
        $.kw_enforced,
        prec.right(5, prec.dynamic(5, seq($.kw_not, $.kw_enforced)))
      ),
    TableLikeClause: $ => prec.left(8, prec.dynamic(8, seq($.kw_like, $.qualified_name, optional($.TableLikeOptionList)))),
    TableLikeOptionList: $ => choice(
        seq(optional($.TableLikeOptionList), $.kw_including, $.TableLikeOption),
        seq(optional($.TableLikeOptionList), $.kw_excluding, $.TableLikeOption)
      ),
    TableLikeOption: $ => choice(
        $.kw_comments,
        $.kw_compression,
        $.kw_constraints,
        $.kw_defaults,
        $.kw_identity,
        $.kw_generated,
        $.kw_indexes,
        $.kw_statistics,
        $.kw_storage,
        $.kw_all
      ),
    TableConstraint: $ => choice(
        seq($.kw_constraint, $.name, $.ConstraintElem),
        $.ConstraintElem
      ),
    ConstraintElem: $ => choice(
        prec.left(20, prec.dynamic(20, seq($.kw_check, '(', $.a_expr, ')', optional($.ConstraintAttributeSpec)))),
        prec.right(5, prec.dynamic(5, seq($.kw_not, $.kw_null, $.ColId, optional($.ConstraintAttributeSpec)))),
        prec.left(20, prec.dynamic(20, seq($.kw_unique, optional($.opt_unique_null_treatment), '(', $.columnList, optional($.opt_without_overlaps), ')', optional($.opt_c_include), optional($.opt_definition), optional($.OptConsTableSpace), optional($.ConstraintAttributeSpec)))),
        seq($.kw_unique, $.ExistingIndex, optional($.ConstraintAttributeSpec)),
        prec.left(20, prec.dynamic(20, seq($.kw_primary, $.kw_key, '(', $.columnList, optional($.opt_without_overlaps), ')', optional($.opt_c_include), optional($.opt_definition), optional($.OptConsTableSpace), optional($.ConstraintAttributeSpec)))),
        seq($.kw_primary, $.kw_key, $.ExistingIndex, optional($.ConstraintAttributeSpec)),
        prec.left(20, prec.dynamic(20, seq($.kw_exclude, optional($.access_method_clause), '(', $.ExclusionConstraintList, ')', optional($.opt_c_include), optional($.opt_definition), optional($.OptConsTableSpace), optional($.OptWhereClause), optional($.ConstraintAttributeSpec)))),
        prec.left(20, prec.dynamic(20, seq($.kw_foreign, $.kw_key, '(', $.columnList, optional($.optionalPeriodName), ')', $.kw_references, $.qualified_name, optional($.opt_column_and_period_list), optional($.key_match), optional($.key_actions), optional($.ConstraintAttributeSpec))))
      ),
    DomainConstraint: $ => choice(
        seq($.kw_constraint, $.name, $.DomainConstraintElem),
        $.DomainConstraintElem
      ),
    DomainConstraintElem: $ => choice(
        prec.left(20, prec.dynamic(20, seq($.kw_check, '(', $.a_expr, ')', optional($.ConstraintAttributeSpec)))),
        prec.right(5, prec.dynamic(5, seq($.kw_not, $.kw_null, optional($.ConstraintAttributeSpec))))
      ),
    opt_no_inherit: $ => seq($.kw_no, $.kw_inherit),
    opt_without_overlaps: $ => prec.left(11, prec.dynamic(11, seq($.kw_without, $.kw_overlaps))),
    opt_column_list: $ => prec.left(20, prec.dynamic(20, seq('(', $.columnList, ')'))),
    columnList: $ => choice(
        $.columnElem,
        seq($.columnList, ',', $.columnElem)
      ),
    optionalPeriodName: $ => seq(',', $.kw_period, $.columnElem),
    opt_column_and_period_list: $ => prec.left(20, prec.dynamic(20, seq('(', $.columnList, optional($.optionalPeriodName), ')'))),
    columnElem: $ => $.ColId,
    opt_c_include: $ => prec.left(20, prec.dynamic(20, seq($.kw_include, '(', $.columnList, ')'))),
    key_match: $ => choice(
        prec.left(23, prec.dynamic(23, seq($.kw_match, $.kw_full))),
        seq($.kw_match, $.kw_partial),
        seq($.kw_match, $.kw_simple)
      ),
    ExclusionConstraintList: $ => choice(
        $.ExclusionConstraintElem,
        seq($.ExclusionConstraintList, ',', $.ExclusionConstraintElem)
      ),
    ExclusionConstraintElem: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.index_elem, $.kw_with, $.any_operator))),
        prec.left(11, prec.dynamic(11, seq($.index_elem, $.kw_with, $.kw_operator, '(', $.any_operator, ')')))
      ),
    OptWhereClause: $ => prec.left(20, prec.dynamic(20, seq($.kw_where, '(', $.a_expr, ')'))),
    key_actions: $ => choice(
        $.key_update,
        $.key_delete,
        seq($.key_update, $.key_delete),
        seq($.key_delete, $.key_update)
      ),
    key_update: $ => seq($.kw_on, $.kw_update, $.key_action),
    key_delete: $ => seq($.kw_on, $.kw_delete, $.key_action),
    key_action: $ => choice(
        seq($.kw_no, $.kw_action),
        $.kw_restrict,
        $.kw_cascade,
        prec.left(11, prec.dynamic(11, seq($.kw_set, $.kw_null, optional($.opt_column_list)))),
        prec.left(11, prec.dynamic(11, seq($.kw_set, $.kw_default, optional($.opt_column_list))))
      ),
    OptInherit: $ => prec.left(20, prec.dynamic(20, seq($.kw_inherits, '(', $.qualified_name_list, ')'))),
    OptPartitionSpec: $ => $.PartitionSpec,
    PartitionSpec: $ => prec.left(11, prec.dynamic(11, seq($.kw_partition, $.kw_by, $.ColId, '(', $.part_params, ')'))),
    part_params: $ => choice(
        $.part_elem,
        seq($.part_params, ',', $.part_elem)
      ),
    part_elem: $ => choice(
        seq($.ColId, optional($.opt_collate), optional($.opt_qualified_name)),
        seq($.func_expr_windowless, optional($.opt_collate), optional($.opt_qualified_name)),
        prec.left(20, prec.dynamic(20, seq('(', $.a_expr, ')', optional($.opt_collate), optional($.opt_qualified_name))))
      ),
    table_access_method_clause: $ => seq($.kw_using, $.name),
    OptWith: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_with, $.reloptions))),
        prec.left(11, prec.dynamic(11, seq($.kw_without, $.kw_oids)))
      ),
    OnCommitOption: $ => choice(
        seq($.kw_on, $.kw_commit, $.kw_drop),
        prec.left(11, prec.dynamic(11, seq($.kw_on, $.kw_commit, $.kw_delete, $.kw_rows))),
        prec.left(11, prec.dynamic(11, seq($.kw_on, $.kw_commit, $.kw_preserve, $.kw_rows)))
      ),
    OptTableSpace: $ => seq($.kw_tablespace, $.name),
    OptConsTableSpace: $ => seq($.kw_using, $.kw_index, $.kw_tablespace, $.name),
    ExistingIndex: $ => seq($.kw_using, $.kw_index, $.name),
    CreateStatsStmt: $ => choice(
        seq($.kw_create, $.kw_statistics, optional($.opt_qualified_name), optional($.opt_name_list), $.kw_on, $.stats_params, $.kw_from, $.from_list),
        prec.right(5, prec.dynamic(5, seq($.kw_create, $.kw_statistics, $.kw_if, $.kw_not, $.kw_exists, $.any_name, optional($.opt_name_list), $.kw_on, $.stats_params, $.kw_from, $.from_list)))
      ),
    stats_params: $ => choice(
        $.stats_param,
        seq($.stats_params, ',', $.stats_param)
      ),
    stats_param: $ => choice(
        $.ColId,
        $.func_expr_windowless,
        prec.left(20, prec.dynamic(20, seq('(', $.a_expr, ')')))
      ),
    AlterStatsStmt: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_statistics, $.any_name, $.kw_set, $.kw_statistics, $.set_statistics_value))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_statistics, $.kw_if, $.kw_exists, $.any_name, $.kw_set, $.kw_statistics, $.set_statistics_value)))
      ),
    CreateAsStmt: $ => choice(
        seq($.kw_create, optional($.OptTemp), $.kw_table, $.create_as_target, $.kw_as, $.SelectStmt, optional($.opt_with_data)),
        prec.right(5, prec.dynamic(5, seq($.kw_create, optional($.OptTemp), $.kw_table, $.kw_if, $.kw_not, $.kw_exists, $.create_as_target, $.kw_as, $.SelectStmt, optional($.opt_with_data))))
      ),
    create_as_target: $ => seq($.qualified_name, optional($.opt_column_list), optional($.table_access_method_clause), optional($.OptWith), optional($.OnCommitOption), optional($.OptTableSpace)),
    opt_with_data: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_with, $.kw_data))),
        prec.left(11, prec.dynamic(11, seq($.kw_with, $.kw_no, $.kw_data)))
      ),
    CreateMatViewStmt: $ => choice(
        seq($.kw_create, optional($.OptNoLog), $.kw_materialized, $.kw_view, $.create_mv_target, $.kw_as, $.SelectStmt, optional($.opt_with_data)),
        prec.right(5, prec.dynamic(5, seq($.kw_create, optional($.OptNoLog), $.kw_materialized, $.kw_view, $.kw_if, $.kw_not, $.kw_exists, $.create_mv_target, $.kw_as, $.SelectStmt, optional($.opt_with_data))))
      ),
    create_mv_target: $ => seq($.qualified_name, optional($.opt_column_list), optional($.table_access_method_clause), optional($.opt_reloptions), optional($.OptTableSpace)),
    OptNoLog: $ => $.kw_unlogged,
    RefreshMatViewStmt: $ => seq($.kw_refresh, $.kw_materialized, $.kw_view, optional($.opt_concurrently), $.qualified_name, optional($.opt_with_data)),
    CreateSeqStmt: $ => choice(
        seq($.kw_create, optional($.OptTemp), $.kw_sequence, $.qualified_name, optional($.OptSeqOptList)),
        prec.right(5, prec.dynamic(5, seq($.kw_create, optional($.OptTemp), $.kw_sequence, $.kw_if, $.kw_not, $.kw_exists, $.qualified_name, optional($.OptSeqOptList))))
      ),
    AlterSeqStmt: $ => choice(
        seq($.kw_alter, $.kw_sequence, $.qualified_name, $.SeqOptList),
        seq($.kw_alter, $.kw_sequence, $.kw_if, $.kw_exists, $.qualified_name, $.SeqOptList)
      ),
    OptSeqOptList: $ => $.SeqOptList,
    OptParenthesizedSeqOptList: $ => prec.left(20, prec.dynamic(20, seq('(', $.SeqOptList, ')'))),
    SeqOptList: $ => choice(
        $.SeqOptElem,
        seq($.SeqOptList, $.SeqOptElem)
      ),
    SeqOptElem: $ => choice(
        seq($.kw_as, $.SimpleTypename),
        seq($.kw_cache, $.NumericOnly),
        $.kw_cycle,
        seq($.kw_no, $.kw_cycle),
        seq($.kw_increment, optional($.opt_by), $.NumericOnly),
        $.kw_logged,
        seq($.kw_maxvalue, $.NumericOnly),
        seq($.kw_minvalue, $.NumericOnly),
        seq($.kw_no, $.kw_maxvalue),
        seq($.kw_no, $.kw_minvalue),
        seq($.kw_owned, $.kw_by, $.any_name),
        seq($.kw_sequence, $.kw_name, $.any_name),
        seq($.kw_start, optional($.opt_with), $.NumericOnly),
        $.kw_restart,
        seq($.kw_restart, optional($.opt_with), $.NumericOnly),
        $.kw_unlogged
      ),
    opt_by: $ => $.kw_by,
    NumericOnly: $ => choice(
        $.float_literal,
        prec.left(13, prec.dynamic(13, seq('+', $.float_literal))),
        prec.left(13, prec.dynamic(13, seq('-', $.float_literal))),
        $.SignedIconst
      ),
    NumericOnly_list: $ => choice(
        $.NumericOnly,
        seq($.NumericOnly_list, ',', $.NumericOnly)
      ),
    CreatePLangStmt: $ => choice(
        seq($.kw_create, optional($.opt_or_replace), optional($.opt_trusted), optional($.opt_procedural), $.kw_language, $.name),
        seq($.kw_create, optional($.opt_or_replace), optional($.opt_trusted), optional($.opt_procedural), $.kw_language, $.name, $.kw_handler, $.handler_name, optional($.opt_inline_handler), optional($.opt_validator))
      ),
    opt_trusted: $ => $.kw_trusted,
    handler_name: $ => choice(
        $.name,
        seq($.name, $.attrs)
      ),
    opt_inline_handler: $ => seq($.kw_inline, $.handler_name),
    validator_clause: $ => choice(
        seq($.kw_validator, $.handler_name),
        seq($.kw_no, $.kw_validator)
      ),
    opt_validator: $ => $.validator_clause,
    opt_procedural: $ => $.kw_procedural,
    CreateTableSpaceStmt: $ => seq($.kw_create, $.kw_tablespace, $.name, optional($.OptTableSpaceOwner), $.kw_location, $.Sconst, optional($.opt_reloptions)),
    OptTableSpaceOwner: $ => seq($.kw_owner, $.RoleSpec),
    DropTableSpaceStmt: $ => choice(
        seq($.kw_drop, $.kw_tablespace, $.name),
        seq($.kw_drop, $.kw_tablespace, $.kw_if, $.kw_exists, $.name)
      ),
    CreateExtensionStmt: $ => choice(
        seq($.kw_create, $.kw_extension, $.name, optional($.opt_with), optional($.create_extension_opt_list)),
        prec.right(5, prec.dynamic(5, seq($.kw_create, $.kw_extension, $.kw_if, $.kw_not, $.kw_exists, $.name, optional($.opt_with), optional($.create_extension_opt_list))))
      ),
    create_extension_opt_list: $ => seq(optional($.create_extension_opt_list), $.create_extension_opt_item),
    create_extension_opt_item: $ => choice(
        seq($.kw_schema, $.name),
        seq($.kw_version, $.NonReservedWord_or_Sconst),
        seq($.kw_from, $.NonReservedWord_or_Sconst),
        $.kw_cascade
      ),
    AlterExtensionStmt: $ => seq($.kw_alter, $.kw_extension, $.name, $.kw_update, optional($.alter_extension_opt_list)),
    alter_extension_opt_list: $ => seq(optional($.alter_extension_opt_list), $.alter_extension_opt_item),
    alter_extension_opt_item: $ => seq($.kw_to, $.NonReservedWord_or_Sconst),
    AlterExtensionContentsStmt: $ => choice(
        seq($.kw_alter, $.kw_extension, $.name, $.add_drop, $.object_type_name, $.name),
        seq($.kw_alter, $.kw_extension, $.name, $.add_drop, $.object_type_any_name, $.any_name),
        seq($.kw_alter, $.kw_extension, $.name, $.add_drop, $.kw_aggregate, $.aggregate_with_argtypes),
        prec.left(20, prec.dynamic(20, seq($.kw_alter, $.kw_extension, $.name, $.add_drop, $.kw_cast, '(', $.Typename, $.kw_as, $.Typename, ')'))),
        seq($.kw_alter, $.kw_extension, $.name, $.add_drop, $.kw_domain, $.Typename),
        seq($.kw_alter, $.kw_extension, $.name, $.add_drop, $.kw_function, $.function_with_argtypes),
        prec.left(12, prec.dynamic(12, seq($.kw_alter, $.kw_extension, $.name, $.add_drop, $.kw_operator, $.operator_with_argtypes))),
        prec.left(12, prec.dynamic(12, seq($.kw_alter, $.kw_extension, $.name, $.add_drop, $.kw_operator, $.kw_class, $.any_name, $.kw_using, $.name))),
        prec.left(12, prec.dynamic(12, seq($.kw_alter, $.kw_extension, $.name, $.add_drop, $.kw_operator, $.kw_family, $.any_name, $.kw_using, $.name))),
        seq($.kw_alter, $.kw_extension, $.name, $.add_drop, $.kw_procedure, $.function_with_argtypes),
        seq($.kw_alter, $.kw_extension, $.name, $.add_drop, $.kw_routine, $.function_with_argtypes),
        seq($.kw_alter, $.kw_extension, $.name, $.add_drop, $.kw_transform, $.kw_for, $.Typename, $.kw_language, $.name),
        seq($.kw_alter, $.kw_extension, $.name, $.add_drop, $.kw_type, $.Typename)
      ),
    CreateFdwStmt: $ => seq($.kw_create, $.kw_foreign, $.kw_data, $.kw_wrapper, $.name, optional($.opt_fdw_options), optional($.create_generic_options)),
    fdw_option: $ => choice(
        seq($.kw_handler, $.handler_name),
        seq($.kw_no, $.kw_handler),
        seq($.kw_validator, $.handler_name),
        seq($.kw_no, $.kw_validator)
      ),
    fdw_options: $ => choice(
        $.fdw_option,
        seq($.fdw_options, $.fdw_option)
      ),
    opt_fdw_options: $ => $.fdw_options,
    AlterFdwStmt: $ => choice(
        seq($.kw_alter, $.kw_foreign, $.kw_data, $.kw_wrapper, $.name, optional($.opt_fdw_options), $.alter_generic_options),
        seq($.kw_alter, $.kw_foreign, $.kw_data, $.kw_wrapper, $.name, $.fdw_options)
      ),
    create_generic_options: $ => prec.left(20, prec.dynamic(20, seq($.kw_options, '(', $.generic_option_list, ')'))),
    generic_option_list: $ => choice(
        $.generic_option_elem,
        seq($.generic_option_list, ',', $.generic_option_elem)
      ),
    alter_generic_options: $ => prec.left(20, prec.dynamic(20, seq($.kw_options, '(', $.alter_generic_option_list, ')'))),
    alter_generic_option_list: $ => choice(
        $.alter_generic_option_elem,
        seq($.alter_generic_option_list, ',', $.alter_generic_option_elem)
      ),
    alter_generic_option_elem: $ => choice(
        $.generic_option_elem,
        prec.left(11, prec.dynamic(11, seq($.kw_set, $.generic_option_elem))),
        seq($.kw_add, $.generic_option_elem),
        seq($.kw_drop, $.generic_option_name)
      ),
    generic_option_elem: $ => seq($.generic_option_name, $.generic_option_arg),
    generic_option_name: $ => $.ColLabel,
    generic_option_arg: $ => $.Sconst,
    CreateForeignServerStmt: $ => choice(
        seq($.kw_create, $.kw_server, $.name, optional($.opt_type), optional($.opt_foreign_server_version), $.kw_foreign, $.kw_data, $.kw_wrapper, $.name, optional($.create_generic_options)),
        prec.right(5, prec.dynamic(5, seq($.kw_create, $.kw_server, $.kw_if, $.kw_not, $.kw_exists, $.name, optional($.opt_type), optional($.opt_foreign_server_version), $.kw_foreign, $.kw_data, $.kw_wrapper, $.name, optional($.create_generic_options))))
      ),
    opt_type: $ => seq($.kw_type, $.Sconst),
    foreign_server_version: $ => choice(
        seq($.kw_version, $.Sconst),
        seq($.kw_version, $.kw_null)
      ),
    opt_foreign_server_version: $ => $.foreign_server_version,
    AlterForeignServerStmt: $ => choice(
        seq($.kw_alter, $.kw_server, $.name, $.foreign_server_version, $.alter_generic_options),
        seq($.kw_alter, $.kw_server, $.name, $.foreign_server_version),
        seq($.kw_alter, $.kw_server, $.name, $.alter_generic_options)
      ),
    CreateForeignTableStmt: $ => choice(
        prec.left(20, prec.dynamic(20, seq($.kw_create, $.kw_foreign, $.kw_table, $.qualified_name, '(', optional($.OptTableElementList), ')', optional($.OptInherit), $.kw_server, $.name, optional($.create_generic_options)))),
        prec.right(5, prec.dynamic(5, seq($.kw_create, $.kw_foreign, $.kw_table, $.kw_if, $.kw_not, $.kw_exists, $.qualified_name, '(', optional($.OptTableElementList), ')', optional($.OptInherit), $.kw_server, $.name, optional($.create_generic_options)))),
        prec.left(11, prec.dynamic(11, seq($.kw_create, $.kw_foreign, $.kw_table, $.qualified_name, $.kw_partition, $.kw_of, $.qualified_name, optional($.OptTypedTableElementList), $.PartitionBoundSpec, $.kw_server, $.name, optional($.create_generic_options)))),
        prec.right(5, prec.dynamic(5, seq($.kw_create, $.kw_foreign, $.kw_table, $.kw_if, $.kw_not, $.kw_exists, $.qualified_name, $.kw_partition, $.kw_of, $.qualified_name, optional($.OptTypedTableElementList), $.PartitionBoundSpec, $.kw_server, $.name, optional($.create_generic_options))))
      ),
    ImportForeignSchemaStmt: $ => seq($.kw_import, $.kw_foreign, $.kw_schema, $.name, optional($.import_qualification), $.kw_from, $.kw_server, $.name, $.kw_into, $.name, optional($.create_generic_options)),
    import_qualification_type: $ => choice(
        seq($.kw_limit, $.kw_to),
        prec.left(1, prec.dynamic(1, $.kw_except))
      ),
    import_qualification: $ => prec.left(20, prec.dynamic(20, seq($.import_qualification_type, '(', $.relation_expr_list, ')'))),
    CreateUserMappingStmt: $ => choice(
        seq($.kw_create, $.kw_user, $.kw_mapping, $.kw_for, $.auth_ident, $.kw_server, $.name, optional($.create_generic_options)),
        prec.right(5, prec.dynamic(5, seq($.kw_create, $.kw_user, $.kw_mapping, $.kw_if, $.kw_not, $.kw_exists, $.kw_for, $.auth_ident, $.kw_server, $.name, optional($.create_generic_options))))
      ),
    auth_ident: $ => choice(
        $.RoleSpec,
        $.kw_user
      ),
    DropUserMappingStmt: $ => choice(
        seq($.kw_drop, $.kw_user, $.kw_mapping, $.kw_for, $.auth_ident, $.kw_server, $.name),
        seq($.kw_drop, $.kw_user, $.kw_mapping, $.kw_if, $.kw_exists, $.kw_for, $.auth_ident, $.kw_server, $.name)
      ),
    AlterUserMappingStmt: $ => seq($.kw_alter, $.kw_user, $.kw_mapping, $.kw_for, $.auth_ident, $.kw_server, $.name, $.alter_generic_options),
    CreatePolicyStmt: $ => seq($.kw_create, $.kw_policy, $.name, $.kw_on, $.qualified_name, optional($.RowSecurityDefaultPermissive), optional($.RowSecurityDefaultForCmd), optional($.RowSecurityDefaultToRole), optional($.RowSecurityOptionalExpr), optional($.RowSecurityOptionalWithCheck)),
    AlterPolicyStmt: $ => seq($.kw_alter, $.kw_policy, $.name, $.kw_on, $.qualified_name, optional($.RowSecurityOptionalToRole), optional($.RowSecurityOptionalExpr), optional($.RowSecurityOptionalWithCheck)),
    RowSecurityOptionalExpr: $ => prec.left(20, prec.dynamic(20, seq($.kw_using, '(', $.a_expr, ')'))),
    RowSecurityOptionalWithCheck: $ => prec.left(11, prec.dynamic(11, seq($.kw_with, $.kw_check, '(', $.a_expr, ')'))),
    RowSecurityDefaultToRole: $ => seq($.kw_to, $.role_list),
    RowSecurityOptionalToRole: $ => seq($.kw_to, $.role_list),
    RowSecurityDefaultPermissive: $ => prec.left(11, prec.dynamic(11, seq($.kw_as, $._ident))),
    RowSecurityDefaultForCmd: $ => seq($.kw_for, $.row_security_cmd),
    row_security_cmd: $ => choice(
        $.kw_all,
        $.kw_select,
        $.kw_insert,
        $.kw_update,
        $.kw_delete
      ),
    CreateAmStmt: $ => seq($.kw_create, $.kw_access, $.kw_method, $.name, $.kw_type, $.am_type, $.kw_handler, $.handler_name),
    am_type: $ => choice(
        $.kw_index,
        $.kw_table
      ),
    CreateTrigStmt: $ => choice(
        prec.left(20, prec.dynamic(20, seq($.kw_create, optional($.opt_or_replace), $.kw_trigger, $.name, $.TriggerActionTime, $.TriggerEvents, $.kw_on, $.qualified_name, optional($.TriggerReferencing), optional($.TriggerForSpec), optional($.TriggerWhen), $.kw_execute, $.FUNCTION_or_PROCEDURE, $.func_name, '(', optional($.TriggerFuncArgs), ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_create, optional($.opt_or_replace), $.kw_constraint, $.kw_trigger, $.name, $.kw_after, $.TriggerEvents, $.kw_on, $.qualified_name, optional($.OptConstrFromTable), optional($.ConstraintAttributeSpec), $.kw_for, $.kw_each, $.kw_row, optional($.TriggerWhen), $.kw_execute, $.FUNCTION_or_PROCEDURE, $.func_name, '(', optional($.TriggerFuncArgs), ')')))
      ),
    TriggerActionTime: $ => choice(
        $.kw_before,
        $.kw_after,
        seq($.kw_instead, $.kw_of)
      ),
    TriggerEvents: $ => choice(
        $.TriggerOneEvent,
        prec.left(3, prec.dynamic(3, seq($.TriggerEvents, $.kw_or, $.TriggerOneEvent)))
      ),
    TriggerOneEvent: $ => choice(
        $.kw_insert,
        $.kw_delete,
        $.kw_update,
        seq($.kw_update, $.kw_of, $.columnList),
        $.kw_truncate
      ),
    TriggerReferencing: $ => seq($.kw_referencing, $.TriggerTransitions),
    TriggerTransitions: $ => choice(
        $.TriggerTransition,
        seq($.TriggerTransitions, $.TriggerTransition)
      ),
    TriggerTransition: $ => seq($.TransitionOldOrNew, $.TransitionRowOrTable, optional($.opt_as), $.TransitionRelName),
    TransitionOldOrNew: $ => choice(
        $.kw_new,
        $.kw_old
      ),
    TransitionRowOrTable: $ => choice(
        $.kw_table,
        $.kw_row
      ),
    TransitionRelName: $ => $.ColId,
    TriggerForSpec: $ => seq($.kw_for, optional($.TriggerForOptEach), $.TriggerForType),
    TriggerForOptEach: $ => $.kw_each,
    TriggerForType: $ => choice(
        $.kw_row,
        $.kw_statement
      ),
    TriggerWhen: $ => prec.left(20, prec.dynamic(20, seq($.kw_when, '(', $.a_expr, ')'))),
    FUNCTION_or_PROCEDURE: $ => choice(
        $.kw_function,
        $.kw_procedure
      ),
    TriggerFuncArgs: $ => choice(
        $.TriggerFuncArg,
        seq(optional($.TriggerFuncArgs), ',', $.TriggerFuncArg)
      ),
    TriggerFuncArg: $ => choice(
        $.Iconst,
        $.float_literal,
        $.Sconst,
        $.ColLabel
      ),
    OptConstrFromTable: $ => seq($.kw_from, $.qualified_name),
    ConstraintAttributeSpec: $ => seq(optional($.ConstraintAttributeSpec), $.ConstraintAttributeElem),
    ConstraintAttributeElem: $ => choice(
        prec.right(5, prec.dynamic(5, seq($.kw_not, $.kw_deferrable))),
        $.kw_deferrable,
        seq($.kw_initially, $.kw_immediate),
        seq($.kw_initially, $.kw_deferred),
        prec.right(5, prec.dynamic(5, seq($.kw_not, $.kw_valid))),
        seq($.kw_no, $.kw_inherit),
        prec.right(5, prec.dynamic(5, seq($.kw_not, $.kw_enforced))),
        $.kw_enforced
      ),
    CreateEventTrigStmt: $ => choice(
        prec.left(20, prec.dynamic(20, seq($.kw_create, $.kw_event, $.kw_trigger, $.name, $.kw_on, $.ColLabel, $.kw_execute, $.FUNCTION_or_PROCEDURE, $.func_name, '(', ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_create, $.kw_event, $.kw_trigger, $.name, $.kw_on, $.ColLabel, $.kw_when, $.event_trigger_when_list, $.kw_execute, $.FUNCTION_or_PROCEDURE, $.func_name, '(', ')')))
      ),
    event_trigger_when_list: $ => choice(
        $.event_trigger_when_item,
        prec.left(4, prec.dynamic(4, seq($.event_trigger_when_list, $.kw_and, $.event_trigger_when_item)))
      ),
    event_trigger_when_item: $ => prec.left(8, prec.dynamic(8, seq($.ColId, $.kw_in, '(', $.event_trigger_value_list, ')'))),
    event_trigger_value_list: $ => choice(
        choice($.string_literal, $.dollar_quoted_string),
        seq($.event_trigger_value_list, ',', choice($.string_literal, $.dollar_quoted_string))
      ),
    AlterEventTrigStmt: $ => seq($.kw_alter, $.kw_event, $.kw_trigger, $.name, $.enable_trigger),
    enable_trigger: $ => choice(
        $.kw_enable,
        seq($.kw_enable, $.kw_replica),
        seq($.kw_enable, $.kw_always),
        $.kw_disable
      ),
    CreateAssertionStmt: $ => prec.left(20, prec.dynamic(20, seq($.kw_create, $.kw_assertion, $.any_name, $.kw_check, '(', $.a_expr, ')', optional($.ConstraintAttributeSpec)))),
    DefineStmt: $ => choice(
        seq($.kw_create, optional($.opt_or_replace), $.kw_aggregate, $.func_name, $.aggr_args, $.definition),
        seq($.kw_create, optional($.opt_or_replace), $.kw_aggregate, $.func_name, $.old_aggr_definition),
        prec.left(12, prec.dynamic(12, seq($.kw_create, $.kw_operator, $.any_operator, $.definition))),
        seq($.kw_create, $.kw_type, $.any_name, $.definition),
        seq($.kw_create, $.kw_type, $.any_name),
        prec.left(20, prec.dynamic(20, seq($.kw_create, $.kw_type, $.any_name, $.kw_as, '(', optional($.OptTableFuncElementList), ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_create, $.kw_type, $.any_name, $.kw_as, $.kw_enum, '(', optional($.opt_enum_val_list), ')'))),
        prec.left(11, prec.dynamic(11, seq($.kw_create, $.kw_type, $.any_name, $.kw_as, $.kw_range, $.definition))),
        seq($.kw_create, $.kw_text, $.kw_search, $.kw_parser, $.any_name, $.definition),
        seq($.kw_create, $.kw_text, $.kw_search, $.kw_dictionary, $.any_name, $.definition),
        seq($.kw_create, $.kw_text, $.kw_search, $.kw_template, $.any_name, $.definition),
        seq($.kw_create, $.kw_text, $.kw_search, $.kw_configuration, $.any_name, $.definition),
        seq($.kw_create, $.kw_collation, $.any_name, $.definition),
        prec.right(5, prec.dynamic(5, seq($.kw_create, $.kw_collation, $.kw_if, $.kw_not, $.kw_exists, $.any_name, $.definition))),
        seq($.kw_create, $.kw_collation, $.any_name, $.kw_from, $.any_name),
        prec.right(5, prec.dynamic(5, seq($.kw_create, $.kw_collation, $.kw_if, $.kw_not, $.kw_exists, $.any_name, $.kw_from, $.any_name)))
      ),
    definition: $ => prec.left(20, prec.dynamic(20, seq('(', $.def_list, ')'))),
    def_list: $ => choice(
        $.def_elem,
        seq($.def_list, ',', $.def_elem)
      ),
    def_elem: $ => choice(
        prec.left(7, prec.dynamic(7, seq($.ColLabel, '=', $.def_arg))),
        $.ColLabel
      ),
    def_arg: $ => choice(
        $.func_type,
        $.reserved_keyword,
        $.qual_all_Op,
        $.NumericOnly,
        $.Sconst,
        $.kw_none
      ),
    old_aggr_definition: $ => prec.left(20, prec.dynamic(20, seq('(', $.old_aggr_list, ')'))),
    old_aggr_list: $ => choice(
        $.old_aggr_elem,
        seq($.old_aggr_list, ',', $.old_aggr_elem)
      ),
    old_aggr_elem: $ => prec.left(11, prec.dynamic(11, seq($._ident, '=', $.def_arg))),
    opt_enum_val_list: $ => $.enum_val_list,
    enum_val_list: $ => choice(
        $.Sconst,
        seq($.enum_val_list, ',', $.Sconst)
      ),
    AlterEnumStmt: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_type, $.any_name, $.kw_add, $.kw_value, optional($.opt_if_not_exists), $.Sconst))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_type, $.any_name, $.kw_add, $.kw_value, optional($.opt_if_not_exists), $.Sconst, $.kw_before, $.Sconst))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_type, $.any_name, $.kw_add, $.kw_value, optional($.opt_if_not_exists), $.Sconst, $.kw_after, $.Sconst))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_type, $.any_name, $.kw_rename, $.kw_value, $.Sconst, $.kw_to, $.Sconst))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_type, $.any_name, $.kw_drop, $.kw_value, $.Sconst)))
      ),
    opt_if_not_exists: $ => prec.right(5, prec.dynamic(5, seq($.kw_if, $.kw_not, $.kw_exists))),
    CreateOpClassStmt: $ => prec.left(12, prec.dynamic(12, seq($.kw_create, $.kw_operator, $.kw_class, $.any_name, optional($.opt_default), $.kw_for, $.kw_type, $.Typename, $.kw_using, $.name, optional($.opt_opfamily), $.kw_as, $.opclass_item_list))),
    opclass_item_list: $ => choice(
        $.opclass_item,
        seq($.opclass_item_list, ',', $.opclass_item)
      ),
    opclass_item: $ => choice(
        prec.left(12, prec.dynamic(12, seq($.kw_operator, $.Iconst, $.any_operator, optional($.opclass_purpose)))),
        prec.left(12, prec.dynamic(12, seq($.kw_operator, $.Iconst, $.operator_with_argtypes, optional($.opclass_purpose)))),
        seq($.kw_function, $.Iconst, $.function_with_argtypes),
        prec.left(20, prec.dynamic(20, seq($.kw_function, $.Iconst, '(', $.type_list, ')', $.function_with_argtypes))),
        seq($.kw_storage, $.Typename)
      ),
    opt_default: $ => $.kw_default,
    opt_opfamily: $ => seq($.kw_family, $.any_name),
    opclass_purpose: $ => choice(
        seq($.kw_for, $.kw_search),
        seq($.kw_for, $.kw_order, $.kw_by, $.any_name)
      ),
    CreateOpFamilyStmt: $ => prec.left(12, prec.dynamic(12, seq($.kw_create, $.kw_operator, $.kw_family, $.any_name, $.kw_using, $.name))),
    AlterOpFamilyStmt: $ => choice(
        prec.left(12, prec.dynamic(12, seq($.kw_alter, $.kw_operator, $.kw_family, $.any_name, $.kw_using, $.name, $.kw_add, $.opclass_item_list))),
        prec.left(12, prec.dynamic(12, seq($.kw_alter, $.kw_operator, $.kw_family, $.any_name, $.kw_using, $.name, $.kw_drop, $.opclass_drop_list)))
      ),
    opclass_drop_list: $ => choice(
        $.opclass_drop,
        seq($.opclass_drop_list, ',', $.opclass_drop)
      ),
    opclass_drop: $ => choice(
        prec.left(12, prec.dynamic(12, seq($.kw_operator, $.Iconst, '(', $.type_list, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_function, $.Iconst, '(', $.type_list, ')')))
      ),
    DropOpClassStmt: $ => choice(
        prec.left(12, prec.dynamic(12, seq($.kw_drop, $.kw_operator, $.kw_class, $.any_name, $.kw_using, $.name, optional($.opt_drop_behavior)))),
        prec.left(12, prec.dynamic(12, seq($.kw_drop, $.kw_operator, $.kw_class, $.kw_if, $.kw_exists, $.any_name, $.kw_using, $.name, optional($.opt_drop_behavior))))
      ),
    DropOpFamilyStmt: $ => choice(
        prec.left(12, prec.dynamic(12, seq($.kw_drop, $.kw_operator, $.kw_family, $.any_name, $.kw_using, $.name, optional($.opt_drop_behavior)))),
        prec.left(12, prec.dynamic(12, seq($.kw_drop, $.kw_operator, $.kw_family, $.kw_if, $.kw_exists, $.any_name, $.kw_using, $.name, optional($.opt_drop_behavior))))
      ),
    DropOwnedStmt: $ => seq($.kw_drop, $.kw_owned, $.kw_by, $.role_list, optional($.opt_drop_behavior)),
    ReassignOwnedStmt: $ => seq($.kw_reassign, $.kw_owned, $.kw_by, $.role_list, $.kw_to, $.RoleSpec),
    DropStmt: $ => choice(
        seq($.kw_drop, $.object_type_any_name, $.kw_if, $.kw_exists, $.any_name_list, optional($.opt_drop_behavior)),
        seq($.kw_drop, $.object_type_any_name, $.any_name_list, optional($.opt_drop_behavior)),
        seq($.kw_drop, $.drop_type_name, $.kw_if, $.kw_exists, $.name_list, optional($.opt_drop_behavior)),
        seq($.kw_drop, $.drop_type_name, $.name_list, optional($.opt_drop_behavior)),
        seq($.kw_drop, $.object_type_name_on_any_name, $.name, $.kw_on, $.any_name, optional($.opt_drop_behavior)),
        seq($.kw_drop, $.object_type_name_on_any_name, $.kw_if, $.kw_exists, $.name, $.kw_on, $.any_name, optional($.opt_drop_behavior)),
        seq($.kw_drop, $.kw_type, $.type_name_list, optional($.opt_drop_behavior)),
        seq($.kw_drop, $.kw_type, $.kw_if, $.kw_exists, $.type_name_list, optional($.opt_drop_behavior)),
        seq($.kw_drop, $.kw_domain, $.type_name_list, optional($.opt_drop_behavior)),
        seq($.kw_drop, $.kw_domain, $.kw_if, $.kw_exists, $.type_name_list, optional($.opt_drop_behavior)),
        seq($.kw_drop, $.kw_index, $.kw_concurrently, $.any_name_list, optional($.opt_drop_behavior)),
        seq($.kw_drop, $.kw_index, $.kw_concurrently, $.kw_if, $.kw_exists, $.any_name_list, optional($.opt_drop_behavior))
      ),
    object_type_any_name: $ => choice(
        $.kw_table,
        $.kw_sequence,
        $.kw_view,
        seq($.kw_materialized, $.kw_view),
        $.kw_index,
        seq($.kw_foreign, $.kw_table),
        $.kw_collation,
        $.kw_conversion,
        $.kw_statistics,
        seq($.kw_text, $.kw_search, $.kw_parser),
        seq($.kw_text, $.kw_search, $.kw_dictionary),
        seq($.kw_text, $.kw_search, $.kw_template),
        seq($.kw_text, $.kw_search, $.kw_configuration)
      ),
    object_type_name: $ => choice(
        $.drop_type_name,
        $.kw_database,
        $.kw_role,
        $.kw_subscription,
        $.kw_tablespace
      ),
    drop_type_name: $ => choice(
        seq($.kw_access, $.kw_method),
        seq($.kw_event, $.kw_trigger),
        $.kw_extension,
        seq($.kw_foreign, $.kw_data, $.kw_wrapper),
        seq(optional($.opt_procedural), $.kw_language),
        $.kw_publication,
        $.kw_schema,
        $.kw_server
      ),
    object_type_name_on_any_name: $ => choice(
        $.kw_policy,
        $.kw_rule,
        $.kw_trigger
      ),
    any_name_list: $ => choice(
        $.any_name,
        seq($.any_name_list, ',', $.any_name)
      ),
    any_name: $ => choice(
        $.ColId,
        seq($.ColId, $.attrs)
      ),
    attrs: $ => choice(
        prec.left(22, prec.dynamic(22, seq('.', $.attr_name))),
        prec.left(22, prec.dynamic(22, seq($.attrs, '.', $.attr_name)))
      ),
    type_name_list: $ => choice(
        $.Typename,
        seq($.type_name_list, ',', $.Typename)
      ),
    TruncateStmt: $ => seq($.kw_truncate, optional($.opt_table), $.relation_expr_list, optional($.opt_restart_seqs), optional($.opt_drop_behavior)),
    opt_restart_seqs: $ => choice(
        seq($.kw_continue, $.kw_identity),
        seq($.kw_restart, $.kw_identity)
      ),
    CommentStmt: $ => choice(
        prec.left(6, prec.dynamic(6, seq($.kw_comment, $.kw_on, $.object_type_any_name, $.any_name, $.kw_is, $.comment_text))),
        prec.left(6, prec.dynamic(6, seq($.kw_comment, $.kw_on, $.kw_column, $.any_name, $.kw_is, $.comment_text))),
        prec.left(6, prec.dynamic(6, seq($.kw_comment, $.kw_on, $.object_type_name, $.name, $.kw_is, $.comment_text))),
        prec.left(6, prec.dynamic(6, seq($.kw_comment, $.kw_on, $.kw_type, $.Typename, $.kw_is, $.comment_text))),
        prec.left(6, prec.dynamic(6, seq($.kw_comment, $.kw_on, $.kw_domain, $.Typename, $.kw_is, $.comment_text))),
        prec.left(6, prec.dynamic(6, seq($.kw_comment, $.kw_on, $.kw_aggregate, $.aggregate_with_argtypes, $.kw_is, $.comment_text))),
        prec.left(6, prec.dynamic(6, seq($.kw_comment, $.kw_on, $.kw_function, $.function_with_argtypes, $.kw_is, $.comment_text))),
        prec.left(12, prec.dynamic(12, seq($.kw_comment, $.kw_on, $.kw_operator, $.operator_with_argtypes, $.kw_is, $.comment_text))),
        prec.left(6, prec.dynamic(6, seq($.kw_comment, $.kw_on, $.kw_constraint, $.name, $.kw_on, $.any_name, $.kw_is, $.comment_text))),
        prec.left(6, prec.dynamic(6, seq($.kw_comment, $.kw_on, $.kw_constraint, $.name, $.kw_on, $.kw_domain, $.any_name, $.kw_is, $.comment_text))),
        prec.left(6, prec.dynamic(6, seq($.kw_comment, $.kw_on, $.object_type_name_on_any_name, $.name, $.kw_on, $.any_name, $.kw_is, $.comment_text))),
        prec.left(6, prec.dynamic(6, seq($.kw_comment, $.kw_on, $.kw_procedure, $.function_with_argtypes, $.kw_is, $.comment_text))),
        prec.left(6, prec.dynamic(6, seq($.kw_comment, $.kw_on, $.kw_routine, $.function_with_argtypes, $.kw_is, $.comment_text))),
        prec.left(6, prec.dynamic(6, seq($.kw_comment, $.kw_on, $.kw_transform, $.kw_for, $.Typename, $.kw_language, $.name, $.kw_is, $.comment_text))),
        prec.left(12, prec.dynamic(12, seq($.kw_comment, $.kw_on, $.kw_operator, $.kw_class, $.any_name, $.kw_using, $.name, $.kw_is, $.comment_text))),
        prec.left(12, prec.dynamic(12, seq($.kw_comment, $.kw_on, $.kw_operator, $.kw_family, $.any_name, $.kw_using, $.name, $.kw_is, $.comment_text))),
        prec.left(11, prec.dynamic(11, seq($.kw_comment, $.kw_on, $.kw_large, $.kw_object, $.NumericOnly, $.kw_is, $.comment_text))),
        prec.left(20, prec.dynamic(20, seq($.kw_comment, $.kw_on, $.kw_cast, '(', $.Typename, $.kw_as, $.Typename, ')', $.kw_is, $.comment_text)))
      ),
    comment_text: $ => choice(
        $.Sconst,
        $.kw_null
      ),
    SecLabelStmt: $ => choice(
        prec.left(6, prec.dynamic(6, seq($.kw_security, $.kw_label, optional($.opt_provider), $.kw_on, $.object_type_any_name, $.any_name, $.kw_is, $.security_label))),
        prec.left(6, prec.dynamic(6, seq($.kw_security, $.kw_label, optional($.opt_provider), $.kw_on, $.kw_column, $.any_name, $.kw_is, $.security_label))),
        prec.left(6, prec.dynamic(6, seq($.kw_security, $.kw_label, optional($.opt_provider), $.kw_on, $.object_type_name, $.name, $.kw_is, $.security_label))),
        prec.left(6, prec.dynamic(6, seq($.kw_security, $.kw_label, optional($.opt_provider), $.kw_on, $.kw_type, $.Typename, $.kw_is, $.security_label))),
        prec.left(6, prec.dynamic(6, seq($.kw_security, $.kw_label, optional($.opt_provider), $.kw_on, $.kw_domain, $.Typename, $.kw_is, $.security_label))),
        prec.left(6, prec.dynamic(6, seq($.kw_security, $.kw_label, optional($.opt_provider), $.kw_on, $.kw_aggregate, $.aggregate_with_argtypes, $.kw_is, $.security_label))),
        prec.left(6, prec.dynamic(6, seq($.kw_security, $.kw_label, optional($.opt_provider), $.kw_on, $.kw_function, $.function_with_argtypes, $.kw_is, $.security_label))),
        prec.left(11, prec.dynamic(11, seq($.kw_security, $.kw_label, optional($.opt_provider), $.kw_on, $.kw_large, $.kw_object, $.NumericOnly, $.kw_is, $.security_label))),
        prec.left(6, prec.dynamic(6, seq($.kw_security, $.kw_label, optional($.opt_provider), $.kw_on, $.kw_procedure, $.function_with_argtypes, $.kw_is, $.security_label))),
        prec.left(6, prec.dynamic(6, seq($.kw_security, $.kw_label, optional($.opt_provider), $.kw_on, $.kw_routine, $.function_with_argtypes, $.kw_is, $.security_label)))
      ),
    opt_provider: $ => seq($.kw_for, $.NonReservedWord_or_Sconst),
    security_label: $ => choice(
        $.Sconst,
        $.kw_null
      ),
    FetchStmt: $ => choice(
        seq($.kw_fetch, $.fetch_args),
        seq($.kw_move, $.fetch_args)
      ),
    fetch_args: $ => choice(
        $.cursor_name,
        seq($.from_in, $.cursor_name),
        seq($.kw_next, optional($.opt_from_in), $.cursor_name),
        seq($.kw_prior, optional($.opt_from_in), $.cursor_name),
        seq($.kw_first, optional($.opt_from_in), $.cursor_name),
        seq($.kw_last, optional($.opt_from_in), $.cursor_name),
        seq($.kw_absolute, $.SignedIconst, optional($.opt_from_in), $.cursor_name),
        seq($.kw_relative, $.SignedIconst, optional($.opt_from_in), $.cursor_name),
        seq($.SignedIconst, optional($.opt_from_in), $.cursor_name),
        seq($.kw_all, optional($.opt_from_in), $.cursor_name),
        seq($.kw_forward, optional($.opt_from_in), $.cursor_name),
        seq($.kw_forward, $.SignedIconst, optional($.opt_from_in), $.cursor_name),
        seq($.kw_forward, $.kw_all, optional($.opt_from_in), $.cursor_name),
        seq($.kw_backward, optional($.opt_from_in), $.cursor_name),
        seq($.kw_backward, $.SignedIconst, optional($.opt_from_in), $.cursor_name),
        seq($.kw_backward, $.kw_all, optional($.opt_from_in), $.cursor_name)
      ),
    from_in: $ => choice(
        $.kw_from,
        prec.left(8, prec.dynamic(8, $.kw_in))
      ),
    opt_from_in: $ => $.from_in,
    GrantStmt: $ => seq($.kw_grant, $.privileges, $.kw_on, $.privilege_target, $.kw_to, $.grantee_list, optional($.opt_grant_grant_option), optional($.opt_granted_by)),
    RevokeStmt: $ => choice(
        seq($.kw_revoke, $.privileges, $.kw_on, $.privilege_target, $.kw_from, $.grantee_list, optional($.opt_granted_by), optional($.opt_drop_behavior)),
        seq($.kw_revoke, $.kw_grant, $.kw_option, $.kw_for, $.privileges, $.kw_on, $.privilege_target, $.kw_from, $.grantee_list, optional($.opt_granted_by), optional($.opt_drop_behavior))
      ),
    privileges: $ => choice(
        $.privilege_list,
        $.kw_all,
        seq($.kw_all, $.kw_privileges),
        prec.left(20, prec.dynamic(20, seq($.kw_all, '(', $.columnList, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_all, $.kw_privileges, '(', $.columnList, ')')))
      ),
    privilege_list: $ => choice(
        $.privilege,
        seq($.privilege_list, ',', $.privilege)
      ),
    privilege: $ => choice(
        seq($.kw_select, optional($.opt_column_list)),
        seq($.kw_references, optional($.opt_column_list)),
        seq($.kw_create, optional($.opt_column_list)),
        seq($.kw_alter, $.kw_system),
        seq($.ColId, optional($.opt_column_list))
      ),
    parameter_name_list: $ => choice(
        $.parameter_name,
        seq($.parameter_name_list, ',', $.parameter_name)
      ),
    parameter_name: $ => choice(
        $.ColId,
        prec.left(22, prec.dynamic(22, seq($.parameter_name, '.', $.ColId)))
      ),
    privilege_target: $ => choice(
        $.qualified_name_list,
        seq($.kw_table, $.qualified_name_list),
        seq($.kw_sequence, $.qualified_name_list),
        seq($.kw_foreign, $.kw_data, $.kw_wrapper, $.name_list),
        seq($.kw_foreign, $.kw_server, $.name_list),
        seq($.kw_function, $.function_with_argtypes_list),
        seq($.kw_procedure, $.function_with_argtypes_list),
        seq($.kw_routine, $.function_with_argtypes_list),
        seq($.kw_database, $.name_list),
        seq($.kw_domain, $.any_name_list),
        seq($.kw_language, $.name_list),
        prec.left(11, prec.dynamic(11, seq($.kw_large, $.kw_object, $.NumericOnly_list))),
        seq($.kw_parameter, $.parameter_name_list),
        seq($.kw_schema, $.name_list),
        seq($.kw_tablespace, $.name_list),
        seq($.kw_type, $.any_name_list),
        prec.left(8, prec.dynamic(8, seq($.kw_all, $.kw_tables, $.kw_in, $.kw_schema, $.name_list))),
        prec.left(8, prec.dynamic(8, seq($.kw_all, $.kw_sequences, $.kw_in, $.kw_schema, $.name_list))),
        prec.left(8, prec.dynamic(8, seq($.kw_all, $.kw_functions, $.kw_in, $.kw_schema, $.name_list))),
        prec.left(8, prec.dynamic(8, seq($.kw_all, $.kw_procedures, $.kw_in, $.kw_schema, $.name_list))),
        prec.left(8, prec.dynamic(8, seq($.kw_all, $.kw_routines, $.kw_in, $.kw_schema, $.name_list)))
      ),
    grantee_list: $ => choice(
        $.grantee,
        seq($.grantee_list, ',', $.grantee)
      ),
    grantee: $ => choice(
        $.RoleSpec,
        seq($.kw_group, $.RoleSpec)
      ),
    opt_grant_grant_option: $ => prec.left(11, prec.dynamic(11, seq($.kw_with, $.kw_grant, $.kw_option))),
    GrantRoleStmt: $ => choice(
        seq($.kw_grant, $.privilege_list, $.kw_to, $.role_list, optional($.opt_granted_by)),
        prec.left(11, prec.dynamic(11, seq($.kw_grant, $.privilege_list, $.kw_to, $.role_list, $.kw_with, $.grant_role_opt_list, optional($.opt_granted_by))))
      ),
    RevokeRoleStmt: $ => choice(
        seq($.kw_revoke, $.privilege_list, $.kw_from, $.role_list, optional($.opt_granted_by), optional($.opt_drop_behavior)),
        seq($.kw_revoke, $.ColId, $.kw_option, $.kw_for, $.privilege_list, $.kw_from, $.role_list, optional($.opt_granted_by), optional($.opt_drop_behavior))
      ),
    grant_role_opt_list: $ => choice(
        seq($.grant_role_opt_list, ',', $.grant_role_opt),
        $.grant_role_opt
      ),
    grant_role_opt: $ => seq($.ColLabel, $.grant_role_opt_value),
    grant_role_opt_value: $ => choice(
        $.kw_option,
        $.kw_true,
        $.kw_false
      ),
    opt_granted_by: $ => seq($.kw_granted, $.kw_by, $.RoleSpec),
    AlterDefaultPrivilegesStmt: $ => seq($.kw_alter, $.kw_default, $.kw_privileges, optional($.DefACLOptionList), $.DefACLAction),
    DefACLOptionList: $ => seq(optional($.DefACLOptionList), $.DefACLOption),
    DefACLOption: $ => choice(
        prec.left(8, prec.dynamic(8, seq($.kw_in, $.kw_schema, $.name_list))),
        seq($.kw_for, $.kw_role, $.role_list),
        seq($.kw_for, $.kw_user, $.role_list)
      ),
    DefACLAction: $ => choice(
        seq($.kw_grant, $.privileges, $.kw_on, $.defacl_privilege_target, $.kw_to, $.grantee_list, optional($.opt_grant_grant_option)),
        seq($.kw_revoke, $.privileges, $.kw_on, $.defacl_privilege_target, $.kw_from, $.grantee_list, optional($.opt_drop_behavior)),
        seq($.kw_revoke, $.kw_grant, $.kw_option, $.kw_for, $.privileges, $.kw_on, $.defacl_privilege_target, $.kw_from, $.grantee_list, optional($.opt_drop_behavior))
      ),
    defacl_privilege_target: $ => choice(
        $.kw_tables,
        $.kw_functions,
        $.kw_routines,
        $.kw_sequences,
        $.kw_types,
        $.kw_schemas,
        seq($.kw_large, $.kw_objects)
      ),
    IndexStmt: $ => choice(
        prec.left(20, prec.dynamic(20, seq($.kw_create, optional($.opt_unique), $.kw_index, optional($.opt_concurrently), optional($.opt_single_name), $.kw_on, $.relation_expr, optional($.access_method_clause), '(', $.index_params, ')', optional($.opt_include), optional($.opt_unique_null_treatment), optional($.opt_reloptions), optional($.OptTableSpace), optional($.where_clause)))),
        prec.right(5, prec.dynamic(5, seq($.kw_create, optional($.opt_unique), $.kw_index, optional($.opt_concurrently), $.kw_if, $.kw_not, $.kw_exists, $.name, $.kw_on, $.relation_expr, optional($.access_method_clause), '(', $.index_params, ')', optional($.opt_include), optional($.opt_unique_null_treatment), optional($.opt_reloptions), optional($.OptTableSpace), optional($.where_clause))))
      ),
    opt_unique: $ => $.kw_unique,
    access_method_clause: $ => seq($.kw_using, $.name),
    index_params: $ => choice(
        $.index_elem,
        seq($.index_params, ',', $.index_elem)
      ),
    index_elem_options: $ => choice(
        choice(
        seq($.opt_collate, optional($.opt_qualified_name), optional($.opt_asc_desc), optional($.opt_nulls_order)),
        seq($.opt_qualified_name, optional($.opt_asc_desc), optional($.opt_nulls_order)),
        seq($.opt_asc_desc, optional($.opt_nulls_order)),
        $.opt_nulls_order
      ),
        seq(optional($.opt_collate), $.any_name, $.reloptions, optional($.opt_asc_desc), optional($.opt_nulls_order))
      ),
    index_elem: $ => choice(
        seq($.ColId, optional($.index_elem_options)),
        seq($.func_expr_windowless, optional($.index_elem_options)),
        prec.left(20, prec.dynamic(20, seq('(', $.a_expr, ')', optional($.index_elem_options))))
      ),
    opt_include: $ => prec.left(20, prec.dynamic(20, seq($.kw_include, '(', $.index_including_params, ')'))),
    index_including_params: $ => choice(
        $.index_elem,
        seq($.index_including_params, ',', $.index_elem)
      ),
    opt_collate: $ => prec.left(17, prec.dynamic(17, seq($.kw_collate, $.any_name))),
    opt_asc_desc: $ => choice(
        $.kw_asc,
        $.kw_desc
      ),
    opt_nulls_order: $ => choice(
        seq($.kw_nulls, $.kw_first),
        seq($.kw_nulls, $.kw_last)
      ),
    CreateFunctionStmt: $ => choice(
        seq($.kw_create, optional($.opt_or_replace), $.kw_function, $.func_name, $.func_args_with_defaults, $.kw_returns, $.func_return, optional($.opt_createfunc_opt_list), optional($.opt_routine_body)),
        prec.left(20, prec.dynamic(20, seq($.kw_create, optional($.opt_or_replace), $.kw_function, $.func_name, $.func_args_with_defaults, $.kw_returns, $.kw_table, '(', $.table_func_column_list, ')', optional($.opt_createfunc_opt_list), optional($.opt_routine_body)))),
        seq($.kw_create, optional($.opt_or_replace), $.kw_function, $.func_name, $.func_args_with_defaults, optional($.opt_createfunc_opt_list), optional($.opt_routine_body)),
        seq($.kw_create, optional($.opt_or_replace), $.kw_procedure, $.func_name, $.func_args_with_defaults, optional($.opt_createfunc_opt_list), optional($.opt_routine_body))
      ),
    opt_or_replace: $ => prec.left(3, prec.dynamic(3, seq($.kw_or, $.kw_replace))),
    func_args: $ => choice(
        prec.left(20, prec.dynamic(20, seq('(', $.func_args_list, ')'))),
        prec.left(20, prec.dynamic(20, seq('(', ')')))
      ),
    func_args_list: $ => choice(
        $.func_arg,
        seq($.func_args_list, ',', $.func_arg)
      ),
    function_with_argtypes_list: $ => choice(
        $.function_with_argtypes,
        seq($.function_with_argtypes_list, ',', $.function_with_argtypes)
      ),
    function_with_argtypes: $ => choice(
        seq($.func_name, $.func_args),
        $.type_func_name_keyword,
        $.ColId,
        seq($.ColId, $.indirection)
      ),
    func_args_with_defaults: $ => choice(
        prec.left(20, prec.dynamic(20, seq('(', $.func_args_with_defaults_list, ')'))),
        prec.left(20, prec.dynamic(20, seq('(', ')')))
      ),
    func_args_with_defaults_list: $ => choice(
        $.func_arg_with_default,
        seq($.func_args_with_defaults_list, ',', $.func_arg_with_default)
      ),
    func_arg: $ => choice(
        seq($.arg_class, $.param_name, $.func_type),
        seq($.param_name, $.arg_class, $.func_type),
        seq($.param_name, $.func_type),
        seq($.arg_class, $.func_type),
        $.func_type
      ),
    arg_class: $ => choice(
        prec.left(8, prec.dynamic(8, $.kw_in)),
        $.kw_out,
        $.kw_inout,
        prec.left(8, prec.dynamic(8, seq($.kw_in, $.kw_out))),
        $.kw_variadic
      ),
    param_name: $ => $.type_function_name,
    func_return: $ => $.func_type,
    func_type: $ => choice(
        $.Typename,
        prec.left(14, prec.dynamic(14, seq($.type_function_name, $.attrs, '%', $.kw_type))),
        prec.left(14, prec.dynamic(14, seq($.kw_setof, $.type_function_name, $.attrs, '%', $.kw_type)))
      ),
    func_arg_with_default: $ => choice(
        $.func_arg,
        seq($.func_arg, $.kw_default, $.a_expr),
        prec.left(7, prec.dynamic(7, seq($.func_arg, '=', $.a_expr)))
      ),
    aggr_arg: $ => $.func_arg,
    aggr_args: $ => choice(
        prec.left(20, prec.dynamic(20, seq('(', '*', ')'))),
        prec.left(20, prec.dynamic(20, seq('(', $.aggr_args_list, ')'))),
        prec.left(20, prec.dynamic(20, seq('(', $.kw_order, $.kw_by, $.aggr_args_list, ')'))),
        prec.left(20, prec.dynamic(20, seq('(', $.aggr_args_list, $.kw_order, $.kw_by, $.aggr_args_list, ')')))
      ),
    aggr_args_list: $ => choice(
        $.aggr_arg,
        seq($.aggr_args_list, ',', $.aggr_arg)
      ),
    aggregate_with_argtypes: $ => seq($.func_name, $.aggr_args),
    aggregate_with_argtypes_list: $ => choice(
        $.aggregate_with_argtypes,
        seq($.aggregate_with_argtypes_list, ',', $.aggregate_with_argtypes)
      ),
    opt_createfunc_opt_list: $ => $.createfunc_opt_list,
    createfunc_opt_list: $ => choice(
        $.createfunc_opt_item,
        seq($.createfunc_opt_list, $.createfunc_opt_item)
      ),
    common_func_opt_item: $ => choice(
        seq($.kw_called, $.kw_on, $.kw_null, $.kw_input),
        seq($.kw_returns, $.kw_null, $.kw_on, $.kw_null, $.kw_input),
        $.kw_strict,
        $.kw_immutable,
        $.kw_stable,
        $.kw_volatile,
        seq($.kw_external, $.kw_security, $.kw_definer),
        seq($.kw_external, $.kw_security, $.kw_invoker),
        seq($.kw_security, $.kw_definer),
        seq($.kw_security, $.kw_invoker),
        $.kw_leakproof,
        prec.right(5, prec.dynamic(5, seq($.kw_not, $.kw_leakproof))),
        seq($.kw_cost, $.NumericOnly),
        prec.left(11, prec.dynamic(11, seq($.kw_rows, $.NumericOnly))),
        seq($.kw_support, $.any_name),
        $.FunctionSetResetClause,
        seq($.kw_parallel, $.ColId)
      ),
    createfunc_opt_item: $ => choice(
        seq($.kw_as, $.func_as),
        seq($.kw_language, $.NonReservedWord_or_Sconst),
        seq($.kw_transform, $.transform_type_list),
        $.kw_window,
        $.common_func_opt_item
      ),
    func_as: $ => choice(
        $.Sconst,
        seq($.Sconst, ',', $.Sconst)
      ),
    ReturnStmt: $ => seq($.kw_return, $.a_expr),
    opt_routine_body: $ => choice(
        $.ReturnStmt,
        seq($.kw_begin, $.kw_atomic, optional($.routine_body_stmt_list), $.kw_end)
      ),
    routine_body_stmt_list: $ => seq(optional($.routine_body_stmt_list), optional($.routine_body_stmt), ';'),
    routine_body_stmt: $ => choice(
        $.stmt,
        $.ReturnStmt
      ),
    transform_type_list: $ => choice(
        seq($.kw_for, $.kw_type, $.Typename),
        seq($.transform_type_list, ',', $.kw_for, $.kw_type, $.Typename)
      ),
    opt_definition: $ => prec.left(11, prec.dynamic(11, seq($.kw_with, $.definition))),
    table_func_column: $ => seq($.param_name, $.func_type),
    table_func_column_list: $ => choice(
        $.table_func_column,
        seq($.table_func_column_list, ',', $.table_func_column)
      ),
    AlterFunctionStmt: $ => choice(
        seq($.kw_alter, $.kw_function, $.function_with_argtypes, $.alterfunc_opt_list, optional($.opt_restrict)),
        seq($.kw_alter, $.kw_procedure, $.function_with_argtypes, $.alterfunc_opt_list, optional($.opt_restrict)),
        seq($.kw_alter, $.kw_routine, $.function_with_argtypes, $.alterfunc_opt_list, optional($.opt_restrict))
      ),
    alterfunc_opt_list: $ => choice(
        $.common_func_opt_item,
        seq($.alterfunc_opt_list, $.common_func_opt_item)
      ),
    opt_restrict: $ => $.kw_restrict,
    RemoveFuncStmt: $ => choice(
        seq($.kw_drop, $.kw_function, $.function_with_argtypes_list, optional($.opt_drop_behavior)),
        seq($.kw_drop, $.kw_function, $.kw_if, $.kw_exists, $.function_with_argtypes_list, optional($.opt_drop_behavior)),
        seq($.kw_drop, $.kw_procedure, $.function_with_argtypes_list, optional($.opt_drop_behavior)),
        seq($.kw_drop, $.kw_procedure, $.kw_if, $.kw_exists, $.function_with_argtypes_list, optional($.opt_drop_behavior)),
        seq($.kw_drop, $.kw_routine, $.function_with_argtypes_list, optional($.opt_drop_behavior)),
        seq($.kw_drop, $.kw_routine, $.kw_if, $.kw_exists, $.function_with_argtypes_list, optional($.opt_drop_behavior))
      ),
    RemoveAggrStmt: $ => choice(
        seq($.kw_drop, $.kw_aggregate, $.aggregate_with_argtypes_list, optional($.opt_drop_behavior)),
        seq($.kw_drop, $.kw_aggregate, $.kw_if, $.kw_exists, $.aggregate_with_argtypes_list, optional($.opt_drop_behavior))
      ),
    RemoveOperStmt: $ => choice(
        prec.left(12, prec.dynamic(12, seq($.kw_drop, $.kw_operator, $.operator_with_argtypes_list, optional($.opt_drop_behavior)))),
        prec.left(12, prec.dynamic(12, seq($.kw_drop, $.kw_operator, $.kw_if, $.kw_exists, $.operator_with_argtypes_list, optional($.opt_drop_behavior))))
      ),
    oper_argtypes: $ => choice(
        prec.left(20, prec.dynamic(20, seq('(', $.Typename, ')'))),
        prec.left(20, prec.dynamic(20, seq('(', $.Typename, ',', $.Typename, ')'))),
        prec.left(20, prec.dynamic(20, seq('(', $.kw_none, ',', $.Typename, ')'))),
        prec.left(20, prec.dynamic(20, seq('(', $.Typename, ',', $.kw_none, ')')))
      ),
    any_operator: $ => choice(
        $.all_Op,
        prec.left(22, prec.dynamic(22, seq($.ColId, '.', $.any_operator)))
      ),
    operator_with_argtypes_list: $ => choice(
        $.operator_with_argtypes,
        seq($.operator_with_argtypes_list, ',', $.operator_with_argtypes)
      ),
    operator_with_argtypes: $ => seq($.any_operator, $.oper_argtypes),
    DoStmt: $ => seq($.kw_do, $.dostmt_opt_list),
    dostmt_opt_list: $ => choice(
        $.dostmt_opt_item,
        seq($.dostmt_opt_list, $.dostmt_opt_item)
      ),
    dostmt_opt_item: $ => choice(
        $.Sconst,
        seq($.kw_language, $.NonReservedWord_or_Sconst)
      ),
    CreateCastStmt: $ => choice(
        prec.left(20, prec.dynamic(20, seq($.kw_create, $.kw_cast, '(', $.Typename, $.kw_as, $.Typename, ')', $.kw_with, $.kw_function, $.function_with_argtypes, optional($.cast_context)))),
        prec.left(20, prec.dynamic(20, seq($.kw_create, $.kw_cast, '(', $.Typename, $.kw_as, $.Typename, ')', $.kw_without, $.kw_function, optional($.cast_context)))),
        prec.left(20, prec.dynamic(20, seq($.kw_create, $.kw_cast, '(', $.Typename, $.kw_as, $.Typename, ')', $.kw_with, $.kw_inout, optional($.cast_context))))
      ),
    cast_context: $ => choice(
        seq($.kw_as, $.kw_implicit),
        seq($.kw_as, $.kw_assignment)
      ),
    DropCastStmt: $ => prec.left(20, prec.dynamic(20, seq($.kw_drop, $.kw_cast, optional($.opt_if_exists), '(', $.Typename, $.kw_as, $.Typename, ')', optional($.opt_drop_behavior)))),
    opt_if_exists: $ => seq($.kw_if, $.kw_exists),
    CreateTransformStmt: $ => prec.left(20, prec.dynamic(20, seq($.kw_create, optional($.opt_or_replace), $.kw_transform, $.kw_for, $.Typename, $.kw_language, $.name, '(', $.transform_element_list, ')'))),
    transform_element_list: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_from, $.kw_sql, $.kw_with, $.kw_function, $.function_with_argtypes, ',', $.kw_to, $.kw_sql, $.kw_with, $.kw_function, $.function_with_argtypes))),
        prec.left(11, prec.dynamic(11, seq($.kw_to, $.kw_sql, $.kw_with, $.kw_function, $.function_with_argtypes, ',', $.kw_from, $.kw_sql, $.kw_with, $.kw_function, $.function_with_argtypes))),
        prec.left(11, prec.dynamic(11, seq($.kw_from, $.kw_sql, $.kw_with, $.kw_function, $.function_with_argtypes))),
        prec.left(11, prec.dynamic(11, seq($.kw_to, $.kw_sql, $.kw_with, $.kw_function, $.function_with_argtypes)))
      ),
    DropTransformStmt: $ => seq($.kw_drop, $.kw_transform, optional($.opt_if_exists), $.kw_for, $.Typename, $.kw_language, $.name, optional($.opt_drop_behavior)),
    ReindexStmt: $ => choice(
        seq($.kw_reindex, optional($.opt_reindex_option_list), $.reindex_target_relation, optional($.opt_concurrently), $.qualified_name),
        seq($.kw_reindex, optional($.opt_reindex_option_list), $.kw_schema, optional($.opt_concurrently), $.name),
        seq($.kw_reindex, optional($.opt_reindex_option_list), $.reindex_target_all, optional($.opt_concurrently), optional($.opt_single_name))
      ),
    reindex_target_relation: $ => choice(
        $.kw_index,
        $.kw_table
      ),
    reindex_target_all: $ => choice(
        $.kw_system,
        $.kw_database
      ),
    opt_reindex_option_list: $ => prec.left(20, prec.dynamic(20, seq('(', $.utility_option_list, ')'))),
    AlterTblSpcStmt: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_tablespace, $.name, $.kw_set, $.reloptions))),
        seq($.kw_alter, $.kw_tablespace, $.name, $.kw_reset, $.reloptions)
      ),
    RenameStmt: $ => choice(
        seq($.kw_alter, $.kw_aggregate, $.aggregate_with_argtypes, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_collation, $.any_name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_conversion, $.any_name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_database, $.name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_domain, $.any_name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_domain, $.any_name, $.kw_rename, $.kw_constraint, $.name, $.kw_to, $.name),
        seq($.kw_alter, $.kw_foreign, $.kw_data, $.kw_wrapper, $.name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_function, $.function_with_argtypes, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_group, $.RoleId, $.kw_rename, $.kw_to, $.RoleId),
        seq($.kw_alter, optional($.opt_procedural), $.kw_language, $.name, $.kw_rename, $.kw_to, $.name),
        prec.left(12, prec.dynamic(12, seq($.kw_alter, $.kw_operator, $.kw_class, $.any_name, $.kw_using, $.name, $.kw_rename, $.kw_to, $.name))),
        prec.left(12, prec.dynamic(12, seq($.kw_alter, $.kw_operator, $.kw_family, $.any_name, $.kw_using, $.name, $.kw_rename, $.kw_to, $.name))),
        seq($.kw_alter, $.kw_policy, $.name, $.kw_on, $.qualified_name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_policy, $.kw_if, $.kw_exists, $.name, $.kw_on, $.qualified_name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_procedure, $.function_with_argtypes, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_publication, $.name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_routine, $.function_with_argtypes, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_schema, $.name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_server, $.name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_subscription, $.name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_table, $.relation_expr, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_table, $.kw_if, $.kw_exists, $.relation_expr, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_sequence, $.qualified_name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_sequence, $.kw_if, $.kw_exists, $.qualified_name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_view, $.qualified_name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_view, $.kw_if, $.kw_exists, $.qualified_name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_materialized, $.kw_view, $.qualified_name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_materialized, $.kw_view, $.kw_if, $.kw_exists, $.qualified_name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_index, $.qualified_name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_index, $.kw_if, $.kw_exists, $.qualified_name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_foreign, $.kw_table, $.relation_expr, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_foreign, $.kw_table, $.kw_if, $.kw_exists, $.relation_expr, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_table, $.relation_expr, $.kw_rename, optional($.opt_column), $.name, $.kw_to, $.name),
        seq($.kw_alter, $.kw_table, $.kw_if, $.kw_exists, $.relation_expr, $.kw_rename, optional($.opt_column), $.name, $.kw_to, $.name),
        seq($.kw_alter, $.kw_view, $.qualified_name, $.kw_rename, optional($.opt_column), $.name, $.kw_to, $.name),
        seq($.kw_alter, $.kw_view, $.kw_if, $.kw_exists, $.qualified_name, $.kw_rename, optional($.opt_column), $.name, $.kw_to, $.name),
        seq($.kw_alter, $.kw_materialized, $.kw_view, $.qualified_name, $.kw_rename, optional($.opt_column), $.name, $.kw_to, $.name),
        seq($.kw_alter, $.kw_materialized, $.kw_view, $.kw_if, $.kw_exists, $.qualified_name, $.kw_rename, optional($.opt_column), $.name, $.kw_to, $.name),
        seq($.kw_alter, $.kw_table, $.relation_expr, $.kw_rename, $.kw_constraint, $.name, $.kw_to, $.name),
        seq($.kw_alter, $.kw_table, $.kw_if, $.kw_exists, $.relation_expr, $.kw_rename, $.kw_constraint, $.name, $.kw_to, $.name),
        seq($.kw_alter, $.kw_foreign, $.kw_table, $.relation_expr, $.kw_rename, optional($.opt_column), $.name, $.kw_to, $.name),
        seq($.kw_alter, $.kw_foreign, $.kw_table, $.kw_if, $.kw_exists, $.relation_expr, $.kw_rename, optional($.opt_column), $.name, $.kw_to, $.name),
        seq($.kw_alter, $.kw_rule, $.name, $.kw_on, $.qualified_name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_trigger, $.name, $.kw_on, $.qualified_name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_event, $.kw_trigger, $.name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_role, $.RoleId, $.kw_rename, $.kw_to, $.RoleId),
        seq($.kw_alter, $.kw_user, $.RoleId, $.kw_rename, $.kw_to, $.RoleId),
        seq($.kw_alter, $.kw_tablespace, $.name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_statistics, $.any_name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_text, $.kw_search, $.kw_parser, $.any_name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_text, $.kw_search, $.kw_dictionary, $.any_name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_text, $.kw_search, $.kw_template, $.any_name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_text, $.kw_search, $.kw_configuration, $.any_name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_type, $.any_name, $.kw_rename, $.kw_to, $.name),
        seq($.kw_alter, $.kw_type, $.any_name, $.kw_rename, $.kw_attribute, $.name, $.kw_to, $.name, optional($.opt_drop_behavior))
      ),
    opt_column: $ => $.kw_column,
    opt_set_data: $ => prec.left(11, prec.dynamic(11, seq($.kw_set, $.kw_data))),
    AlterObjectDependsStmt: $ => choice(
        seq($.kw_alter, $.kw_function, $.function_with_argtypes, optional($.opt_no), $.kw_depends, $.kw_on, $.kw_extension, $.name),
        seq($.kw_alter, $.kw_procedure, $.function_with_argtypes, optional($.opt_no), $.kw_depends, $.kw_on, $.kw_extension, $.name),
        seq($.kw_alter, $.kw_routine, $.function_with_argtypes, optional($.opt_no), $.kw_depends, $.kw_on, $.kw_extension, $.name),
        seq($.kw_alter, $.kw_trigger, $.name, $.kw_on, $.qualified_name, optional($.opt_no), $.kw_depends, $.kw_on, $.kw_extension, $.name),
        seq($.kw_alter, $.kw_materialized, $.kw_view, $.qualified_name, optional($.opt_no), $.kw_depends, $.kw_on, $.kw_extension, $.name),
        seq($.kw_alter, $.kw_index, $.qualified_name, optional($.opt_no), $.kw_depends, $.kw_on, $.kw_extension, $.name)
      ),
    opt_no: $ => $.kw_no,
    AlterObjectSchemaStmt: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_aggregate, $.aggregate_with_argtypes, $.kw_set, $.kw_schema, $.name))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_collation, $.any_name, $.kw_set, $.kw_schema, $.name))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_conversion, $.any_name, $.kw_set, $.kw_schema, $.name))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_domain, $.any_name, $.kw_set, $.kw_schema, $.name))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_extension, $.name, $.kw_set, $.kw_schema, $.name))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_function, $.function_with_argtypes, $.kw_set, $.kw_schema, $.name))),
        prec.left(12, prec.dynamic(12, seq($.kw_alter, $.kw_operator, $.operator_with_argtypes, $.kw_set, $.kw_schema, $.name))),
        prec.left(12, prec.dynamic(12, seq($.kw_alter, $.kw_operator, $.kw_class, $.any_name, $.kw_using, $.name, $.kw_set, $.kw_schema, $.name))),
        prec.left(12, prec.dynamic(12, seq($.kw_alter, $.kw_operator, $.kw_family, $.any_name, $.kw_using, $.name, $.kw_set, $.kw_schema, $.name))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_procedure, $.function_with_argtypes, $.kw_set, $.kw_schema, $.name))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_routine, $.function_with_argtypes, $.kw_set, $.kw_schema, $.name))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_table, $.relation_expr, $.kw_set, $.kw_schema, $.name))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_table, $.kw_if, $.kw_exists, $.relation_expr, $.kw_set, $.kw_schema, $.name))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_statistics, $.any_name, $.kw_set, $.kw_schema, $.name))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_text, $.kw_search, $.kw_parser, $.any_name, $.kw_set, $.kw_schema, $.name))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_text, $.kw_search, $.kw_dictionary, $.any_name, $.kw_set, $.kw_schema, $.name))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_text, $.kw_search, $.kw_template, $.any_name, $.kw_set, $.kw_schema, $.name))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_text, $.kw_search, $.kw_configuration, $.any_name, $.kw_set, $.kw_schema, $.name))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_sequence, $.qualified_name, $.kw_set, $.kw_schema, $.name))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_sequence, $.kw_if, $.kw_exists, $.qualified_name, $.kw_set, $.kw_schema, $.name))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_view, $.qualified_name, $.kw_set, $.kw_schema, $.name))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_view, $.kw_if, $.kw_exists, $.qualified_name, $.kw_set, $.kw_schema, $.name))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_materialized, $.kw_view, $.qualified_name, $.kw_set, $.kw_schema, $.name))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_materialized, $.kw_view, $.kw_if, $.kw_exists, $.qualified_name, $.kw_set, $.kw_schema, $.name))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_foreign, $.kw_table, $.relation_expr, $.kw_set, $.kw_schema, $.name))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_foreign, $.kw_table, $.kw_if, $.kw_exists, $.relation_expr, $.kw_set, $.kw_schema, $.name))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_type, $.any_name, $.kw_set, $.kw_schema, $.name)))
      ),
    AlterOperatorStmt: $ => prec.left(12, prec.dynamic(12, seq($.kw_alter, $.kw_operator, $.operator_with_argtypes, $.kw_set, '(', $.operator_def_list, ')'))),
    operator_def_list: $ => choice(
        $.operator_def_elem,
        seq($.operator_def_list, ',', $.operator_def_elem)
      ),
    operator_def_elem: $ => choice(
        prec.left(7, prec.dynamic(7, seq($.ColLabel, '=', $.kw_none))),
        prec.left(7, prec.dynamic(7, seq($.ColLabel, '=', $.operator_def_arg))),
        $.ColLabel
      ),
    operator_def_arg: $ => choice(
        $.func_type,
        $.reserved_keyword,
        $.qual_all_Op,
        $.NumericOnly,
        $.Sconst
      ),
    AlterTypeStmt: $ => prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_type, $.any_name, $.kw_set, '(', $.operator_def_list, ')'))),
    AlterOwnerStmt: $ => choice(
        seq($.kw_alter, $.kw_aggregate, $.aggregate_with_argtypes, $.kw_owner, $.kw_to, $.RoleSpec),
        seq($.kw_alter, $.kw_collation, $.any_name, $.kw_owner, $.kw_to, $.RoleSpec),
        seq($.kw_alter, $.kw_conversion, $.any_name, $.kw_owner, $.kw_to, $.RoleSpec),
        seq($.kw_alter, $.kw_database, $.name, $.kw_owner, $.kw_to, $.RoleSpec),
        seq($.kw_alter, $.kw_domain, $.any_name, $.kw_owner, $.kw_to, $.RoleSpec),
        seq($.kw_alter, $.kw_function, $.function_with_argtypes, $.kw_owner, $.kw_to, $.RoleSpec),
        seq($.kw_alter, optional($.opt_procedural), $.kw_language, $.name, $.kw_owner, $.kw_to, $.RoleSpec),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_large, $.kw_object, $.NumericOnly, $.kw_owner, $.kw_to, $.RoleSpec))),
        prec.left(12, prec.dynamic(12, seq($.kw_alter, $.kw_operator, $.operator_with_argtypes, $.kw_owner, $.kw_to, $.RoleSpec))),
        prec.left(12, prec.dynamic(12, seq($.kw_alter, $.kw_operator, $.kw_class, $.any_name, $.kw_using, $.name, $.kw_owner, $.kw_to, $.RoleSpec))),
        prec.left(12, prec.dynamic(12, seq($.kw_alter, $.kw_operator, $.kw_family, $.any_name, $.kw_using, $.name, $.kw_owner, $.kw_to, $.RoleSpec))),
        seq($.kw_alter, $.kw_procedure, $.function_with_argtypes, $.kw_owner, $.kw_to, $.RoleSpec),
        seq($.kw_alter, $.kw_routine, $.function_with_argtypes, $.kw_owner, $.kw_to, $.RoleSpec),
        seq($.kw_alter, $.kw_schema, $.name, $.kw_owner, $.kw_to, $.RoleSpec),
        seq($.kw_alter, $.kw_type, $.any_name, $.kw_owner, $.kw_to, $.RoleSpec),
        seq($.kw_alter, $.kw_tablespace, $.name, $.kw_owner, $.kw_to, $.RoleSpec),
        seq($.kw_alter, $.kw_statistics, $.any_name, $.kw_owner, $.kw_to, $.RoleSpec),
        seq($.kw_alter, $.kw_text, $.kw_search, $.kw_dictionary, $.any_name, $.kw_owner, $.kw_to, $.RoleSpec),
        seq($.kw_alter, $.kw_text, $.kw_search, $.kw_configuration, $.any_name, $.kw_owner, $.kw_to, $.RoleSpec),
        seq($.kw_alter, $.kw_foreign, $.kw_data, $.kw_wrapper, $.name, $.kw_owner, $.kw_to, $.RoleSpec),
        seq($.kw_alter, $.kw_server, $.name, $.kw_owner, $.kw_to, $.RoleSpec),
        seq($.kw_alter, $.kw_event, $.kw_trigger, $.name, $.kw_owner, $.kw_to, $.RoleSpec),
        seq($.kw_alter, $.kw_publication, $.name, $.kw_owner, $.kw_to, $.RoleSpec),
        seq($.kw_alter, $.kw_subscription, $.name, $.kw_owner, $.kw_to, $.RoleSpec)
      ),
    CreatePublicationStmt: $ => choice(
        seq($.kw_create, $.kw_publication, $.name, optional($.opt_definition)),
        seq($.kw_create, $.kw_publication, $.name, $.kw_for, $.kw_all, $.kw_tables, optional($.opt_definition)),
        seq($.kw_create, $.kw_publication, $.name, $.kw_for, $.pub_obj_list, optional($.opt_definition))
      ),
    PublicationObjSpec: $ => choice(
        seq($.kw_table, $.relation_expr, optional($.opt_column_list), optional($.OptWhereClause)),
        prec.left(8, prec.dynamic(8, seq($.kw_tables, $.kw_in, $.kw_schema, $.ColId))),
        prec.left(8, prec.dynamic(8, seq($.kw_tables, $.kw_in, $.kw_schema, $.kw_current_schema))),
        seq($.ColId, optional($.opt_column_list), optional($.OptWhereClause)),
        seq($.ColId, $.indirection, optional($.opt_column_list), optional($.OptWhereClause)),
        seq($.extended_relation_expr, optional($.opt_column_list), optional($.OptWhereClause)),
        $.kw_current_schema
      ),
    pub_obj_list: $ => choice(
        $.PublicationObjSpec,
        seq($.pub_obj_list, ',', $.PublicationObjSpec)
      ),
    AlterPublicationStmt: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_publication, $.name, $.kw_set, $.definition))),
        seq($.kw_alter, $.kw_publication, $.name, $.kw_add, $.pub_obj_list),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_publication, $.name, $.kw_set, $.pub_obj_list))),
        seq($.kw_alter, $.kw_publication, $.name, $.kw_drop, $.pub_obj_list)
      ),
    CreateSubscriptionStmt: $ => seq($.kw_create, $.kw_subscription, $.name, $.kw_connection, $.Sconst, $.kw_publication, $.name_list, optional($.opt_definition)),
    AlterSubscriptionStmt: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_subscription, $.name, $.kw_set, $.definition))),
        seq($.kw_alter, $.kw_subscription, $.name, $.kw_connection, $.Sconst),
        seq($.kw_alter, $.kw_subscription, $.name, $.kw_refresh, $.kw_publication, optional($.opt_definition)),
        seq($.kw_alter, $.kw_subscription, $.name, $.kw_add, $.kw_publication, $.name_list, optional($.opt_definition)),
        seq($.kw_alter, $.kw_subscription, $.name, $.kw_drop, $.kw_publication, $.name_list, optional($.opt_definition)),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_subscription, $.name, $.kw_set, $.kw_publication, $.name_list, optional($.opt_definition)))),
        seq($.kw_alter, $.kw_subscription, $.name, $.kw_enable),
        seq($.kw_alter, $.kw_subscription, $.name, $.kw_disable),
        seq($.kw_alter, $.kw_subscription, $.name, $.kw_skip, $.definition)
      ),
    DropSubscriptionStmt: $ => choice(
        seq($.kw_drop, $.kw_subscription, $.name, optional($.opt_drop_behavior)),
        seq($.kw_drop, $.kw_subscription, $.kw_if, $.kw_exists, $.name, optional($.opt_drop_behavior))
      ),
    RuleStmt: $ => seq($.kw_create, optional($.opt_or_replace), $.kw_rule, $.name, $.kw_as, $.kw_on, $.event, $.kw_to, $.qualified_name, optional($.where_clause), $.kw_do, optional($.opt_instead), $.RuleActionList),
    RuleActionList: $ => choice(
        $.kw_nothing,
        $.RuleActionStmt,
        prec.left(20, prec.dynamic(20, seq('(', optional($.RuleActionMulti), ')')))
      ),
    RuleActionMulti: $ => choice(
        seq(optional($.RuleActionMulti), ';', optional($.RuleActionStmtOrEmpty)),
        $.RuleActionStmtOrEmpty
      ),
    RuleActionStmt: $ => choice(
        $.SelectStmt,
        $.InsertStmt,
        $.UpdateStmt,
        $.DeleteStmt,
        $.NotifyStmt
      ),
    RuleActionStmtOrEmpty: $ => $.RuleActionStmt,
    event: $ => choice(
        $.kw_select,
        $.kw_update,
        $.kw_delete,
        $.kw_insert
      ),
    opt_instead: $ => choice(
        $.kw_instead,
        $.kw_also
      ),
    NotifyStmt: $ => seq($.kw_notify, $.ColId, optional($.notify_payload)),
    notify_payload: $ => seq(',', $.Sconst),
    ListenStmt: $ => seq($.kw_listen, $.ColId),
    UnlistenStmt: $ => choice(
        seq($.kw_unlisten, $.ColId),
        prec.left(14, prec.dynamic(14, seq($.kw_unlisten, '*')))
      ),
    TransactionStmt: $ => choice(
        seq($.kw_abort, optional($.opt_transaction), optional($.opt_transaction_chain)),
        seq($.kw_start, $.kw_transaction, optional($.transaction_mode_list_or_empty)),
        seq($.kw_commit, optional($.opt_transaction), optional($.opt_transaction_chain)),
        seq($.kw_rollback, optional($.opt_transaction), optional($.opt_transaction_chain)),
        seq($.kw_savepoint, $.ColId),
        seq($.kw_release, $.kw_savepoint, $.ColId),
        seq($.kw_release, $.ColId),
        seq($.kw_rollback, optional($.opt_transaction), $.kw_to, $.kw_savepoint, $.ColId),
        seq($.kw_rollback, optional($.opt_transaction), $.kw_to, $.ColId),
        seq($.kw_prepare, $.kw_transaction, $.Sconst),
        seq($.kw_commit, $.kw_prepared, $.Sconst),
        seq($.kw_rollback, $.kw_prepared, $.Sconst)
      ),
    TransactionStmtLegacy: $ => choice(
        seq($.kw_begin, optional($.opt_transaction), optional($.transaction_mode_list_or_empty)),
        seq($.kw_end, optional($.opt_transaction), optional($.opt_transaction_chain))
      ),
    opt_transaction: $ => choice(
        $.kw_work,
        $.kw_transaction
      ),
    transaction_mode_item: $ => choice(
        seq($.kw_isolation, $.kw_level, $.iso_level),
        seq($.kw_read, $.kw_only),
        seq($.kw_read, $.kw_write),
        $.kw_deferrable,
        prec.right(5, prec.dynamic(5, seq($.kw_not, $.kw_deferrable)))
      ),
    transaction_mode_list: $ => choice(
        $.transaction_mode_item,
        seq($.transaction_mode_list, ',', $.transaction_mode_item),
        seq($.transaction_mode_list, $.transaction_mode_item)
      ),
    transaction_mode_list_or_empty: $ => $.transaction_mode_list,
    opt_transaction_chain: $ => choice(
        prec.left(4, prec.dynamic(4, seq($.kw_and, $.kw_chain))),
        prec.left(4, prec.dynamic(4, seq($.kw_and, $.kw_no, $.kw_chain)))
      ),
    ViewStmt: $ => choice(
        seq($.kw_create, optional($.OptTemp), $.kw_view, $.qualified_name, optional($.opt_column_list), optional($.opt_reloptions), $.kw_as, $.SelectStmt, optional($.opt_check_option)),
        prec.left(3, prec.dynamic(3, seq($.kw_create, $.kw_or, $.kw_replace, optional($.OptTemp), $.kw_view, $.qualified_name, optional($.opt_column_list), optional($.opt_reloptions), $.kw_as, $.SelectStmt, optional($.opt_check_option)))),
        prec.left(20, prec.dynamic(20, seq($.kw_create, optional($.OptTemp), $.kw_recursive, $.kw_view, $.qualified_name, '(', $.columnList, ')', optional($.opt_reloptions), $.kw_as, $.SelectStmt, optional($.opt_check_option)))),
        prec.left(3, prec.dynamic(3, seq($.kw_create, $.kw_or, $.kw_replace, optional($.OptTemp), $.kw_recursive, $.kw_view, $.qualified_name, '(', $.columnList, ')', optional($.opt_reloptions), $.kw_as, $.SelectStmt, optional($.opt_check_option))))
      ),
    opt_check_option: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_with, $.kw_check, $.kw_option))),
        prec.left(11, prec.dynamic(11, seq($.kw_with, $.kw_cascaded, $.kw_check, $.kw_option))),
        prec.left(11, prec.dynamic(11, seq($.kw_with, $.kw_local, $.kw_check, $.kw_option)))
      ),
    LoadStmt: $ => seq($.kw_load, $.file_name),
    CreatedbStmt: $ => seq($.kw_create, $.kw_database, $.name, optional($.opt_with), optional($.createdb_opt_list)),
    createdb_opt_list: $ => $.createdb_opt_items,
    createdb_opt_items: $ => choice(
        $.createdb_opt_item,
        seq($.createdb_opt_items, $.createdb_opt_item)
      ),
    createdb_opt_item: $ => choice(
        seq($.createdb_opt_name, optional($.opt_equal), $.NumericOnly),
        seq($.createdb_opt_name, optional($.opt_equal), $.opt_boolean_or_string),
        seq($.createdb_opt_name, optional($.opt_equal), $.kw_default)
      ),
    createdb_opt_name: $ => choice(
        prec.left(11, prec.dynamic(11, $._ident)),
        seq($.kw_connection, $.kw_limit),
        $.kw_encoding,
        $.kw_location,
        $.kw_owner,
        $.kw_tablespace,
        $.kw_template
      ),
    opt_equal: $ => prec.left(7, prec.dynamic(7, '=')),
    AlterDatabaseStmt: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_database, $.name, $.kw_with, optional($.createdb_opt_list)))),
        seq($.kw_alter, $.kw_database, $.name, optional($.createdb_opt_list)),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_database, $.name, $.kw_set, $.kw_tablespace, $.name))),
        seq($.kw_alter, $.kw_database, $.name, $.kw_refresh, $.kw_collation, $.kw_version)
      ),
    AlterDatabaseSetStmt: $ => seq($.kw_alter, $.kw_database, $.name, $.SetResetClause),
    DropdbStmt: $ => choice(
        seq($.kw_drop, $.kw_database, $.name),
        seq($.kw_drop, $.kw_database, $.kw_if, $.kw_exists, $.name),
        prec.left(20, prec.dynamic(20, seq($.kw_drop, $.kw_database, $.name, optional($.opt_with), '(', $.drop_option_list, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_drop, $.kw_database, $.kw_if, $.kw_exists, $.name, optional($.opt_with), '(', $.drop_option_list, ')')))
      ),
    drop_option_list: $ => choice(
        $.drop_option,
        seq($.drop_option_list, ',', $.drop_option)
      ),
    drop_option: $ => $.kw_force,
    AlterCollationStmt: $ => seq($.kw_alter, $.kw_collation, $.any_name, $.kw_refresh, $.kw_version),
    AlterSystemStmt: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_system, $.kw_set, $.generic_set))),
        seq($.kw_alter, $.kw_system, $.kw_reset, $.generic_reset)
      ),
    CreateDomainStmt: $ => seq($.kw_create, $.kw_domain, $.any_name, optional($.opt_as), $.Typename, optional($.ColQualList)),
    AlterDomainStmt: $ => choice(
        seq($.kw_alter, $.kw_domain, $.any_name, $.alter_column_default),
        prec.right(5, prec.dynamic(5, seq($.kw_alter, $.kw_domain, $.any_name, $.kw_drop, $.kw_not, $.kw_null))),
        prec.left(11, prec.dynamic(11, seq($.kw_alter, $.kw_domain, $.any_name, $.kw_set, $.kw_not, $.kw_null))),
        seq($.kw_alter, $.kw_domain, $.any_name, $.kw_add, $.DomainConstraint),
        seq($.kw_alter, $.kw_domain, $.any_name, $.kw_drop, $.kw_constraint, $.name, optional($.opt_drop_behavior)),
        seq($.kw_alter, $.kw_domain, $.any_name, $.kw_drop, $.kw_constraint, $.kw_if, $.kw_exists, $.name, optional($.opt_drop_behavior)),
        seq($.kw_alter, $.kw_domain, $.any_name, $.kw_validate, $.kw_constraint, $.name)
      ),
    opt_as: $ => $.kw_as,
    AlterTSDictionaryStmt: $ => seq($.kw_alter, $.kw_text, $.kw_search, $.kw_dictionary, $.any_name, $.definition),
    AlterTSConfigurationStmt: $ => choice(
        seq($.kw_alter, $.kw_text, $.kw_search, $.kw_configuration, $.any_name, $.kw_add, $.kw_mapping, $.kw_for, $.name_list, $.any_with, $.any_name_list),
        seq($.kw_alter, $.kw_text, $.kw_search, $.kw_configuration, $.any_name, $.kw_alter, $.kw_mapping, $.kw_for, $.name_list, $.any_with, $.any_name_list),
        seq($.kw_alter, $.kw_text, $.kw_search, $.kw_configuration, $.any_name, $.kw_alter, $.kw_mapping, $.kw_replace, $.any_name, $.any_with, $.any_name),
        seq($.kw_alter, $.kw_text, $.kw_search, $.kw_configuration, $.any_name, $.kw_alter, $.kw_mapping, $.kw_for, $.name_list, $.kw_replace, $.any_name, $.any_with, $.any_name),
        seq($.kw_alter, $.kw_text, $.kw_search, $.kw_configuration, $.any_name, $.kw_drop, $.kw_mapping, $.kw_for, $.name_list),
        seq($.kw_alter, $.kw_text, $.kw_search, $.kw_configuration, $.any_name, $.kw_drop, $.kw_mapping, $.kw_if, $.kw_exists, $.kw_for, $.name_list)
      ),
    any_with: $ => choice(
        prec.left(11, prec.dynamic(11, $.kw_with)),
        $.kw_with
      ),
    CreateConversionStmt: $ => seq($.kw_create, optional($.opt_default), $.kw_conversion, $.any_name, $.kw_for, $.Sconst, $.kw_to, $.Sconst, $.kw_from, $.any_name),
    ClusterStmt: $ => choice(
        prec.left(20, prec.dynamic(20, seq($.kw_cluster, '(', $.utility_option_list, ')', $.qualified_name, optional($.cluster_index_specification)))),
        prec.left(20, prec.dynamic(20, seq($.kw_cluster, '(', $.utility_option_list, ')'))),
        seq($.kw_cluster, optional($.opt_verbose), $.qualified_name, optional($.cluster_index_specification)),
        seq($.kw_cluster, optional($.opt_verbose)),
        seq($.kw_cluster, optional($.opt_verbose), $.name, $.kw_on, $.qualified_name)
      ),
    cluster_index_specification: $ => seq($.kw_using, $.name),
    VacuumStmt: $ => choice(
        seq($.kw_vacuum, optional($.opt_full), optional($.opt_freeze), optional($.opt_verbose), optional($.opt_analyze), optional($.opt_vacuum_relation_list)),
        prec.left(20, prec.dynamic(20, seq($.kw_vacuum, '(', $.utility_option_list, ')', optional($.opt_vacuum_relation_list))))
      ),
    AnalyzeStmt: $ => choice(
        seq($.analyze_keyword, optional($.opt_verbose), optional($.opt_vacuum_relation_list)),
        prec.left(20, prec.dynamic(20, seq($.analyze_keyword, '(', $.utility_option_list, ')', optional($.opt_vacuum_relation_list))))
      ),
    utility_option_list: $ => choice(
        $.utility_option_elem,
        seq($.utility_option_list, ',', $.utility_option_elem)
      ),
    analyze_keyword: $ => choice(
        $.kw_analyze,
        $.kw_analyse
      ),
    utility_option_elem: $ => seq($.utility_option_name, optional($.utility_option_arg)),
    utility_option_name: $ => choice(
        $.NonReservedWord,
        $.analyze_keyword,
        $.kw_format
      ),
    utility_option_arg: $ => choice(
        $.opt_boolean_or_string,
        $.NumericOnly
      ),
    opt_analyze: $ => $.analyze_keyword,
    opt_verbose: $ => $.kw_verbose,
    opt_full: $ => prec.left(23, prec.dynamic(23, $.kw_full)),
    opt_freeze: $ => $.kw_freeze,
    opt_name_list: $ => prec.left(20, prec.dynamic(20, seq('(', $.name_list, ')'))),
    vacuum_relation: $ => seq($.relation_expr, optional($.opt_name_list)),
    vacuum_relation_list: $ => choice(
        $.vacuum_relation,
        seq($.vacuum_relation_list, ',', $.vacuum_relation)
      ),
    opt_vacuum_relation_list: $ => $.vacuum_relation_list,
    ExplainStmt: $ => choice(
        seq($.kw_explain, $.ExplainableStmt),
        seq($.kw_explain, $.analyze_keyword, optional($.opt_verbose), $.ExplainableStmt),
        seq($.kw_explain, $.kw_verbose, $.ExplainableStmt),
        prec.left(20, prec.dynamic(20, seq($.kw_explain, '(', $.utility_option_list, ')', $.ExplainableStmt)))
      ),
    ExplainableStmt: $ => choice(
        $.SelectStmt,
        $.InsertStmt,
        $.UpdateStmt,
        $.DeleteStmt,
        $.MergeStmt,
        $.DeclareCursorStmt,
        $.CreateAsStmt,
        $.CreateMatViewStmt,
        $.RefreshMatViewStmt,
        $.ExecuteStmt
      ),
    PrepareStmt: $ => seq($.kw_prepare, $.name, optional($.prep_type_clause), $.kw_as, $.PreparableStmt),
    prep_type_clause: $ => prec.left(20, prec.dynamic(20, seq('(', $.type_list, ')'))),
    PreparableStmt: $ => choice(
        $.SelectStmt,
        $.InsertStmt,
        $.UpdateStmt,
        $.DeleteStmt,
        $.MergeStmt
      ),
    ExecuteStmt: $ => choice(
        seq($.kw_execute, $.name, optional($.execute_param_clause)),
        seq($.kw_create, optional($.OptTemp), $.kw_table, $.create_as_target, $.kw_as, $.kw_execute, $.name, optional($.execute_param_clause), optional($.opt_with_data)),
        prec.right(5, prec.dynamic(5, seq($.kw_create, optional($.OptTemp), $.kw_table, $.kw_if, $.kw_not, $.kw_exists, $.create_as_target, $.kw_as, $.kw_execute, $.name, optional($.execute_param_clause), optional($.opt_with_data))))
      ),
    execute_param_clause: $ => prec.left(20, prec.dynamic(20, seq('(', $.expr_list, ')'))),
    DeallocateStmt: $ => choice(
        seq($.kw_deallocate, $.name),
        seq($.kw_deallocate, $.kw_prepare, $.name),
        seq($.kw_deallocate, $.kw_all),
        seq($.kw_deallocate, $.kw_prepare, $.kw_all)
      ),
    InsertStmt: $ => seq(optional($.opt_with_clause), $.kw_insert, $.kw_into, $.insert_target, $.insert_rest, optional($.opt_on_conflict), optional($.returning_clause)),
    insert_target: $ => choice(
        $.qualified_name,
        seq($.qualified_name, $.kw_as, $.ColId)
      ),
    insert_rest: $ => choice(
        $.SelectStmt,
        prec.left(11, prec.dynamic(11, seq($.kw_overriding, $.override_kind, $.kw_value, $.SelectStmt))),
        prec.left(20, prec.dynamic(20, seq('(', $.insert_column_list, ')', $.SelectStmt))),
        prec.left(20, prec.dynamic(20, seq('(', $.insert_column_list, ')', $.kw_overriding, $.override_kind, $.kw_value, $.SelectStmt))),
        seq($.kw_default, $.kw_values)
      ),
    override_kind: $ => choice(
        $.kw_user,
        $.kw_system
      ),
    insert_column_list: $ => choice(
        $.insert_column_item,
        seq($.insert_column_list, ',', $.insert_column_item)
      ),
    insert_column_item: $ => seq($.ColId, optional($.opt_indirection)),
    opt_on_conflict: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_on, $.kw_conflict, optional($.opt_conf_expr), $.kw_do, $.kw_update, $.kw_set, $.set_clause_list, optional($.where_clause)))),
        seq($.kw_on, $.kw_conflict, optional($.opt_conf_expr), $.kw_do, $.kw_nothing)
      ),
    opt_conf_expr: $ => choice(
        prec.left(20, prec.dynamic(20, seq('(', $.index_params, ')', optional($.where_clause)))),
        seq($.kw_on, $.kw_constraint, $.name)
      ),
    returning_clause: $ => seq($.kw_returning, optional($.returning_with_clause), $.target_list),
    returning_with_clause: $ => prec.left(11, prec.dynamic(11, seq($.kw_with, '(', $.returning_options, ')'))),
    returning_options: $ => choice(
        $.returning_option,
        seq($.returning_options, ',', $.returning_option)
      ),
    returning_option: $ => seq($.returning_option_kind, $.kw_as, $.ColId),
    returning_option_kind: $ => choice(
        $.kw_old,
        $.kw_new
      ),
    DeleteStmt: $ => seq(optional($.opt_with_clause), $.kw_delete, $.kw_from, $.relation_expr_opt_alias, optional($.using_clause), optional($.where_or_current_clause), optional($.returning_clause)),
    using_clause: $ => seq($.kw_using, $.from_list),
    LockStmt: $ => seq($.kw_lock, optional($.opt_table), $.relation_expr_list, optional($.opt_lock), optional($.opt_nowait)),
    opt_lock: $ => prec.left(8, prec.dynamic(8, seq($.kw_in, $.lock_type, $.kw_mode))),
    lock_type: $ => choice(
        seq($.kw_access, $.kw_share),
        seq($.kw_row, $.kw_share),
        seq($.kw_row, $.kw_exclusive),
        seq($.kw_share, $.kw_update, $.kw_exclusive),
        $.kw_share,
        seq($.kw_share, $.kw_row, $.kw_exclusive),
        $.kw_exclusive,
        seq($.kw_access, $.kw_exclusive)
      ),
    opt_nowait: $ => $.kw_nowait,
    opt_nowait_or_skip: $ => choice(
        $.kw_nowait,
        seq($.kw_skip, $.kw_locked)
      ),
    UpdateStmt: $ => prec.left(11, prec.dynamic(11, seq(optional($.opt_with_clause), $.kw_update, $.relation_expr_opt_alias, $.kw_set, $.set_clause_list, optional($.from_clause), optional($.where_or_current_clause), optional($.returning_clause)))),
    set_clause_list: $ => choice(
        $.set_clause,
        seq($.set_clause_list, ',', $.set_clause)
      ),
    set_clause: $ => choice(
        prec.left(7, prec.dynamic(7, seq($.set_target, '=', $.a_expr))),
        prec.left(20, prec.dynamic(20, seq('(', $.set_target_list, ')', '=', $.a_expr)))
      ),
    set_target: $ => seq($.ColId, optional($.opt_indirection)),
    set_target_list: $ => choice(
        $.set_target,
        seq($.set_target_list, ',', $.set_target)
      ),
    MergeStmt: $ => seq(optional($.opt_with_clause), $.kw_merge, $.kw_into, $.relation_expr_opt_alias, $.kw_using, $.table_ref, $.kw_on, $.a_expr, $.merge_when_list, optional($.returning_clause)),
    merge_when_list: $ => choice(
        $.merge_when_clause,
        seq($.merge_when_list, $.merge_when_clause)
      ),
    merge_when_clause: $ => choice(
        seq($.merge_when_tgt_matched, $.opt_merge_when_condition, $.kw_then, $.merge_update),
        seq($.merge_when_tgt_matched, $.opt_merge_when_condition, $.kw_then, $.merge_delete),
        seq($.merge_when_tgt_not_matched, $.opt_merge_when_condition, $.kw_then, $.merge_insert),
        seq($.merge_when_tgt_matched, $.opt_merge_when_condition, $.kw_then, $.kw_do, $.kw_nothing),
        seq($.merge_when_tgt_not_matched, $.opt_merge_when_condition, $.kw_then, $.kw_do, $.kw_nothing)
      ),
    merge_when_tgt_matched: $ => choice(
        seq($.kw_when, $.kw_matched),
        prec.right(5, prec.dynamic(5, seq($.kw_when, $.kw_not, $.kw_matched, $.kw_by, $.kw_source)))
      ),
    merge_when_tgt_not_matched: $ => choice(
        prec.right(5, prec.dynamic(5, seq($.kw_when, $.kw_not, $.kw_matched))),
        prec.right(5, prec.dynamic(5, seq($.kw_when, $.kw_not, $.kw_matched, $.kw_by, $.kw_target)))
      ),
    opt_merge_when_condition: $ => prec.left(4, prec.dynamic(4, seq($.kw_and, $.a_expr))),
    merge_update: $ => prec.left(11, prec.dynamic(11, seq($.kw_update, $.kw_set, $.set_clause_list))),
    merge_delete: $ => $.kw_delete,
    merge_insert: $ => choice(
        seq($.kw_insert, $.merge_values_clause),
        prec.left(11, prec.dynamic(11, seq($.kw_insert, $.kw_overriding, $.override_kind, $.kw_value, $.merge_values_clause))),
        prec.left(20, prec.dynamic(20, seq($.kw_insert, '(', $.insert_column_list, ')', $.merge_values_clause))),
        prec.left(20, prec.dynamic(20, seq($.kw_insert, '(', $.insert_column_list, ')', $.kw_overriding, $.override_kind, $.kw_value, $.merge_values_clause))),
        seq($.kw_insert, $.kw_default, $.kw_values)
      ),
    merge_values_clause: $ => prec.left(20, prec.dynamic(20, seq($.kw_values, '(', $.expr_list, ')'))),
    DeclareCursorStmt: $ => seq($.kw_declare, $.cursor_name, optional($.cursor_options), $.kw_cursor, optional($.opt_hold), $.kw_for, $.SelectStmt),
    cursor_name: $ => $.name,
    cursor_options: $ => choice(
        seq(optional($.cursor_options), $.kw_no, $.kw_scroll),
        seq(optional($.cursor_options), $.kw_scroll),
        seq(optional($.cursor_options), $.kw_binary),
        seq(optional($.cursor_options), $.kw_asensitive),
        seq(optional($.cursor_options), $.kw_insensitive)
      ),
    opt_hold: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_with, $.kw_hold))),
        prec.left(11, prec.dynamic(11, seq($.kw_without, $.kw_hold)))
      ),
    SelectStmt: $ => choice(
        prec.right(18, prec.dynamic(18, $.select_no_parens)),
        prec.right(18, prec.dynamic(18, $.select_with_parens))
      ),
    select_with_parens: $ => choice(
        prec.left(20, prec.dynamic(20, seq('(', $.select_no_parens, ')'))),
        prec.left(20, prec.dynamic(20, seq('(', $.select_with_parens, ')')))
      ),
    select_no_parens: $ => choice(
        $.simple_select,
        seq($.select_clause, $.sort_clause),
        seq($.select_clause, optional($.opt_sort_clause), $.for_locking_clause, optional($.opt_select_limit)),
        seq($.select_clause, optional($.opt_sort_clause), $.select_limit, optional($.opt_for_locking_clause)),
        seq($.with_clause, $.select_clause),
        seq($.with_clause, $.select_clause, $.sort_clause),
        seq($.with_clause, $.select_clause, optional($.opt_sort_clause), $.for_locking_clause, optional($.opt_select_limit)),
        seq($.with_clause, $.select_clause, optional($.opt_sort_clause), $.select_limit, optional($.opt_for_locking_clause))
      ),
    select_clause: $ => choice(
        $.simple_select,
        $.select_with_parens
      ),
    simple_select: $ => choice(
        seq($.kw_select, optional($.opt_all_clause), optional($.opt_target_list), optional($.into_clause), optional($.from_clause), optional($.where_clause), optional($.group_clause), optional($.having_clause), optional($.window_clause)),
        seq($.kw_select, $.distinct_clause, $.target_list, optional($.into_clause), optional($.from_clause), optional($.where_clause), optional($.group_clause), optional($.having_clause), optional($.window_clause)),
        $.values_clause,
        seq($.kw_table, $.relation_expr),
        prec.left(1, prec.dynamic(1, seq($.select_clause, $.kw_union, optional($.set_quantifier), $.select_clause))),
        prec.left(2, prec.dynamic(2, seq($.select_clause, $.kw_intersect, optional($.set_quantifier), $.select_clause))),
        prec.left(1, prec.dynamic(1, seq($.select_clause, $.kw_except, optional($.set_quantifier), $.select_clause)))
      ),
    with_clause: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_with, $.cte_list))),
        seq($.kw_with, $.cte_list),
        prec.left(11, prec.dynamic(11, seq($.kw_with, $.kw_recursive, $.cte_list)))
      ),
    cte_list: $ => choice(
        $.common_table_expr,
        seq($.cte_list, ',', $.common_table_expr)
      ),
    common_table_expr: $ => prec.left(20, prec.dynamic(20, seq($.name, optional($.opt_name_list), $.kw_as, optional($.opt_materialized), '(', $.PreparableStmt, ')', optional($.opt_search_clause), optional($.opt_cycle_clause)))),
    opt_materialized: $ => choice(
        $.kw_materialized,
        prec.right(5, prec.dynamic(5, seq($.kw_not, $.kw_materialized)))
      ),
    opt_search_clause: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_search, $.kw_depth, $.kw_first, $.kw_by, $.columnList, $.kw_set, $.ColId))),
        prec.left(11, prec.dynamic(11, seq($.kw_search, $.kw_breadth, $.kw_first, $.kw_by, $.columnList, $.kw_set, $.ColId)))
      ),
    opt_cycle_clause: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_cycle, $.columnList, $.kw_set, $.ColId, $.kw_to, $.AexprConst, $.kw_default, $.AexprConst, $.kw_using, $.ColId))),
        prec.left(11, prec.dynamic(11, seq($.kw_cycle, $.columnList, $.kw_set, $.ColId, $.kw_using, $.ColId)))
      ),
    opt_with_clause: $ => $.with_clause,
    into_clause: $ => seq($.kw_into, $.OptTempTableName),
    OptTempTableName: $ => choice(
        seq($.kw_temporary, optional($.opt_table), $.qualified_name),
        seq($.kw_temp, optional($.opt_table), $.qualified_name),
        seq($.kw_local, $.kw_temporary, optional($.opt_table), $.qualified_name),
        seq($.kw_local, $.kw_temp, optional($.opt_table), $.qualified_name),
        seq($.kw_global, $.kw_temporary, optional($.opt_table), $.qualified_name),
        seq($.kw_global, $.kw_temp, optional($.opt_table), $.qualified_name),
        seq($.kw_unlogged, optional($.opt_table), $.qualified_name),
        seq($.kw_table, $.qualified_name),
        $.qualified_name
      ),
    opt_table: $ => $.kw_table,
    set_quantifier: $ => choice(
        $.kw_all,
        $.kw_distinct
      ),
    distinct_clause: $ => choice(
        $.kw_distinct,
        prec.left(20, prec.dynamic(20, seq($.kw_distinct, $.kw_on, '(', $.expr_list, ')')))
      ),
    opt_all_clause: $ => $.kw_all,
    opt_distinct_clause: $ => choice(
        $.distinct_clause,
        $.opt_all_clause
      ),
    opt_sort_clause: $ => $.sort_clause,
    sort_clause: $ => seq($.kw_order, $.kw_by, $.sortby_list),
    sortby_list: $ => choice(
        $.sortby,
        seq($.sortby_list, ',', $.sortby)
      ),
    sortby: $ => choice(
        seq($.a_expr, $.kw_using, $.qual_all_Op, optional($.opt_nulls_order)),
        seq($.a_expr, optional($.opt_asc_desc), optional($.opt_nulls_order))
      ),
    select_limit: $ => choice(
        seq($.limit_clause, $.offset_clause),
        seq($.offset_clause, $.limit_clause),
        $.limit_clause,
        $.offset_clause
      ),
    opt_select_limit: $ => $.select_limit,
    limit_clause: $ => choice(
        seq($.kw_limit, $.select_limit_value),
        seq($.kw_limit, $.select_limit_value, ',', $.select_offset_value),
        seq($.kw_fetch, $.first_or_next, $.select_fetch_first_value, $.row_or_rows, $.kw_only),
        prec.left(11, prec.dynamic(11, seq($.kw_fetch, $.first_or_next, $.select_fetch_first_value, $.row_or_rows, $.kw_with, $.kw_ties))),
        seq($.kw_fetch, $.first_or_next, $.row_or_rows, $.kw_only),
        prec.left(11, prec.dynamic(11, seq($.kw_fetch, $.first_or_next, $.row_or_rows, $.kw_with, $.kw_ties)))
      ),
    offset_clause: $ => choice(
        seq($.kw_offset, $.select_offset_value),
        seq($.kw_offset, $.select_fetch_first_value, $.row_or_rows)
      ),
    select_limit_value: $ => choice(
        $.a_expr,
        $.kw_all
      ),
    select_offset_value: $ => $.a_expr,
    select_fetch_first_value: $ => choice(
        $.c_expr,
        prec.left(13, prec.dynamic(13, seq('+', $.I_or_F_const))),
        prec.left(13, prec.dynamic(13, seq('-', $.I_or_F_const)))
      ),
    I_or_F_const: $ => choice(
        $.Iconst,
        $.float_literal
      ),
    row_or_rows: $ => choice(
        $.kw_row,
        prec.left(11, prec.dynamic(11, $.kw_rows))
      ),
    first_or_next: $ => choice(
        $.kw_first,
        $.kw_next
      ),
    group_clause: $ => seq($.kw_group, $.kw_by, optional($.set_quantifier), $.group_by_list),
    group_by_list: $ => choice(
        $.group_by_item,
        seq($.group_by_list, ',', $.group_by_item)
      ),
    group_by_item: $ => choice(
        $.a_expr,
        $.empty_grouping_set,
        $.cube_clause,
        $.rollup_clause,
        $.grouping_sets_clause
      ),
    empty_grouping_set: $ => prec.left(20, prec.dynamic(20, seq('(', ')'))),
    rollup_clause: $ => prec.left(11, prec.dynamic(11, seq($.kw_rollup, '(', $.expr_list, ')'))),
    cube_clause: $ => prec.left(11, prec.dynamic(11, seq($.kw_cube, '(', $.expr_list, ')'))),
    grouping_sets_clause: $ => prec.left(20, prec.dynamic(20, seq($.kw_grouping, $.kw_sets, '(', $.group_by_list, ')'))),
    having_clause: $ => seq($.kw_having, $.a_expr),
    for_locking_clause: $ => choice(
        $.for_locking_items,
        seq($.kw_for, $.kw_read, $.kw_only)
      ),
    opt_for_locking_clause: $ => $.for_locking_clause,
    for_locking_items: $ => choice(
        $.for_locking_item,
        seq($.for_locking_items, $.for_locking_item)
      ),
    for_locking_item: $ => seq($.for_locking_strength, optional($.locked_rels_list), optional($.opt_nowait_or_skip)),
    for_locking_strength: $ => choice(
        seq($.kw_for, $.kw_update),
        seq($.kw_for, $.kw_no, $.kw_key, $.kw_update),
        seq($.kw_for, $.kw_share),
        seq($.kw_for, $.kw_key, $.kw_share)
      ),
    locked_rels_list: $ => seq($.kw_of, $.qualified_name_list),
    values_clause: $ => choice(
        prec.left(20, prec.dynamic(20, seq($.kw_values, '(', $.expr_list, ')'))),
        prec.left(20, prec.dynamic(20, seq($.values_clause, ',', '(', $.expr_list, ')')))
      ),
    from_clause: $ => seq($.kw_from, $.from_list),
    from_list: $ => choice(
        $.table_ref,
        seq($.from_list, ',', $.table_ref)
      ),
    table_ref: $ => choice(
        seq($.relation_expr, optional($.opt_alias_clause)),
        seq($.relation_expr, optional($.opt_alias_clause), $.tablesample_clause),
        seq($.func_table, optional($.func_alias_clause)),
        seq($.kw_lateral, $.func_table, optional($.func_alias_clause)),
        seq($.xmltable, optional($.opt_alias_clause)),
        seq($.kw_lateral, $.xmltable, optional($.opt_alias_clause)),
        seq($.select_with_parens, optional($.opt_alias_clause)),
        seq($.kw_lateral, $.select_with_parens, optional($.opt_alias_clause)),
        $.joined_table,
        prec.left(20, prec.dynamic(20, seq('(', $.joined_table, ')', $.alias_clause))),
        seq($.json_table, optional($.opt_alias_clause)),
        seq($.kw_lateral, $.json_table, optional($.opt_alias_clause))
      ),
    joined_table: $ => choice(
        prec.left(20, prec.dynamic(20, seq('(', $.joined_table, ')'))),
        prec.left(23, prec.dynamic(23, seq($.table_ref, $.kw_cross, $.kw_join, $.table_ref))),
        prec.left(23, prec.dynamic(23, seq($.table_ref, $.join_type, $.kw_join, $.table_ref, $.join_qual))),
        prec.left(23, prec.dynamic(23, seq($.table_ref, $.kw_join, $.table_ref, $.join_qual))),
        prec.left(23, prec.dynamic(23, seq($.table_ref, $.kw_natural, $.join_type, $.kw_join, $.table_ref))),
        prec.left(23, prec.dynamic(23, seq($.table_ref, $.kw_natural, $.kw_join, $.table_ref)))
      ),
    alias_clause: $ => choice(
        prec.left(20, prec.dynamic(20, seq($.kw_as, $.ColId, '(', $.name_list, ')'))),
        seq($.kw_as, $.ColId),
        prec.left(20, prec.dynamic(20, seq($.ColId, '(', $.name_list, ')'))),
        $.ColId
      ),
    opt_alias_clause: $ => $.alias_clause,
    opt_alias_clause_for_join_using: $ => seq($.kw_as, $.ColId),
    func_alias_clause: $ => choice(
        $.alias_clause,
        prec.left(20, prec.dynamic(20, seq($.kw_as, '(', $.TableFuncElementList, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_as, $.ColId, '(', $.TableFuncElementList, ')'))),
        prec.left(20, prec.dynamic(20, seq($.ColId, '(', $.TableFuncElementList, ')')))
      ),
    join_type: $ => choice(
        prec.left(23, prec.dynamic(23, seq($.kw_full, optional($.opt_outer)))),
        prec.left(23, prec.dynamic(23, seq($.kw_left, optional($.opt_outer)))),
        prec.left(23, prec.dynamic(23, seq($.kw_right, optional($.opt_outer)))),
        prec.left(23, prec.dynamic(23, $.kw_inner))
      ),
    opt_outer: $ => $.kw_outer,
    join_qual: $ => choice(
        prec.left(20, prec.dynamic(20, seq($.kw_using, '(', $.name_list, ')', optional($.opt_alias_clause_for_join_using)))),
        seq($.kw_on, $.a_expr)
      ),
    relation_expr: $ => choice(
        $.qualified_name,
        $.extended_relation_expr
      ),
    extended_relation_expr: $ => choice(
        prec.left(14, prec.dynamic(14, seq($.qualified_name, '*'))),
        seq($.kw_only, $.qualified_name),
        prec.left(20, prec.dynamic(20, seq($.kw_only, '(', $.qualified_name, ')')))
      ),
    relation_expr_list: $ => choice(
        $.relation_expr,
        seq($.relation_expr_list, ',', $.relation_expr)
      ),
    relation_expr_opt_alias: $ => choice(
        prec.right(18, prec.dynamic(18, $.relation_expr)),
        seq($.relation_expr, $.ColId),
        seq($.relation_expr, $.kw_as, $.ColId)
      ),
    tablesample_clause: $ => prec.left(20, prec.dynamic(20, seq($.kw_tablesample, $.func_name, '(', $.expr_list, ')', optional($.opt_repeatable_clause)))),
    opt_repeatable_clause: $ => prec.left(20, prec.dynamic(20, seq($.kw_repeatable, '(', $.a_expr, ')'))),
    func_table: $ => choice(
        seq($.func_expr_windowless, optional($.opt_ordinality)),
        prec.left(11, prec.dynamic(11, seq($.kw_rows, $.kw_from, '(', $.rowsfrom_list, ')', optional($.opt_ordinality))))
      ),
    rowsfrom_item: $ => seq($.func_expr_windowless, optional($.opt_col_def_list)),
    rowsfrom_list: $ => choice(
        $.rowsfrom_item,
        seq($.rowsfrom_list, ',', $.rowsfrom_item)
      ),
    opt_col_def_list: $ => prec.left(20, prec.dynamic(20, seq($.kw_as, '(', $.TableFuncElementList, ')'))),
    opt_ordinality: $ => seq($.kw_with, $.kw_ordinality),
    where_clause: $ => seq($.kw_where, $.a_expr),
    where_or_current_clause: $ => choice(
        seq($.kw_where, $.a_expr),
        seq($.kw_where, $.kw_current, $.kw_of, $.cursor_name)
      ),
    OptTableFuncElementList: $ => $.TableFuncElementList,
    TableFuncElementList: $ => choice(
        $.TableFuncElement,
        seq($.TableFuncElementList, ',', $.TableFuncElement)
      ),
    TableFuncElement: $ => seq($.ColId, $.Typename, optional($.opt_collate_clause)),
    xmltable: $ => choice(
        prec.left(20, prec.dynamic(20, seq($.kw_xmltable, '(', $.c_expr, $.xmlexists_argument, $.kw_columns, $.xmltable_column_list, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_xmltable, '(', $.kw_xmlnamespaces, '(', $.xml_namespace_list, ')', ',', $.c_expr, $.xmlexists_argument, $.kw_columns, $.xmltable_column_list, ')')))
      ),
    xmltable_column_list: $ => choice(
        $.xmltable_column_el,
        seq($.xmltable_column_list, ',', $.xmltable_column_el)
      ),
    xmltable_column_el: $ => choice(
        seq($.ColId, $.Typename),
        seq($.ColId, $.Typename, $.xmltable_column_option_list),
        seq($.ColId, $.kw_for, $.kw_ordinality)
      ),
    xmltable_column_option_list: $ => choice(
        $.xmltable_column_option_el,
        seq($.xmltable_column_option_list, $.xmltable_column_option_el)
      ),
    xmltable_column_option_el: $ => choice(
        prec.left(11, prec.dynamic(11, seq($._ident, $.b_expr))),
        seq($.kw_default, $.b_expr),
        prec.right(5, prec.dynamic(5, seq($.kw_not, $.kw_null))),
        $.kw_null,
        prec.left(11, prec.dynamic(11, seq($.kw_path, $.b_expr)))
      ),
    xml_namespace_list: $ => choice(
        $.xml_namespace_el,
        seq($.xml_namespace_list, ',', $.xml_namespace_el)
      ),
    xml_namespace_el: $ => choice(
        seq($.b_expr, $.kw_as, $.ColLabel),
        seq($.kw_default, $.b_expr)
      ),
    json_table: $ => prec.left(20, prec.dynamic(20, seq($.kw_json_table, '(', $.json_value_expr, ',', $.a_expr, optional($.json_table_path_name_opt), optional($.json_passing_clause_opt), $.kw_columns, '(', $.json_table_column_definition_list, ')', optional($.json_on_error_clause_opt), ')'))),
    json_table_path_name_opt: $ => seq($.kw_as, $.name),
    json_table_column_definition_list: $ => choice(
        $.json_table_column_definition,
        seq($.json_table_column_definition_list, ',', $.json_table_column_definition)
      ),
    json_table_column_definition: $ => choice(
        seq($.ColId, $.kw_for, $.kw_ordinality),
        seq($.ColId, $.Typename, optional($.json_table_column_path_clause_opt), optional($.json_wrapper_behavior), optional($.json_quotes_clause_opt), optional($.json_behavior_clause_opt)),
        seq($.ColId, $.Typename, $.json_format_clause, optional($.json_table_column_path_clause_opt), optional($.json_wrapper_behavior), optional($.json_quotes_clause_opt), optional($.json_behavior_clause_opt)),
        seq($.ColId, $.Typename, $.kw_exists, optional($.json_table_column_path_clause_opt), optional($.json_on_error_clause_opt)),
        prec.left(10, prec.dynamic(10, seq($.kw_nested, optional($.path_opt), $.Sconst, $.kw_columns, '(', $.json_table_column_definition_list, ')'))),
        prec.left(10, prec.dynamic(10, seq($.kw_nested, optional($.path_opt), $.Sconst, $.kw_as, $.name, $.kw_columns, '(', $.json_table_column_definition_list, ')')))
      ),
    path_opt: $ => prec.left(11, prec.dynamic(11, $.kw_path)),
    json_table_column_path_clause_opt: $ => prec.left(11, prec.dynamic(11, seq($.kw_path, $.Sconst))),
    Typename: $ => choice(
        seq($.SimpleTypename, optional($.opt_array_bounds)),
        seq($.kw_setof, $.SimpleTypename, optional($.opt_array_bounds)),
        prec.left(19, prec.dynamic(19, seq($.SimpleTypename, $.kw_array, '[', $.Iconst, ']'))),
        prec.left(19, prec.dynamic(19, seq($.kw_setof, $.SimpleTypename, $.kw_array, '[', $.Iconst, ']'))),
        seq($.SimpleTypename, $.kw_array),
        seq($.kw_setof, $.SimpleTypename, $.kw_array)
      ),
    opt_array_bounds: $ => choice(
        prec.left(19, prec.dynamic(19, seq(optional($.opt_array_bounds), '[', ']'))),
        prec.left(19, prec.dynamic(19, seq(optional($.opt_array_bounds), '[', $.Iconst, ']')))
      ),
    SimpleTypename: $ => choice(
        $.GenericType,
        $.Numeric,
        $.Bit,
        $.Character,
        $.ConstDatetime,
        seq($.ConstInterval, optional($.opt_interval)),
        prec.left(20, prec.dynamic(20, seq($.ConstInterval, '(', $.Iconst, ')'))),
        $.JsonType
      ),
    ConstTypename: $ => choice(
        $.Numeric,
        $.ConstBit,
        $.ConstCharacter,
        $.ConstDatetime,
        $.JsonType
      ),
    GenericType: $ => choice(
        seq($.type_function_name, optional($.opt_type_modifiers)),
        seq($.type_function_name, $.attrs, optional($.opt_type_modifiers))
      ),
    opt_type_modifiers: $ => prec.left(20, prec.dynamic(20, seq('(', $.expr_list, ')'))),
    Numeric: $ => choice(
        $.kw_int,
        $.kw_integer,
        $.kw_smallint,
        $.kw_bigint,
        $.kw_real,
        seq($.kw_float, optional($.opt_float)),
        seq($.kw_double, $.kw_precision),
        seq($.kw_decimal, optional($.opt_type_modifiers)),
        seq($.kw_dec, optional($.opt_type_modifiers)),
        seq($.kw_numeric, optional($.opt_type_modifiers)),
        $.kw_boolean
      ),
    opt_float: $ => prec.left(20, prec.dynamic(20, seq('(', $.Iconst, ')'))),
    Bit: $ => choice(
        $.BitWithLength,
        $.BitWithoutLength
      ),
    ConstBit: $ => choice(
        $.BitWithLength,
        $.BitWithoutLength
      ),
    BitWithLength: $ => prec.left(20, prec.dynamic(20, seq($.kw_bit, optional($.opt_varying), '(', $.expr_list, ')'))),
    BitWithoutLength: $ => seq($.kw_bit, optional($.opt_varying)),
    Character: $ => choice(
        $.CharacterWithLength,
        $.CharacterWithoutLength
      ),
    ConstCharacter: $ => choice(
        $.CharacterWithLength,
        $.CharacterWithoutLength
      ),
    CharacterWithLength: $ => prec.left(20, prec.dynamic(20, seq($.character, '(', $.Iconst, ')'))),
    CharacterWithoutLength: $ => $.character,
    character: $ => choice(
        seq($.kw_character, optional($.opt_varying)),
        seq($.kw_char, optional($.opt_varying)),
        $.kw_varchar,
        seq($.kw_national, $.kw_character, optional($.opt_varying)),
        seq($.kw_national, $.kw_char, optional($.opt_varying)),
        seq($.kw_nchar, optional($.opt_varying))
      ),
    opt_varying: $ => $.kw_varying,
    ConstDatetime: $ => choice(
        prec.left(20, prec.dynamic(20, seq($.kw_timestamp, '(', $.Iconst, ')', optional($.opt_timezone)))),
        seq($.kw_timestamp, optional($.opt_timezone)),
        prec.left(20, prec.dynamic(20, seq($.kw_time, '(', $.Iconst, ')', optional($.opt_timezone)))),
        seq($.kw_time, optional($.opt_timezone))
      ),
    ConstInterval: $ => $.kw_interval,
    opt_timezone: $ => choice(
        seq($.kw_with, $.kw_time, $.kw_zone),
        seq($.kw_without, $.kw_time, $.kw_zone)
      ),
    opt_interval: $ => choice(
        $.kw_year,
        $.kw_month,
        $.kw_day,
        $.kw_hour,
        $.kw_minute,
        $.interval_second,
        seq($.kw_year, $.kw_to, $.kw_month),
        seq($.kw_day, $.kw_to, $.kw_hour),
        seq($.kw_day, $.kw_to, $.kw_minute),
        seq($.kw_day, $.kw_to, $.interval_second),
        seq($.kw_hour, $.kw_to, $.kw_minute),
        seq($.kw_hour, $.kw_to, $.interval_second),
        seq($.kw_minute, $.kw_to, $.interval_second)
      ),
    interval_second: $ => choice(
        $.kw_second,
        prec.left(20, prec.dynamic(20, seq($.kw_second, '(', $.Iconst, ')')))
      ),
    JsonType: $ => $.kw_json,
    a_expr_prec: $ => choice(
        $.c_expr,
        prec.left(21, prec.dynamic(21, seq($.a_expr_prec, '::', $.Typename))),
        prec.left(17, prec.dynamic(17, seq($.a_expr_prec, $.kw_collate, $.any_name))),
        prec.left(16, prec.dynamic(16, seq($.a_expr_prec, $.kw_at, $.kw_local))),
        prec.right(18, prec.dynamic(18, seq('+', $.a_expr_prec))),
        prec.right(18, prec.dynamic(18, seq('-', $.a_expr_prec))),
        prec.left(13, prec.dynamic(13, seq($.a_expr_prec, '+', $.a_expr_prec))),
        prec.left(13, prec.dynamic(13, seq($.a_expr_prec, '-', $.a_expr_prec))),
        prec.left(14, prec.dynamic(14, seq($.a_expr_prec, '*', $.a_expr_prec))),
        prec.left(14, prec.dynamic(14, seq($.a_expr_prec, '/', $.a_expr_prec))),
        prec.left(14, prec.dynamic(14, seq($.a_expr_prec, '%', $.a_expr_prec))),
        prec.left(15, prec.dynamic(15, seq($.a_expr_prec, '^', $.a_expr_prec))),
        prec.left(7, prec.dynamic(7, seq($.a_expr_prec, '<', $.a_expr_prec))),
        prec.left(7, prec.dynamic(7, seq($.a_expr_prec, '>', $.a_expr_prec))),
        prec.left(7, prec.dynamic(7, seq($.a_expr_prec, '=', $.a_expr_prec)))
      ),
    a_expr: $ => choice(
        alias($.a_expr_prec, $.a_expr),
        prec.left(16, prec.dynamic(16, seq($.a_expr, $.kw_at, $.kw_time, $.kw_zone, $.a_expr))),
        prec.left(7, prec.dynamic(7, seq($.a_expr, '<=', $.a_expr))),
        prec.left(7, prec.dynamic(7, seq($.a_expr, '>=', $.a_expr))),
        prec.left(7, prec.dynamic(7, seq($.a_expr, '<>', $.a_expr))),
        prec.left(12, prec.dynamic(12, seq($.a_expr, $.qual_Op, $.a_expr))),
        prec.left(12, prec.dynamic(12, seq($.qual_Op, $.a_expr))),
        prec.left(4, prec.dynamic(4, seq($.a_expr, $.kw_and, $.a_expr))),
        prec.left(3, prec.dynamic(3, seq($.a_expr, $.kw_or, $.a_expr))),
        prec.right(5, prec.dynamic(5, seq($.kw_not, $.a_expr))),
        prec.right(5, prec.dynamic(5, seq($.kw_not, $.a_expr))),
        prec.left(8, prec.dynamic(8, seq($.a_expr, $.kw_like, $.a_expr))),
        prec.left(8, prec.dynamic(8, seq($.a_expr, $.kw_like, $.a_expr, $.kw_escape, $.a_expr))),
        prec.left(8, prec.dynamic(8, seq($.a_expr, $.kw_not, $.kw_like, $.a_expr))),
        prec.left(8, prec.dynamic(8, seq($.a_expr, $.kw_not, $.kw_like, $.a_expr, $.kw_escape, $.a_expr))),
        prec.left(8, prec.dynamic(8, seq($.a_expr, $.kw_ilike, $.a_expr))),
        prec.left(8, prec.dynamic(8, seq($.a_expr, $.kw_ilike, $.a_expr, $.kw_escape, $.a_expr))),
        prec.left(8, prec.dynamic(8, seq($.a_expr, $.kw_not, $.kw_ilike, $.a_expr))),
        prec.left(8, prec.dynamic(8, seq($.a_expr, $.kw_not, $.kw_ilike, $.a_expr, $.kw_escape, $.a_expr))),
        prec.left(8, prec.dynamic(8, seq($.a_expr, $.kw_similar, $.kw_to, $.a_expr))),
        prec.left(8, prec.dynamic(8, seq($.a_expr, $.kw_similar, $.kw_to, $.a_expr, $.kw_escape, $.a_expr))),
        prec.left(8, prec.dynamic(8, seq($.a_expr, $.kw_not, $.kw_similar, $.kw_to, $.a_expr))),
        prec.left(8, prec.dynamic(8, seq($.a_expr, $.kw_not, $.kw_similar, $.kw_to, $.a_expr, $.kw_escape, $.a_expr))),
        prec.left(6, prec.dynamic(6, seq($.a_expr, $.kw_is, $.kw_null))),
        prec.left(6, prec.dynamic(6, seq($.a_expr, $.kw_isnull))),
        prec.left(6, prec.dynamic(6, seq($.a_expr, $.kw_is, $.kw_not, $.kw_null))),
        prec.left(6, prec.dynamic(6, seq($.a_expr, $.kw_notnull))),
        seq($.row, $.kw_overlaps, $.row),
        prec.left(6, prec.dynamic(6, seq($.a_expr, $.kw_is, $.kw_true))),
        prec.left(6, prec.dynamic(6, seq($.a_expr, $.kw_is, $.kw_not, $.kw_true))),
        prec.left(6, prec.dynamic(6, seq($.a_expr, $.kw_is, $.kw_false))),
        prec.left(6, prec.dynamic(6, seq($.a_expr, $.kw_is, $.kw_not, $.kw_false))),
        prec.left(6, prec.dynamic(6, seq($.a_expr, $.kw_is, $.kw_unknown))),
        prec.left(6, prec.dynamic(6, seq($.a_expr, $.kw_is, $.kw_not, $.kw_unknown))),
        prec.left(6, prec.dynamic(6, seq($.a_expr, $.kw_is, $.kw_distinct, $.kw_from, $.a_expr))),
        prec.left(6, prec.dynamic(6, seq($.a_expr, $.kw_is, $.kw_not, $.kw_distinct, $.kw_from, $.a_expr))),
        prec.left(8, prec.dynamic(8, seq($.a_expr, $.kw_between, optional($.opt_asymmetric), $.b_expr, $.kw_and, $.a_expr))),
        prec.left(8, prec.dynamic(8, seq($.a_expr, $.kw_not, $.kw_between, optional($.opt_asymmetric), $.b_expr, $.kw_and, $.a_expr))),
        prec.left(8, prec.dynamic(8, seq($.a_expr, $.kw_between, $.kw_symmetric, $.b_expr, $.kw_and, $.a_expr))),
        prec.left(8, prec.dynamic(8, seq($.a_expr, $.kw_not, $.kw_between, $.kw_symmetric, $.b_expr, $.kw_and, $.a_expr))),
        prec.left(8, prec.dynamic(8, seq($.a_expr, $.kw_in, $.select_with_parens))),
        prec.left(8, prec.dynamic(8, seq($.a_expr, $.kw_in, '(', $.expr_list, ')'))),
        prec.left(8, prec.dynamic(8, seq($.a_expr, $.kw_not, $.kw_in, $.select_with_parens))),
        prec.left(8, prec.dynamic(8, seq($.a_expr, $.kw_not, $.kw_in, '(', $.expr_list, ')'))),
        prec.left(12, prec.dynamic(12, seq($.a_expr, $.subquery_Op, $.sub_type, $.select_with_parens))),
        prec.left(12, prec.dynamic(12, seq($.a_expr, $.subquery_Op, $.sub_type, '(', $.a_expr, ')'))),
        seq($.kw_unique, optional($.opt_unique_null_treatment), $.select_with_parens),
        prec.left(6, prec.dynamic(6, seq($.a_expr, $.kw_is, $.kw_document))),
        prec.left(6, prec.dynamic(6, seq($.a_expr, $.kw_is, $.kw_not, $.kw_document))),
        prec.left(6, prec.dynamic(6, seq($.a_expr, $.kw_is, $.kw_normalized))),
        prec.left(6, prec.dynamic(6, seq($.a_expr, $.kw_is, $.unicode_normal_form, $.kw_normalized))),
        prec.left(6, prec.dynamic(6, seq($.a_expr, $.kw_is, $.kw_not, $.kw_normalized))),
        prec.left(6, prec.dynamic(6, seq($.a_expr, $.kw_is, $.kw_not, $.unicode_normal_form, $.kw_normalized))),
        prec.left(6, prec.dynamic(6, seq($.a_expr, $.kw_is, $.json_predicate_type_constraint, optional($.json_key_uniqueness_constraint_opt)))),
        prec.left(6, prec.dynamic(6, seq($.a_expr, $.kw_is, $.kw_not, $.json_predicate_type_constraint, optional($.json_key_uniqueness_constraint_opt)))),
        $.kw_default
      ),
    b_expr_prec: $ => choice(
        $.c_expr,
        prec.left(21, prec.dynamic(21, seq($.b_expr_prec, '::', $.Typename))),
        prec.right(18, prec.dynamic(18, seq('+', $.b_expr_prec))),
        prec.right(18, prec.dynamic(18, seq('-', $.b_expr_prec))),
        prec.left(13, prec.dynamic(13, seq($.b_expr_prec, '+', $.b_expr_prec))),
        prec.left(13, prec.dynamic(13, seq($.b_expr_prec, '-', $.b_expr_prec))),
        prec.left(14, prec.dynamic(14, seq($.b_expr_prec, '*', $.b_expr_prec))),
        prec.left(14, prec.dynamic(14, seq($.b_expr_prec, '/', $.b_expr_prec))),
        prec.left(14, prec.dynamic(14, seq($.b_expr_prec, '%', $.b_expr_prec))),
        prec.left(15, prec.dynamic(15, seq($.b_expr_prec, '^', $.b_expr_prec))),
        prec.left(7, prec.dynamic(7, seq($.b_expr_prec, '<', $.b_expr_prec))),
        prec.left(7, prec.dynamic(7, seq($.b_expr_prec, '>', $.b_expr_prec))),
        prec.left(7, prec.dynamic(7, seq($.b_expr_prec, '=', $.b_expr_prec)))
      ),
    b_expr: $ => choice(
        alias($.b_expr_prec, $.b_expr),
        prec.left(7, prec.dynamic(7, seq($.b_expr, '<=', $.b_expr))),
        prec.left(7, prec.dynamic(7, seq($.b_expr, '>=', $.b_expr))),
        prec.left(7, prec.dynamic(7, seq($.b_expr, '<>', $.b_expr))),
        prec.left(12, prec.dynamic(12, seq($.b_expr, $.qual_Op, $.b_expr))),
        prec.left(12, prec.dynamic(12, seq($.qual_Op, $.b_expr))),
        prec.left(6, prec.dynamic(6, seq($.b_expr, $.kw_is, $.kw_distinct, $.kw_from, $.b_expr))),
        prec.left(6, prec.dynamic(6, seq($.b_expr, $.kw_is, $.kw_not, $.kw_distinct, $.kw_from, $.b_expr))),
        prec.left(6, prec.dynamic(6, seq($.b_expr, $.kw_is, $.kw_document))),
        prec.left(6, prec.dynamic(6, seq($.b_expr, $.kw_is, $.kw_not, $.kw_document)))
      ),
    c_expr: $ => choice(
        $.columnref,
        $.AexprConst,
        seq($.param, optional($.opt_indirection)),
        prec.left(20, prec.dynamic(20, seq('(', $.a_expr, ')', optional($.opt_indirection)))),
        $.case_expr,
        $.func_expr,
        prec.right(18, prec.dynamic(18, $.select_with_parens)),
        seq($.select_with_parens, $.indirection),
        seq($.kw_exists, $.select_with_parens),
        seq($.kw_array, $.select_with_parens),
        seq($.kw_array, $.array_expr),
        $.explicit_row,
        $.implicit_row,
        prec.left(20, prec.dynamic(20, seq($.kw_grouping, '(', $.expr_list, ')')))
      ),
    func_application: $ => choice(
        prec.left(20, prec.dynamic(20, seq($.func_name, '(', ')'))),
        prec.left(20, prec.dynamic(20, seq($.func_name, '(', $.func_arg_list, optional($.opt_sort_clause), ')'))),
        prec.left(20, prec.dynamic(20, seq($.func_name, '(', $.kw_variadic, $.func_arg_expr, optional($.opt_sort_clause), ')'))),
        prec.left(20, prec.dynamic(20, seq($.func_name, '(', $.func_arg_list, ',', $.kw_variadic, $.func_arg_expr, optional($.opt_sort_clause), ')'))),
        prec.left(20, prec.dynamic(20, seq($.func_name, '(', $.kw_all, $.func_arg_list, optional($.opt_sort_clause), ')'))),
        prec.left(20, prec.dynamic(20, seq($.func_name, '(', $.kw_distinct, $.func_arg_list, optional($.opt_sort_clause), ')'))),
        prec.left(20, prec.dynamic(20, seq($.func_name, '(', '*', ')')))
      ),
    func_expr: $ => choice(
        seq($.func_application, optional($.within_group_clause), optional($.filter_clause), optional($.over_clause)),
        seq($.json_aggregate_func, optional($.filter_clause), optional($.over_clause)),
        $.func_expr_common_subexpr
      ),
    func_expr_windowless: $ => choice(
        $.func_application,
        $.func_expr_common_subexpr,
        $.json_aggregate_func
      ),
    func_expr_common_subexpr: $ => choice(
        prec.left(20, prec.dynamic(20, seq($.kw_collation, $.kw_for, '(', $.a_expr, ')'))),
        $.kw_current_date,
        $.kw_current_time,
        prec.left(20, prec.dynamic(20, seq($.kw_current_time, '(', $.Iconst, ')'))),
        $.kw_current_timestamp,
        prec.left(20, prec.dynamic(20, seq($.kw_current_timestamp, '(', $.Iconst, ')'))),
        $.kw_localtime,
        prec.left(20, prec.dynamic(20, seq($.kw_localtime, '(', $.Iconst, ')'))),
        $.kw_localtimestamp,
        prec.left(20, prec.dynamic(20, seq($.kw_localtimestamp, '(', $.Iconst, ')'))),
        $.kw_current_role,
        $.kw_current_user,
        $.kw_session_user,
        $.kw_system_user,
        $.kw_user,
        $.kw_current_catalog,
        $.kw_current_schema,
        prec.left(20, prec.dynamic(20, seq($.kw_cast, '(', $.a_expr, $.kw_as, $.Typename, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_extract, '(', $.extract_list, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_normalize, '(', $.a_expr, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_normalize, '(', $.a_expr, ',', $.unicode_normal_form, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_overlay, '(', $.overlay_list, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_overlay, '(', optional($.func_arg_list_opt), ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_position, '(', $.position_list, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_substring, '(', $.substr_list, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_substring, '(', optional($.func_arg_list_opt), ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_treat, '(', $.a_expr, $.kw_as, $.Typename, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_trim, '(', $.kw_both, $.trim_list, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_trim, '(', $.kw_leading, $.trim_list, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_trim, '(', $.kw_trailing, $.trim_list, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_trim, '(', $.trim_list, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_nullif, '(', $.a_expr, ',', $.a_expr, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_coalesce, '(', $.expr_list, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_greatest, '(', $.expr_list, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_least, '(', $.expr_list, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_xmlconcat, '(', $.expr_list, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_xmlelement, '(', $.kw_name, $.ColLabel, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_xmlelement, '(', $.kw_name, $.ColLabel, ',', $.xml_attributes, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_xmlelement, '(', $.kw_name, $.ColLabel, ',', $.expr_list, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_xmlelement, '(', $.kw_name, $.ColLabel, ',', $.xml_attributes, ',', $.expr_list, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_xmlexists, '(', $.c_expr, $.xmlexists_argument, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_xmlforest, '(', $.xml_attribute_list, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_xmlparse, '(', $.document_or_content, $.a_expr, optional($.xml_whitespace_option), ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_xmlpi, '(', $.kw_name, $.ColLabel, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_xmlpi, '(', $.kw_name, $.ColLabel, ',', $.a_expr, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_xmlroot, '(', $.a_expr, ',', $.xml_root_version, optional($.opt_xml_root_standalone), ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_xmlserialize, '(', $.document_or_content, $.a_expr, $.kw_as, $.SimpleTypename, optional($.xml_indent_option), ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_json_object, '(', $.func_arg_list, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_json_object, '(', $.json_name_and_value_list, optional($.json_object_constructor_null_clause_opt), optional($.json_key_uniqueness_constraint_opt), optional($.json_returning_clause_opt), ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_json_object, '(', optional($.json_returning_clause_opt), ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_json_array, '(', $.json_value_expr_list, optional($.json_array_constructor_null_clause_opt), optional($.json_returning_clause_opt), ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_json_array, '(', $.select_no_parens, optional($.json_format_clause_opt), optional($.json_returning_clause_opt), ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_json_array, '(', optional($.json_returning_clause_opt), ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_json, '(', $.json_value_expr, optional($.json_key_uniqueness_constraint_opt), ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_json_scalar, '(', $.a_expr, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_json_serialize, '(', $.json_value_expr, optional($.json_returning_clause_opt), ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_merge_action, '(', ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_json_query, '(', $.json_value_expr, ',', $.a_expr, optional($.json_passing_clause_opt), optional($.json_returning_clause_opt), optional($.json_wrapper_behavior), optional($.json_quotes_clause_opt), optional($.json_behavior_clause_opt), ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_json_exists, '(', $.json_value_expr, ',', $.a_expr, optional($.json_passing_clause_opt), optional($.json_on_error_clause_opt), ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_json_value, '(', $.json_value_expr, ',', $.a_expr, optional($.json_passing_clause_opt), optional($.json_returning_clause_opt), optional($.json_behavior_clause_opt), ')')))
      ),
    xml_root_version: $ => choice(
        seq($.kw_version, $.a_expr),
        prec.left(11, prec.dynamic(11, seq($.kw_version, $.kw_no, $.kw_value)))
      ),
    opt_xml_root_standalone: $ => choice(
        seq(',', $.kw_standalone, $.kw_yes),
        seq(',', $.kw_standalone, $.kw_no),
        prec.left(11, prec.dynamic(11, seq(',', $.kw_standalone, $.kw_no, $.kw_value)))
      ),
    xml_attributes: $ => prec.left(20, prec.dynamic(20, seq($.kw_xmlattributes, '(', $.xml_attribute_list, ')'))),
    xml_attribute_list: $ => choice(
        $.xml_attribute_el,
        seq($.xml_attribute_list, ',', $.xml_attribute_el)
      ),
    xml_attribute_el: $ => choice(
        seq($.a_expr, $.kw_as, $.ColLabel),
        $.a_expr
      ),
    document_or_content: $ => choice(
        $.kw_document,
        $.kw_content
      ),
    xml_indent_option: $ => choice(
        $.kw_indent,
        seq($.kw_no, $.kw_indent)
      ),
    xml_whitespace_option: $ => choice(
        seq($.kw_preserve, $.kw_whitespace),
        seq($.kw_strip, $.kw_whitespace)
      ),
    xmlexists_argument: $ => choice(
        seq($.kw_passing, $.c_expr),
        seq($.kw_passing, $.c_expr, $.xml_passing_mech),
        seq($.kw_passing, $.xml_passing_mech, $.c_expr),
        seq($.kw_passing, $.xml_passing_mech, $.c_expr, $.xml_passing_mech)
      ),
    xml_passing_mech: $ => choice(
        seq($.kw_by, $.kw_ref),
        prec.left(11, prec.dynamic(11, seq($.kw_by, $.kw_value)))
      ),
    within_group_clause: $ => prec.left(20, prec.dynamic(20, seq($.kw_within, $.kw_group, '(', $.sort_clause, ')'))),
    filter_clause: $ => prec.left(20, prec.dynamic(20, seq($.kw_filter, '(', $.kw_where, $.a_expr, ')'))),
    window_clause: $ => seq($.kw_window, $.window_definition_list),
    window_definition_list: $ => choice(
        $.window_definition,
        seq($.window_definition_list, ',', $.window_definition)
      ),
    window_definition: $ => seq($.ColId, $.kw_as, $.window_specification),
    over_clause: $ => choice(
        seq($.kw_over, $.window_specification),
        seq($.kw_over, $.ColId)
      ),
    window_specification: $ => prec.left(20, prec.dynamic(20, seq('(', optional($.opt_existing_window_name), optional($.opt_partition_clause), optional($.opt_sort_clause), optional($.opt_frame_clause), ')'))),
    opt_existing_window_name: $ => $.ColId,
    opt_partition_clause: $ => prec.left(11, prec.dynamic(11, seq($.kw_partition, $.kw_by, $.expr_list))),
    opt_frame_clause: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_range, $.frame_extent, optional($.opt_window_exclusion_clause)))),
        prec.left(11, prec.dynamic(11, seq($.kw_rows, $.frame_extent, optional($.opt_window_exclusion_clause)))),
        prec.left(11, prec.dynamic(11, seq($.kw_groups, $.frame_extent, optional($.opt_window_exclusion_clause))))
      ),
    frame_extent: $ => choice(
        $.frame_bound,
        prec.left(8, prec.dynamic(8, seq($.kw_between, $.frame_bound, $.kw_and, $.frame_bound)))
      ),
    frame_bound: $ => choice(
        prec.left(10, prec.dynamic(10, seq($.kw_unbounded, $.kw_preceding))),
        prec.left(10, prec.dynamic(10, seq($.kw_unbounded, $.kw_following))),
        seq($.kw_current, $.kw_row),
        prec.left(11, prec.dynamic(11, seq($.a_expr, $.kw_preceding))),
        prec.left(11, prec.dynamic(11, seq($.a_expr, $.kw_following)))
      ),
    opt_window_exclusion_clause: $ => choice(
        seq($.kw_exclude, $.kw_current, $.kw_row),
        seq($.kw_exclude, $.kw_group),
        seq($.kw_exclude, $.kw_ties),
        seq($.kw_exclude, $.kw_no, $.kw_others)
      ),
    row: $ => choice(
        prec.left(20, prec.dynamic(20, seq($.kw_row, '(', $.expr_list, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_row, '(', ')'))),
        prec.left(20, prec.dynamic(20, seq('(', $.expr_list, ',', $.a_expr, ')')))
      ),
    explicit_row: $ => choice(
        prec.left(20, prec.dynamic(20, seq($.kw_row, '(', $.expr_list, ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_row, '(', ')')))
      ),
    implicit_row: $ => prec.left(20, prec.dynamic(20, seq('(', $.expr_list, ',', $.a_expr, ')'))),
    sub_type: $ => choice(
        $.kw_any,
        $.kw_some,
        $.kw_all
      ),
    all_Op: $ => choice(
        prec.left(12, prec.dynamic(12, $.operator)),
        $.MathOp
      ),
    MathOp: $ => choice(
        prec.left(13, prec.dynamic(13, '+')),
        prec.left(13, prec.dynamic(13, '-')),
        prec.left(14, prec.dynamic(14, '*')),
        prec.left(14, prec.dynamic(14, '/')),
        prec.left(14, prec.dynamic(14, '%')),
        prec.left(15, prec.dynamic(15, '^')),
        prec.left(7, prec.dynamic(7, '<')),
        prec.left(7, prec.dynamic(7, '>')),
        prec.left(7, prec.dynamic(7, '=')),
        prec.left(7, prec.dynamic(7, '<=')),
        prec.left(7, prec.dynamic(7, '>=')),
        prec.left(7, prec.dynamic(7, '<>'))
      ),
    qual_Op: $ => choice(
        prec.left(12, prec.dynamic(12, $.operator)),
        prec.left(12, prec.dynamic(12, seq($.kw_operator, '(', $.any_operator, ')')))
      ),
    qual_all_Op: $ => choice(
        $.all_Op,
        prec.left(12, prec.dynamic(12, seq($.kw_operator, '(', $.any_operator, ')')))
      ),
    subquery_Op: $ => choice(
        $.all_Op,
        prec.left(12, prec.dynamic(12, seq($.kw_operator, '(', $.any_operator, ')'))),
        prec.left(8, prec.dynamic(8, $.kw_like)),
        prec.left(8, prec.dynamic(8, seq($.kw_not, $.kw_like))),
        prec.left(8, prec.dynamic(8, $.kw_ilike)),
        prec.left(8, prec.dynamic(8, seq($.kw_not, $.kw_ilike)))
      ),
    expr_list: $ => choice(
        $.a_expr,
        seq($.expr_list, ',', $.a_expr)
      ),
    func_arg_list: $ => choice(
        $.func_arg_expr,
        seq($.func_arg_list, ',', $.func_arg_expr)
      ),
    func_arg_expr: $ => choice(
        $.a_expr,
        seq($.param_name, ':=', $.a_expr),
        seq($.param_name, '=>', $.a_expr)
      ),
    func_arg_list_opt: $ => $.func_arg_list,
    type_list: $ => choice(
        $.Typename,
        seq($.type_list, ',', $.Typename)
      ),
    array_expr: $ => choice(
        prec.left(19, prec.dynamic(19, seq('[', $.expr_list, ']'))),
        prec.left(19, prec.dynamic(19, seq('[', $.array_expr_list, ']'))),
        prec.left(19, prec.dynamic(19, seq('[', ']')))
      ),
    array_expr_list: $ => choice(
        $.array_expr,
        seq($.array_expr_list, ',', $.array_expr)
      ),
    extract_list: $ => seq($.extract_arg, $.kw_from, $.a_expr),
    extract_arg: $ => choice(
        prec.left(11, prec.dynamic(11, $._ident)),
        $.kw_year,
        $.kw_month,
        $.kw_day,
        $.kw_hour,
        $.kw_minute,
        $.kw_second,
        $.Sconst
      ),
    unicode_normal_form: $ => choice(
        $.kw_nfc,
        $.kw_nfd,
        $.kw_nfkc,
        $.kw_nfkd
      ),
    overlay_list: $ => choice(
        seq($.a_expr, $.kw_placing, $.a_expr, $.kw_from, $.a_expr, $.kw_for, $.a_expr),
        seq($.a_expr, $.kw_placing, $.a_expr, $.kw_from, $.a_expr)
      ),
    position_list: $ => prec.left(8, prec.dynamic(8, seq($.b_expr, $.kw_in, $.b_expr))),
    substr_list: $ => choice(
        seq($.a_expr, $.kw_from, $.a_expr, $.kw_for, $.a_expr),
        seq($.a_expr, $.kw_for, $.a_expr, $.kw_from, $.a_expr),
        seq($.a_expr, $.kw_from, $.a_expr),
        seq($.a_expr, $.kw_for, $.a_expr),
        prec.left(8, prec.dynamic(8, seq($.a_expr, $.kw_similar, $.a_expr, $.kw_escape, $.a_expr)))
      ),
    trim_list: $ => choice(
        seq($.a_expr, $.kw_from, $.expr_list),
        seq($.kw_from, $.expr_list),
        $.expr_list
      ),
    case_expr: $ => seq($.kw_case, optional($.case_arg), $.when_clause_list, optional($.case_default), $.kw_end),
    when_clause_list: $ => choice(
        $.when_clause,
        seq($.when_clause_list, $.when_clause)
      ),
    when_clause: $ => seq($.kw_when, $.a_expr, $.kw_then, $.a_expr),
    case_default: $ => seq($.kw_else, $.a_expr),
    case_arg: $ => $.a_expr,
    columnref: $ => choice(
        $.ColId,
        seq($.ColId, $.indirection)
      ),
    indirection_el: $ => choice(
        prec.left(22, prec.dynamic(22, seq('.', $.attr_name))),
        prec.left(22, prec.dynamic(22, seq('.', '*'))),
        prec.left(19, prec.dynamic(19, seq('[', $.a_expr, ']'))),
        prec.left(19, prec.dynamic(19, seq('[', optional($.opt_slice_bound), ':', optional($.opt_slice_bound), ']')))
      ),
    opt_slice_bound: $ => $.a_expr,
    indirection: $ => choice(
        $.indirection_el,
        seq($.indirection, $.indirection_el)
      ),
    opt_indirection: $ => seq(optional($.opt_indirection), $.indirection_el),
    opt_asymmetric: $ => $.kw_asymmetric,
    json_passing_clause_opt: $ => seq($.kw_passing, $.json_arguments),
    json_arguments: $ => choice(
        $.json_argument,
        seq($.json_arguments, ',', $.json_argument)
      ),
    json_argument: $ => seq($.json_value_expr, $.kw_as, $.ColLabel),
    json_wrapper_behavior: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_without, $.kw_wrapper))),
        prec.left(11, prec.dynamic(11, seq($.kw_without, $.kw_array, $.kw_wrapper))),
        prec.left(11, prec.dynamic(11, seq($.kw_with, $.kw_wrapper))),
        prec.left(11, prec.dynamic(11, seq($.kw_with, $.kw_array, $.kw_wrapper))),
        prec.left(11, prec.dynamic(11, seq($.kw_with, $.kw_conditional, $.kw_array, $.kw_wrapper))),
        prec.left(11, prec.dynamic(11, seq($.kw_with, $.kw_unconditional, $.kw_array, $.kw_wrapper))),
        prec.left(11, prec.dynamic(11, seq($.kw_with, $.kw_conditional, $.kw_wrapper))),
        prec.left(11, prec.dynamic(11, seq($.kw_with, $.kw_unconditional, $.kw_wrapper)))
      ),
    json_behavior: $ => choice(
        seq($.kw_default, $.a_expr),
        $.json_behavior_type
      ),
    json_behavior_type: $ => choice(
        $.kw_error,
        $.kw_null,
        $.kw_true,
        $.kw_false,
        $.kw_unknown,
        seq($.kw_empty, $.kw_array),
        prec.left(11, prec.dynamic(11, seq($.kw_empty, $.kw_object))),
        $.kw_empty
      ),
    json_behavior_clause_opt: $ => choice(
        seq($.json_behavior, $.kw_on, $.kw_empty),
        seq($.json_behavior, $.kw_on, $.kw_error),
        seq($.json_behavior, $.kw_on, $.kw_empty, $.json_behavior, $.kw_on, $.kw_error)
      ),
    json_on_error_clause_opt: $ => seq($.json_behavior, $.kw_on, $.kw_error),
    json_value_expr: $ => seq($.a_expr, optional($.json_format_clause_opt)),
    json_format_clause: $ => choice(
        seq($.kw_format, $.kw_json, $.kw_encoding, $.name),
        seq($.kw_format, $.kw_json)
      ),
    json_format_clause_opt: $ => $.json_format_clause,
    json_quotes_clause_opt: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_keep, $.kw_quotes, $.kw_on, $.kw_scalar, $.kw_string))),
        seq($.kw_keep, $.kw_quotes),
        prec.left(11, prec.dynamic(11, seq($.kw_omit, $.kw_quotes, $.kw_on, $.kw_scalar, $.kw_string))),
        seq($.kw_omit, $.kw_quotes)
      ),
    json_returning_clause_opt: $ => seq($.kw_returning, $.Typename, optional($.json_format_clause_opt)),
    json_predicate_type_constraint: $ => choice(
        prec.left(10, prec.dynamic(10, $.kw_json)),
        prec.left(11, prec.dynamic(11, seq($.kw_json, $.kw_value))),
        seq($.kw_json, $.kw_array),
        prec.left(11, prec.dynamic(11, seq($.kw_json, $.kw_object))),
        prec.left(11, prec.dynamic(11, seq($.kw_json, $.kw_scalar)))
      ),
    json_key_uniqueness_constraint_opt: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.kw_with, $.kw_unique, $.kw_keys))),
        prec.left(10, prec.dynamic(10, seq($.kw_with, $.kw_unique))),
        prec.left(11, prec.dynamic(11, seq($.kw_without, $.kw_unique, $.kw_keys))),
        prec.left(10, prec.dynamic(10, seq($.kw_without, $.kw_unique)))
      ),
    json_name_and_value_list: $ => choice(
        $.json_name_and_value,
        seq($.json_name_and_value_list, ',', $.json_name_and_value)
      ),
    json_name_and_value: $ => choice(
        prec.left(11, prec.dynamic(11, seq($.c_expr, $.kw_value, $.json_value_expr))),
        seq($.a_expr, ':', $.json_value_expr)
      ),
    json_object_constructor_null_clause_opt: $ => choice(
        seq($.kw_null, $.kw_on, $.kw_null),
        seq($.kw_absent, $.kw_on, $.kw_null)
      ),
    json_array_constructor_null_clause_opt: $ => choice(
        seq($.kw_null, $.kw_on, $.kw_null),
        seq($.kw_absent, $.kw_on, $.kw_null)
      ),
    json_value_expr_list: $ => choice(
        $.json_value_expr,
        seq($.json_value_expr_list, ',', $.json_value_expr)
      ),
    json_aggregate_func: $ => choice(
        prec.left(20, prec.dynamic(20, seq($.kw_json_objectagg, '(', $.json_name_and_value, optional($.json_object_constructor_null_clause_opt), optional($.json_key_uniqueness_constraint_opt), optional($.json_returning_clause_opt), ')'))),
        prec.left(20, prec.dynamic(20, seq($.kw_json_arrayagg, '(', $.json_value_expr, optional($.json_array_aggregate_order_by_clause_opt), optional($.json_array_constructor_null_clause_opt), optional($.json_returning_clause_opt), ')')))
      ),
    json_array_aggregate_order_by_clause_opt: $ => seq($.kw_order, $.kw_by, $.sortby_list),
    opt_target_list: $ => $.target_list,
    target_list: $ => choice(
        $.target_el,
        seq($.target_list, ',', $.target_el)
      ),
    target_el: $ => choice(
        seq($.a_expr, $.kw_as, $.ColLabel),
        seq($.a_expr, $.BareColLabel),
        $.a_expr,
        prec.left(14, prec.dynamic(14, '*'))
      ),
    qualified_name_list: $ => choice(
        $.qualified_name,
        seq($.qualified_name_list, ',', $.qualified_name)
      ),
    qualified_name: $ => choice(
        $.ColId,
        seq($.ColId, $.indirection)
      ),
    name_list: $ => choice(
        $.name,
        seq($.name_list, ',', $.name)
      ),
    name: $ => $.ColId,
    attr_name: $ => $.ColLabel,
    file_name: $ => $.Sconst,
    func_name: $ => choice(
        $.type_function_name,
        seq($.ColId, $.indirection)
      ),
    AexprConst: $ => choice(
        $.Iconst,
        $.float_literal,
        $.Sconst,
        $.bit_string_literal,
        $.hex_string_literal,
        seq($.func_name, $.Sconst),
        prec.left(20, prec.dynamic(20, seq($.func_name, '(', $.func_arg_list, optional($.opt_sort_clause), ')', $.Sconst))),
        seq($.ConstTypename, $.Sconst),
        seq($.ConstInterval, $.Sconst, optional($.opt_interval)),
        prec.left(20, prec.dynamic(20, seq($.ConstInterval, '(', $.Iconst, ')', $.Sconst))),
        $.kw_true,
        $.kw_false,
        $.kw_null
      ),
    Iconst: $ => $.integer_literal,
    Sconst: $ => choice($.string_literal, $.dollar_quoted_string),
    SignedIconst: $ => choice(
        $.Iconst,
        prec.left(13, prec.dynamic(13, seq('+', $.Iconst))),
        prec.left(13, prec.dynamic(13, seq('-', $.Iconst)))
      ),
    RoleId: $ => $.RoleSpec,
    RoleSpec: $ => choice(
        $.NonReservedWord,
        $.kw_current_role,
        $.kw_current_user,
        $.kw_session_user
      ),
    role_list: $ => choice(
        $.RoleSpec,
        seq($.role_list, ',', $.RoleSpec)
      ),
    PLpgSQL_Expr: $ => choice(
        seq($.opt_distinct_clause, optional($.opt_target_list), optional($.from_clause), optional($.where_clause), optional($.group_clause), optional($.having_clause), optional($.window_clause), optional($.opt_sort_clause), optional($.opt_select_limit), optional($.opt_for_locking_clause)),
        seq($.opt_target_list, optional($.from_clause), optional($.where_clause), optional($.group_clause), optional($.having_clause), optional($.window_clause), optional($.opt_sort_clause), optional($.opt_select_limit), optional($.opt_for_locking_clause)),
        seq($.from_clause, optional($.where_clause), optional($.group_clause), optional($.having_clause), optional($.window_clause), optional($.opt_sort_clause), optional($.opt_select_limit), optional($.opt_for_locking_clause)),
        seq($.where_clause, optional($.group_clause), optional($.having_clause), optional($.window_clause), optional($.opt_sort_clause), optional($.opt_select_limit), optional($.opt_for_locking_clause)),
        seq($.group_clause, optional($.having_clause), optional($.window_clause), optional($.opt_sort_clause), optional($.opt_select_limit), optional($.opt_for_locking_clause)),
        seq($.having_clause, optional($.window_clause), optional($.opt_sort_clause), optional($.opt_select_limit), optional($.opt_for_locking_clause)),
        seq($.window_clause, optional($.opt_sort_clause), optional($.opt_select_limit), optional($.opt_for_locking_clause)),
        seq($.opt_sort_clause, optional($.opt_select_limit), optional($.opt_for_locking_clause)),
        seq($.opt_select_limit, optional($.opt_for_locking_clause)),
        $.opt_for_locking_clause
      ),
    PLAssignStmt: $ => seq($.plassign_target, optional($.opt_indirection), $.plassign_equals, optional($.PLpgSQL_Expr)),
    plassign_target: $ => choice(
        $.ColId,
        $.param
      ),
    plassign_equals: $ => choice(
        ':=',
        prec.left(7, prec.dynamic(7, '='))
      ),
    ColId: $ => choice(
        prec.left(11, prec.dynamic(11, $._ident)),
        $.unreserved_keyword,
        $.col_name_keyword
      ),
    type_function_name: $ => choice(
        prec.left(11, prec.dynamic(11, $._ident)),
        $.unreserved_keyword,
        $.type_func_name_keyword
      ),
    NonReservedWord: $ => choice(
        prec.left(11, prec.dynamic(11, $._ident)),
        $.unreserved_keyword,
        $.col_name_keyword,
        $.type_func_name_keyword
      ),
    ColLabel: $ => choice(
        prec.left(11, prec.dynamic(11, $._ident)),
        $.unreserved_keyword,
        $.col_name_keyword,
        $.type_func_name_keyword,
        $.reserved_keyword
      ),
    BareColLabel: $ => choice(
        prec.left(11, prec.dynamic(11, $._ident)),
        $.bare_label_keyword
      ),
    bare_label_keyword: $ => choice(
        $.kw_abort,
        $.kw_absent,
        $.kw_absolute,
        $.kw_access,
        $.kw_action,
        $.kw_add,
        $.kw_admin,
        $.kw_after,
        $.kw_aggregate,
        $.kw_all,
        $.kw_also,
        $.kw_alter,
        $.kw_always,
        $.kw_analyse,
        $.kw_analyze,
        prec.left(4, prec.dynamic(4, $.kw_and)),
        $.kw_any,
        $.kw_asc,
        $.kw_asensitive,
        $.kw_assertion,
        $.kw_assignment,
        $.kw_asymmetric,
        prec.left(16, prec.dynamic(16, $.kw_at)),
        $.kw_atomic,
        $.kw_attach,
        $.kw_attribute,
        $.kw_authorization,
        $.kw_backward,
        $.kw_before,
        $.kw_begin,
        prec.left(8, prec.dynamic(8, $.kw_between)),
        $.kw_bigint,
        $.kw_binary,
        $.kw_bit,
        $.kw_boolean,
        $.kw_both,
        $.kw_breadth,
        $.kw_by,
        $.kw_cache,
        $.kw_call,
        $.kw_called,
        $.kw_cascade,
        $.kw_cascaded,
        $.kw_case,
        $.kw_cast,
        $.kw_catalog,
        $.kw_chain,
        $.kw_characteristics,
        $.kw_check,
        $.kw_checkpoint,
        $.kw_class,
        $.kw_close,
        $.kw_cluster,
        $.kw_coalesce,
        prec.left(17, prec.dynamic(17, $.kw_collate)),
        $.kw_collation,
        $.kw_column,
        $.kw_columns,
        $.kw_comment,
        $.kw_comments,
        $.kw_commit,
        $.kw_committed,
        $.kw_compression,
        $.kw_concurrently,
        $.kw_conditional,
        $.kw_configuration,
        $.kw_conflict,
        $.kw_connection,
        $.kw_constraint,
        $.kw_constraints,
        $.kw_content,
        $.kw_continue,
        $.kw_conversion,
        $.kw_copy,
        $.kw_cost,
        prec.left(23, prec.dynamic(23, $.kw_cross)),
        $.kw_csv,
        prec.left(11, prec.dynamic(11, $.kw_cube)),
        $.kw_current,
        $.kw_current_catalog,
        $.kw_current_date,
        $.kw_current_role,
        $.kw_current_schema,
        $.kw_current_time,
        $.kw_current_timestamp,
        $.kw_current_user,
        $.kw_cursor,
        $.kw_cycle,
        $.kw_data,
        $.kw_database,
        $.kw_deallocate,
        $.kw_dec,
        $.kw_decimal,
        $.kw_declare,
        $.kw_default,
        $.kw_defaults,
        $.kw_deferrable,
        $.kw_deferred,
        $.kw_definer,
        $.kw_delete,
        $.kw_delimiter,
        $.kw_delimiters,
        $.kw_depends,
        $.kw_depth,
        $.kw_desc,
        $.kw_detach,
        $.kw_dictionary,
        $.kw_disable,
        $.kw_discard,
        $.kw_distinct,
        $.kw_do,
        $.kw_document,
        $.kw_domain,
        $.kw_double,
        $.kw_drop,
        $.kw_each,
        $.kw_else,
        $.kw_empty,
        $.kw_enable,
        $.kw_encoding,
        $.kw_encrypted,
        $.kw_end,
        $.kw_enforced,
        $.kw_enum,
        $.kw_error,
        prec.left(9, prec.dynamic(9, $.kw_escape)),
        $.kw_event,
        $.kw_exclude,
        $.kw_excluding,
        $.kw_exclusive,
        $.kw_execute,
        $.kw_exists,
        $.kw_explain,
        $.kw_expression,
        $.kw_extension,
        $.kw_external,
        $.kw_extract,
        $.kw_false,
        $.kw_family,
        $.kw_finalize,
        $.kw_first,
        $.kw_float,
        prec.left(11, prec.dynamic(11, $.kw_following)),
        $.kw_force,
        $.kw_foreign,
        $.kw_format,
        $.kw_forward,
        $.kw_freeze,
        prec.left(23, prec.dynamic(23, $.kw_full)),
        $.kw_function,
        $.kw_functions,
        $.kw_generated,
        $.kw_global,
        $.kw_granted,
        $.kw_greatest,
        $.kw_grouping,
        prec.left(11, prec.dynamic(11, $.kw_groups)),
        $.kw_handler,
        $.kw_header,
        $.kw_hold,
        $.kw_identity,
        $.kw_if,
        prec.left(8, prec.dynamic(8, $.kw_ilike)),
        $.kw_immediate,
        $.kw_immutable,
        $.kw_implicit,
        $.kw_import,
        prec.left(8, prec.dynamic(8, $.kw_in)),
        $.kw_include,
        $.kw_including,
        $.kw_increment,
        $.kw_indent,
        $.kw_index,
        $.kw_indexes,
        $.kw_inherit,
        $.kw_inherits,
        $.kw_initially,
        $.kw_inline,
        prec.left(23, prec.dynamic(23, $.kw_inner)),
        $.kw_inout,
        $.kw_input,
        $.kw_insensitive,
        $.kw_insert,
        $.kw_instead,
        $.kw_int,
        $.kw_integer,
        $.kw_interval,
        $.kw_invoker,
        prec.left(6, prec.dynamic(6, $.kw_is)),
        $.kw_isolation,
        prec.left(23, prec.dynamic(23, $.kw_join)),
        $.kw_json,
        $.kw_json_array,
        $.kw_json_arrayagg,
        $.kw_json_exists,
        $.kw_json_object,
        $.kw_json_objectagg,
        $.kw_json_query,
        $.kw_json_scalar,
        $.kw_json_serialize,
        $.kw_json_table,
        $.kw_json_value,
        $.kw_keep,
        $.kw_key,
        prec.left(11, prec.dynamic(11, $.kw_keys)),
        $.kw_label,
        $.kw_language,
        $.kw_large,
        $.kw_last,
        $.kw_lateral,
        $.kw_leading,
        $.kw_leakproof,
        $.kw_least,
        prec.left(23, prec.dynamic(23, $.kw_left)),
        $.kw_level,
        prec.left(8, prec.dynamic(8, $.kw_like)),
        $.kw_listen,
        $.kw_load,
        $.kw_local,
        $.kw_localtime,
        $.kw_localtimestamp,
        $.kw_location,
        $.kw_lock,
        $.kw_locked,
        $.kw_logged,
        $.kw_mapping,
        $.kw_match,
        $.kw_matched,
        $.kw_materialized,
        $.kw_maxvalue,
        $.kw_merge,
        $.kw_merge_action,
        $.kw_method,
        $.kw_minvalue,
        $.kw_mode,
        $.kw_move,
        $.kw_name,
        $.kw_names,
        $.kw_national,
        prec.left(23, prec.dynamic(23, $.kw_natural)),
        $.kw_nchar,
        prec.left(10, prec.dynamic(10, $.kw_nested)),
        $.kw_new,
        $.kw_next,
        $.kw_nfc,
        $.kw_nfd,
        $.kw_nfkc,
        $.kw_nfkd,
        $.kw_no,
        $.kw_none,
        $.kw_normalize,
        $.kw_normalized,
        prec.right(5, prec.dynamic(5, $.kw_not)),
        $.kw_nothing,
        $.kw_notify,
        $.kw_nowait,
        $.kw_null,
        $.kw_nullif,
        $.kw_nulls,
        $.kw_numeric,
        prec.left(11, prec.dynamic(11, $.kw_object)),
        $.kw_objects,
        $.kw_of,
        $.kw_off,
        $.kw_oids,
        $.kw_old,
        $.kw_omit,
        $.kw_only,
        prec.left(12, prec.dynamic(12, $.kw_operator)),
        $.kw_option,
        $.kw_options,
        prec.left(3, prec.dynamic(3, $.kw_or)),
        $.kw_ordinality,
        $.kw_others,
        $.kw_out,
        $.kw_outer,
        $.kw_overlay,
        $.kw_overriding,
        $.kw_owned,
        $.kw_owner,
        $.kw_parallel,
        $.kw_parameter,
        $.kw_parser,
        $.kw_partial,
        prec.left(11, prec.dynamic(11, $.kw_partition)),
        $.kw_passing,
        $.kw_password,
        prec.left(11, prec.dynamic(11, $.kw_path)),
        $.kw_period,
        $.kw_placing,
        $.kw_plan,
        $.kw_plans,
        $.kw_policy,
        $.kw_position,
        prec.left(11, prec.dynamic(11, $.kw_preceding)),
        $.kw_prepare,
        $.kw_prepared,
        $.kw_preserve,
        $.kw_primary,
        $.kw_prior,
        $.kw_privileges,
        $.kw_procedural,
        $.kw_procedure,
        $.kw_procedures,
        $.kw_program,
        $.kw_publication,
        $.kw_quote,
        $.kw_quotes,
        prec.left(11, prec.dynamic(11, $.kw_range)),
        $.kw_read,
        $.kw_real,
        $.kw_reassign,
        $.kw_recursive,
        $.kw_ref,
        $.kw_references,
        $.kw_referencing,
        $.kw_refresh,
        $.kw_reindex,
        $.kw_relative,
        $.kw_release,
        $.kw_rename,
        $.kw_repeatable,
        $.kw_replace,
        $.kw_replica,
        $.kw_reset,
        $.kw_restart,
        $.kw_restrict,
        $.kw_return,
        $.kw_returns,
        $.kw_revoke,
        prec.left(23, prec.dynamic(23, $.kw_right)),
        $.kw_role,
        $.kw_rollback,
        prec.left(11, prec.dynamic(11, $.kw_rollup)),
        $.kw_routine,
        $.kw_routines,
        $.kw_row,
        prec.left(11, prec.dynamic(11, $.kw_rows)),
        $.kw_rule,
        $.kw_savepoint,
        prec.left(11, prec.dynamic(11, $.kw_scalar)),
        $.kw_schema,
        $.kw_schemas,
        $.kw_scroll,
        $.kw_search,
        $.kw_security,
        $.kw_select,
        $.kw_sequence,
        $.kw_sequences,
        $.kw_serializable,
        $.kw_server,
        $.kw_session,
        $.kw_session_user,
        prec.left(11, prec.dynamic(11, $.kw_set)),
        $.kw_setof,
        $.kw_sets,
        $.kw_share,
        $.kw_show,
        prec.left(8, prec.dynamic(8, $.kw_similar)),
        $.kw_simple,
        $.kw_skip,
        $.kw_smallint,
        $.kw_snapshot,
        $.kw_some,
        $.kw_source,
        $.kw_sql,
        $.kw_stable,
        $.kw_standalone,
        $.kw_start,
        $.kw_statement,
        $.kw_statistics,
        $.kw_stdin,
        $.kw_stdout,
        $.kw_storage,
        $.kw_stored,
        $.kw_strict,
        $.kw_string,
        $.kw_strip,
        $.kw_subscription,
        $.kw_substring,
        $.kw_support,
        $.kw_symmetric,
        $.kw_sysid,
        $.kw_system,
        $.kw_system_user,
        $.kw_table,
        $.kw_tables,
        $.kw_tablesample,
        $.kw_tablespace,
        $.kw_target,
        $.kw_temp,
        $.kw_template,
        $.kw_temporary,
        $.kw_text,
        $.kw_then,
        $.kw_ties,
        $.kw_time,
        $.kw_timestamp,
        $.kw_trailing,
        $.kw_transaction,
        $.kw_transform,
        $.kw_treat,
        $.kw_trigger,
        $.kw_trim,
        $.kw_true,
        $.kw_truncate,
        $.kw_trusted,
        $.kw_type,
        $.kw_types,
        $.kw_uescape,
        prec.left(10, prec.dynamic(10, $.kw_unbounded)),
        $.kw_uncommitted,
        $.kw_unconditional,
        $.kw_unencrypted,
        $.kw_unique,
        $.kw_unknown,
        $.kw_unlisten,
        $.kw_unlogged,
        $.kw_until,
        $.kw_update,
        $.kw_user,
        $.kw_using,
        $.kw_vacuum,
        $.kw_valid,
        $.kw_validate,
        $.kw_validator,
        prec.left(11, prec.dynamic(11, $.kw_value)),
        $.kw_values,
        $.kw_varchar,
        $.kw_variadic,
        $.kw_verbose,
        $.kw_version,
        $.kw_view,
        $.kw_views,
        $.kw_virtual,
        $.kw_volatile,
        $.kw_when,
        $.kw_whitespace,
        $.kw_work,
        $.kw_wrapper,
        $.kw_write,
        $.kw_xml,
        $.kw_xmlattributes,
        $.kw_xmlconcat,
        $.kw_xmlelement,
        $.kw_xmlexists,
        $.kw_xmlforest,
        $.kw_xmlnamespaces,
        $.kw_xmlparse,
        $.kw_xmlpi,
        $.kw_xmlroot,
        $.kw_xmlserialize,
        $.kw_xmltable,
        $.kw_yes,
        $.kw_zone
      ),

    // ── Keyword category lists (from kwlist.h) ─────────────────────────────

    unreserved_keyword: $ => choice(
        $.kw_abort,
        $.kw_absent,
        $.kw_absolute,
        $.kw_access,
        $.kw_action,
        $.kw_add,
        $.kw_admin,
        $.kw_after,
        $.kw_aggregate,
        $.kw_also,
        $.kw_alter,
        $.kw_always,
        $.kw_asensitive,
        $.kw_assertion,
        $.kw_assignment,
        $.kw_at,
        $.kw_atomic,
        $.kw_attach,
        $.kw_attribute,
        $.kw_backward,
        $.kw_before,
        $.kw_begin,
        $.kw_breadth,
        $.kw_by,
        $.kw_cache,
        $.kw_call,
        $.kw_called,
        $.kw_cascade,
        $.kw_cascaded,
        $.kw_catalog,
        $.kw_chain,
        $.kw_characteristics,
        $.kw_checkpoint,
        $.kw_class,
        $.kw_close,
        $.kw_cluster,
        $.kw_columns,
        $.kw_comment,
        $.kw_comments,
        $.kw_commit,
        $.kw_committed,
        $.kw_compression,
        $.kw_conditional,
        $.kw_configuration,
        $.kw_conflict,
        $.kw_connection,
        $.kw_constraints,
        $.kw_content,
        $.kw_continue,
        $.kw_conversion,
        $.kw_copy,
        $.kw_cost,
        $.kw_csv,
        $.kw_cube,
        $.kw_current,
        $.kw_cursor,
        $.kw_cycle,
        $.kw_data,
        $.kw_database,
        $.kw_day,
        $.kw_deallocate,
        $.kw_declare,
        $.kw_defaults,
        $.kw_deferred,
        $.kw_definer,
        $.kw_delete,
        $.kw_delimiter,
        $.kw_delimiters,
        $.kw_depends,
        $.kw_depth,
        $.kw_detach,
        $.kw_dictionary,
        $.kw_disable,
        $.kw_discard,
        $.kw_document,
        $.kw_domain,
        $.kw_double,
        $.kw_drop,
        $.kw_each,
        $.kw_empty,
        $.kw_enable,
        $.kw_encoding,
        $.kw_encrypted,
        $.kw_enforced,
        $.kw_enum,
        $.kw_error,
        $.kw_escape,
        $.kw_event,
        $.kw_exclude,
        $.kw_excluding,
        $.kw_exclusive,
        $.kw_execute,
        $.kw_explain,
        $.kw_expression,
        $.kw_extension,
        $.kw_external,
        $.kw_family,
        $.kw_filter,
        $.kw_finalize,
        $.kw_first,
        $.kw_following,
        $.kw_force,
        $.kw_format,
        $.kw_forward,
        $.kw_function,
        $.kw_functions,
        $.kw_generated,
        $.kw_global,
        $.kw_granted,
        $.kw_groups,
        $.kw_handler,
        $.kw_header,
        $.kw_hold,
        $.kw_hour,
        $.kw_identity,
        $.kw_if,
        $.kw_immediate,
        $.kw_immutable,
        $.kw_implicit,
        $.kw_import,
        $.kw_include,
        $.kw_including,
        $.kw_increment,
        $.kw_indent,
        $.kw_index,
        $.kw_indexes,
        $.kw_inherit,
        $.kw_inherits,
        $.kw_inline,
        $.kw_input,
        $.kw_insensitive,
        $.kw_insert,
        $.kw_instead,
        $.kw_invoker,
        $.kw_isolation,
        $.kw_keep,
        $.kw_key,
        $.kw_keys,
        $.kw_label,
        $.kw_language,
        $.kw_large,
        $.kw_last,
        $.kw_leakproof,
        $.kw_level,
        $.kw_listen,
        $.kw_load,
        $.kw_local,
        $.kw_location,
        $.kw_lock,
        $.kw_locked,
        $.kw_logged,
        $.kw_mapping,
        $.kw_match,
        $.kw_matched,
        $.kw_materialized,
        $.kw_maxvalue,
        $.kw_merge,
        $.kw_method,
        $.kw_minute,
        $.kw_minvalue,
        $.kw_mode,
        $.kw_month,
        $.kw_move,
        $.kw_name,
        $.kw_names,
        $.kw_nested,
        $.kw_new,
        $.kw_next,
        $.kw_nfc,
        $.kw_nfd,
        $.kw_nfkc,
        $.kw_nfkd,
        $.kw_no,
        $.kw_normalized,
        $.kw_nothing,
        $.kw_notify,
        $.kw_nowait,
        $.kw_nulls,
        $.kw_object,
        $.kw_objects,
        $.kw_of,
        $.kw_off,
        $.kw_oids,
        $.kw_old,
        $.kw_omit,
        $.kw_operator,
        $.kw_option,
        $.kw_options,
        $.kw_ordinality,
        $.kw_others,
        $.kw_over,
        $.kw_overriding,
        $.kw_owned,
        $.kw_owner,
        $.kw_parallel,
        $.kw_parameter,
        $.kw_parser,
        $.kw_partial,
        $.kw_partition,
        $.kw_passing,
        $.kw_password,
        $.kw_path,
        $.kw_period,
        $.kw_plan,
        $.kw_plans,
        $.kw_policy,
        $.kw_preceding,
        $.kw_prepare,
        $.kw_prepared,
        $.kw_preserve,
        $.kw_prior,
        $.kw_privileges,
        $.kw_procedural,
        $.kw_procedure,
        $.kw_procedures,
        $.kw_program,
        $.kw_publication,
        $.kw_quote,
        $.kw_quotes,
        $.kw_range,
        $.kw_read,
        $.kw_reassign,
        $.kw_recursive,
        $.kw_ref,
        $.kw_referencing,
        $.kw_refresh,
        $.kw_reindex,
        $.kw_relative,
        $.kw_release,
        $.kw_rename,
        $.kw_repeatable,
        $.kw_replace,
        $.kw_replica,
        $.kw_reset,
        $.kw_restart,
        $.kw_restrict,
        $.kw_return,
        $.kw_returns,
        $.kw_revoke,
        $.kw_role,
        $.kw_rollback,
        $.kw_rollup,
        $.kw_routine,
        $.kw_routines,
        $.kw_rows,
        $.kw_rule,
        $.kw_savepoint,
        $.kw_scalar,
        $.kw_schema,
        $.kw_schemas,
        $.kw_scroll,
        $.kw_search,
        $.kw_second,
        $.kw_security,
        $.kw_sequence,
        $.kw_sequences,
        $.kw_serializable,
        $.kw_server,
        $.kw_session,
        $.kw_set,
        $.kw_sets,
        $.kw_share,
        $.kw_show,
        $.kw_simple,
        $.kw_skip,
        $.kw_snapshot,
        $.kw_source,
        $.kw_sql,
        $.kw_stable,
        $.kw_standalone,
        $.kw_start,
        $.kw_statement,
        $.kw_statistics,
        $.kw_stdin,
        $.kw_stdout,
        $.kw_storage,
        $.kw_stored,
        $.kw_strict,
        $.kw_string,
        $.kw_strip,
        $.kw_subscription,
        $.kw_support,
        $.kw_sysid,
        $.kw_system,
        $.kw_tables,
        $.kw_tablespace,
        $.kw_target,
        $.kw_temp,
        $.kw_template,
        $.kw_temporary,
        $.kw_text,
        $.kw_ties,
        $.kw_transaction,
        $.kw_transform,
        $.kw_trigger,
        $.kw_truncate,
        $.kw_trusted,
        $.kw_type,
        $.kw_types,
        $.kw_uescape,
        $.kw_unbounded,
        $.kw_uncommitted,
        $.kw_unconditional,
        $.kw_unencrypted,
        $.kw_unknown,
        $.kw_unlisten,
        $.kw_unlogged,
        $.kw_until,
        $.kw_update,
        $.kw_vacuum,
        $.kw_valid,
        $.kw_validate,
        $.kw_validator,
        $.kw_value,
        $.kw_varying,
        $.kw_version,
        $.kw_view,
        $.kw_views,
        $.kw_virtual,
        $.kw_volatile,
        $.kw_whitespace,
        $.kw_within,
        $.kw_without,
        $.kw_work,
        $.kw_wrapper,
        $.kw_write,
        $.kw_xml,
        $.kw_year,
        $.kw_yes,
        $.kw_zone
      ),

    col_name_keyword: $ => choice(
        $.kw_between,
        $.kw_bigint,
        $.kw_bit,
        $.kw_boolean,
        $.kw_char,
        $.kw_character,
        $.kw_coalesce,
        $.kw_dec,
        $.kw_decimal,
        $.kw_exists,
        $.kw_extract,
        $.kw_float,
        $.kw_greatest,
        $.kw_grouping,
        $.kw_inout,
        $.kw_int,
        $.kw_integer,
        $.kw_interval,
        $.kw_json,
        $.kw_json_array,
        $.kw_json_arrayagg,
        $.kw_json_exists,
        $.kw_json_object,
        $.kw_json_objectagg,
        $.kw_json_query,
        $.kw_json_scalar,
        $.kw_json_serialize,
        $.kw_json_table,
        $.kw_json_value,
        $.kw_least,
        $.kw_merge_action,
        $.kw_national,
        $.kw_nchar,
        $.kw_none,
        $.kw_normalize,
        $.kw_nullif,
        $.kw_numeric,
        $.kw_out,
        $.kw_overlay,
        $.kw_position,
        $.kw_precision,
        $.kw_real,
        $.kw_row,
        $.kw_setof,
        $.kw_smallint,
        $.kw_substring,
        $.kw_time,
        $.kw_timestamp,
        $.kw_treat,
        $.kw_trim,
        $.kw_values,
        $.kw_varchar,
        $.kw_xmlattributes,
        $.kw_xmlconcat,
        $.kw_xmlelement,
        $.kw_xmlexists,
        $.kw_xmlforest,
        $.kw_xmlnamespaces,
        $.kw_xmlparse,
        $.kw_xmlpi,
        $.kw_xmlroot,
        $.kw_xmlserialize,
        $.kw_xmltable
      ),

    type_func_name_keyword: $ => choice(
        $.kw_authorization,
        $.kw_binary,
        $.kw_collation,
        $.kw_concurrently,
        $.kw_cross,
        $.kw_current_schema,
        $.kw_freeze,
        $.kw_full,
        $.kw_ilike,
        $.kw_inner,
        $.kw_is,
        $.kw_isnull,
        $.kw_join,
        $.kw_left,
        $.kw_like,
        $.kw_natural,
        $.kw_notnull,
        $.kw_outer,
        $.kw_overlaps,
        $.kw_right,
        $.kw_similar,
        $.kw_tablesample,
        $.kw_verbose
      ),

    reserved_keyword: $ => choice(
        $.kw_all,
        $.kw_analyse,
        $.kw_analyze,
        $.kw_and,
        $.kw_any,
        $.kw_array,
        $.kw_as,
        $.kw_asc,
        $.kw_asymmetric,
        $.kw_both,
        $.kw_case,
        $.kw_cast,
        $.kw_check,
        $.kw_collate,
        $.kw_column,
        $.kw_constraint,
        $.kw_create,
        $.kw_current_catalog,
        $.kw_current_date,
        $.kw_current_role,
        $.kw_current_time,
        $.kw_current_timestamp,
        $.kw_current_user,
        $.kw_default,
        $.kw_deferrable,
        $.kw_desc,
        $.kw_distinct,
        $.kw_do,
        $.kw_else,
        $.kw_end,
        $.kw_except,
        $.kw_false,
        $.kw_fetch,
        $.kw_for,
        $.kw_foreign,
        $.kw_from,
        $.kw_grant,
        $.kw_group,
        $.kw_having,
        $.kw_in,
        $.kw_initially,
        $.kw_intersect,
        $.kw_into,
        $.kw_lateral,
        $.kw_leading,
        $.kw_limit,
        $.kw_localtime,
        $.kw_localtimestamp,
        $.kw_not,
        $.kw_null,
        $.kw_offset,
        $.kw_on,
        $.kw_only,
        $.kw_or,
        $.kw_order,
        $.kw_placing,
        $.kw_primary,
        $.kw_references,
        $.kw_returning,
        $.kw_select,
        $.kw_session_user,
        $.kw_some,
        $.kw_symmetric,
        $.kw_system_user,
        $.kw_table,
        $.kw_then,
        $.kw_to,
        $.kw_trailing,
        $.kw_true,
        $.kw_union,
        $.kw_unique,
        $.kw_user,
        $.kw_using,
        $.kw_variadic,
        $.kw_when,
        $.kw_where,
        $.kw_window,
        $.kw_with
      ),


    // ── Keyword tokens (case-insensitive) ────────────────────────────────────

    kw_abort: _ => token(prec(1, /[aA][bB][oO][rR][tT]/)),
    kw_absent: _ => token(prec(1, /[aA][bB][sS][eE][nN][tT]/)),
    kw_absolute: _ => token(prec(1, /[aA][bB][sS][oO][lL][uU][tT][eE]/)),
    kw_access: _ => token(prec(1, /[aA][cC][cC][eE][sS][sS]/)),
    kw_action: _ => token(prec(1, /[aA][cC][tT][iI][oO][nN]/)),
    kw_add: _ => token(prec(1, /[aA][dD][dD]/)),
    kw_admin: _ => token(prec(1, /[aA][dD][mM][iI][nN]/)),
    kw_after: _ => token(prec(1, /[aA][fF][tT][eE][rR]/)),
    kw_aggregate: _ => token(prec(1, /[aA][gG][gG][rR][eE][gG][aA][tT][eE]/)),
    kw_all: _ => token(prec(1, /[aA][lL][lL]/)),
    kw_also: _ => token(prec(1, /[aA][lL][sS][oO]/)),
    kw_alter: _ => token(prec(1, /[aA][lL][tT][eE][rR]/)),
    kw_always: _ => token(prec(1, /[aA][lL][wW][aA][yY][sS]/)),
    kw_analyse: _ => token(prec(1, /[aA][nN][aA][lL][yY][sS][eE]/)),
    kw_analyze: _ => token(prec(1, /[aA][nN][aA][lL][yY][zZ][eE]/)),
    kw_and: _ => token(prec(1, /[aA][nN][dD]/)),
    kw_any: _ => token(prec(1, /[aA][nN][yY]/)),
    kw_array: _ => token(prec(1, /[aA][rR][rR][aA][yY]/)),
    kw_as: _ => token(prec(1, /[aA][sS]/)),
    kw_asc: _ => token(prec(1, /[aA][sS][cC]/)),
    kw_asensitive: _ => token(prec(1, /[aA][sS][eE][nN][sS][iI][tT][iI][vV][eE]/)),
    kw_assertion: _ => token(prec(1, /[aA][sS][sS][eE][rR][tT][iI][oO][nN]/)),
    kw_assignment: _ => token(prec(1, /[aA][sS][sS][iI][gG][nN][mM][eE][nN][tT]/)),
    kw_asymmetric: _ => token(prec(1, /[aA][sS][yY][mM][mM][eE][tT][rR][iI][cC]/)),
    kw_at: _ => token(prec(1, /[aA][tT]/)),
    kw_atomic: _ => token(prec(1, /[aA][tT][oO][mM][iI][cC]/)),
    kw_attach: _ => token(prec(1, /[aA][tT][tT][aA][cC][hH]/)),
    kw_attribute: _ => token(prec(1, /[aA][tT][tT][rR][iI][bB][uU][tT][eE]/)),
    kw_authorization: _ => token(prec(1, /[aA][uU][tT][hH][oO][rR][iI][zZ][aA][tT][iI][oO][nN]/)),
    kw_backward: _ => token(prec(1, /[bB][aA][cC][kK][wW][aA][rR][dD]/)),
    kw_before: _ => token(prec(1, /[bB][eE][fF][oO][rR][eE]/)),
    kw_begin: _ => token(prec(1, /[bB][eE][gG][iI][nN]/)),
    kw_between: _ => token(prec(1, /[bB][eE][tT][wW][eE][eE][nN]/)),
    kw_bigint: _ => token(prec(1, /[bB][iI][gG][iI][nN][tT]/)),
    kw_binary: _ => token(prec(1, /[bB][iI][nN][aA][rR][yY]/)),
    kw_bit: _ => token(prec(1, /[bB][iI][tT]/)),
    kw_boolean: _ => token(prec(1, /[bB][oO][oO][lL][eE][aA][nN]/)),
    kw_both: _ => token(prec(1, /[bB][oO][tT][hH]/)),
    kw_breadth: _ => token(prec(1, /[bB][rR][eE][aA][dD][tT][hH]/)),
    kw_by: _ => token(prec(1, /[bB][yY]/)),
    kw_cache: _ => token(prec(1, /[cC][aA][cC][hH][eE]/)),
    kw_call: _ => token(prec(1, /[cC][aA][lL][lL]/)),
    kw_called: _ => token(prec(1, /[cC][aA][lL][lL][eE][dD]/)),
    kw_cascade: _ => token(prec(1, /[cC][aA][sS][cC][aA][dD][eE]/)),
    kw_cascaded: _ => token(prec(1, /[cC][aA][sS][cC][aA][dD][eE][dD]/)),
    kw_case: _ => token(prec(1, /[cC][aA][sS][eE]/)),
    kw_cast: _ => token(prec(1, /[cC][aA][sS][tT]/)),
    kw_catalog: _ => token(prec(1, /[cC][aA][tT][aA][lL][oO][gG]/)),
    kw_chain: _ => token(prec(1, /[cC][hH][aA][iI][nN]/)),
    kw_char: _ => token(prec(1, /[cC][hH][aA][rR]/)),
    kw_character: _ => token(prec(1, /[cC][hH][aA][rR][aA][cC][tT][eE][rR]/)),
    kw_characteristics: _ => token(prec(1, /[cC][hH][aA][rR][aA][cC][tT][eE][rR][iI][sS][tT][iI][cC][sS]/)),
    kw_check: _ => token(prec(1, /[cC][hH][eE][cC][kK]/)),
    kw_checkpoint: _ => token(prec(1, /[cC][hH][eE][cC][kK][pP][oO][iI][nN][tT]/)),
    kw_class: _ => token(prec(1, /[cC][lL][aA][sS][sS]/)),
    kw_close: _ => token(prec(1, /[cC][lL][oO][sS][eE]/)),
    kw_cluster: _ => token(prec(1, /[cC][lL][uU][sS][tT][eE][rR]/)),
    kw_coalesce: _ => token(prec(1, /[cC][oO][aA][lL][eE][sS][cC][eE]/)),
    kw_collate: _ => token(prec(1, /[cC][oO][lL][lL][aA][tT][eE]/)),
    kw_collation: _ => token(prec(1, /[cC][oO][lL][lL][aA][tT][iI][oO][nN]/)),
    kw_column: _ => token(prec(1, /[cC][oO][lL][uU][mM][nN]/)),
    kw_columns: _ => token(prec(1, /[cC][oO][lL][uU][mM][nN][sS]/)),
    kw_comment: _ => token(prec(1, /[cC][oO][mM][mM][eE][nN][tT]/)),
    kw_comments: _ => token(prec(1, /[cC][oO][mM][mM][eE][nN][tT][sS]/)),
    kw_commit: _ => token(prec(1, /[cC][oO][mM][mM][iI][tT]/)),
    kw_committed: _ => token(prec(1, /[cC][oO][mM][mM][iI][tT][tT][eE][dD]/)),
    kw_compression: _ => token(prec(1, /[cC][oO][mM][pP][rR][eE][sS][sS][iI][oO][nN]/)),
    kw_concurrently: _ => token(prec(1, /[cC][oO][nN][cC][uU][rR][rR][eE][nN][tT][lL][yY]/)),
    kw_conditional: _ => token(prec(1, /[cC][oO][nN][dD][iI][tT][iI][oO][nN][aA][lL]/)),
    kw_configuration: _ => token(prec(1, /[cC][oO][nN][fF][iI][gG][uU][rR][aA][tT][iI][oO][nN]/)),
    kw_conflict: _ => token(prec(1, /[cC][oO][nN][fF][lL][iI][cC][tT]/)),
    kw_connection: _ => token(prec(1, /[cC][oO][nN][nN][eE][cC][tT][iI][oO][nN]/)),
    kw_constraint: _ => token(prec(1, /[cC][oO][nN][sS][tT][rR][aA][iI][nN][tT]/)),
    kw_constraints: _ => token(prec(1, /[cC][oO][nN][sS][tT][rR][aA][iI][nN][tT][sS]/)),
    kw_content: _ => token(prec(1, /[cC][oO][nN][tT][eE][nN][tT]/)),
    kw_continue: _ => token(prec(1, /[cC][oO][nN][tT][iI][nN][uU][eE]/)),
    kw_conversion: _ => token(prec(1, /[cC][oO][nN][vV][eE][rR][sS][iI][oO][nN]/)),
    kw_copy: _ => token(prec(1, /[cC][oO][pP][yY]/)),
    kw_cost: _ => token(prec(1, /[cC][oO][sS][tT]/)),
    kw_create: _ => token(prec(1, /[cC][rR][eE][aA][tT][eE]/)),
    kw_cross: _ => token(prec(1, /[cC][rR][oO][sS][sS]/)),
    kw_csv: _ => token(prec(1, /[cC][sS][vV]/)),
    kw_cube: _ => token(prec(1, /[cC][uU][bB][eE]/)),
    kw_current: _ => token(prec(1, /[cC][uU][rR][rR][eE][nN][tT]/)),
    kw_current_catalog: _ => token(prec(1, /[cC][uU][rR][rR][eE][nN][tT]_[cC][aA][tT][aA][lL][oO][gG]/)),
    kw_current_date: _ => token(prec(1, /[cC][uU][rR][rR][eE][nN][tT]_[dD][aA][tT][eE]/)),
    kw_current_role: _ => token(prec(1, /[cC][uU][rR][rR][eE][nN][tT]_[rR][oO][lL][eE]/)),
    kw_current_schema: _ => token(prec(1, /[cC][uU][rR][rR][eE][nN][tT]_[sS][cC][hH][eE][mM][aA]/)),
    kw_current_time: _ => token(prec(1, /[cC][uU][rR][rR][eE][nN][tT]_[tT][iI][mM][eE]/)),
    kw_current_timestamp: _ => token(prec(1, /[cC][uU][rR][rR][eE][nN][tT]_[tT][iI][mM][eE][sS][tT][aA][mM][pP]/)),
    kw_current_user: _ => token(prec(1, /[cC][uU][rR][rR][eE][nN][tT]_[uU][sS][eE][rR]/)),
    kw_cursor: _ => token(prec(1, /[cC][uU][rR][sS][oO][rR]/)),
    kw_cycle: _ => token(prec(1, /[cC][yY][cC][lL][eE]/)),
    kw_data: _ => token(prec(1, /[dD][aA][tT][aA]/)),
    kw_database: _ => token(prec(1, /[dD][aA][tT][aA][bB][aA][sS][eE]/)),
    kw_day: _ => token(prec(1, /[dD][aA][yY]/)),
    kw_deallocate: _ => token(prec(1, /[dD][eE][aA][lL][lL][oO][cC][aA][tT][eE]/)),
    kw_dec: _ => token(prec(1, /[dD][eE][cC]/)),
    kw_decimal: _ => token(prec(1, /[dD][eE][cC][iI][mM][aA][lL]/)),
    kw_declare: _ => token(prec(1, /[dD][eE][cC][lL][aA][rR][eE]/)),
    kw_default: _ => token(prec(1, /[dD][eE][fF][aA][uU][lL][tT]/)),
    kw_defaults: _ => token(prec(1, /[dD][eE][fF][aA][uU][lL][tT][sS]/)),
    kw_deferrable: _ => token(prec(1, /[dD][eE][fF][eE][rR][rR][aA][bB][lL][eE]/)),
    kw_deferred: _ => token(prec(1, /[dD][eE][fF][eE][rR][rR][eE][dD]/)),
    kw_definer: _ => token(prec(1, /[dD][eE][fF][iI][nN][eE][rR]/)),
    kw_delete: _ => token(prec(1, /[dD][eE][lL][eE][tT][eE]/)),
    kw_delimiter: _ => token(prec(1, /[dD][eE][lL][iI][mM][iI][tT][eE][rR]/)),
    kw_delimiters: _ => token(prec(1, /[dD][eE][lL][iI][mM][iI][tT][eE][rR][sS]/)),
    kw_depends: _ => token(prec(1, /[dD][eE][pP][eE][nN][dD][sS]/)),
    kw_depth: _ => token(prec(1, /[dD][eE][pP][tT][hH]/)),
    kw_desc: _ => token(prec(1, /[dD][eE][sS][cC]/)),
    kw_detach: _ => token(prec(1, /[dD][eE][tT][aA][cC][hH]/)),
    kw_dictionary: _ => token(prec(1, /[dD][iI][cC][tT][iI][oO][nN][aA][rR][yY]/)),
    kw_disable: _ => token(prec(1, /[dD][iI][sS][aA][bB][lL][eE]/)),
    kw_discard: _ => token(prec(1, /[dD][iI][sS][cC][aA][rR][dD]/)),
    kw_distinct: _ => token(prec(1, /[dD][iI][sS][tT][iI][nN][cC][tT]/)),
    kw_do: _ => token(prec(1, /[dD][oO]/)),
    kw_document: _ => token(prec(1, /[dD][oO][cC][uU][mM][eE][nN][tT]/)),
    kw_domain: _ => token(prec(1, /[dD][oO][mM][aA][iI][nN]/)),
    kw_double: _ => token(prec(1, /[dD][oO][uU][bB][lL][eE]/)),
    kw_drop: _ => token(prec(1, /[dD][rR][oO][pP]/)),
    kw_each: _ => token(prec(1, /[eE][aA][cC][hH]/)),
    kw_else: _ => token(prec(1, /[eE][lL][sS][eE]/)),
    kw_empty: _ => token(prec(1, /[eE][mM][pP][tT][yY]/)),
    kw_enable: _ => token(prec(1, /[eE][nN][aA][bB][lL][eE]/)),
    kw_encoding: _ => token(prec(1, /[eE][nN][cC][oO][dD][iI][nN][gG]/)),
    kw_encrypted: _ => token(prec(1, /[eE][nN][cC][rR][yY][pP][tT][eE][dD]/)),
    kw_end: _ => token(prec(1, /[eE][nN][dD]/)),
    kw_enforced: _ => token(prec(1, /[eE][nN][fF][oO][rR][cC][eE][dD]/)),
    kw_enum: _ => token(prec(1, /[eE][nN][uU][mM]/)),
    kw_error: _ => token(prec(1, /[eE][rR][rR][oO][rR]/)),
    kw_escape: _ => token(prec(1, /[eE][sS][cC][aA][pP][eE]/)),
    kw_event: _ => token(prec(1, /[eE][vV][eE][nN][tT]/)),
    kw_except: _ => token(prec(1, /[eE][xX][cC][eE][pP][tT]/)),
    kw_exclude: _ => token(prec(1, /[eE][xX][cC][lL][uU][dD][eE]/)),
    kw_excluding: _ => token(prec(1, /[eE][xX][cC][lL][uU][dD][iI][nN][gG]/)),
    kw_exclusive: _ => token(prec(1, /[eE][xX][cC][lL][uU][sS][iI][vV][eE]/)),
    kw_execute: _ => token(prec(1, /[eE][xX][eE][cC][uU][tT][eE]/)),
    kw_exists: _ => token(prec(1, /[eE][xX][iI][sS][tT][sS]/)),
    kw_explain: _ => token(prec(1, /[eE][xX][pP][lL][aA][iI][nN]/)),
    kw_expression: _ => token(prec(1, /[eE][xX][pP][rR][eE][sS][sS][iI][oO][nN]/)),
    kw_extension: _ => token(prec(1, /[eE][xX][tT][eE][nN][sS][iI][oO][nN]/)),
    kw_external: _ => token(prec(1, /[eE][xX][tT][eE][rR][nN][aA][lL]/)),
    kw_extract: _ => token(prec(1, /[eE][xX][tT][rR][aA][cC][tT]/)),
    kw_false: _ => token(prec(1, /[fF][aA][lL][sS][eE]/)),
    kw_family: _ => token(prec(1, /[fF][aA][mM][iI][lL][yY]/)),
    kw_fetch: _ => token(prec(1, /[fF][eE][tT][cC][hH]/)),
    kw_filter: _ => token(prec(1, /[fF][iI][lL][tT][eE][rR]/)),
    kw_finalize: _ => token(prec(1, /[fF][iI][nN][aA][lL][iI][zZ][eE]/)),
    kw_first: _ => token(prec(1, /[fF][iI][rR][sS][tT]/)),
    kw_float: _ => token(prec(1, /[fF][lL][oO][aA][tT]/)),
    kw_following: _ => token(prec(1, /[fF][oO][lL][lL][oO][wW][iI][nN][gG]/)),
    kw_for: _ => token(prec(1, /[fF][oO][rR]/)),
    kw_force: _ => token(prec(1, /[fF][oO][rR][cC][eE]/)),
    kw_foreign: _ => token(prec(1, /[fF][oO][rR][eE][iI][gG][nN]/)),
    kw_format: _ => token(prec(1, /[fF][oO][rR][mM][aA][tT]/)),
    kw_forward: _ => token(prec(1, /[fF][oO][rR][wW][aA][rR][dD]/)),
    kw_freeze: _ => token(prec(1, /[fF][rR][eE][eE][zZ][eE]/)),
    kw_from: _ => token(prec(1, /[fF][rR][oO][mM]/)),
    kw_full: _ => token(prec(1, /[fF][uU][lL][lL]/)),
    kw_function: _ => token(prec(1, /[fF][uU][nN][cC][tT][iI][oO][nN]/)),
    kw_functions: _ => token(prec(1, /[fF][uU][nN][cC][tT][iI][oO][nN][sS]/)),
    kw_generated: _ => token(prec(1, /[gG][eE][nN][eE][rR][aA][tT][eE][dD]/)),
    kw_global: _ => token(prec(1, /[gG][lL][oO][bB][aA][lL]/)),
    kw_grant: _ => token(prec(1, /[gG][rR][aA][nN][tT]/)),
    kw_granted: _ => token(prec(1, /[gG][rR][aA][nN][tT][eE][dD]/)),
    kw_greatest: _ => token(prec(1, /[gG][rR][eE][aA][tT][eE][sS][tT]/)),
    kw_group: _ => token(prec(1, /[gG][rR][oO][uU][pP]/)),
    kw_grouping: _ => token(prec(1, /[gG][rR][oO][uU][pP][iI][nN][gG]/)),
    kw_groups: _ => token(prec(1, /[gG][rR][oO][uU][pP][sS]/)),
    kw_handler: _ => token(prec(1, /[hH][aA][nN][dD][lL][eE][rR]/)),
    kw_having: _ => token(prec(1, /[hH][aA][vV][iI][nN][gG]/)),
    kw_header: _ => token(prec(1, /[hH][eE][aA][dD][eE][rR]/)),
    kw_hold: _ => token(prec(1, /[hH][oO][lL][dD]/)),
    kw_hour: _ => token(prec(1, /[hH][oO][uU][rR]/)),
    kw_identity: _ => token(prec(1, /[iI][dD][eE][nN][tT][iI][tT][yY]/)),
    kw_if: _ => token(prec(1, /[iI][fF]/)),
    kw_ilike: _ => token(prec(1, /[iI][lL][iI][kK][eE]/)),
    kw_immediate: _ => token(prec(1, /[iI][mM][mM][eE][dD][iI][aA][tT][eE]/)),
    kw_immutable: _ => token(prec(1, /[iI][mM][mM][uU][tT][aA][bB][lL][eE]/)),
    kw_implicit: _ => token(prec(1, /[iI][mM][pP][lL][iI][cC][iI][tT]/)),
    kw_import: _ => token(prec(1, /[iI][mM][pP][oO][rR][tT]/)),
    kw_in: _ => token(prec(1, /[iI][nN]/)),
    kw_include: _ => token(prec(1, /[iI][nN][cC][lL][uU][dD][eE]/)),
    kw_including: _ => token(prec(1, /[iI][nN][cC][lL][uU][dD][iI][nN][gG]/)),
    kw_increment: _ => token(prec(1, /[iI][nN][cC][rR][eE][mM][eE][nN][tT]/)),
    kw_indent: _ => token(prec(1, /[iI][nN][dD][eE][nN][tT]/)),
    kw_index: _ => token(prec(1, /[iI][nN][dD][eE][xX]/)),
    kw_indexes: _ => token(prec(1, /[iI][nN][dD][eE][xX][eE][sS]/)),
    kw_inherit: _ => token(prec(1, /[iI][nN][hH][eE][rR][iI][tT]/)),
    kw_inherits: _ => token(prec(1, /[iI][nN][hH][eE][rR][iI][tT][sS]/)),
    kw_initially: _ => token(prec(1, /[iI][nN][iI][tT][iI][aA][lL][lL][yY]/)),
    kw_inline: _ => token(prec(1, /[iI][nN][lL][iI][nN][eE]/)),
    kw_inner: _ => token(prec(1, /[iI][nN][nN][eE][rR]/)),
    kw_inout: _ => token(prec(1, /[iI][nN][oO][uU][tT]/)),
    kw_input: _ => token(prec(1, /[iI][nN][pP][uU][tT]/)),
    kw_insensitive: _ => token(prec(1, /[iI][nN][sS][eE][nN][sS][iI][tT][iI][vV][eE]/)),
    kw_insert: _ => token(prec(1, /[iI][nN][sS][eE][rR][tT]/)),
    kw_instead: _ => token(prec(1, /[iI][nN][sS][tT][eE][aA][dD]/)),
    kw_int: _ => token(prec(1, /[iI][nN][tT]/)),
    kw_integer: _ => token(prec(1, /[iI][nN][tT][eE][gG][eE][rR]/)),
    kw_intersect: _ => token(prec(1, /[iI][nN][tT][eE][rR][sS][eE][cC][tT]/)),
    kw_interval: _ => token(prec(1, /[iI][nN][tT][eE][rR][vV][aA][lL]/)),
    kw_into: _ => token(prec(1, /[iI][nN][tT][oO]/)),
    kw_invoker: _ => token(prec(1, /[iI][nN][vV][oO][kK][eE][rR]/)),
    kw_is: _ => token(prec(1, /[iI][sS]/)),
    kw_isnull: _ => token(prec(1, /[iI][sS][nN][uU][lL][lL]/)),
    kw_isolation: _ => token(prec(1, /[iI][sS][oO][lL][aA][tT][iI][oO][nN]/)),
    kw_join: _ => token(prec(1, /[jJ][oO][iI][nN]/)),
    kw_json: _ => token(prec(1, /[jJ][sS][oO][nN]/)),
    kw_json_array: _ => token(prec(1, /[jJ][sS][oO][nN]_[aA][rR][rR][aA][yY]/)),
    kw_json_arrayagg: _ => token(prec(1, /[jJ][sS][oO][nN]_[aA][rR][rR][aA][yY][aA][gG][gG]/)),
    kw_json_exists: _ => token(prec(1, /[jJ][sS][oO][nN]_[eE][xX][iI][sS][tT][sS]/)),
    kw_json_object: _ => token(prec(1, /[jJ][sS][oO][nN]_[oO][bB][jJ][eE][cC][tT]/)),
    kw_json_objectagg: _ => token(prec(1, /[jJ][sS][oO][nN]_[oO][bB][jJ][eE][cC][tT][aA][gG][gG]/)),
    kw_json_query: _ => token(prec(1, /[jJ][sS][oO][nN]_[qQ][uU][eE][rR][yY]/)),
    kw_json_scalar: _ => token(prec(1, /[jJ][sS][oO][nN]_[sS][cC][aA][lL][aA][rR]/)),
    kw_json_serialize: _ => token(prec(1, /[jJ][sS][oO][nN]_[sS][eE][rR][iI][aA][lL][iI][zZ][eE]/)),
    kw_json_table: _ => token(prec(1, /[jJ][sS][oO][nN]_[tT][aA][bB][lL][eE]/)),
    kw_json_value: _ => token(prec(1, /[jJ][sS][oO][nN]_[vV][aA][lL][uU][eE]/)),
    kw_keep: _ => token(prec(1, /[kK][eE][eE][pP]/)),
    kw_key: _ => token(prec(1, /[kK][eE][yY]/)),
    kw_keys: _ => token(prec(1, /[kK][eE][yY][sS]/)),
    kw_label: _ => token(prec(1, /[lL][aA][bB][eE][lL]/)),
    kw_language: _ => token(prec(1, /[lL][aA][nN][gG][uU][aA][gG][eE]/)),
    kw_large: _ => token(prec(1, /[lL][aA][rR][gG][eE]/)),
    kw_last: _ => token(prec(1, /[lL][aA][sS][tT]/)),
    kw_lateral: _ => token(prec(1, /[lL][aA][tT][eE][rR][aA][lL]/)),
    kw_leading: _ => token(prec(1, /[lL][eE][aA][dD][iI][nN][gG]/)),
    kw_leakproof: _ => token(prec(1, /[lL][eE][aA][kK][pP][rR][oO][oO][fF]/)),
    kw_least: _ => token(prec(1, /[lL][eE][aA][sS][tT]/)),
    kw_left: _ => token(prec(1, /[lL][eE][fF][tT]/)),
    kw_level: _ => token(prec(1, /[lL][eE][vV][eE][lL]/)),
    kw_like: _ => token(prec(1, /[lL][iI][kK][eE]/)),
    kw_limit: _ => token(prec(1, /[lL][iI][mM][iI][tT]/)),
    kw_listen: _ => token(prec(1, /[lL][iI][sS][tT][eE][nN]/)),
    kw_load: _ => token(prec(1, /[lL][oO][aA][dD]/)),
    kw_local: _ => token(prec(1, /[lL][oO][cC][aA][lL]/)),
    kw_localtime: _ => token(prec(1, /[lL][oO][cC][aA][lL][tT][iI][mM][eE]/)),
    kw_localtimestamp: _ => token(prec(1, /[lL][oO][cC][aA][lL][tT][iI][mM][eE][sS][tT][aA][mM][pP]/)),
    kw_location: _ => token(prec(1, /[lL][oO][cC][aA][tT][iI][oO][nN]/)),
    kw_lock: _ => token(prec(1, /[lL][oO][cC][kK]/)),
    kw_locked: _ => token(prec(1, /[lL][oO][cC][kK][eE][dD]/)),
    kw_logged: _ => token(prec(1, /[lL][oO][gG][gG][eE][dD]/)),
    kw_mapping: _ => token(prec(1, /[mM][aA][pP][pP][iI][nN][gG]/)),
    kw_match: _ => token(prec(1, /[mM][aA][tT][cC][hH]/)),
    kw_matched: _ => token(prec(1, /[mM][aA][tT][cC][hH][eE][dD]/)),
    kw_materialized: _ => token(prec(1, /[mM][aA][tT][eE][rR][iI][aA][lL][iI][zZ][eE][dD]/)),
    kw_maxvalue: _ => token(prec(1, /[mM][aA][xX][vV][aA][lL][uU][eE]/)),
    kw_merge: _ => token(prec(1, /[mM][eE][rR][gG][eE]/)),
    kw_merge_action: _ => token(prec(1, /[mM][eE][rR][gG][eE]_[aA][cC][tT][iI][oO][nN]/)),
    kw_method: _ => token(prec(1, /[mM][eE][tT][hH][oO][dD]/)),
    kw_minute: _ => token(prec(1, /[mM][iI][nN][uU][tT][eE]/)),
    kw_minvalue: _ => token(prec(1, /[mM][iI][nN][vV][aA][lL][uU][eE]/)),
    kw_mode: _ => token(prec(1, /[mM][oO][dD][eE]/)),
    kw_month: _ => token(prec(1, /[mM][oO][nN][tT][hH]/)),
    kw_move: _ => token(prec(1, /[mM][oO][vV][eE]/)),
    kw_name: _ => token(prec(1, /[nN][aA][mM][eE]/)),
    kw_names: _ => token(prec(1, /[nN][aA][mM][eE][sS]/)),
    kw_national: _ => token(prec(1, /[nN][aA][tT][iI][oO][nN][aA][lL]/)),
    kw_natural: _ => token(prec(1, /[nN][aA][tT][uU][rR][aA][lL]/)),
    kw_nchar: _ => token(prec(1, /[nN][cC][hH][aA][rR]/)),
    kw_nested: _ => token(prec(1, /[nN][eE][sS][tT][eE][dD]/)),
    kw_new: _ => token(prec(1, /[nN][eE][wW]/)),
    kw_next: _ => token(prec(1, /[nN][eE][xX][tT]/)),
    kw_nfc: _ => token(prec(1, /[nN][fF][cC]/)),
    kw_nfd: _ => token(prec(1, /[nN][fF][dD]/)),
    kw_nfkc: _ => token(prec(1, /[nN][fF][kK][cC]/)),
    kw_nfkd: _ => token(prec(1, /[nN][fF][kK][dD]/)),
    kw_no: _ => token(prec(1, /[nN][oO]/)),
    kw_none: _ => token(prec(1, /[nN][oO][nN][eE]/)),
    kw_normalize: _ => token(prec(1, /[nN][oO][rR][mM][aA][lL][iI][zZ][eE]/)),
    kw_normalized: _ => token(prec(1, /[nN][oO][rR][mM][aA][lL][iI][zZ][eE][dD]/)),
    kw_not: _ => token(prec(1, /[nN][oO][tT]/)),
    kw_nothing: _ => token(prec(1, /[nN][oO][tT][hH][iI][nN][gG]/)),
    kw_notify: _ => token(prec(1, /[nN][oO][tT][iI][fF][yY]/)),
    kw_notnull: _ => token(prec(1, /[nN][oO][tT][nN][uU][lL][lL]/)),
    kw_nowait: _ => token(prec(1, /[nN][oO][wW][aA][iI][tT]/)),
    kw_null: _ => token(prec(1, /[nN][uU][lL][lL]/)),
    kw_nullif: _ => token(prec(1, /[nN][uU][lL][lL][iI][fF]/)),
    kw_nulls: _ => token(prec(1, /[nN][uU][lL][lL][sS]/)),
    kw_numeric: _ => token(prec(1, /[nN][uU][mM][eE][rR][iI][cC]/)),
    kw_object: _ => token(prec(1, /[oO][bB][jJ][eE][cC][tT]/)),
    kw_objects: _ => token(prec(1, /[oO][bB][jJ][eE][cC][tT][sS]/)),
    kw_of: _ => token(prec(1, /[oO][fF]/)),
    kw_off: _ => token(prec(1, /[oO][fF][fF]/)),
    kw_offset: _ => token(prec(1, /[oO][fF][fF][sS][eE][tT]/)),
    kw_oids: _ => token(prec(1, /[oO][iI][dD][sS]/)),
    kw_old: _ => token(prec(1, /[oO][lL][dD]/)),
    kw_omit: _ => token(prec(1, /[oO][mM][iI][tT]/)),
    kw_on: _ => token(prec(1, /[oO][nN]/)),
    kw_only: _ => token(prec(1, /[oO][nN][lL][yY]/)),
    kw_operator: _ => token(prec(1, /[oO][pP][eE][rR][aA][tT][oO][rR]/)),
    kw_option: _ => token(prec(1, /[oO][pP][tT][iI][oO][nN]/)),
    kw_options: _ => token(prec(1, /[oO][pP][tT][iI][oO][nN][sS]/)),
    kw_or: _ => token(prec(1, /[oO][rR]/)),
    kw_order: _ => token(prec(1, /[oO][rR][dD][eE][rR]/)),
    kw_ordinality: _ => token(prec(1, /[oO][rR][dD][iI][nN][aA][lL][iI][tT][yY]/)),
    kw_others: _ => token(prec(1, /[oO][tT][hH][eE][rR][sS]/)),
    kw_out: _ => token(prec(1, /[oO][uU][tT]/)),
    kw_outer: _ => token(prec(1, /[oO][uU][tT][eE][rR]/)),
    kw_over: _ => token(prec(1, /[oO][vV][eE][rR]/)),
    kw_overlaps: _ => token(prec(1, /[oO][vV][eE][rR][lL][aA][pP][sS]/)),
    kw_overlay: _ => token(prec(1, /[oO][vV][eE][rR][lL][aA][yY]/)),
    kw_overriding: _ => token(prec(1, /[oO][vV][eE][rR][rR][iI][dD][iI][nN][gG]/)),
    kw_owned: _ => token(prec(1, /[oO][wW][nN][eE][dD]/)),
    kw_owner: _ => token(prec(1, /[oO][wW][nN][eE][rR]/)),
    kw_parallel: _ => token(prec(1, /[pP][aA][rR][aA][lL][lL][eE][lL]/)),
    kw_parameter: _ => token(prec(1, /[pP][aA][rR][aA][mM][eE][tT][eE][rR]/)),
    kw_parser: _ => token(prec(1, /[pP][aA][rR][sS][eE][rR]/)),
    kw_partial: _ => token(prec(1, /[pP][aA][rR][tT][iI][aA][lL]/)),
    kw_partition: _ => token(prec(1, /[pP][aA][rR][tT][iI][tT][iI][oO][nN]/)),
    kw_passing: _ => token(prec(1, /[pP][aA][sS][sS][iI][nN][gG]/)),
    kw_password: _ => token(prec(1, /[pP][aA][sS][sS][wW][oO][rR][dD]/)),
    kw_path: _ => token(prec(1, /[pP][aA][tT][hH]/)),
    kw_period: _ => token(prec(1, /[pP][eE][rR][iI][oO][dD]/)),
    kw_placing: _ => token(prec(1, /[pP][lL][aA][cC][iI][nN][gG]/)),
    kw_plan: _ => token(prec(1, /[pP][lL][aA][nN]/)),
    kw_plans: _ => token(prec(1, /[pP][lL][aA][nN][sS]/)),
    kw_policy: _ => token(prec(1, /[pP][oO][lL][iI][cC][yY]/)),
    kw_position: _ => token(prec(1, /[pP][oO][sS][iI][tT][iI][oO][nN]/)),
    kw_preceding: _ => token(prec(1, /[pP][rR][eE][cC][eE][dD][iI][nN][gG]/)),
    kw_precision: _ => token(prec(1, /[pP][rR][eE][cC][iI][sS][iI][oO][nN]/)),
    kw_prepare: _ => token(prec(1, /[pP][rR][eE][pP][aA][rR][eE]/)),
    kw_prepared: _ => token(prec(1, /[pP][rR][eE][pP][aA][rR][eE][dD]/)),
    kw_preserve: _ => token(prec(1, /[pP][rR][eE][sS][eE][rR][vV][eE]/)),
    kw_primary: _ => token(prec(1, /[pP][rR][iI][mM][aA][rR][yY]/)),
    kw_prior: _ => token(prec(1, /[pP][rR][iI][oO][rR]/)),
    kw_privileges: _ => token(prec(1, /[pP][rR][iI][vV][iI][lL][eE][gG][eE][sS]/)),
    kw_procedural: _ => token(prec(1, /[pP][rR][oO][cC][eE][dD][uU][rR][aA][lL]/)),
    kw_procedure: _ => token(prec(1, /[pP][rR][oO][cC][eE][dD][uU][rR][eE]/)),
    kw_procedures: _ => token(prec(1, /[pP][rR][oO][cC][eE][dD][uU][rR][eE][sS]/)),
    kw_program: _ => token(prec(1, /[pP][rR][oO][gG][rR][aA][mM]/)),
    kw_publication: _ => token(prec(1, /[pP][uU][bB][lL][iI][cC][aA][tT][iI][oO][nN]/)),
    kw_quote: _ => token(prec(1, /[qQ][uU][oO][tT][eE]/)),
    kw_quotes: _ => token(prec(1, /[qQ][uU][oO][tT][eE][sS]/)),
    kw_range: _ => token(prec(1, /[rR][aA][nN][gG][eE]/)),
    kw_read: _ => token(prec(1, /[rR][eE][aA][dD]/)),
    kw_real: _ => token(prec(1, /[rR][eE][aA][lL]/)),
    kw_reassign: _ => token(prec(1, /[rR][eE][aA][sS][sS][iI][gG][nN]/)),
    kw_recursive: _ => token(prec(1, /[rR][eE][cC][uU][rR][sS][iI][vV][eE]/)),
    kw_ref: _ => token(prec(1, /[rR][eE][fF]/)),
    kw_references: _ => token(prec(1, /[rR][eE][fF][eE][rR][eE][nN][cC][eE][sS]/)),
    kw_referencing: _ => token(prec(1, /[rR][eE][fF][eE][rR][eE][nN][cC][iI][nN][gG]/)),
    kw_refresh: _ => token(prec(1, /[rR][eE][fF][rR][eE][sS][hH]/)),
    kw_reindex: _ => token(prec(1, /[rR][eE][iI][nN][dD][eE][xX]/)),
    kw_relative: _ => token(prec(1, /[rR][eE][lL][aA][tT][iI][vV][eE]/)),
    kw_release: _ => token(prec(1, /[rR][eE][lL][eE][aA][sS][eE]/)),
    kw_rename: _ => token(prec(1, /[rR][eE][nN][aA][mM][eE]/)),
    kw_repeatable: _ => token(prec(1, /[rR][eE][pP][eE][aA][tT][aA][bB][lL][eE]/)),
    kw_replace: _ => token(prec(1, /[rR][eE][pP][lL][aA][cC][eE]/)),
    kw_replica: _ => token(prec(1, /[rR][eE][pP][lL][iI][cC][aA]/)),
    kw_reset: _ => token(prec(1, /[rR][eE][sS][eE][tT]/)),
    kw_restart: _ => token(prec(1, /[rR][eE][sS][tT][aA][rR][tT]/)),
    kw_restrict: _ => token(prec(1, /[rR][eE][sS][tT][rR][iI][cC][tT]/)),
    kw_return: _ => token(prec(1, /[rR][eE][tT][uU][rR][nN]/)),
    kw_returning: _ => token(prec(1, /[rR][eE][tT][uU][rR][nN][iI][nN][gG]/)),
    kw_returns: _ => token(prec(1, /[rR][eE][tT][uU][rR][nN][sS]/)),
    kw_revoke: _ => token(prec(1, /[rR][eE][vV][oO][kK][eE]/)),
    kw_right: _ => token(prec(1, /[rR][iI][gG][hH][tT]/)),
    kw_role: _ => token(prec(1, /[rR][oO][lL][eE]/)),
    kw_rollback: _ => token(prec(1, /[rR][oO][lL][lL][bB][aA][cC][kK]/)),
    kw_rollup: _ => token(prec(1, /[rR][oO][lL][lL][uU][pP]/)),
    kw_routine: _ => token(prec(1, /[rR][oO][uU][tT][iI][nN][eE]/)),
    kw_routines: _ => token(prec(1, /[rR][oO][uU][tT][iI][nN][eE][sS]/)),
    kw_row: _ => token(prec(1, /[rR][oO][wW]/)),
    kw_rows: _ => token(prec(1, /[rR][oO][wW][sS]/)),
    kw_rule: _ => token(prec(1, /[rR][uU][lL][eE]/)),
    kw_savepoint: _ => token(prec(1, /[sS][aA][vV][eE][pP][oO][iI][nN][tT]/)),
    kw_scalar: _ => token(prec(1, /[sS][cC][aA][lL][aA][rR]/)),
    kw_schema: _ => token(prec(1, /[sS][cC][hH][eE][mM][aA]/)),
    kw_schemas: _ => token(prec(1, /[sS][cC][hH][eE][mM][aA][sS]/)),
    kw_scroll: _ => token(prec(1, /[sS][cC][rR][oO][lL][lL]/)),
    kw_search: _ => token(prec(1, /[sS][eE][aA][rR][cC][hH]/)),
    kw_second: _ => token(prec(1, /[sS][eE][cC][oO][nN][dD]/)),
    kw_security: _ => token(prec(1, /[sS][eE][cC][uU][rR][iI][tT][yY]/)),
    kw_select: _ => token(prec(1, /[sS][eE][lL][eE][cC][tT]/)),
    kw_sequence: _ => token(prec(1, /[sS][eE][qQ][uU][eE][nN][cC][eE]/)),
    kw_sequences: _ => token(prec(1, /[sS][eE][qQ][uU][eE][nN][cC][eE][sS]/)),
    kw_serializable: _ => token(prec(1, /[sS][eE][rR][iI][aA][lL][iI][zZ][aA][bB][lL][eE]/)),
    kw_server: _ => token(prec(1, /[sS][eE][rR][vV][eE][rR]/)),
    kw_session: _ => token(prec(1, /[sS][eE][sS][sS][iI][oO][nN]/)),
    kw_session_user: _ => token(prec(1, /[sS][eE][sS][sS][iI][oO][nN]_[uU][sS][eE][rR]/)),
    kw_set: _ => token(prec(1, /[sS][eE][tT]/)),
    kw_setof: _ => token(prec(1, /[sS][eE][tT][oO][fF]/)),
    kw_sets: _ => token(prec(1, /[sS][eE][tT][sS]/)),
    kw_share: _ => token(prec(1, /[sS][hH][aA][rR][eE]/)),
    kw_show: _ => token(prec(1, /[sS][hH][oO][wW]/)),
    kw_similar: _ => token(prec(1, /[sS][iI][mM][iI][lL][aA][rR]/)),
    kw_simple: _ => token(prec(1, /[sS][iI][mM][pP][lL][eE]/)),
    kw_skip: _ => token(prec(1, /[sS][kK][iI][pP]/)),
    kw_smallint: _ => token(prec(1, /[sS][mM][aA][lL][lL][iI][nN][tT]/)),
    kw_snapshot: _ => token(prec(1, /[sS][nN][aA][pP][sS][hH][oO][tT]/)),
    kw_some: _ => token(prec(1, /[sS][oO][mM][eE]/)),
    kw_source: _ => token(prec(1, /[sS][oO][uU][rR][cC][eE]/)),
    kw_sql: _ => token(prec(1, /[sS][qQ][lL]/)),
    kw_stable: _ => token(prec(1, /[sS][tT][aA][bB][lL][eE]/)),
    kw_standalone: _ => token(prec(1, /[sS][tT][aA][nN][dD][aA][lL][oO][nN][eE]/)),
    kw_start: _ => token(prec(1, /[sS][tT][aA][rR][tT]/)),
    kw_statement: _ => token(prec(1, /[sS][tT][aA][tT][eE][mM][eE][nN][tT]/)),
    kw_statistics: _ => token(prec(1, /[sS][tT][aA][tT][iI][sS][tT][iI][cC][sS]/)),
    kw_stdin: _ => token(prec(1, /[sS][tT][dD][iI][nN]/)),
    kw_stdout: _ => token(prec(1, /[sS][tT][dD][oO][uU][tT]/)),
    kw_storage: _ => token(prec(1, /[sS][tT][oO][rR][aA][gG][eE]/)),
    kw_stored: _ => token(prec(1, /[sS][tT][oO][rR][eE][dD]/)),
    kw_strict: _ => token(prec(1, /[sS][tT][rR][iI][cC][tT]/)),
    kw_string: _ => token(prec(1, /[sS][tT][rR][iI][nN][gG]/)),
    kw_strip: _ => token(prec(1, /[sS][tT][rR][iI][pP]/)),
    kw_subscription: _ => token(prec(1, /[sS][uU][bB][sS][cC][rR][iI][pP][tT][iI][oO][nN]/)),
    kw_substring: _ => token(prec(1, /[sS][uU][bB][sS][tT][rR][iI][nN][gG]/)),
    kw_support: _ => token(prec(1, /[sS][uU][pP][pP][oO][rR][tT]/)),
    kw_symmetric: _ => token(prec(1, /[sS][yY][mM][mM][eE][tT][rR][iI][cC]/)),
    kw_sysid: _ => token(prec(1, /[sS][yY][sS][iI][dD]/)),
    kw_system: _ => token(prec(1, /[sS][yY][sS][tT][eE][mM]/)),
    kw_system_user: _ => token(prec(1, /[sS][yY][sS][tT][eE][mM]_[uU][sS][eE][rR]/)),
    kw_table: _ => token(prec(1, /[tT][aA][bB][lL][eE]/)),
    kw_tables: _ => token(prec(1, /[tT][aA][bB][lL][eE][sS]/)),
    kw_tablesample: _ => token(prec(1, /[tT][aA][bB][lL][eE][sS][aA][mM][pP][lL][eE]/)),
    kw_tablespace: _ => token(prec(1, /[tT][aA][bB][lL][eE][sS][pP][aA][cC][eE]/)),
    kw_target: _ => token(prec(1, /[tT][aA][rR][gG][eE][tT]/)),
    kw_temp: _ => token(prec(1, /[tT][eE][mM][pP]/)),
    kw_template: _ => token(prec(1, /[tT][eE][mM][pP][lL][aA][tT][eE]/)),
    kw_temporary: _ => token(prec(1, /[tT][eE][mM][pP][oO][rR][aA][rR][yY]/)),
    kw_text: _ => token(prec(1, /[tT][eE][xX][tT]/)),
    kw_then: _ => token(prec(1, /[tT][hH][eE][nN]/)),
    kw_ties: _ => token(prec(1, /[tT][iI][eE][sS]/)),
    kw_time: _ => token(prec(1, /[tT][iI][mM][eE]/)),
    kw_timestamp: _ => token(prec(1, /[tT][iI][mM][eE][sS][tT][aA][mM][pP]/)),
    kw_to: _ => token(prec(1, /[tT][oO]/)),
    kw_trailing: _ => token(prec(1, /[tT][rR][aA][iI][lL][iI][nN][gG]/)),
    kw_transaction: _ => token(prec(1, /[tT][rR][aA][nN][sS][aA][cC][tT][iI][oO][nN]/)),
    kw_transform: _ => token(prec(1, /[tT][rR][aA][nN][sS][fF][oO][rR][mM]/)),
    kw_treat: _ => token(prec(1, /[tT][rR][eE][aA][tT]/)),
    kw_trigger: _ => token(prec(1, /[tT][rR][iI][gG][gG][eE][rR]/)),
    kw_trim: _ => token(prec(1, /[tT][rR][iI][mM]/)),
    kw_true: _ => token(prec(1, /[tT][rR][uU][eE]/)),
    kw_truncate: _ => token(prec(1, /[tT][rR][uU][nN][cC][aA][tT][eE]/)),
    kw_trusted: _ => token(prec(1, /[tT][rR][uU][sS][tT][eE][dD]/)),
    kw_type: _ => token(prec(1, /[tT][yY][pP][eE]/)),
    kw_types: _ => token(prec(1, /[tT][yY][pP][eE][sS]/)),
    kw_uescape: _ => token(prec(1, /[uU][eE][sS][cC][aA][pP][eE]/)),
    kw_unbounded: _ => token(prec(1, /[uU][nN][bB][oO][uU][nN][dD][eE][dD]/)),
    kw_uncommitted: _ => token(prec(1, /[uU][nN][cC][oO][mM][mM][iI][tT][tT][eE][dD]/)),
    kw_unconditional: _ => token(prec(1, /[uU][nN][cC][oO][nN][dD][iI][tT][iI][oO][nN][aA][lL]/)),
    kw_unencrypted: _ => token(prec(1, /[uU][nN][eE][nN][cC][rR][yY][pP][tT][eE][dD]/)),
    kw_union: _ => token(prec(1, /[uU][nN][iI][oO][nN]/)),
    kw_unique: _ => token(prec(1, /[uU][nN][iI][qQ][uU][eE]/)),
    kw_unknown: _ => token(prec(1, /[uU][nN][kK][nN][oO][wW][nN]/)),
    kw_unlisten: _ => token(prec(1, /[uU][nN][lL][iI][sS][tT][eE][nN]/)),
    kw_unlogged: _ => token(prec(1, /[uU][nN][lL][oO][gG][gG][eE][dD]/)),
    kw_until: _ => token(prec(1, /[uU][nN][tT][iI][lL]/)),
    kw_update: _ => token(prec(1, /[uU][pP][dD][aA][tT][eE]/)),
    kw_user: _ => token(prec(1, /[uU][sS][eE][rR]/)),
    kw_using: _ => token(prec(1, /[uU][sS][iI][nN][gG]/)),
    kw_vacuum: _ => token(prec(1, /[vV][aA][cC][uU][uU][mM]/)),
    kw_valid: _ => token(prec(1, /[vV][aA][lL][iI][dD]/)),
    kw_validate: _ => token(prec(1, /[vV][aA][lL][iI][dD][aA][tT][eE]/)),
    kw_validator: _ => token(prec(1, /[vV][aA][lL][iI][dD][aA][tT][oO][rR]/)),
    kw_value: _ => token(prec(1, /[vV][aA][lL][uU][eE]/)),
    kw_values: _ => token(prec(1, /[vV][aA][lL][uU][eE][sS]/)),
    kw_varchar: _ => token(prec(1, /[vV][aA][rR][cC][hH][aA][rR]/)),
    kw_variadic: _ => token(prec(1, /[vV][aA][rR][iI][aA][dD][iI][cC]/)),
    kw_varying: _ => token(prec(1, /[vV][aA][rR][yY][iI][nN][gG]/)),
    kw_verbose: _ => token(prec(1, /[vV][eE][rR][bB][oO][sS][eE]/)),
    kw_version: _ => token(prec(1, /[vV][eE][rR][sS][iI][oO][nN]/)),
    kw_view: _ => token(prec(1, /[vV][iI][eE][wW]/)),
    kw_views: _ => token(prec(1, /[vV][iI][eE][wW][sS]/)),
    kw_virtual: _ => token(prec(1, /[vV][iI][rR][tT][uU][aA][lL]/)),
    kw_volatile: _ => token(prec(1, /[vV][oO][lL][aA][tT][iI][lL][eE]/)),
    kw_when: _ => token(prec(1, /[wW][hH][eE][nN]/)),
    kw_where: _ => token(prec(1, /[wW][hH][eE][rR][eE]/)),
    kw_whitespace: _ => token(prec(1, /[wW][hH][iI][tT][eE][sS][pP][aA][cC][eE]/)),
    kw_window: _ => token(prec(1, /[wW][iI][nN][dD][oO][wW]/)),
    kw_with: _ => token(prec(1, /[wW][iI][tT][hH]/)),
    kw_within: _ => token(prec(1, /[wW][iI][tT][hH][iI][nN]/)),
    kw_without: _ => token(prec(1, /[wW][iI][tT][hH][oO][uU][tT]/)),
    kw_work: _ => token(prec(1, /[wW][oO][rR][kK]/)),
    kw_wrapper: _ => token(prec(1, /[wW][rR][aA][pP][pP][eE][rR]/)),
    kw_write: _ => token(prec(1, /[wW][rR][iI][tT][eE]/)),
    kw_xml: _ => token(prec(1, /[xX][mM][lL]/)),
    kw_xmlattributes: _ => token(prec(1, /[xX][mM][lL][aA][tT][tT][rR][iI][bB][uU][tT][eE][sS]/)),
    kw_xmlconcat: _ => token(prec(1, /[xX][mM][lL][cC][oO][nN][cC][aA][tT]/)),
    kw_xmlelement: _ => token(prec(1, /[xX][mM][lL][eE][lL][eE][mM][eE][nN][tT]/)),
    kw_xmlexists: _ => token(prec(1, /[xX][mM][lL][eE][xX][iI][sS][tT][sS]/)),
    kw_xmlforest: _ => token(prec(1, /[xX][mM][lL][fF][oO][rR][eE][sS][tT]/)),
    kw_xmlnamespaces: _ => token(prec(1, /[xX][mM][lL][nN][aA][mM][eE][sS][pP][aA][cC][eE][sS]/)),
    kw_xmlparse: _ => token(prec(1, /[xX][mM][lL][pP][aA][rR][sS][eE]/)),
    kw_xmlpi: _ => token(prec(1, /[xX][mM][lL][pP][iI]/)),
    kw_xmlroot: _ => token(prec(1, /[xX][mM][lL][rR][oO][oO][tT]/)),
    kw_xmlserialize: _ => token(prec(1, /[xX][mM][lL][sS][eE][rR][iI][aA][lL][iI][zZ][eE]/)),
    kw_xmltable: _ => token(prec(1, /[xX][mM][lL][tT][aA][bB][lL][eE]/)),
    kw_year: _ => token(prec(1, /[yY][eE][aA][rR]/)),
    kw_yes: _ => token(prec(1, /[yY][eE][sS]/)),
    kw_zone: _ => token(prec(1, /[zZ][oO][nN][eE]/)),

    // ── Lexer rules ────────────────────────────────────────────────────────────

    // ── Identifiers ──────────────────────────────────────────────────────────────

    // Plain unquoted identifier; keywords (prec 1) take priority over this (prec 0).
    identifier: _ => token(prec(0, /[a-zA-Z_\u0080-\u00ff][a-zA-Z0-9_$\u0080-\u00ff]*/)),

    // Double-quoted delimited identifier: "my table" or "My""Column"
    // NOTE: U&"..." unicode identifiers have the same lexer limitation as
    // prefix strings — the U is consumed as an identifier. An external
    // scanner would be needed to handle these correctly.
    quoted_identifier: _ => token(/"([^"]|"")*"/),

    // gram.y's IDENT terminal matches either identifier form (scan.l lexes
    // quoted identifiers into IDENT). Hidden so the CST surfaces the
    // (identifier) / (quoted_identifier) leaf directly. 'word' below must
    // stay on the bare identifier token, so this cannot replace it there.
    _ident: $ => choice($.identifier, $.quoted_identifier),

    // Positional parameter: $1, $2, ...
    param: _ => /\$[0-9]+/,

    // ── Numeric literals ─────────────────────────────────────────────────────────

    integer_literal: _ => token(/[0-9](_?[0-9])*/),

    float_literal: _ => token(choice(
      /[0-9](_?[0-9])*\.[0-9](_?[0-9])*([eE][+-]?[0-9](_?[0-9])*)? /,
      /\.[0-9](_?[0-9])*([eE][+-]?[0-9](_?[0-9])*)?/,
      /[0-9](_?[0-9])*[eE][+-]?[0-9](_?[0-9])*/
    )),

    // ── String literals ──────────────────────────────────────────────────────────

    // Standard SQL string: 'hello' — doubled single-quote is the escape: 'it''s'
    string_literal: _ => token(/'([^']|'')*'/),

    // NOTE: E'...', N'...', and U&'...' prefix strings are parsed as
    // function-call-like forms (identifier + string_literal) rather than
    // single tokens. This is a tree-sitter limitation: the lexer can't
    // prefer a multi-char token over an identifier when both start with
    // a letter, because the parser state commits to 'identifier' before
    // considering string alternatives. An external scanner would fix this
    // but adds significant complexity. The parse is still correct — PG
    // treats E'...' the same as a function call to E() at parse time.

    // Dollar-quoted string: $$body$$ or $tag$body$tag$
    // Handled by the external scanner (postgres/src/scanner.c) so the
    // open/close tags must match exactly. A pure regex cannot enforce that
    // because tree-sitter compiles tokens into a DFA that ignores non-greedy
    // `*?`, which previously caused over-capture across multiple quoted
    // strings in a single file.

    // Bit string: B'0101'
    bit_string_literal: _ => token(/[bB]'[01]*'/),

    // Hex string: X'deadbeef'
    hex_string_literal: _ => token(/[xX]'[0-9a-fA-F]*'/),

    // ── Operators ────────────────────────────────────────────────────────────────

    // Custom and built-in multi-character operators.
    // The specific compound operators (::, .., :=, =>, <=, >=, <>) are matched
    // as string literals in the grammar rules and take priority.
    operator: _ => token(/[~!@#^&|?+\-*/%<>=]+/),

    // ── Comments ─────────────────────────────────────────────────────────────────

    comment: _ => token(choice(
      /--[^\r\n]*/,
      /\/\*[^*]*\*+([^/*][^*]*\*+)*\//
    )),
  }, // end rules
}); // end grammar