Skip to content

Commit 8878dff

Browse files
authored
parser: fix parsing insert select on conflict part 2 (#721)
There are some more cases that we need to handle.
1 parent 1758654 commit 8878dff

File tree

3 files changed

+211
-3
lines changed

3 files changed

+211
-3
lines changed

crates/squawk_parser/src/grammar.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3456,7 +3456,9 @@ fn join(p: &mut Parser<'_>) {
34563456
if !opt_from_item(p) {
34573457
p.error("expected from_item");
34583458
}
3459-
if p.at(ON_KW) && !p.nth_at(1, CONFLICT_KW) {
3459+
// need to check that we're not actually at the on_conflict clause in an
3460+
// insert/update statement
3461+
if p.at(ON_KW) && !(p.nth_at(1, CONFLICT_KW) && matches!(p.nth(2), DO_KW | ON_KW | L_PAREN)) {
34603462
on_clause(p);
34613463
} else if p.at(USING_KW) {
34623464
join_using_clause(p);

crates/squawk_parser/tests/data/ok/insert.sql

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,4 +99,23 @@ INSERT INTO t
9999
SELECT *
100100
FROM t
101101
CROSS JOIN f
102-
ON CONFLICT DO NOTHING;
102+
ON CONFLICT
103+
DO NOTHING;
104+
105+
insert into t
106+
select * from u join i
107+
on conflict = conflict
108+
on conflict
109+
do nothing;
110+
111+
insert into t
112+
select * from u join i
113+
on conflict = conflict
114+
on conflict (foo)
115+
do nothing;
116+
117+
insert into t
118+
select * from u join i
119+
on conflict = conflict
120+
on conflict
121+
on constraint temporal_rng_pk do nothing;

crates/squawk_parser/tests/snapshots/tests__insert_ok.snap

Lines changed: 188 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1508,10 +1508,197 @@ SOURCE_FILE
15081508
ON_KW "ON"
15091509
WHITESPACE " "
15101510
CONFLICT_KW "CONFLICT"
1511-
WHITESPACE " "
1511+
WHITESPACE "\n "
15121512
CONFLICT_DO_NOTHING
15131513
DO_KW "DO"
15141514
WHITESPACE " "
15151515
NOTHING_KW "NOTHING"
15161516
SEMICOLON ";"
1517+
WHITESPACE "\n\n"
1518+
INSERT
1519+
INSERT_KW "insert"
1520+
WHITESPACE " "
1521+
INTO_KW "into"
1522+
WHITESPACE " "
1523+
PATH
1524+
PATH_SEGMENT
1525+
NAME_REF
1526+
IDENT "t"
1527+
WHITESPACE " \n"
1528+
SELECT
1529+
SELECT_CLAUSE
1530+
SELECT_KW "select"
1531+
WHITESPACE " "
1532+
TARGET_LIST
1533+
TARGET
1534+
STAR "*"
1535+
WHITESPACE " "
1536+
FROM_CLAUSE
1537+
FROM_KW "from"
1538+
WHITESPACE " "
1539+
JOIN_EXPR
1540+
FROM_ITEM
1541+
NAME_REF
1542+
IDENT "u"
1543+
WHITESPACE " "
1544+
JOIN
1545+
JOIN_INNER
1546+
JOIN_KW "join"
1547+
WHITESPACE " "
1548+
FROM_ITEM
1549+
NAME_REF
1550+
IDENT "i"
1551+
WHITESPACE " \n"
1552+
ON_CLAUSE
1553+
ON_KW "on"
1554+
WHITESPACE " "
1555+
BIN_EXPR
1556+
NAME_REF
1557+
CONFLICT_KW "conflict"
1558+
WHITESPACE " "
1559+
EQ "="
1560+
WHITESPACE " "
1561+
NAME_REF
1562+
CONFLICT_KW "conflict"
1563+
WHITESPACE "\n"
1564+
ON_CONFLICT_CLAUSE
1565+
ON_KW "on"
1566+
WHITESPACE " "
1567+
CONFLICT_KW "conflict"
1568+
WHITESPACE "\n "
1569+
CONFLICT_DO_NOTHING
1570+
DO_KW "do"
1571+
WHITESPACE " "
1572+
NOTHING_KW "nothing"
1573+
SEMICOLON ";"
1574+
WHITESPACE "\n\n"
1575+
INSERT
1576+
INSERT_KW "insert"
1577+
WHITESPACE " "
1578+
INTO_KW "into"
1579+
WHITESPACE " "
1580+
PATH
1581+
PATH_SEGMENT
1582+
NAME_REF
1583+
IDENT "t"
1584+
WHITESPACE " \n"
1585+
SELECT
1586+
SELECT_CLAUSE
1587+
SELECT_KW "select"
1588+
WHITESPACE " "
1589+
TARGET_LIST
1590+
TARGET
1591+
STAR "*"
1592+
WHITESPACE " "
1593+
FROM_CLAUSE
1594+
FROM_KW "from"
1595+
WHITESPACE " "
1596+
JOIN_EXPR
1597+
FROM_ITEM
1598+
NAME_REF
1599+
IDENT "u"
1600+
WHITESPACE " "
1601+
JOIN
1602+
JOIN_INNER
1603+
JOIN_KW "join"
1604+
WHITESPACE " "
1605+
FROM_ITEM
1606+
NAME_REF
1607+
IDENT "i"
1608+
WHITESPACE " \n"
1609+
ON_CLAUSE
1610+
ON_KW "on"
1611+
WHITESPACE " "
1612+
BIN_EXPR
1613+
NAME_REF
1614+
CONFLICT_KW "conflict"
1615+
WHITESPACE " "
1616+
EQ "="
1617+
WHITESPACE " "
1618+
NAME_REF
1619+
CONFLICT_KW "conflict"
1620+
WHITESPACE "\n"
1621+
ON_CONFLICT_CLAUSE
1622+
ON_KW "on"
1623+
WHITESPACE " "
1624+
CONFLICT_KW "conflict"
1625+
WHITESPACE " "
1626+
CONFLICT_ON_INDEX
1627+
CONFLICT_INDEX_ITEM_LIST
1628+
L_PAREN "("
1629+
CONFLICT_INDEX_ITEM
1630+
NAME_REF
1631+
IDENT "foo"
1632+
R_PAREN ")"
1633+
WHITESPACE "\n "
1634+
CONFLICT_DO_NOTHING
1635+
DO_KW "do"
1636+
WHITESPACE " "
1637+
NOTHING_KW "nothing"
1638+
SEMICOLON ";"
1639+
WHITESPACE "\n\n"
1640+
INSERT
1641+
INSERT_KW "insert"
1642+
WHITESPACE " "
1643+
INTO_KW "into"
1644+
WHITESPACE " "
1645+
PATH
1646+
PATH_SEGMENT
1647+
NAME_REF
1648+
IDENT "t"
1649+
WHITESPACE " \n"
1650+
SELECT
1651+
SELECT_CLAUSE
1652+
SELECT_KW "select"
1653+
WHITESPACE " "
1654+
TARGET_LIST
1655+
TARGET
1656+
STAR "*"
1657+
WHITESPACE " "
1658+
FROM_CLAUSE
1659+
FROM_KW "from"
1660+
WHITESPACE " "
1661+
JOIN_EXPR
1662+
FROM_ITEM
1663+
NAME_REF
1664+
IDENT "u"
1665+
WHITESPACE " "
1666+
JOIN
1667+
JOIN_INNER
1668+
JOIN_KW "join"
1669+
WHITESPACE " "
1670+
FROM_ITEM
1671+
NAME_REF
1672+
IDENT "i"
1673+
WHITESPACE " \n"
1674+
ON_CLAUSE
1675+
ON_KW "on"
1676+
WHITESPACE " "
1677+
BIN_EXPR
1678+
NAME_REF
1679+
CONFLICT_KW "conflict"
1680+
WHITESPACE " "
1681+
EQ "="
1682+
WHITESPACE " "
1683+
NAME_REF
1684+
CONFLICT_KW "conflict"
1685+
WHITESPACE "\n"
1686+
ON_CONFLICT_CLAUSE
1687+
ON_KW "on"
1688+
WHITESPACE " "
1689+
CONFLICT_KW "conflict"
1690+
WHITESPACE "\n "
1691+
CONFLICT_ON_CONSTRAINT
1692+
ON_KW "on"
1693+
WHITESPACE " "
1694+
CONSTRAINT_KW "constraint"
1695+
WHITESPACE " "
1696+
NAME_REF
1697+
IDENT "temporal_rng_pk"
1698+
WHITESPACE " "
1699+
CONFLICT_DO_NOTHING
1700+
DO_KW "do"
1701+
WHITESPACE " "
1702+
NOTHING_KW "nothing"
1703+
SEMICOLON ";"
15171704
WHITESPACE "\n"

0 commit comments

Comments
 (0)