Re: Failure assertion in GROUPS mode of window function in current HEAD - Mailing list pgsql-hackers

From Masahiko Sawada
Subject Re: Failure assertion in GROUPS mode of window function in current HEAD
Date
Msg-id CAD21AoCd9TrYnkN-8-8xbpkvbRXsSBXRsLVnM3zDYJJjNCaw9A@mail.gmail.com
Whole thread Raw
In response to Failure assertion in GROUPS mode of window function in current HEAD  (Masahiko Sawada <sawada.mshk@gmail.com>)
List pgsql-hackers
On Wed, Jul 4, 2018 at 11:24 PM, Masahiko Sawada <sawada.mshk@gmail.com> wrote:
> Hi,
>
> I got an assertion failure when I use GROUPS mode and specifies offset
> without ORDER BY clause. The reproduction steps and the backtrace I
> got are following.
>
> =# create table test as select 1 as c;
> =# select sum(c) over (partition by c groups between 1 preceding and
> current row) from test;
> TRAP: FailedAssertion("!(ptr >= 0 && ptr < state->readptrcount)",
> File: "tuplestore.c", Line: 478)
>
> #0  0x0000003b3ce32495 in raise () from /lib64/libc.so.6
> #1  0x0000003b3ce33c75 in abort () from /lib64/libc.so.6
> #2  0x0000000000a2ef5a in ExceptionalCondition (conditionName=0xc99f38
> "!(ptr >= 0 && ptr < state->readptrcount)", errorType=0xc99f22
> "FailedAssertion",
>     fileName=0xc99ec0 "tuplestore.c", lineNumber=478) at assert.c:54
> #3  0x0000000000a7fa7d in tuplestore_select_read_pointer
> (state=0x139e4a0, ptr=-1) at tuplestore.c:478
> #4  0x00000000007216cd in update_frameheadpos (winstate=0x137fc30) at
> nodeWindowAgg.c:1655
> #5  0x000000000071fb7f in eval_windowaggregates (winstate=0x137fc30)
> at nodeWindowAgg.c:735
> #6  0x0000000000722ac8 in ExecWindowAgg (pstate=0x137fc30) at
> nodeWindowAgg.c:2196
> #7  0x00000000006e5776 in ExecProcNodeFirst (node=0x137fc30) at
> execProcnode.c:445
> #8  0x00000000006da945 in ExecProcNode (node=0x137fc30) at
> ../../../src/include/executor/executor.h:237
> #9  0x00000000006dd2fc in ExecutePlan (estate=0x137fa18,
> planstate=0x137fc30, use_parallel_mode=false, operation=CMD_SELECT,
> sendTuples=true,
>     numberTuples=0, direction=ForwardScanDirection, dest=0x138b098,
> execute_once=true) at execMain.c:1726
> #10 0x00000000006daf2c in standard_ExecutorRun (queryDesc=0x13785b8,
> direction=ForwardScanDirection, count=0, execute_once=true) at
> execMain.c:363
> #11 0x00000000006dad48 in ExecutorRun (queryDesc=0x13785b8,
> direction=ForwardScanDirection, count=0, execute_once=true) at
> execMain.c:306
> #12 0x00000000008c7626 in PortalRunSelect (portal=0x12f3bd8,
> forward=true, count=0, dest=0x138b098) at pquery.c:932
> #13 0x00000000008c72b4 in PortalRun (portal=0x12f3bd8,
> count=9223372036854775807, isTopLevel=true, run_once=true,
> dest=0x138b098, altdest=0x138b098,
>     completionTag=0x7fffaece38b0 "") at pquery.c:773
> #14 0x00000000008c1288 in exec_simple_query (
>     query_string=0x128e938 "select sum(c) over (partition by c groups
> between 1 preceding and current row) from test;") at postgres.c:1122
> #15 0x00000000008c555e in PostgresMain (argc=1, argv=0x12b8258,
> dbname=0x12b80d8 "postgres", username=0x12b80b0 "masahiko") at
> postgres.c:4153
> #16 0x0000000000822c3c in BackendRun (port=0x12b0020) at postmaster.c:4361
> #17 0x00000000008223aa in BackendStartup (port=0x12b0020) at postmaster.c:4033
> #18 0x000000000081e84b in ServerLoop () at postmaster.c:1706
> #19 0x000000000081e17d in PostmasterMain (argc=5, argv=0x1289330) at
> postmaster.c:1379
> #20 0x00000000007452d0 in main (argc=5, argv=0x1289330) at main.c:228
>
> The cause of this assertion failure is that we attempted to select a
> read pointer (framehead_ptr) that is not allocated. We allocate read
> pointers for both frame head and tail when begin a new partition in
> begin_partition(). The current code doesn't allocate them as follows
> if ORDER BY clause is omitted, but this behavior doesn't match to both
> update_framheadpos() and update_framtailpos() which always use each
> read pointer in GROUPS offset mode.
>
>     if ((winstate->frameOptions & (FRAMEOPTION_RANGE | FRAMEOPTION_GROUPS)) &&
>        node->ordNumCols != 0)
>     {
>         if (!(winstate->frameOptions & FRAMEOPTION_START_UNBOUNDED_PRECEDING))
>             winstate->framehead_ptr =
>                 tuplestore_alloc_read_pointer(winstate->buffer, 0);
>         if (!(winstate->frameOptions & FRAMEOPTION_END_UNBOUNDED_FOLLOWING))
>             winstate->frametail_ptr =
>                 tuplestore_alloc_read_pointer(winstate->buffer, 0);
>     }
>
> Since this issue relates to only GROUPS mode it happen in PostgreSQL
> 11 or later. Attached patch fixes this issue and add regression tests
> for testing GROUPS mode without ORDER BY clause.

Since this problem still happens with current HEAD I've added this
item to Open Item.

Regards,

--
Masahiko Sawada
NIPPON TELEGRAPH AND TELEPHONE CORPORATION
NTT Open Source Software Center


pgsql-hackers by date:

Previous
From: Masahiko Sawada
Date:
Subject: Re: Copy function for logical replication slots
Next
From: David Rowley
Date:
Subject: Re: [HACKERS] Secondary index access optimizations