Thread: Small query using LATERAL that segfaults Postgres
This small query seems to segfault Postgres. I've tried on the version of Postgres 11 that comes with Debian Stable and all versions on https://www.db-fiddle.com/ including 13 (Beta). DB Fiddle actually says "An unexpected error occurred." but I suspect that's the segfault. Tom SELECT 0 FROM (SELECT TRUE as "r", SUM(0) ) as "T1", LATERAL (SELECT TRUE as "b" UNION ALL SELECT "r" as "b" FROM (SELECT 0 ORDER BY COALESCE(0)) as "T1" ) as "T2" WHERE "b"
po 13. 7. 2020 v 20:06 odesílatel Tom Ellis <tom-lists-postgresql.org@jaguarpaw.co.uk> napsal:
This small query seems to segfault Postgres. I've tried on the
version of Postgres 11 that comes with Debian Stable and all versions
on https://www.db-fiddle.com/ including 13 (Beta). DB Fiddle actually
says "An unexpected error occurred." but I suspect that's the
segfault.
Tom
SELECT
0
FROM (SELECT
TRUE as "r",
SUM(0)
) as "T1",
LATERAL
(SELECT TRUE as "b"
UNION ALL
SELECT
"r" as "b"
FROM (SELECT 0 ORDER BY COALESCE(0)) as "T1"
) as "T2"
WHERE "b"
here is stacktrace
Program received signal SIGABRT, Aborted.
0x00007f269e6e9a25 in raise () from /lib64/libc.so.6
Missing separate debuginfos, use: dnf debuginfo-install libgcc-10.1.1-1.fc32.x86_64
(gdb) bt
#0 0x00007f269e6e9a25 in raise () from /lib64/libc.so.6
#1 0x00007f269e6d2895 in abort () from /lib64/libc.so.6
#2 0x000000000090340b in ExceptionalCondition (conditionName=conditionName@entry=0xa55fef "var->varno == rti",
errorType=errorType@entry=0x959029 "FailedAssertion", fileName=fileName@entry=0xa55f10 "allpaths.c",
lineNumber=lineNumber@entry=3532) at assert.c:67
#3 0x00000000006e3041 in qual_is_pushdown_safe (subquery=0x2b7cc40, safetyInfo=0x7ffcc3355530, qual=0x2b7a998, rti=6)
at allpaths.c:3532
#4 set_subquery_pathlist (rte=0x2b77258, rti=<optimized out>, rel=0x2b7a5e0, root=0x2b6fdb0) at allpaths.c:2262
#5 set_rel_size (root=root@entry=0x2b6fdb0, rel=rel@entry=0x2b7a5e0, rti=rti@entry=6, rte=rte@entry=0x2b77258) at allpaths.c:422
#6 0x00000000006e2101 in set_append_rel_size (rte=0x2b77258, rti=2, rel=0x2b6e850, root=0x2b798a0) at allpaths.c:1111
#7 set_rel_size (root=root@entry=0x2b6fdb0, rel=rel@entry=0x2b6e850, rti=rti@entry=2, rte=rte@entry=0x2b68098) at allpaths.c:383
#8 0x00000000006e4ea0 in set_base_rel_sizes (root=<optimized out>) at allpaths.c:323
#9 make_one_rel (root=root@entry=0x2b6fdb0, joinlist=joinlist@entry=0x2b79f08) at allpaths.c:185
#10 0x0000000000709b69 in query_planner (root=root@entry=0x2b6fdb0, qp_callback=qp_callback@entry=0x70a240 <standard_qp_callback>,
qp_extra=qp_extra@entry=0x7ffcc33557a0) at planmain.c:269
#11 0x000000000070edfb in grouping_planner (root=<optimized out>, inheritance_update=false, tuple_fraction=<optimized out>)
at planner.c:2058
#12 0x0000000000711907 in subquery_planner (glob=glob@entry=0x2b67ac8, parse=parse@entry=0x2b67be0,
parent_root=parent_root@entry=0x0, hasRecursion=hasRecursion@entry=false, tuple_fraction=tuple_fraction@entry=0)
at planner.c:1015
#13 0x0000000000712cbb in standard_planner (parse=0x2b67be0, query_string=<optimized out>, cursorOptions=256,
boundParams=<optimized out>) at planner.c:405
#14 0x00000000007dd4a8 in pg_plan_query (querytree=0x2b67be0,
query_string=query_string@entry=0x2aa23f0 "SELECT\n0\nFROM (SELECT\n TRUE as \"r\",\n SUM(0)\n ) as \"T1\",\nLATERAL\n(SELECT TRUE as \"b\"\n UNION ALL\n SELECT\n \"r\" as \"b\"\n FROM (SELECT 0 ORDER BY COALESCE(0)) as \""..., cursorOptions=cursorOptions@entry=256, boundParams=boundParams@entry=0x0) at postgres.c:875
#15 0x00000000007dd5a1 in pg_plan_queries (querytrees=0x2b6fd58,
query_string=query_string@entry=0x2aa23f0 "SELECT\n0\nFROM (SELECT\n TRUE as \"r\",\n SUM(0)\n ) as \"T1\",\nLATERAL\n(SELECT TRUE as \"b\"\n UNION ALL\n SELECT\n \"r\" as \"b\"\n FROM (SELECT 0 ORDER BY COALESCE(0)) as \""..., cursorOptions=cursorOptions@entry=256, boundParams=boundParams@entry=0x0) at postgres.c:966
#16 0x00000000007dd8f8 in exec_simple_query (
query_string=0x2aa23f0 "SELECT\n0\nFROM (SELECT\n TRUE as \"r\",\n SUM(0)\n ) as \"T1\",\nLATERAL\n(SELECT TRUE as \"b\"\n UNION ALL\n SELECT\n \"r\" as \"b\"\n FROM (SELECT 0 ORDER BY COALESCE(0)) as \""...)
at postgres.c:1158
#17 0x00000000007df755 in PostgresMain (argc=<optimized out>, argv=argv@entry=0x2ad06e8, dbname=<optimized out>,
username=<optimized out>) at postgres.c:4315
#18 0x00000000007579e9 in BackendRun (port=0x2ac6fe0) at postmaster.c:4523
0x00007f269e6e9a25 in raise () from /lib64/libc.so.6
Missing separate debuginfos, use: dnf debuginfo-install libgcc-10.1.1-1.fc32.x86_64
(gdb) bt
#0 0x00007f269e6e9a25 in raise () from /lib64/libc.so.6
#1 0x00007f269e6d2895 in abort () from /lib64/libc.so.6
#2 0x000000000090340b in ExceptionalCondition (conditionName=conditionName@entry=0xa55fef "var->varno == rti",
errorType=errorType@entry=0x959029 "FailedAssertion", fileName=fileName@entry=0xa55f10 "allpaths.c",
lineNumber=lineNumber@entry=3532) at assert.c:67
#3 0x00000000006e3041 in qual_is_pushdown_safe (subquery=0x2b7cc40, safetyInfo=0x7ffcc3355530, qual=0x2b7a998, rti=6)
at allpaths.c:3532
#4 set_subquery_pathlist (rte=0x2b77258, rti=<optimized out>, rel=0x2b7a5e0, root=0x2b6fdb0) at allpaths.c:2262
#5 set_rel_size (root=root@entry=0x2b6fdb0, rel=rel@entry=0x2b7a5e0, rti=rti@entry=6, rte=rte@entry=0x2b77258) at allpaths.c:422
#6 0x00000000006e2101 in set_append_rel_size (rte=0x2b77258, rti=2, rel=0x2b6e850, root=0x2b798a0) at allpaths.c:1111
#7 set_rel_size (root=root@entry=0x2b6fdb0, rel=rel@entry=0x2b6e850, rti=rti@entry=2, rte=rte@entry=0x2b68098) at allpaths.c:383
#8 0x00000000006e4ea0 in set_base_rel_sizes (root=<optimized out>) at allpaths.c:323
#9 make_one_rel (root=root@entry=0x2b6fdb0, joinlist=joinlist@entry=0x2b79f08) at allpaths.c:185
#10 0x0000000000709b69 in query_planner (root=root@entry=0x2b6fdb0, qp_callback=qp_callback@entry=0x70a240 <standard_qp_callback>,
qp_extra=qp_extra@entry=0x7ffcc33557a0) at planmain.c:269
#11 0x000000000070edfb in grouping_planner (root=<optimized out>, inheritance_update=false, tuple_fraction=<optimized out>)
at planner.c:2058
#12 0x0000000000711907 in subquery_planner (glob=glob@entry=0x2b67ac8, parse=parse@entry=0x2b67be0,
parent_root=parent_root@entry=0x0, hasRecursion=hasRecursion@entry=false, tuple_fraction=tuple_fraction@entry=0)
at planner.c:1015
#13 0x0000000000712cbb in standard_planner (parse=0x2b67be0, query_string=<optimized out>, cursorOptions=256,
boundParams=<optimized out>) at planner.c:405
#14 0x00000000007dd4a8 in pg_plan_query (querytree=0x2b67be0,
query_string=query_string@entry=0x2aa23f0 "SELECT\n0\nFROM (SELECT\n TRUE as \"r\",\n SUM(0)\n ) as \"T1\",\nLATERAL\n(SELECT TRUE as \"b\"\n UNION ALL\n SELECT\n \"r\" as \"b\"\n FROM (SELECT 0 ORDER BY COALESCE(0)) as \""..., cursorOptions=cursorOptions@entry=256, boundParams=boundParams@entry=0x0) at postgres.c:875
#15 0x00000000007dd5a1 in pg_plan_queries (querytrees=0x2b6fd58,
query_string=query_string@entry=0x2aa23f0 "SELECT\n0\nFROM (SELECT\n TRUE as \"r\",\n SUM(0)\n ) as \"T1\",\nLATERAL\n(SELECT TRUE as \"b\"\n UNION ALL\n SELECT\n \"r\" as \"b\"\n FROM (SELECT 0 ORDER BY COALESCE(0)) as \""..., cursorOptions=cursorOptions@entry=256, boundParams=boundParams@entry=0x0) at postgres.c:966
#16 0x00000000007dd8f8 in exec_simple_query (
query_string=0x2aa23f0 "SELECT\n0\nFROM (SELECT\n TRUE as \"r\",\n SUM(0)\n ) as \"T1\",\nLATERAL\n(SELECT TRUE as \"b\"\n UNION ALL\n SELECT\n \"r\" as \"b\"\n FROM (SELECT 0 ORDER BY COALESCE(0)) as \""...)
at postgres.c:1158
#17 0x00000000007df755 in PostgresMain (argc=<optimized out>, argv=argv@entry=0x2ad06e8, dbname=<optimized out>,
username=<optimized out>) at postgres.c:4315
#18 0x00000000007579e9 in BackendRun (port=0x2ac6fe0) at postmaster.c:4523
Regards
Pavel
Tom Ellis <tom-lists-postgresql.org@jaguarpaw.co.uk> writes: > This small query seems to segfault Postgres. I've tried on the > version of Postgres 11 that comes with Debian Stable and all versions > on https://www.db-fiddle.com/ including 13 (Beta). DB Fiddle actually > says "An unexpected error occurred." but I suspect that's the > segfault. Hm, looks like this has been wrong since we introduced LATERAL :-(. I pushed a band-aid fix. Thanks for the report! regards, tom lane
On Mon, Jul 13, 2020 at 08:40:38PM -0400, Tom Lane wrote: > Tom Ellis <tom-lists-postgresql.org@jaguarpaw.co.uk> writes: > > This small query seems to segfault Postgres. I've tried on the > > version of Postgres 11 that comes with Debian Stable and all versions > > on https://www.db-fiddle.com/ including 13 (Beta). DB Fiddle actually > > says "An unexpected error occurred." but I suspect that's the > > segfault. > > Hm, looks like this has been wrong since we introduced LATERAL :-(. > I pushed a band-aid fix. Thanks for the report! Thanks Tom. Could you send a link to the fix? I'd be interested to see what the problem was. Tom
On Tue, 14 Jul 2020 at 21:00, Tom Ellis <tom-lists-postgresql.org@jaguarpaw.co.uk> wrote: > Thanks Tom. Could you send a link to the fix? I'd be interested to > see what the problem was. https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=a742ecf9c63d454ccb107a357288c8ec1444ca12 David