It appears that pg_overexplain produces invalid JSON output when
EXPLAIN (FORMAT JSON, RANGE_TABLE) is used. The "Unprunable RTIs" and "Result RTIs" properties are emitted as key:value pairs directly inside the "Range Table" JSON array, which is structurally invalid.
Attempted to fix this by moving ExplainCloseGroup() before the two overexplain_bitmapset()
calls, so the properties are emitted as siblings of "Range Table" in the parent object rather
than inside the array.
Attached a patch to address this which also includes a test.
Repro:
LOAD 'pg_overexplain'; CREATE TABLE t1 (id serial PRIMARY KEY, val text); CREATE TABLE t2 (id serial PRIMARY KEY, a_id int REFERENCES t1(id), data text); INSERT INTO t1 VALUES (1, 'x'), (2, 'y'); INSERT INTO t2 VALUES (1, 1, 'd1'), (2, 2, 'd2');
EXPLAIN (FORMAT JSON, RANGE_TABLE) EXPLAIN (FORMAT JSON, RANGE_TABLE) SELECT * FROM t1 a JOIN t2 b ON a.id = b.a_id WHERE a.id = 1; "