Skip to content

Commit 87422ec

Browse files
authored
fix: support other 'booly' values for opts bool (#493)
follow-up for #486 reference: https://www.postgresql.org/docs/current/sql-explain.html > boolean: Specifies whether the selected option should be turned on or off. You can write TRUE, ON, or 1 to enable the option, and FALSE, OFF, or 0 to disable it. The boolean value can also be omitted, in which case TRUE is assumed. makes 5 more regression tests pass 🎉 added one todo item - i was not sure if its possible to know if its specifically 1 or 0. let me know if it is! :)
1 parent 35e0876 commit 87422ec

File tree

428 files changed

+113817
-116
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

428 files changed

+113817
-116
lines changed

Cargo.lock

Lines changed: 9 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ serde = { version = "1.0.215", features = ["derive"] }
2323
serde_json = "1.0"
2424
serde_plain = "1.0"
2525
serde_repr = "0.1"
26+
regex = "1.11.1"
2627
simplelog = "0.12.0"
2728
structopt = "0.3"
2829
tempfile = "3.2.0"

crates/squawk_parser/src/grammar.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4644,7 +4644,9 @@ fn string_literal(p: &mut Parser<'_>) {
46444644

46454645
fn opt_bool_literal(p: &mut Parser<'_>) -> bool {
46464646
let m = p.start();
4647-
if p.eat(TRUE_KW) || p.eat(FALSE_KW) {
4647+
// TOOD: we might want to check if its 1 or 0 specificially, not just `INT_NUMBER`
4648+
// https://www.postgresql.org/docs/current/sql-explain.html
4649+
if p.eat(TRUE_KW) || p.eat(FALSE_KW) || p.eat(OFF_KW) || p.eat(ON_KW) || p.eat(INT_NUMBER) {
46484650
m.complete(p, LITERAL);
46494651
true
46504652
} else {

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

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ explain analyze select a from t;
88
explain (
99
analyze,
1010
verbose,
11-
costs,
12-
costs true,
13-
costs false,
11+
costs,
12+
costs true,
13+
costs false,
1414
settings,
1515
generic_plan,
1616
buffers,
@@ -69,3 +69,14 @@ explain analyze (((((select 1)))));
6969
-- parens_values
7070
explain analyze (((((values (1))))));
7171

72+
-- boolean off
73+
EXPLAIN (COSTS OFF) SELECT * FROM foo WHERE i = 4;
74+
75+
-- boolean on
76+
EXPLAIN (COSTS ON) SELECT * FROM foo WHERE i = 4;
77+
78+
-- boolean 1
79+
EXPLAIN (COSTS 1) SELECT * FROM foo WHERE i = 4;
80+
81+
-- boolean 0
82+
EXPLAIN (COSTS 0) SELECT * FROM foo WHERE i = 4;
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
--
2+
-- ADVISORY LOCKS
3+
--
4+
5+
SELECT oid AS datoid FROM pg_database WHERE datname = current_database() ;
6+
7+
BEGIN;
8+
9+
SELECT
10+
pg_advisory_xact_lock(1), pg_advisory_xact_lock_shared(2),
11+
pg_advisory_xact_lock(1, 1), pg_advisory_xact_lock_shared(2, 2);
12+
13+
SELECT locktype, classid, objid, objsubid, mode, granted
14+
FROM pg_locks WHERE locktype = 'advisory' AND database = 'datoid'
15+
ORDER BY classid, objid, objsubid;
16+
17+
18+
-- pg_advisory_unlock_all() shouldn't release xact locks
19+
SELECT pg_advisory_unlock_all();
20+
21+
SELECT count(*) FROM pg_locks WHERE locktype = 'advisory' AND database = 'datoid';
22+
23+
24+
-- can't unlock xact locks
25+
SELECT
26+
pg_advisory_unlock(1), pg_advisory_unlock_shared(2),
27+
pg_advisory_unlock(1, 1), pg_advisory_unlock_shared(2, 2);
28+
29+
30+
-- automatically release xact locks at commit
31+
COMMIT;
32+
33+
SELECT count(*) FROM pg_locks WHERE locktype = 'advisory' AND database = 'datoid';
34+
35+
36+
BEGIN;
37+
38+
-- holding both session and xact locks on the same objects, xact first
39+
SELECT
40+
pg_advisory_xact_lock(1), pg_advisory_xact_lock_shared(2),
41+
pg_advisory_xact_lock(1, 1), pg_advisory_xact_lock_shared(2, 2);
42+
43+
SELECT locktype, classid, objid, objsubid, mode, granted
44+
FROM pg_locks WHERE locktype = 'advisory' AND database = 'datoid'
45+
ORDER BY classid, objid, objsubid;
46+
47+
SELECT
48+
pg_advisory_lock(1), pg_advisory_lock_shared(2),
49+
pg_advisory_lock(1, 1), pg_advisory_lock_shared(2, 2);
50+
51+
ROLLBACK;
52+
53+
SELECT locktype, classid, objid, objsubid, mode, granted
54+
FROM pg_locks WHERE locktype = 'advisory' AND database = 'datoid'
55+
ORDER BY classid, objid, objsubid;
56+
57+
58+
-- unlocking session locks
59+
SELECT
60+
pg_advisory_unlock(1), pg_advisory_unlock(1),
61+
pg_advisory_unlock_shared(2), pg_advisory_unlock_shared(2),
62+
pg_advisory_unlock(1, 1), pg_advisory_unlock(1, 1),
63+
pg_advisory_unlock_shared(2, 2), pg_advisory_unlock_shared(2, 2);
64+
65+
SELECT count(*) FROM pg_locks WHERE locktype = 'advisory' AND database = 'datoid';
66+
67+
68+
BEGIN;
69+
70+
-- holding both session and xact locks on the same objects, session first
71+
SELECT
72+
pg_advisory_lock(1), pg_advisory_lock_shared(2),
73+
pg_advisory_lock(1, 1), pg_advisory_lock_shared(2, 2);
74+
75+
SELECT locktype, classid, objid, objsubid, mode, granted
76+
FROM pg_locks WHERE locktype = 'advisory' AND database = 'datoid'
77+
ORDER BY classid, objid, objsubid;
78+
79+
SELECT
80+
pg_advisory_xact_lock(1), pg_advisory_xact_lock_shared(2),
81+
pg_advisory_xact_lock(1, 1), pg_advisory_xact_lock_shared(2, 2);
82+
83+
ROLLBACK;
84+
85+
SELECT locktype, classid, objid, objsubid, mode, granted
86+
FROM pg_locks WHERE locktype = 'advisory' AND database = 'datoid'
87+
ORDER BY classid, objid, objsubid;
88+
89+
90+
-- releasing all session locks
91+
SELECT pg_advisory_unlock_all();
92+
93+
SELECT count(*) FROM pg_locks WHERE locktype = 'advisory' AND database = 'datoid';
94+
95+
96+
BEGIN;
97+
98+
-- grabbing txn locks multiple times
99+
100+
SELECT
101+
pg_advisory_xact_lock(1), pg_advisory_xact_lock(1),
102+
pg_advisory_xact_lock_shared(2), pg_advisory_xact_lock_shared(2),
103+
pg_advisory_xact_lock(1, 1), pg_advisory_xact_lock(1, 1),
104+
pg_advisory_xact_lock_shared(2, 2), pg_advisory_xact_lock_shared(2, 2);
105+
106+
SELECT locktype, classid, objid, objsubid, mode, granted
107+
FROM pg_locks WHERE locktype = 'advisory' AND database = 'datoid'
108+
ORDER BY classid, objid, objsubid;
109+
110+
COMMIT;
111+
112+
SELECT count(*) FROM pg_locks WHERE locktype = 'advisory' AND database = 'datoid';
113+
114+
-- grabbing session locks multiple times
115+
116+
SELECT
117+
pg_advisory_lock(1), pg_advisory_lock(1),
118+
pg_advisory_lock_shared(2), pg_advisory_lock_shared(2),
119+
pg_advisory_lock(1, 1), pg_advisory_lock(1, 1),
120+
pg_advisory_lock_shared(2, 2), pg_advisory_lock_shared(2, 2);
121+
122+
SELECT locktype, classid, objid, objsubid, mode, granted
123+
FROM pg_locks WHERE locktype = 'advisory' AND database = 'datoid'
124+
ORDER BY classid, objid, objsubid;
125+
126+
SELECT
127+
pg_advisory_unlock(1), pg_advisory_unlock(1),
128+
pg_advisory_unlock_shared(2), pg_advisory_unlock_shared(2),
129+
pg_advisory_unlock(1, 1), pg_advisory_unlock(1, 1),
130+
pg_advisory_unlock_shared(2, 2), pg_advisory_unlock_shared(2, 2);
131+
132+
SELECT count(*) FROM pg_locks WHERE locktype = 'advisory' AND database = 'datoid';
133+
134+
-- .. and releasing them all at once
135+
136+
SELECT
137+
pg_advisory_lock(1), pg_advisory_lock(1),
138+
pg_advisory_lock_shared(2), pg_advisory_lock_shared(2),
139+
pg_advisory_lock(1, 1), pg_advisory_lock(1, 1),
140+
pg_advisory_lock_shared(2, 2), pg_advisory_lock_shared(2, 2);
141+
142+
SELECT locktype, classid, objid, objsubid, mode, granted
143+
FROM pg_locks WHERE locktype = 'advisory' AND database = 'datoid'
144+
ORDER BY classid, objid, objsubid;
145+
146+
SELECT pg_advisory_unlock_all();
147+
148+
SELECT count(*) FROM pg_locks WHERE locktype = 'advisory' AND database = 'datoid';

0 commit comments

Comments
 (0)