Thread

Commits

  1. Ensure dummy paths have correct required_outer if rel is parameterized.

  1. BUG #15694: Server crash in EXPLAIN with LATERAL and a partitioned table

    The Post Office <noreply@postgresql.org> — 2019-03-14T11:24:27Z

    The following bug has been logged on the website:
    
    Bug reference:      15694
    Logged by:          Alexander Lakhin
    Email address:      exclusion@gmail.com
    PostgreSQL version: 11.2
    Operating system:   Ubuntu 18.04
    Description:        
    
    The following query:
    CREATE TABLE prt1_l (a int) PARTITION BY RANGE(a);
    CREATE TABLE prt2_l (a int);
    
    EXPLAIN
    SELECT * FROM prt1_l t1 LEFT JOIN LATERAL
      (SELECT t1.a as t1a, prt1_l.a FROM prt1_l) t2 ON t1.a = t2.a;
    
    crashes the server with the stack trace:
    Core was generated by `postgres: law regression [local] EXPLAIN             
                            '.
    Program terminated with signal SIGABRT, Aborted.
    #0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
    51      ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
    (gdb) bt
    #0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
    #1  0x00007f6548ca5801 in __GI_abort () at abort.c:79
    #2  0x000055a1a7906e13 in ExceptionalCondition (
        conditionName=conditionName@entry=0x55a1a7aafb80
    "!(bms_is_subset(appendrel->lateral_relids, required_outer))", 
        errorType=errorType@entry=0x55a1a795c61d "FailedAssertion",
    fileName=fileName@entry=0x55a1a7aaf164 "relnode.c", 
        lineNumber=lineNumber@entry=1543) at assert.c:54
    #3  0x000055a1a7752135 in get_appendrel_parampathinfo
    (appendrel=appendrel@entry=0x55a1a8ae5458, 
        required_outer=required_outer@entry=0x0) at relnode.c:1543
    #4  0x000055a1a7747783 in create_append_path (root=root@entry=0x0,
    rel=rel@entry=0x55a1a8ae5458, 
        subpaths=subpaths@entry=0x0,
    partial_subpaths=partial_subpaths@entry=0x0,
    required_outer=required_outer@entry=0x0, 
        parallel_workers=parallel_workers@entry=0, parallel_aware=false,
    partitioned_rels=0x0, rows=rows@entry=-1)
        at pathnode.c:1250
    #5  0x000055a1a7705bf7 in set_dummy_rel_pathlist
    (rel=rel@entry=0x55a1a8ae5458) at allpaths.c:2019
    #6  0x000055a1a7706e04 in set_subquery_pathlist (rte=<optimized out>,
    rti=<optimized out>, rel=<optimized out>, 
        root=<optimized out>) at allpaths.c:2205
    #7  set_rel_size (root=root@entry=0x55a1a8ae2158,
    rel=rel@entry=0x55a1a8ae5458, rti=rti@entry=4, rte=<optimized out>)
        at allpaths.c:379
    #8  0x000055a1a7707dcd in set_base_rel_sizes (root=<optimized out>) at
    allpaths.c:281
    #9  make_one_rel (root=root@entry=0x55a1a8ae2158,
    joinlist=joinlist@entry=0x55a1a8ae5040) at allpaths.c:179
    #10 0x000055a1a7729a3a in query_planner (root=root@entry=0x55a1a8ae2158,
    tlist=tlist@entry=0x55a1a8ae3e58, 
        qp_callback=qp_callback@entry=0x55a1a772a6c0 <standard_qp_callback>,
    qp_extra=qp_extra@entry=0x7ffef88cb520)
        at planmain.c:265
    #11 0x000055a1a772e617 in grouping_planner (root=root@entry=0x55a1a8ae2158,
    
        inheritance_update=inheritance_update@entry=false,
    tuple_fraction=<optimized out>, tuple_fraction@entry=0)
        at planner.c:1908
    #12 0x000055a1a7730f0b in subquery_planner (glob=glob@entry=0x55a1a8ae20c0,
    parse=parse@entry=0x55a1a8a9c928, 
        parent_root=parent_root@entry=0x0,
    hasRecursion=hasRecursion@entry=false,
    tuple_fraction=tuple_fraction@entry=0)
        at planner.c:966
    #13 0x000055a1a773204e in standard_planner (parse=0x55a1a8a9c928,
    cursorOptions=256, boundParams=<optimized out>)
        at planner.c:405
    #14 0x000055a1a77ec30d in pg_plan_query
    (querytree=querytree@entry=0x55a1a8a9c928, cursorOptions=256, 
        boundParams=boundParams@entry=0x0) at postgres.c:832
    #15 0x000055a1a7621efe in ExplainOneQuery (query=0x55a1a8a9c928,
    cursorOptions=<optimized out>, into=0x0, 
        es=0x55a1a8a30548, 
        queryString=0x55a1a8a0d618 "EXPLAIN\nSELECT * FROM prt1_l t1 LEFT JOIN
    LATERAL\n  (SELECT t1.a as t1a, prt1_l.a FROM prt1_l) t2 ON t1.a = t2.a;",
    params=0x0, queryEnv=0x0) at explain.c:365
    #16 0x000055a1a76224c8 in ExplainQuery (pstate=pstate@entry=0x55a1a8a2e1d8,
    stmt=stmt@entry=0x55a1a8a0ee78, 
        queryString=queryString@entry=0x55a1a8a0d618 "EXPLAIN\nSELECT * FROM
    prt1_l t1 LEFT JOIN LATERAL\n  (SELECT t1.a as t1a, prt1_l.a FROM prt1_l) t2
    ON t1.a = t2.a;", params=params@entry=0x0, queryEnv=queryEnv@entry=0x0, 
        dest=dest@entry=0x55a1a8a304b0) at explain.c:254
    #17 0x000055a1a77f263d in standard_ProcessUtility (pstmt=0x55a1a8a0ef48, 
        queryString=0x55a1a8a0d618 "EXPLAIN\nSELECT * FROM prt1_l t1 LEFT JOIN
    LATERAL\n  (SELECT t1.a as t1a, prt1_l.a FROM prt1_l) t2 ON t1.a = t2.a;",
    context=PROCESS_UTILITY_TOPLEVEL, params=0x0, queryEnv=0x0,
    dest=0x55a1a8a304b0, 
        completionTag=0x7ffef88cb990 "") at utility.c:675
    #18 0x000055a1a77ef2f2 in PortalRunUtility (portal=0x55a1a8a74168,
    pstmt=0x55a1a8a0ef48, isTopLevel=<optimized out>, 
        setHoldSnapshot=<optimized out>, dest=<optimized out>,
    completionTag=0x7ffef88cb990 "") at pquery.c:1178
    #19 0x000055a1a77f0207 in FillPortalStore
    (portal=portal@entry=0x55a1a8a74168, isTopLevel=isTopLevel@entry=true)
        at pquery.c:1038
    #20 0x000055a1a77f0e7d in PortalRun (portal=portal@entry=0x55a1a8a74168,
    count=count@entry=9223372036854775807, 
        isTopLevel=isTopLevel@entry=true, run_once=run_once@entry=true,
    dest=dest@entry=0x55a1a8acabc0, 
        altdest=altdest@entry=0x55a1a8acabc0, completionTag=0x7ffef88cbbc0 "")
    at pquery.c:768
    #21 0x000055a1a77ec612 in exec_simple_query (
        query_string=0x55a1a8a0d618 "EXPLAIN\nSELECT * FROM prt1_l t1 LEFT JOIN
    LATERAL\n  (SELECT t1.a as t1a, prt1_l.a FROM prt1_l) t2 ON t1.a = t2.a;")
    at postgres.c:1145
    #22 0x000055a1a77ee59d in PostgresMain (argc=<optimized out>,
    argv=argv@entry=0x55a1a8a38748, dbname=<optimized out>, 
        username=<optimized out>) at postgres.c:4182
    #23 0x000055a1a74c327d in BackendRun (port=0x55a1a8a30e40) at
    postmaster.c:4361
    #24 BackendStartup (port=0x55a1a8a30e40) at postmaster.c:4033
    #25 ServerLoop () at postmaster.c:1706
    #26 0x000055a1a776c398 in PostmasterMain (argc=3, argv=0x55a1a8a079f0) at
    postmaster.c:1379
    #27 0x000055a1a74c4ea9 in main (argc=3, argv=0x55a1a8a079f0) at main.c:228
    (gdb) q
    
    git bisect points to 9d6d2b2134.
    Thanks to Roman Zharkov for discovering this.
    
    
  2. Re: BUG #15694: Server crash in EXPLAIN with LATERAL and a partitioned table

    Tom Lane <tgl@sss.pgh.pa.us> — 2019-03-14T14:40:20Z

    PG Bug reporting form <noreply@postgresql.org> writes:
    > CREATE TABLE prt1_l (a int) PARTITION BY RANGE(a);
    > CREATE TABLE prt2_l (a int);
    
    > EXPLAIN
    > SELECT * FROM prt1_l t1 LEFT JOIN LATERAL
    >   (SELECT t1.a as t1a, prt1_l.a FROM prt1_l) t2 ON t1.a = t2.a;
    
    > crashes the server with the stack trace:
    
    Huh.  Clearly, when we added that Assert, we should've fixed
    set_dummy_rel_pathlist so that it would properly populate the
    required_outer of the dummy path.  I'm surprised though that
    this wasn't already exposed by the existing regression tests...
    
    			regards, tom lane