Re: BUG #18077: PostgreSQL server subprocess crashed by a SELECT statement with WITH clause
Richard Guo <guofenglinux@gmail.com>
From: Richard Guo <guofenglinux@gmail.com>
To: fuboat@outlook.com, pgsql-bugs@lists.postgresql.org
Date: 2023-08-30T11:42:34Z
Lists: pgsql-bugs
On Wed, Aug 30, 2023 at 4:06 PM PG Bug reporting form <
noreply@postgresql.org> wrote:
> PostgreSQL server subprocess crashed by a SELECT statement with WITH
> clause.
> It did not affect the main process. It can be reproduced on PostgreSQL
> 15.4.
>
> PoC:
> ```sql
> WITH x ( x ) AS ( SELECT ( 1 , 'x' ) ) SELECT FROM x WHERE ( SELECT FROM (
> SELECT x ) x WHERE ( SELECT x ( x ) ) )
> ```
Thanks for the report! Reproduced here on HEAD. I looked into it a
little bit and it seems that when we expand a Var of type RECORD from a
RTE_SUBQUERY, we mess up with the level of ParseState. For example,
select * from (SELECT(1, 'a')) as t(c)
WHERE (SELECT * FROM (SELECT c as c1) s
WHERE (select * from func(c1) f));
When we expand Var 'c1' from func(c1), we figure out that it comes from
subquery 's'. When we recurse into subquery 's', we just build an
additional level of ParseState atop the current ParseState, which seems
not correct. Shouldn't we climb up by the nesting depth first before we
build the additional level of ParseState? Something like
--- a/src/backend/parser/parse_target.c
+++ b/src/backend/parser/parse_target.c
@@ -1591,6 +1591,12 @@ expandRecordVariable(ParseState *pstate, Var *var,
int levelsup)
*/
ParseState mypstate = {0};
+ for (int i = 0; i < netlevelsup; i++)
+ {
+ pstate = pstate->parentParseState;
+ Assert(pstate != NULL);
+ }
+
mypstate.parentParseState = pstate;
mypstate.p_rtable = rte->subquery->rtable;
Thanks
Richard
Commits
-
Track nesting depth correctly when drilling down into RECORD Vars.
- e0e492e5a928 17.0 landed
- d29812c0c6cd 12.17 landed
- c5b7f791dab9 13.13 landed
- ae13f8166dc3 14.10 landed
- a374f6c61681 11.22 landed
- 53630f12d39b 16.1 landed
- 2679a107a152 15.5 landed
-
Fix get_expr_result_type() to find field names for RECORD Consts.
- 8a15b4178c40 12.17 landed
- 59bc0dfe44a6 13.13 landed
- 479b99125dcc 11.22 landed
-
Allow extracting fields from a ROW() expression in more cases.
- ece1154f4c89 11.22 landed
- 2f02d4a2b9cb 12.17 landed