public inbox for [email protected]  
help / color / mirror / Atom feed
From: John Naylor <[email protected]>
To: David Rowley <[email protected]>
Cc: Richard Guo <[email protected]>
Cc: Chengpeng Yan <[email protected]>
Cc: [email protected] <[email protected]>
Cc: [email protected] <[email protected]>
Subject: Re: BUG #19533: Wrong results from WindowAgg run-condition pushdown on count() with EXCLUDE CURRENT ROW
Date: Sun, 5 Jul 2026 17:44:02 +0700
Message-ID: <CANWCAZap+k7-E2f-XoC36Hk4izZjbN8w2c9OuomummGfZ5d20w@mail.gmail.com> (raw)
In-Reply-To: <CAApHDvrN-HL=dSBez=pme5RQKCiH7SrsMEFV-eQRJN3Vs94ZEQ@mail.gmail.com>
References: <[email protected]>
	<[email protected]>
	<CAMbWs4-6umOecRifmC88RW0SHWDAvb4c3-VD8XQ3NJufsUyUOQ@mail.gmail.com>
	<CAApHDvqHXZpF9pPStLqPp5O=G2gVpPD959bMTRRkLjdy4Tvx7g@mail.gmail.com>
	<CAApHDvoJ07GM6V2QWyJAgsJcM-dcFS+nwPq4Um=-NsXv5PmoCw@mail.gmail.com>
	<CANWCAZbiYQ+=CHAaftwp2x83Gy6tJCB8GUe15yO5DW-cpp0Mxg@mail.gmail.com>
	<CAApHDvrN-HL=dSBez=pme5RQKCiH7SrsMEFV-eQRJN3Vs94ZEQ@mail.gmail.com>

On Sat, Jul 4, 2026 at 6:57 AM David Rowley <[email protected]> wrote:
>
> On Fri, 3 Jul 2026 at 21:10, John Naylor <[email protected]> wrote:
> > If it was from tooling, it must have stopped with the first case it
> > found, as is often the case. I just tried myself and found three more
> > apparent bugs with EXCLUDE both with and without the v1 patch. Do you
> > want to see the reproducers, or rethink the risk/reward ratio of
> > what's handled? I'm also not sure how common that clause is.
>
> Please share what you discovered. It would be good to understand if
> it's just a simple missing check that can be added to handle all
> three, or if there's just more complexity in this than making this
> work correctly is worth.

I was going to share the three examples, but then I had a better idea:
I had Claude generate a PL/pgSQL script to exhaustively (or something
close to it) iterate through the the whole space on a few different
data set shapes, look for plans with run conditions, and compare the
result to the "c+0" oracle. (attached as
count_runcondition_matrix.sql). On master, it found 295 (!) distinct
window specs that give wrong answers with run conditions on at least
one data set (attached as runcond-failures-master.txt). With v2, that
number falls to 162, which is still a surprisingly large number
(attached as runcond-failures-v2.txt). This script takes a while to
run, so it's probably not a good basis for a regression test, but it
seems useful to test against, and it can be modified to test
hypotheses.

I then had Claude generate two patches against master, attached as v3.
One is the minimal fix to get the above test matrix to pass. I didn't
try to determine how many currently working cases got lost that way.
The other is an attempt to provide complete coverage of all
monotonicity proofs. The latter is quite an indigestible mess, so we
probably cannot commit something like that, but I think a reasonable
takeaway is that EXCLUDE presents a really difficult set of cases.

I'll also note that two of v2's tests are valid on the data they work
on, but are not valid in general. I've attached v2-wrong-test-repo.sql
to demonstrate.

--
John Naylor
Amazon Web Services

SET
CREATE TABLE
INSERT 0 5
CREATE TABLE
INSERT 0 6
CREATE TABLE
INSERT 0 6
CREATE TABLE
INSERT 0 7
CREATE TABLE
INSERT 0 5
CREATE TABLE
INSERT 0 5
CREATE TABLE
DO
 mismatching_queries | distinct_bad_windows 
---------------------+----------------------
                6181 |                  295
(1 row)

                                          winspec                                          |    fn    |  dirs   |     datasets      | nfail 
-------------------------------------------------------------------------------------------+----------+---------+-------------------+-------
 ORDER BY s GROUPS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW         | count(e) | =,>=    | d2,d4,d5,d6       |    12
 ORDER BY s GROUPS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE TIES                | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s GROUPS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW         | count(e) | =,>=    | d2,d4,d5,d6       |    12
 ORDER BY s GROUPS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s GROUPS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW         | count(e) | =,>=    | d2,d3,d4,d5,d6    |    16
 ORDER BY s GROUPS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP               | count(*) | =,>=    | d4                |     4
 ORDER BY s GROUPS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP               | count(e) | =,>=    | d4                |     5
 ORDER BY s GROUPS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                | count(*) | =,>=    | d4                |     2
 ORDER BY s GROUPS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                | count(e) | =,>=    | d3,d4,d5,d6       |    14
 ORDER BY s GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW         | count(e) | =,>=    | d2,d3,d4,d5,d6    |    10
 ORDER BY s GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP               | count(*) | =,>=    | d4                |     2
 ORDER BY s GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP               | count(e) | =,>=    | d4                |     4
 ORDER BY s GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                | count(e) | =,>=    | d3,d4,d5,d6       |    12
 ORDER BY s GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW         | count(e) | =,>=    | d2,d4,d5,d6       |    12
 ORDER BY s GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES                | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW         | count(e) | <=,=    | d3,d4,d5,d6       |    10
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE TIES                | count(e) | <=,=    | d2,d4,d5,d6       |    12
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW         | count(e) | <=,=    | d3,d4,d5,d6       |    10
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE TIES                | count(e) | <=,=    | d2,d4,d5,d6       |    12
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW         | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE GROUP               | count(*) | <=,=    | d2,d3,d4          |     6
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE GROUP               | count(e) | <=,=    | d2,d3,d4          |     7
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE TIES                | count(*) | <=,=    | d2,d3,d4          |     6
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE TIES                | count(e) | <=,=    | d2,d3,d4,d5,d6    |    18
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE CURRENT ROW         | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE GROUP               | count(*) | <=,=    | d2,d3,d4,d5       |    13
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE GROUP               | count(e) | <=,=    | d2,d3,d4          |     9
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE TIES                | count(*) | <=,=    | d2,d3,d4,d5       |    13
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE TIES                | count(e) | <=,=    | d2,d3,d4,d5,d6    |    16
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW         | count(e) | <=,=    | d3,d4,d5,d6       |    10
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES                | count(e) | <=,=    | d2,d4,d5,d6       |    12
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP       | count(*) | <=,=,>= | d2,d3,d4,d5       |    16
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP       | count(e) | <=,=,>= | d2,d3,d4          |    12
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES        | count(*) | <=,=,>= | d2,d3,d4,d5       |    14
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES        | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    26
 ORDER BY s RANGE BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d2,d4,d5,d6       |    12
 ORDER BY s RANGE BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE TIES                 | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s RANGE BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d2,d4,d5,d6       |    12
 ORDER BY s RANGE BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                 | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s RANGE BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d5                |     2
 ORDER BY s RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d2,d3,d4,d5,d6    |    16
 ORDER BY s RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                | count(*) | =,>=    | d4                |     4
 ORDER BY s RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                | count(e) | =,>=    | d4                |     5
 ORDER BY s RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                 | count(*) | =,>=    | d4                |     2
 ORDER BY s RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                 | count(e) | =,>=    | d3,d4,d5,d6       |    14
 ORDER BY s RANGE BETWEEN 2 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d5                |     2
 ORDER BY s RANGE BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d2,d3,d4,d5,d6    |    12
 ORDER BY s RANGE BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                | count(*) | =,>=    | d4                |     2
 ORDER BY s RANGE BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                | count(e) | =,>=    | d4                |     4
 ORDER BY s RANGE BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                 | count(e) | =,>=    | d3,d4,d5,d6       |    12
 ORDER BY s RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d2,d4,d5,d6       |    12
 ORDER BY s RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES                 | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW          | count(e) | <=,=    | d3,d4,d5,d6       |    10
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE TIES                 | count(e) | <=,=    | d2,d4,d5,d6       |    12
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW          | count(e) | <=,=    | d3,d4,d5,d6       |    10
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE TIES                 | count(e) | <=,=    | d2,d4,d5,d6       |    12
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW          | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE GROUP                | count(*) | <=,=    | d2,d3,d4,d5       |     8
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE GROUP                | count(e) | <=,=    | d2,d3,d4          |     7
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE TIES                 | count(*) | <=,=    | d2,d3,d4,d5       |     8
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE TIES                 | count(e) | <=,=    | d2,d3,d4,d5,d6    |    20
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING EXCLUDE TIES                 | count(e) | <=,=    | d5                |     2
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE CURRENT ROW          | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE GROUP                | count(*) | <=,=    | d2,d3,d4,d5       |    13
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE GROUP                | count(e) | <=,=    | d2,d3,d4          |     9
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE TIES                 | count(*) | <=,=    | d2,d3,d4,d5       |    13
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE TIES                 | count(e) | <=,=    | d2,d3,d4,d5,d6    |    18
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 2 PRECEDING EXCLUDE TIES                 | count(e) | <=,=    | d5                |     2
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW          | count(e) | <=,=    | d3,d4,d5,d6       |    10
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES                 | count(e) | <=,=    | d2,d4,d5,d6       |    12
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW  | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP        | count(*) | <=,=,>= | d2,d3,d4,d5       |    16
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP        | count(e) | <=,=,>= | d2,d3,d4          |    12
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES         | count(*) | <=,=,>= | d2,d3,d4,d5       |    14
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES         | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    26
 ORDER BY s ROWS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE TIES                  | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s ROWS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                  | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW           | count(e) | =,>=    | d3,d4,d5,d6       |    14
 ORDER BY s ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                 | count(e) | =,>=    | d4                |     2
 ORDER BY s ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                  | count(e) | =,>=    | d3,d4,d6          |     6
 ORDER BY s ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW           | count(e) | =,>=    | d2,d3,d4,d5,d6    |    16
 ORDER BY s ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                 | count(*) | =,>=    | d4                |     4
 ORDER BY s ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                 | count(e) | =,>=    | d4                |     4
 ORDER BY s ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                  | count(*) | =,>=    | d4                |     2
 ORDER BY s ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                  | count(e) | =,>=    | d3,d4,d5,d6       |    12
 ORDER BY s ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES                  | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE TIES                  | count(e) | <=,=    | d2,d4,d5,d6       |    12
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE TIES                  | count(e) | <=,=    | d2,d4,d5,d6       |    12
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW           | count(e) | <=,=    | d3,d4,d6          |    10
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE GROUP                 | count(e) | <=,=    | d4                |     2
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE TIES                  | count(e) | <=,=    | d2,d4,d5,d6       |    10
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE CURRENT ROW           | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE GROUP                 | count(*) | <=,=    | d4                |     2
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE GROUP                 | count(e) | <=,=    | d2,d3,d4          |     6
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE TIES                  | count(*) | <=,=    | d4                |     2
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE TIES                  | count(e) | <=,=    | d2,d3,d4,d5,d6    |    12
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES                  | count(e) | <=,=    | d2,d4,d5,d6       |    12
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW   | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP         | count(*) | <=,=,>= | d2,d3,d4,d5       |    16
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP         | count(e) | <=,=,>= | d2,d3,d4          |    12
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES          | count(*) | <=,=,>= | d2,d3,d4,d5       |    14
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES          | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    26
 RANGE BETWEEN CURRENT ROW AND CURRENT ROW EXCLUDE CURRENT ROW                             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 RANGE BETWEEN CURRENT ROW AND CURRENT ROW EXCLUDE TIES                                    | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES                            | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES                            | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                    | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 FOLLOWING AND 0 FOLLOWING                                                  | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 FOLLOWING AND 0 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 FOLLOWING AND 1 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 0 FOLLOWING AND 1 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4       |    17
 ROWS BETWEEN 0 FOLLOWING AND 1 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 0 FOLLOWING AND 1 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 0 FOLLOWING AND 1 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 FOLLOWING AND 2 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 0 FOLLOWING AND 2 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    26
 ROWS BETWEEN 0 FOLLOWING AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 0 FOLLOWING AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 0 FOLLOWING AND 2 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    34
 ROWS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE TIES                             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 PRECEDING AND 0 FOLLOWING                                                  | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 PRECEDING AND 0 PRECEDING                                                  | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 PRECEDING AND 0 PRECEDING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 PRECEDING AND 1 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 0 PRECEDING AND 1 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4       |    17
 ROWS BETWEEN 0 PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 0 PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 0 PRECEDING AND 1 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 PRECEDING AND 2 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 0 PRECEDING AND 2 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    26
 ROWS BETWEEN 0 PRECEDING AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 0 PRECEDING AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 0 PRECEDING AND 2 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 PRECEDING AND CURRENT ROW                                                  | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 PRECEDING AND CURRENT ROW EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    34
 ROWS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING                                                  | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4       |    14
 ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 1 PRECEDING AND 0 PRECEDING                                                  | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 PRECEDING AND 0 PRECEDING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4       |    14
 ROWS BETWEEN 1 PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW                              | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 1 PRECEDING AND 0 PRECEDING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING                                                  | count(*) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    34
 ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING                                                  | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW                              | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING                                                  | count(*) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    36
 ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    25
 ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    36
 ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    38
 ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 1 PRECEDING AND CURRENT ROW                                                  | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 PRECEDING AND CURRENT ROW                                                  | count(e) | <=,=,>= | d1,d2,d3,d4       |    14
 ROWS BETWEEN 1 PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW                              | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 1 PRECEDING AND CURRENT ROW EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    44
 ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    26
 ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    44
 ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    43
 ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 2 FOLLOWING AND 2 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 2 FOLLOWING AND 2 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 2 FOLLOWING AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 2 FOLLOWING AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 2 FOLLOWING AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    44
 ROWS BETWEEN 2 FOLLOWING AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    28
 ROWS BETWEEN 2 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    44
 ROWS BETWEEN 2 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    28
 ROWS BETWEEN 2 PRECEDING AND 0 FOLLOWING                                                  | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 2 PRECEDING AND 0 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 2 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 2 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    19
 ROWS BETWEEN 2 PRECEDING AND 0 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 2 PRECEDING AND 0 PRECEDING                                                  | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 2 PRECEDING AND 0 PRECEDING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 2 PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW                              | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 2 PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    19
 ROWS BETWEEN 2 PRECEDING AND 0 PRECEDING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING                                                  | count(*) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    30
 ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    30
 ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    36
 ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING                                                  | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    19
 ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW                              | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    19
 ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING                                                  | count(*) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    42
 ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    31
 ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    42
 ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    36
 ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 2 PRECEDING AND 2 PRECEDING                                                  | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 2 PRECEDING AND 2 PRECEDING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 2 PRECEDING AND 2 PRECEDING EXCLUDE CURRENT ROW                              | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 2 PRECEDING AND 2 PRECEDING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW                                                  | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW                              | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    19
 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    18
 ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    37
 ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN CURRENT ROW AND 0 FOLLOWING                                                  | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN CURRENT ROW AND 0 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4       |    17
 ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    26
 ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN CURRENT ROW AND CURRENT ROW                                                  | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN CURRENT ROW AND CURRENT ROW EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    34
 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES                             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING                                          | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    54
 ROWS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING                                          | count(e) | =,>=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | =,>=    | d1,d2,d3,d4,d5,d6 |    34
 ROWS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE TIES                             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING                                          | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    54
 ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING                                          | count(e) | =,>=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW                      | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW                      | count(e) | =,>=    | d1,d2,d3,d4,d5,d6 |    34
 ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE TIES                             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING                                          | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    42
 ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING                                          | count(e) | =,>=    | d1,d2,d3,d4,d5,d6 |    28
 ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    44
 ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    41
 ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE TIES                             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING                                          | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING                                          | count(e) | =,>=    | d1,d2,d3,d4,d5,d6 |    34
 ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW                      | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW                      | count(e) | =,>=    | d1,d2,d3,d4,d5,d6 |    34
 ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING                                          | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    30
 ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING                                          | count(e) | =,>=    | d1,d2,d3,d4,d5,d6 |    20
 ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE TIES                             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN UNBOUNDED PRECEDING AND 2 PRECEDING                                          | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    44
 ROWS BETWEEN UNBOUNDED PRECEDING AND 2 PRECEDING                                          | count(e) | =,>=    | d1,d2,d3,d4,d5,d6 |    26
 ROWS BETWEEN UNBOUNDED PRECEDING AND 2 PRECEDING EXCLUDE CURRENT ROW                      | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    44
 ROWS BETWEEN UNBOUNDED PRECEDING AND 2 PRECEDING EXCLUDE CURRENT ROW                      | count(e) | =,>=    | d1,d2,d3,d4,d5,d6 |    26
 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW                                          | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    54
 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW                                          | count(e) | =,>=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW                      | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW                      | count(e) | =,>=    | d1,d2,d3,d4,d5,d6 |    34
 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES                             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW              | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
(295 rows)


 mismatching_queries | distinct_bad_windows 
---------------------+----------------------
                2626 |                  162
(1 row)

                                          winspec                                          |    fn    |  dirs   |     datasets      | nfail 
-------------------------------------------------------------------------------------------+----------+---------+-------------------+-------
 ORDER BY s GROUPS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW         | count(e) | =,>=    | d2,d4,d5,d6       |    12
 ORDER BY s GROUPS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE TIES                | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s GROUPS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW         | count(e) | =,>=    | d2,d4,d5,d6       |    12
 ORDER BY s GROUPS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s GROUPS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW         | count(e) | =,>=    | d2,d3,d4,d5,d6    |    16
 ORDER BY s GROUPS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP               | count(*) | =,>=    | d4                |     4
 ORDER BY s GROUPS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP               | count(e) | =,>=    | d4                |     5
 ORDER BY s GROUPS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                | count(*) | =,>=    | d4                |     2
 ORDER BY s GROUPS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                | count(e) | =,>=    | d3,d4,d5,d6       |    14
 ORDER BY s GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW         | count(e) | =,>=    | d2,d3,d4,d5,d6    |    10
 ORDER BY s GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP               | count(*) | =,>=    | d4                |     2
 ORDER BY s GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP               | count(e) | =,>=    | d4                |     4
 ORDER BY s GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                | count(e) | =,>=    | d3,d4,d5,d6       |    12
 ORDER BY s GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW         | count(e) | =,>=    | d2,d4,d5,d6       |    12
 ORDER BY s GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES                | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW         | count(e) | <=,=    | d3,d4,d5,d6       |    10
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE TIES                | count(e) | <=,=    | d2,d4,d5,d6       |    12
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP       | count(*) | <=,=,>= | d2,d3,d4,d5       |    16
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP       | count(e) | <=,=,>= | d2,d3,d4          |    12
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES        | count(*) | <=,=,>= | d2,d3,d4,d5       |    14
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES        | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    26
 ORDER BY s RANGE BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d2,d4,d5,d6       |    12
 ORDER BY s RANGE BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE TIES                 | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s RANGE BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d2,d4,d5,d6       |    12
 ORDER BY s RANGE BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                 | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s RANGE BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d5                |     2
 ORDER BY s RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d2,d3,d4,d5,d6    |    16
 ORDER BY s RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                | count(*) | =,>=    | d4                |     4
 ORDER BY s RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                | count(e) | =,>=    | d4                |     5
 ORDER BY s RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                 | count(*) | =,>=    | d4                |     2
 ORDER BY s RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                 | count(e) | =,>=    | d3,d4,d5,d6       |    14
 ORDER BY s RANGE BETWEEN 2 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d5                |     2
 ORDER BY s RANGE BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d2,d3,d4,d5,d6    |    12
 ORDER BY s RANGE BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                | count(*) | =,>=    | d4                |     2
 ORDER BY s RANGE BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                | count(e) | =,>=    | d4                |     4
 ORDER BY s RANGE BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                 | count(e) | =,>=    | d3,d4,d5,d6       |    12
 ORDER BY s RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d2,d4,d5,d6       |    12
 ORDER BY s RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES                 | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW  | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP        | count(*) | <=,=,>= | d2,d3,d4,d5       |    16
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP        | count(e) | <=,=,>= | d2,d3,d4          |    12
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES         | count(*) | <=,=,>= | d2,d3,d4,d5       |    14
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES         | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    26
 ORDER BY s ROWS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE TIES                  | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s ROWS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                  | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW           | count(e) | =,>=    | d3,d4,d5,d6       |    14
 ORDER BY s ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                 | count(e) | =,>=    | d4                |     2
 ORDER BY s ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                  | count(e) | =,>=    | d3,d4,d6          |     6
 ORDER BY s ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW           | count(e) | =,>=    | d2,d3,d4,d5,d6    |    16
 ORDER BY s ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                 | count(*) | =,>=    | d4                |     4
 ORDER BY s ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                 | count(e) | =,>=    | d4                |     4
 ORDER BY s ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                  | count(*) | =,>=    | d4                |     2
 ORDER BY s ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                  | count(e) | =,>=    | d3,d4,d5,d6       |    12
 ORDER BY s ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES                  | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE TIES                  | count(e) | <=,=    | d2,d4,d5,d6       |    12
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES                  | count(e) | <=,=    | d2,d4,d5,d6       |    12
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW   | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP         | count(*) | <=,=,>= | d2,d3,d4,d5       |    16
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP         | count(e) | <=,=,>= | d2,d3,d4          |    12
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES          | count(*) | <=,=,>= | d2,d3,d4,d5       |    14
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES          | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    26
 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES                            | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                    | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 FOLLOWING AND 0 FOLLOWING                                                  | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 0 FOLLOWING AND 0 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 0 FOLLOWING AND 1 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 0 FOLLOWING AND 1 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d3,d4       |    10
 ROWS BETWEEN 0 FOLLOWING AND 2 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 0 FOLLOWING AND 2 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    18
 ROWS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    34
 ROWS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE TIES                             | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 0 PRECEDING AND 0 FOLLOWING                                                  | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 0 PRECEDING AND 0 PRECEDING                                                  | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 0 PRECEDING AND 1 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 0 PRECEDING AND 1 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d3,d4       |    10
 ROWS BETWEEN 0 PRECEDING AND 2 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 0 PRECEDING AND 2 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    18
 ROWS BETWEEN 0 PRECEDING AND CURRENT ROW                                                  | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 0 PRECEDING AND CURRENT ROW EXCLUDE TIES                                     | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    34
 ROWS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                             | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    18
 ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING                                                  | count(e) | <=,=    | d2,d4             |     4
 ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 1 PRECEDING AND 0 PRECEDING                                                  | count(e) | <=,=    | d2,d4             |     4
 ROWS BETWEEN 1 PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW                              | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d4,d5,d6    |    10
 ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING                                                  | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW                              | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    16
 ROWS BETWEEN 1 PRECEDING AND CURRENT ROW                                                  | count(e) | <=,=    | d2,d4             |     4
 ROWS BETWEEN 1 PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW                              | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 1 PRECEDING AND CURRENT ROW EXCLUDE TIES                                     | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    44
 ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    26
 ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    44
 ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    31
 ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                             | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 2 FOLLOWING AND 2 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 2 FOLLOWING AND 2 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 2 FOLLOWING AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    44
 ROWS BETWEEN 2 FOLLOWING AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    28
 ROWS BETWEEN 2 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    44
 ROWS BETWEEN 2 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    28
 ROWS BETWEEN 2 PRECEDING AND 0 FOLLOWING                                                  | count(e) | <=,=    | d4,d5,d6          |     6
 ROWS BETWEEN 2 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=    | d2,d4             |     4
 ROWS BETWEEN 2 PRECEDING AND 0 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 2 PRECEDING AND 0 PRECEDING                                                  | count(e) | <=,=    | d4,d5,d6          |     6
 ROWS BETWEEN 2 PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW                              | count(e) | <=,=    | d2,d4             |     4
 ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d3,d4       |     8
 ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING                                                  | count(e) | <=,=    | d2,d4             |     4
 ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW                              | count(e) | <=,=    | d2,d4             |     4
 ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    16
 ROWS BETWEEN 2 PRECEDING AND 2 PRECEDING                                                  | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 2 PRECEDING AND 2 PRECEDING EXCLUDE CURRENT ROW                              | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW                                                  | count(e) | <=,=    | d4,d5,d6          |     6
 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW                              | count(e) | <=,=    | d2,d4             |     4
 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW EXCLUDE TIES                                     | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    18
 ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    25
 ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                             | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN CURRENT ROW AND 0 FOLLOWING                                                  | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN CURRENT ROW AND 0 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d3,d4       |    10
 ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    18
 ROWS BETWEEN CURRENT ROW AND CURRENT ROW                                                  | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN CURRENT ROW AND CURRENT ROW EXCLUDE TIES                                     | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    34
 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES                             | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE TIES                             | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES                             | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW              | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                     | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
(162 rows)



Attachments:

  [text/plain] runcond-failures-master.txt (40.9K, ../CANWCAZap+k7-E2f-XoC36Hk4izZjbN8w2c9OuomummGfZ5d20w@mail.gmail.com/2-runcond-failures-master.txt)
  download | inline:
SET
CREATE TABLE
INSERT 0 5
CREATE TABLE
INSERT 0 6
CREATE TABLE
INSERT 0 6
CREATE TABLE
INSERT 0 7
CREATE TABLE
INSERT 0 5
CREATE TABLE
INSERT 0 5
CREATE TABLE
DO
 mismatching_queries | distinct_bad_windows 
---------------------+----------------------
                6181 |                  295
(1 row)

                                          winspec                                          |    fn    |  dirs   |     datasets      | nfail 
-------------------------------------------------------------------------------------------+----------+---------+-------------------+-------
 ORDER BY s GROUPS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW         | count(e) | =,>=    | d2,d4,d5,d6       |    12
 ORDER BY s GROUPS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE TIES                | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s GROUPS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW         | count(e) | =,>=    | d2,d4,d5,d6       |    12
 ORDER BY s GROUPS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s GROUPS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW         | count(e) | =,>=    | d2,d3,d4,d5,d6    |    16
 ORDER BY s GROUPS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP               | count(*) | =,>=    | d4                |     4
 ORDER BY s GROUPS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP               | count(e) | =,>=    | d4                |     5
 ORDER BY s GROUPS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                | count(*) | =,>=    | d4                |     2
 ORDER BY s GROUPS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                | count(e) | =,>=    | d3,d4,d5,d6       |    14
 ORDER BY s GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW         | count(e) | =,>=    | d2,d3,d4,d5,d6    |    10
 ORDER BY s GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP               | count(*) | =,>=    | d4                |     2
 ORDER BY s GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP               | count(e) | =,>=    | d4                |     4
 ORDER BY s GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                | count(e) | =,>=    | d3,d4,d5,d6       |    12
 ORDER BY s GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW         | count(e) | =,>=    | d2,d4,d5,d6       |    12
 ORDER BY s GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES                | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW         | count(e) | <=,=    | d3,d4,d5,d6       |    10
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE TIES                | count(e) | <=,=    | d2,d4,d5,d6       |    12
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW         | count(e) | <=,=    | d3,d4,d5,d6       |    10
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE TIES                | count(e) | <=,=    | d2,d4,d5,d6       |    12
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW         | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE GROUP               | count(*) | <=,=    | d2,d3,d4          |     6
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE GROUP               | count(e) | <=,=    | d2,d3,d4          |     7
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE TIES                | count(*) | <=,=    | d2,d3,d4          |     6
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE TIES                | count(e) | <=,=    | d2,d3,d4,d5,d6    |    18
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE CURRENT ROW         | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE GROUP               | count(*) | <=,=    | d2,d3,d4,d5       |    13
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE GROUP               | count(e) | <=,=    | d2,d3,d4          |     9
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE TIES                | count(*) | <=,=    | d2,d3,d4,d5       |    13
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE TIES                | count(e) | <=,=    | d2,d3,d4,d5,d6    |    16
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW         | count(e) | <=,=    | d3,d4,d5,d6       |    10
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES                | count(e) | <=,=    | d2,d4,d5,d6       |    12
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP       | count(*) | <=,=,>= | d2,d3,d4,d5       |    16
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP       | count(e) | <=,=,>= | d2,d3,d4          |    12
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES        | count(*) | <=,=,>= | d2,d3,d4,d5       |    14
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES        | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    26
 ORDER BY s RANGE BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d2,d4,d5,d6       |    12
 ORDER BY s RANGE BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE TIES                 | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s RANGE BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d2,d4,d5,d6       |    12
 ORDER BY s RANGE BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                 | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s RANGE BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d5                |     2
 ORDER BY s RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d2,d3,d4,d5,d6    |    16
 ORDER BY s RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                | count(*) | =,>=    | d4                |     4
 ORDER BY s RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                | count(e) | =,>=    | d4                |     5
 ORDER BY s RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                 | count(*) | =,>=    | d4                |     2
 ORDER BY s RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                 | count(e) | =,>=    | d3,d4,d5,d6       |    14
 ORDER BY s RANGE BETWEEN 2 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d5                |     2
 ORDER BY s RANGE BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d2,d3,d4,d5,d6    |    12
 ORDER BY s RANGE BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                | count(*) | =,>=    | d4                |     2
 ORDER BY s RANGE BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                | count(e) | =,>=    | d4                |     4
 ORDER BY s RANGE BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                 | count(e) | =,>=    | d3,d4,d5,d6       |    12
 ORDER BY s RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d2,d4,d5,d6       |    12
 ORDER BY s RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES                 | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW          | count(e) | <=,=    | d3,d4,d5,d6       |    10
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE TIES                 | count(e) | <=,=    | d2,d4,d5,d6       |    12
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW          | count(e) | <=,=    | d3,d4,d5,d6       |    10
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE TIES                 | count(e) | <=,=    | d2,d4,d5,d6       |    12
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW          | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE GROUP                | count(*) | <=,=    | d2,d3,d4,d5       |     8
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE GROUP                | count(e) | <=,=    | d2,d3,d4          |     7
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE TIES                 | count(*) | <=,=    | d2,d3,d4,d5       |     8
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE TIES                 | count(e) | <=,=    | d2,d3,d4,d5,d6    |    20
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING EXCLUDE TIES                 | count(e) | <=,=    | d5                |     2
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE CURRENT ROW          | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE GROUP                | count(*) | <=,=    | d2,d3,d4,d5       |    13
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE GROUP                | count(e) | <=,=    | d2,d3,d4          |     9
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE TIES                 | count(*) | <=,=    | d2,d3,d4,d5       |    13
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE TIES                 | count(e) | <=,=    | d2,d3,d4,d5,d6    |    18
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND 2 PRECEDING EXCLUDE TIES                 | count(e) | <=,=    | d5                |     2
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW          | count(e) | <=,=    | d3,d4,d5,d6       |    10
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES                 | count(e) | <=,=    | d2,d4,d5,d6       |    12
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW  | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP        | count(*) | <=,=,>= | d2,d3,d4,d5       |    16
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP        | count(e) | <=,=,>= | d2,d3,d4          |    12
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES         | count(*) | <=,=,>= | d2,d3,d4,d5       |    14
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES         | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    26
 ORDER BY s ROWS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE TIES                  | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s ROWS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                  | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW           | count(e) | =,>=    | d3,d4,d5,d6       |    14
 ORDER BY s ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                 | count(e) | =,>=    | d4                |     2
 ORDER BY s ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                  | count(e) | =,>=    | d3,d4,d6          |     6
 ORDER BY s ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW           | count(e) | =,>=    | d2,d3,d4,d5,d6    |    16
 ORDER BY s ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                 | count(*) | =,>=    | d4                |     4
 ORDER BY s ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                 | count(e) | =,>=    | d4                |     4
 ORDER BY s ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                  | count(*) | =,>=    | d4                |     2
 ORDER BY s ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                  | count(e) | =,>=    | d3,d4,d5,d6       |    12
 ORDER BY s ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES                  | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE TIES                  | count(e) | <=,=    | d2,d4,d5,d6       |    12
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE TIES                  | count(e) | <=,=    | d2,d4,d5,d6       |    12
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW           | count(e) | <=,=    | d3,d4,d6          |    10
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE GROUP                 | count(e) | <=,=    | d4                |     2
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE TIES                  | count(e) | <=,=    | d2,d4,d5,d6       |    10
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE CURRENT ROW           | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE GROUP                 | count(*) | <=,=    | d4                |     2
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE GROUP                 | count(e) | <=,=    | d2,d3,d4          |     6
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE TIES                  | count(*) | <=,=    | d4                |     2
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE TIES                  | count(e) | <=,=    | d2,d3,d4,d5,d6    |    12
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES                  | count(e) | <=,=    | d2,d4,d5,d6       |    12
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW   | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP         | count(*) | <=,=,>= | d2,d3,d4,d5       |    16
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP         | count(e) | <=,=,>= | d2,d3,d4          |    12
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES          | count(*) | <=,=,>= | d2,d3,d4,d5       |    14
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES          | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    26
 RANGE BETWEEN CURRENT ROW AND CURRENT ROW EXCLUDE CURRENT ROW                             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 RANGE BETWEEN CURRENT ROW AND CURRENT ROW EXCLUDE TIES                                    | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES                            | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES                            | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                    | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 FOLLOWING AND 0 FOLLOWING                                                  | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 FOLLOWING AND 0 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 FOLLOWING AND 1 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 0 FOLLOWING AND 1 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4       |    17
 ROWS BETWEEN 0 FOLLOWING AND 1 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 0 FOLLOWING AND 1 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 0 FOLLOWING AND 1 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 FOLLOWING AND 2 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 0 FOLLOWING AND 2 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    26
 ROWS BETWEEN 0 FOLLOWING AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 0 FOLLOWING AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 0 FOLLOWING AND 2 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    34
 ROWS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE TIES                             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 PRECEDING AND 0 FOLLOWING                                                  | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 PRECEDING AND 0 PRECEDING                                                  | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 PRECEDING AND 0 PRECEDING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 PRECEDING AND 1 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 0 PRECEDING AND 1 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4       |    17
 ROWS BETWEEN 0 PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 0 PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 0 PRECEDING AND 1 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 PRECEDING AND 2 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 0 PRECEDING AND 2 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    26
 ROWS BETWEEN 0 PRECEDING AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 0 PRECEDING AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 0 PRECEDING AND 2 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 PRECEDING AND CURRENT ROW                                                  | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 PRECEDING AND CURRENT ROW EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    34
 ROWS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING                                                  | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4       |    14
 ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 1 PRECEDING AND 0 PRECEDING                                                  | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 PRECEDING AND 0 PRECEDING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4       |    14
 ROWS BETWEEN 1 PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW                              | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 1 PRECEDING AND 0 PRECEDING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING                                                  | count(*) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    34
 ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING                                                  | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW                              | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING                                                  | count(*) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    36
 ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    25
 ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    36
 ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    38
 ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 1 PRECEDING AND CURRENT ROW                                                  | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 PRECEDING AND CURRENT ROW                                                  | count(e) | <=,=,>= | d1,d2,d3,d4       |    14
 ROWS BETWEEN 1 PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW                              | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 1 PRECEDING AND CURRENT ROW EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    44
 ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    26
 ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    44
 ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    43
 ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 2 FOLLOWING AND 2 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 2 FOLLOWING AND 2 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 2 FOLLOWING AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 2 FOLLOWING AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 2 FOLLOWING AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    44
 ROWS BETWEEN 2 FOLLOWING AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    28
 ROWS BETWEEN 2 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    44
 ROWS BETWEEN 2 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    28
 ROWS BETWEEN 2 PRECEDING AND 0 FOLLOWING                                                  | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 2 PRECEDING AND 0 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 2 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 2 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    19
 ROWS BETWEEN 2 PRECEDING AND 0 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 2 PRECEDING AND 0 PRECEDING                                                  | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 2 PRECEDING AND 0 PRECEDING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 2 PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW                              | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 2 PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    19
 ROWS BETWEEN 2 PRECEDING AND 0 PRECEDING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING                                                  | count(*) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    30
 ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    30
 ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    36
 ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING                                                  | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    19
 ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW                              | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    19
 ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING                                                  | count(*) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    42
 ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    31
 ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    42
 ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    36
 ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 2 PRECEDING AND 2 PRECEDING                                                  | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 2 PRECEDING AND 2 PRECEDING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 2 PRECEDING AND 2 PRECEDING EXCLUDE CURRENT ROW                              | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 2 PRECEDING AND 2 PRECEDING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW                                                  | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW                              | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    19
 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    18
 ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    37
 ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN CURRENT ROW AND 0 FOLLOWING                                                  | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN CURRENT ROW AND 0 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4       |    17
 ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    22
 ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING                                                  | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    26
 ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN CURRENT ROW AND CURRENT ROW                                                  | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN CURRENT ROW AND CURRENT ROW EXCLUDE TIES                                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    34
 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES                             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING                                          | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    54
 ROWS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING                                          | count(e) | =,>=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | =,>=    | d1,d2,d3,d4,d5,d6 |    34
 ROWS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE TIES                             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING                                          | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    54
 ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING                                          | count(e) | =,>=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW                      | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW                      | count(e) | =,>=    | d1,d2,d3,d4,d5,d6 |    34
 ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE TIES                             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING                                          | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    42
 ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING                                          | count(e) | =,>=    | d1,d2,d3,d4,d5,d6 |    28
 ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    44
 ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    41
 ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING EXCLUDE TIES                             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING                                          | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING                                          | count(e) | =,>=    | d1,d2,d3,d4,d5,d6 |    34
 ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW                      | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW                      | count(e) | =,>=    | d1,d2,d3,d4,d5,d6 |    34
 ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING                                          | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    30
 ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING                                          | count(e) | =,>=    | d1,d2,d3,d4,d5,d6 |    20
 ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=,>= | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING EXCLUDE TIES                             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN UNBOUNDED PRECEDING AND 2 PRECEDING                                          | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    44
 ROWS BETWEEN UNBOUNDED PRECEDING AND 2 PRECEDING                                          | count(e) | =,>=    | d1,d2,d3,d4,d5,d6 |    26
 ROWS BETWEEN UNBOUNDED PRECEDING AND 2 PRECEDING EXCLUDE CURRENT ROW                      | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    44
 ROWS BETWEEN UNBOUNDED PRECEDING AND 2 PRECEDING EXCLUDE CURRENT ROW                      | count(e) | =,>=    | d1,d2,d3,d4,d5,d6 |    26
 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW                                          | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    54
 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW                                          | count(e) | =,>=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW                      | count(*) | =,>=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW                      | count(e) | =,>=    | d1,d2,d3,d4,d5,d6 |    34
 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES                             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW              | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
(295 rows)


  [text/plain] runcond-failures-v2.txt (22.6K, ../CANWCAZap+k7-E2f-XoC36Hk4izZjbN8w2c9OuomummGfZ5d20w@mail.gmail.com/3-runcond-failures-v2.txt)
  download | inline:
 mismatching_queries | distinct_bad_windows 
---------------------+----------------------
                2626 |                  162
(1 row)

                                          winspec                                          |    fn    |  dirs   |     datasets      | nfail 
-------------------------------------------------------------------------------------------+----------+---------+-------------------+-------
 ORDER BY s GROUPS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW         | count(e) | =,>=    | d2,d4,d5,d6       |    12
 ORDER BY s GROUPS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE TIES                | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s GROUPS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW         | count(e) | =,>=    | d2,d4,d5,d6       |    12
 ORDER BY s GROUPS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s GROUPS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW         | count(e) | =,>=    | d2,d3,d4,d5,d6    |    16
 ORDER BY s GROUPS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP               | count(*) | =,>=    | d4                |     4
 ORDER BY s GROUPS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP               | count(e) | =,>=    | d4                |     5
 ORDER BY s GROUPS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                | count(*) | =,>=    | d4                |     2
 ORDER BY s GROUPS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                | count(e) | =,>=    | d3,d4,d5,d6       |    14
 ORDER BY s GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW         | count(e) | =,>=    | d2,d3,d4,d5,d6    |    10
 ORDER BY s GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP               | count(*) | =,>=    | d4                |     2
 ORDER BY s GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP               | count(e) | =,>=    | d4                |     4
 ORDER BY s GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                | count(e) | =,>=    | d3,d4,d5,d6       |    12
 ORDER BY s GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW         | count(e) | =,>=    | d2,d4,d5,d6       |    12
 ORDER BY s GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES                | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW         | count(e) | <=,=    | d3,d4,d5,d6       |    10
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE TIES                | count(e) | <=,=    | d2,d4,d5,d6       |    12
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP       | count(*) | <=,=,>= | d2,d3,d4,d5       |    16
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP       | count(e) | <=,=,>= | d2,d3,d4          |    12
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES        | count(*) | <=,=,>= | d2,d3,d4,d5       |    14
 ORDER BY s GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES        | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    26
 ORDER BY s RANGE BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d2,d4,d5,d6       |    12
 ORDER BY s RANGE BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE TIES                 | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s RANGE BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d2,d4,d5,d6       |    12
 ORDER BY s RANGE BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                 | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s RANGE BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d5                |     2
 ORDER BY s RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d2,d3,d4,d5,d6    |    16
 ORDER BY s RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                | count(*) | =,>=    | d4                |     4
 ORDER BY s RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                | count(e) | =,>=    | d4                |     5
 ORDER BY s RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                 | count(*) | =,>=    | d4                |     2
 ORDER BY s RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                 | count(e) | =,>=    | d3,d4,d5,d6       |    14
 ORDER BY s RANGE BETWEEN 2 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d5                |     2
 ORDER BY s RANGE BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d2,d3,d4,d5,d6    |    12
 ORDER BY s RANGE BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                | count(*) | =,>=    | d4                |     2
 ORDER BY s RANGE BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                | count(e) | =,>=    | d4                |     4
 ORDER BY s RANGE BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                 | count(e) | =,>=    | d3,d4,d5,d6       |    12
 ORDER BY s RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW          | count(e) | =,>=    | d2,d4,d5,d6       |    12
 ORDER BY s RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES                 | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW  | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP        | count(*) | <=,=,>= | d2,d3,d4,d5       |    16
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP        | count(e) | <=,=,>= | d2,d3,d4          |    12
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES         | count(*) | <=,=,>= | d2,d3,d4,d5       |    14
 ORDER BY s RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES         | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    26
 ORDER BY s ROWS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE TIES                  | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s ROWS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                  | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW           | count(e) | =,>=    | d3,d4,d5,d6       |    14
 ORDER BY s ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                 | count(e) | =,>=    | d4                |     2
 ORDER BY s ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                  | count(e) | =,>=    | d3,d4,d6          |     6
 ORDER BY s ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW           | count(e) | =,>=    | d2,d3,d4,d5,d6    |    16
 ORDER BY s ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                 | count(*) | =,>=    | d4                |     4
 ORDER BY s ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP                 | count(e) | =,>=    | d4                |     4
 ORDER BY s ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                  | count(*) | =,>=    | d4                |     2
 ORDER BY s ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                  | count(e) | =,>=    | d3,d4,d5,d6       |    12
 ORDER BY s ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES                  | count(e) | =,>=    | d3,d4,d5,d6       |    10
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE TIES                  | count(e) | <=,=    | d2,d4,d5,d6       |    12
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES                  | count(e) | <=,=    | d2,d4,d5,d6       |    12
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW   | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP         | count(*) | <=,=,>= | d2,d3,d4,d5       |    16
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP         | count(e) | <=,=,>= | d2,d3,d4          |    12
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES          | count(*) | <=,=,>= | d2,d3,d4,d5       |    14
 ORDER BY s ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES          | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    26
 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                     | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES                            | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW             | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                    | count(e) | <=,=,>= | d2,d3,d4,d5,d6    |    20
 ROWS BETWEEN 0 FOLLOWING AND 0 FOLLOWING                                                  | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 0 FOLLOWING AND 0 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 0 FOLLOWING AND 1 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 0 FOLLOWING AND 1 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d3,d4       |    10
 ROWS BETWEEN 0 FOLLOWING AND 2 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 0 FOLLOWING AND 2 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    18
 ROWS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    34
 ROWS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN 0 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE TIES                             | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 0 PRECEDING AND 0 FOLLOWING                                                  | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 0 PRECEDING AND 0 PRECEDING                                                  | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 0 PRECEDING AND 1 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 0 PRECEDING AND 1 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d3,d4       |    10
 ROWS BETWEEN 0 PRECEDING AND 2 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 0 PRECEDING AND 2 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    18
 ROWS BETWEEN 0 PRECEDING AND CURRENT ROW                                                  | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 0 PRECEDING AND CURRENT ROW EXCLUDE TIES                                     | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    34
 ROWS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN 0 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                             | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    18
 ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING                                                  | count(e) | <=,=    | d2,d4             |     4
 ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 1 PRECEDING AND 0 PRECEDING                                                  | count(e) | <=,=    | d2,d4             |     4
 ROWS BETWEEN 1 PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW                              | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d4,d5,d6    |    10
 ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING                                                  | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW                              | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    16
 ROWS BETWEEN 1 PRECEDING AND CURRENT ROW                                                  | count(e) | <=,=    | d2,d4             |     4
 ROWS BETWEEN 1 PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW                              | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 1 PRECEDING AND CURRENT ROW EXCLUDE TIES                                     | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    44
 ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    26
 ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    44
 ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    31
 ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                             | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 2 FOLLOWING AND 2 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 2 FOLLOWING AND 2 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 2 FOLLOWING AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    44
 ROWS BETWEEN 2 FOLLOWING AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    28
 ROWS BETWEEN 2 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    44
 ROWS BETWEEN 2 FOLLOWING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    28
 ROWS BETWEEN 2 PRECEDING AND 0 FOLLOWING                                                  | count(e) | <=,=    | d4,d5,d6          |     6
 ROWS BETWEEN 2 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW                              | count(e) | <=,=    | d2,d4             |     4
 ROWS BETWEEN 2 PRECEDING AND 0 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 2 PRECEDING AND 0 PRECEDING                                                  | count(e) | <=,=    | d4,d5,d6          |     6
 ROWS BETWEEN 2 PRECEDING AND 0 PRECEDING EXCLUDE CURRENT ROW                              | count(e) | <=,=    | d2,d4             |     4
 ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d3,d4       |     8
 ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING                                                  | count(e) | <=,=    | d2,d4             |     4
 ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING EXCLUDE CURRENT ROW                              | count(e) | <=,=    | d2,d4             |     4
 ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    16
 ROWS BETWEEN 2 PRECEDING AND 2 PRECEDING                                                  | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 2 PRECEDING AND 2 PRECEDING EXCLUDE CURRENT ROW                              | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW                                                  | count(e) | <=,=    | d4,d5,d6          |     6
 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW                              | count(e) | <=,=    | d2,d4             |     4
 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW EXCLUDE TIES                                     | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    18
 ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    25
 ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                             | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN CURRENT ROW AND 0 FOLLOWING                                                  | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN CURRENT ROW AND 0 FOLLOWING EXCLUDE TIES                                     | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    12
 ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d3,d4       |    10
 ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING                                                  | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    24
 ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING                                                  | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    18
 ROWS BETWEEN CURRENT ROW AND CURRENT ROW                                                  | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN CURRENT ROW AND CURRENT ROW EXCLUDE TIES                                     | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING                                          | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING                                          | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    34
 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(*) | <=,=    | d1,d2,d3,d4,d5,d6 |    56
 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW                      | count(e) | <=,=    | d1,d2,d3,d4,d5,d6 |    32
 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES                             | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE TIES                             | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES                             | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW              | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES                     | count(e) | <=,=    | d2,d3,d4,d5,d6    |    10
(162 rows)


  [application/sql] count_runcondition_matrix.sql (5.8K, ../CANWCAZap+k7-E2f-XoC36Hk4izZjbN8w2c9OuomummGfZ5d20w@mail.gmail.com/4-count_runcondition_matrix.sql)
  download

  [application/sql] v2-wrong-tests-repro.sql (3.9K, ../CANWCAZap+k7-E2f-XoC36Hk4izZjbN8w2c9OuomummGfZ5d20w@mail.gmail.com/5-v2-wrong-tests-repro.sql)
  download

  [text/x-patch] v3-0001-Minimal-fix-for-COUNT-s-window-run-condition-supp.patch (14.8K, ../CANWCAZap+k7-E2f-XoC36Hk4izZjbN8w2c9OuomummGfZ5d20w@mail.gmail.com/6-v3-0001-Minimal-fix-for-COUNT-s-window-run-condition-supp.patch)
  download | inline diff:
From cc7ca26237e3b55853ef489306423b5d6828feab Mon Sep 17 00:00:00 2001
From: John Naylor <[email protected]>
Date: Sat, 4 Jul 2026 14:54:36 +0700
Subject: [PATCH v3] Minimal fix for COUNT's window run condition support

XXX vibe-coded, and the regression tests are surely not enough.

9d9c02ccd added code to allow the executor to stop early when
processing WindowAgg nodes where a monotonic window function starts
producing values that fail a pushed-down qual and can never satisfy it
again.  The monotonicity of COUNT(*) and COUNT(ANY) is determined by
int8inc_support(), which got two things wrong:

Firstly, it ignored the frame's EXCLUDE clause.  Excluded rows can
rejoin the count as the frame moves over the partition, so the count
can both rise and fall even when a frame bound is pinned to an edge of
the partition.  Proving monotonicity in the presence of an EXCLUDE
clause requires analyzing both frame bounds relative to the current
row's peer group, the frame mode, the exclusion type, and whether the
COUNT argument can be NULL.  That doesn't seem worth the complexity for
such a rarely-used feature, so simply report COUNT as non-monotonic
whenever the frame has an EXCLUDE clause.

Secondly, it assumed that the absence of an ORDER BY clause means the
count is the same for every row.  That's only true in RANGE mode, where
all rows being peers means every permitted frame covers the whole
partition.  In ROWS mode the frame bounds count individual rows
regardless of peerage, so determine monotonicity from the frame bounds
in the same way as when an ORDER BY is present.

Both errors could result in rows incorrectly missing from the query
result when the qual was pushed down as a run condition.

Bug: #19533
Reported-by: Qifan Liu <[email protected]>
Discussion: https://postgr.es/m/[email protected]
---
 src/backend/utils/adt/int8.c         |  27 +++-
 src/test/regress/expected/window.out | 183 +++++++++++++++++++++++++++
 src/test/regress/sql/window.sql      | 100 +++++++++++++++
 3 files changed, 308 insertions(+), 2 deletions(-)

diff --git a/src/backend/utils/adt/int8.c b/src/backend/utils/adt/int8.c
index 9b429da86d9..6f0da84b435 100644
--- a/src/backend/utils/adt/int8.c
+++ b/src/backend/utils/adt/int8.c
@@ -795,8 +795,31 @@ int8inc_support(PG_FUNCTION_ARGS)
 		MonotonicFunction monotonic = MONOTONICFUNC_NONE;
 		int			frameOptions = req->window_clause->frameOptions;
 
-		/* No ORDER BY clause then all rows are peers */
-		if (req->window_clause->orderClause == NIL)
+		/*
+		 * A frame EXCLUDE clause removes rows from within the frame as the
+		 * frame moves over the partition, which can cause the count to both
+		 * rise and fall for the same window definition.  Proving which
+		 * combinations of frame mode, frame bounds, exclusion type and
+		 * COUNT(*) vs COUNT(any) remain monotonic requires analysis of both
+		 * frame bounds relative to the current row's peer group, so we don't
+		 * attempt it; just report the function as non-monotonic.
+		 */
+		if (frameOptions & FRAMEOPTION_EXCLUSION)
+		{
+			req->monotonic = MONOTONICFUNC_NONE;
+			PG_RETURN_POINTER(req);
+		}
+
+		/*
+		 * When there's no ORDER BY clause, all rows are peers of one
+		 * another, so in RANGE mode every permitted frame bound degenerates
+		 * to the edge of the partition and the count is the same for every
+		 * row.  This does not apply in ROWS mode, where frame bounds count
+		 * individual rows regardless of any peerage; those get the ordinary
+		 * treatment below.  (GROUPS mode requires an ORDER BY clause.)
+		 */
+		if (req->window_clause->orderClause == NIL &&
+			frameOptions & FRAMEOPTION_RANGE)
 			monotonic = MONOTONICFUNC_BOTH;
 		else
 		{
diff --git a/src/test/regress/expected/window.out b/src/test/regress/expected/window.out
index 90d9f953b81..b48316e2b53 100644
--- a/src/test/regress/expected/window.out
+++ b/src/test/regress/expected/window.out
@@ -4436,6 +4436,189 @@ WHERE c = 1;
                ->  Seq Scan on empsalary
 (9 rows)
 
+--
+-- Ensure we don't push down the run condition when the frame has an EXCLUDE
+-- clause.  The excluded rows can rejoin the count as the frame moves over
+-- the partition, so the count is not guaranteed monotonic.
+--
+-- The count is 10 minus the size of the current row's peer group, which can
+-- both rise and fall, despite the UNBOUNDED PRECEDING start
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) c
+   FROM empsalary) emp
+WHERE c <= 3;
+                                                        QUERY PLAN                                                        
+--------------------------------------------------------------------------------------------------------------------------
+ Subquery Scan on emp
+   Filter: (emp.c <= 3)
+   ->  WindowAgg
+         Window: w1 AS (ORDER BY empsalary.salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP)
+         ->  Sort
+               Sort Key: empsalary.salary
+               ->  Seq Scan on empsalary
+(7 rows)
+
+-- As above, for the monotonically decreasing claim of the UNBOUNDED
+-- FOLLOWING end
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) c
+   FROM empsalary) emp
+WHERE c >= 8;
+                                                        QUERY PLAN                                                        
+--------------------------------------------------------------------------------------------------------------------------
+ Subquery Scan on emp
+   Filter: (emp.c >= 8)
+   ->  WindowAgg
+         Window: w1 AS (ORDER BY empsalary.salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP)
+         ->  Sort
+               Sort Key: empsalary.salary
+               ->  Seq Scan on empsalary
+(7 rows)
+
+-- Check the results are sane without the pushdown
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) c
+   FROM empsalary) emp
+WHERE c >= 8 ORDER BY empno;
+ empno | salary | c 
+-------+--------+---
+     1 |   5000 | 9
+     2 |   3900 | 9
+     3 |   4800 | 8
+     4 |   4800 | 8
+     5 |   3500 | 9
+     7 |   4200 | 9
+     8 |   6000 | 9
+     9 |   4500 | 9
+    10 |   5200 | 8
+    11 |   5200 | 8
+(10 rows)
+
+-- EXCLUDE TIES keeps the current row, so with COUNT(any) the count can go
+-- down when the current row's argument is NULL
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES) c
+   FROM empsalary) emp
+WHERE c <= 3;
+                                                   QUERY PLAN                                                    
+-----------------------------------------------------------------------------------------------------------------
+ Subquery Scan on emp
+   Filter: (emp.c <= 3)
+   ->  WindowAgg
+         Window: w1 AS (ORDER BY empsalary.salary ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES)
+         ->  Sort
+               Sort Key: empsalary.salary
+               ->  Seq Scan on empsalary
+(7 rows)
+
+-- As above, spelled 0 FOLLOWING instead of CURRENT ROW
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ORDER BY salary GROUPS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE TIES) c
+   FROM empsalary) emp
+WHERE c <= 3;
+                                                         QUERY PLAN                                                          
+-----------------------------------------------------------------------------------------------------------------------------
+ Subquery Scan on emp
+   Filter: (emp.c <= 3)
+   ->  WindowAgg
+         Window: w1 AS (ORDER BY empsalary.salary GROUPS BETWEEN UNBOUNDED PRECEDING AND '0'::bigint FOLLOWING EXCLUDE TIES)
+         ->  Sort
+               Sort Key: empsalary.salary
+               ->  Seq Scan on empsalary
+(7 rows)
+
+-- No pushdown here either, even though this particular case happens to be
+-- monotonic: the excluded peer group can never be within the frame
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ORDER BY salary GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING EXCLUDE GROUP) c
+   FROM empsalary) emp
+WHERE c <= 3;
+                                                          QUERY PLAN                                                          
+------------------------------------------------------------------------------------------------------------------------------
+ Subquery Scan on emp
+   Filter: (emp.c <= 3)
+   ->  WindowAgg
+         Window: w1 AS (ORDER BY empsalary.salary GROUPS BETWEEN UNBOUNDED PRECEDING AND '1'::bigint PRECEDING EXCLUDE GROUP)
+         ->  Sort
+               Sort Key: empsalary.salary
+               ->  Seq Scan on empsalary
+(7 rows)
+
+--
+-- Frames without an ORDER BY clause.  In RANGE mode all rows are peers, so
+-- the frame always covers the whole partition and the count is constant.
+-- In ROWS mode the frame bounds count rows as usual, so only the frame
+-- bounds determine monotonicity.
+--
+-- Ensure we get a pushdown in ROWS mode when the frame starts at the start
+-- of the partition
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) c
+   FROM empsalary) emp
+WHERE c <= 3;
+                             QUERY PLAN                             
+--------------------------------------------------------------------
+ WindowAgg
+   Window: w1 AS (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+   Run Condition: (count(empsalary.empno) OVER w1 <= 3)
+   ->  Seq Scan on empsalary
+(4 rows)
+
+-- The count here is the row number counted from the end of the partition,
+-- i.e. monotonically decreasing, so ensure we get a pushdown for >=
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) c
+   FROM empsalary) emp
+WHERE c >= 9;
+                             QUERY PLAN                             
+--------------------------------------------------------------------
+ WindowAgg
+   Window: w1 AS (ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
+   Run Condition: (count(*) OVER w1 >= 9)
+   ->  Seq Scan on empsalary
+(4 rows)
+
+-- Ensure no pushdown when neither frame bound is the partition edge; the
+-- count is not monotonic in either direction
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ROWS BETWEEN CURRENT ROW AND CURRENT ROW) c
+   FROM empsalary) emp
+WHERE c <= 3;
+                            QUERY PLAN                            
+------------------------------------------------------------------
+ Subquery Scan on emp
+   Filter: (emp.c <= 3)
+   ->  WindowAgg
+         Window: w1 AS (ROWS BETWEEN CURRENT ROW AND CURRENT ROW)
+         ->  Seq Scan on empsalary
+(5 rows)
+
 -- Test Sort node collapsing
 EXPLAIN (COSTS OFF)
 SELECT * FROM
diff --git a/src/test/regress/sql/window.sql b/src/test/regress/sql/window.sql
index 5ac3a486e16..c2d7e36bb0c 100644
--- a/src/test/regress/sql/window.sql
+++ b/src/test/regress/sql/window.sql
@@ -1460,6 +1460,106 @@ SELECT * FROM
    FROM empsalary) emp
 WHERE c = 1;
 
+--
+-- Ensure we don't push down the run condition when the frame has an EXCLUDE
+-- clause.  The excluded rows can rejoin the count as the frame moves over
+-- the partition, so the count is not guaranteed monotonic.
+--
+
+-- The count is 10 minus the size of the current row's peer group, which can
+-- both rise and fall, despite the UNBOUNDED PRECEDING start
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) c
+   FROM empsalary) emp
+WHERE c <= 3;
+
+-- As above, for the monotonically decreasing claim of the UNBOUNDED
+-- FOLLOWING end
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) c
+   FROM empsalary) emp
+WHERE c >= 8;
+
+-- Check the results are sane without the pushdown
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) c
+   FROM empsalary) emp
+WHERE c >= 8 ORDER BY empno;
+
+-- EXCLUDE TIES keeps the current row, so with COUNT(any) the count can go
+-- down when the current row's argument is NULL
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES) c
+   FROM empsalary) emp
+WHERE c <= 3;
+
+-- As above, spelled 0 FOLLOWING instead of CURRENT ROW
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ORDER BY salary GROUPS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE TIES) c
+   FROM empsalary) emp
+WHERE c <= 3;
+
+-- No pushdown here either, even though this particular case happens to be
+-- monotonic: the excluded peer group can never be within the frame
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ORDER BY salary GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING EXCLUDE GROUP) c
+   FROM empsalary) emp
+WHERE c <= 3;
+
+--
+-- Frames without an ORDER BY clause.  In RANGE mode all rows are peers, so
+-- the frame always covers the whole partition and the count is constant.
+-- In ROWS mode the frame bounds count rows as usual, so only the frame
+-- bounds determine monotonicity.
+--
+
+-- Ensure we get a pushdown in ROWS mode when the frame starts at the start
+-- of the partition
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) c
+   FROM empsalary) emp
+WHERE c <= 3;
+
+-- The count here is the row number counted from the end of the partition,
+-- i.e. monotonically decreasing, so ensure we get a pushdown for >=
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) c
+   FROM empsalary) emp
+WHERE c >= 9;
+
+-- Ensure no pushdown when neither frame bound is the partition edge; the
+-- count is not monotonic in either direction
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ROWS BETWEEN CURRENT ROW AND CURRENT ROW) c
+   FROM empsalary) emp
+WHERE c <= 3;
+
 -- Test Sort node collapsing
 EXPLAIN (COSTS OFF)
 SELECT * FROM
-- 
2.54.0



  [text/x-patch] v3-0001-Demo-full-coverage-for-COUNT-s-window-run-conditi.patch (32.8K, ../CANWCAZap+k7-E2f-XoC36Hk4izZjbN8w2c9OuomummGfZ5d20w@mail.gmail.com/7-v3-0001-Demo-full-coverage-for-COUNT-s-window-run-conditi.patch)
  download | inline diff:
From d820f841448fe628cf0ca0e50a4cf5aa6d70181c Mon Sep 17 00:00:00 2001
From: John Naylor <[email protected]>
Date: Sat, 4 Jul 2026 12:14:48 +0700
Subject: [PATCH v3] Demo full coverage for COUNT's window run condition
 support

XXX vibe-coded, and the regression tests still need thought.

9d9c02ccd added code to allow the executor to stop early when
processing WindowAgg nodes where a monotonic window function starts
producing values that fail a pushed-down qual and can never satisfy it
again.  The monotonicity of COUNT(*) and COUNT(ANY) is determined by
int8inc_support(), which got two things wrong:

Firstly, it ignored the frame's EXCLUDE clause.  Excluded rows can
rejoin the count as the frame moves over the partition, so the count
can both rise and fall even when a frame bound is pinned to an edge of
the partition.  Whether monotonicity survives an EXCLUDE clause depends
on where the moving frame bound can be relative to the current row and
its peer group, and, since COUNT(ANY) skips NULL arguments, on whether
the excluded rows' contribution to the count can vary from row to row.
Add that analysis, applying it to the frame end for the monotonically
increasing case and, as a mirror image, to the frame start for the
monotonically decreasing case.

Secondly, it assumed that the absence of an ORDER BY clause means the
count is the same for every row.  That's only true in RANGE mode, where
all rows being peers means every permitted frame covers the whole
partition.  In ROWS mode the frame bounds count individual rows
regardless of peerage, so determine monotonicity from the frame bounds
in the same way as when an ORDER BY is present.

Both errors could result in rows incorrectly missing from the query
result when the qual was pushed down as a run condition.

Bug: #19533
Reported-by: Qifan Liu <[email protected]>
Discussion: https://postgr.es/m/[email protected]
---
 src/backend/utils/adt/int8.c         | 234 ++++++++++++++++--
 src/test/regress/expected/window.out | 343 +++++++++++++++++++++++++++
 src/test/regress/sql/window.sql      | 178 ++++++++++++++
 3 files changed, 737 insertions(+), 18 deletions(-)

diff --git a/src/backend/utils/adt/int8.c b/src/backend/utils/adt/int8.c
index 9b429da86d9..a97f2d41704 100644
--- a/src/backend/utils/adt/int8.c
+++ b/src/backend/utils/adt/int8.c
@@ -780,6 +780,177 @@ int8dec_any(PG_FUNCTION_ARGS)
 	return int8dec(fcinfo);
 }
 
+/*
+ * count_wfunc_offset_matches
+ *		Check that a ROWS or GROUPS mode frame offset expression is a
+ *		non-NULL Const and that its value is zero (when positive is false)
+ *		or greater than zero (when positive is true).
+ *
+ * This must not be used for RANGE mode offsets, whose type depends on the
+ * ORDER BY column.
+ */
+static bool
+count_wfunc_offset_matches(Node *offset, bool positive)
+{
+	Const	   *cnst;
+
+	offset = eval_const_expressions(NULL, offset);
+
+	if (!IsA(offset, Const))
+		return false;
+
+	cnst = castNode(Const, offset);
+	if (cnst->constisnull)
+		return false;
+
+	if (positive)
+		return DatumGetInt64(cnst->constvalue) > 0;
+	else
+		return DatumGetInt64(cnst->constvalue) == 0;
+}
+
+/*
+ * count_wfunc_exclusion_ok
+ *		Determine whether the window frame's EXCLUDE clause preserves the
+ *		monotonicity of COUNT in one direction.
+ *
+ * COUNT is monotonically increasing when the frame start is pinned to the
+ * partition start and monotonically decreasing when the frame end is pinned
+ * to the partition end, since frame bounds only ever move forwards as the
+ * current row advances through the partition.  An EXCLUDE clause can break
+ * this by removing rows from within the frame in a way that varies from row
+ * to row: rows excluded for one current row can count again for a later
+ * one, and vice versa.  Whether that can happen depends only on where the
+ * moving frame bound can be relative to the current row and its peer group,
+ * so this function inspects the frame end when checking the increasing case
+ * (check_start is false), and the frame start when checking the decreasing
+ * case (check_start is true).  The two cases are exact mirror images, so
+ * the comments below describe the increasing case only.
+ *
+ * count_any must be true for COUNT(any) and false for COUNT(*).  The
+ * difference matters because COUNT(any) skips rows with a NULL argument, so
+ * excluding or re-admitting a particular row can change that count by a
+ * row-dependent amount.
+ */
+static bool
+count_wfunc_exclusion_ok(WindowClause *wc, bool count_any, bool check_start)
+{
+	int			frameOptions = wc->frameOptions;
+	Node	   *offset;
+	bool		bound_current;
+	bool		bound_shrinks;
+	bool		bound_grows;
+	bool		within_group;
+	bool		before_current;
+
+	if (check_start)
+	{
+		/* frame start, for the monotonically decreasing case */
+		bound_current = (frameOptions & FRAMEOPTION_START_CURRENT_ROW) != 0;
+		bound_shrinks = (frameOptions & FRAMEOPTION_START_OFFSET_FOLLOWING) != 0;
+		bound_grows = (frameOptions & FRAMEOPTION_START_OFFSET_PRECEDING) != 0;
+		offset = wc->startOffset;
+	}
+	else
+	{
+		/* frame end, for the monotonically increasing case */
+		bound_current = (frameOptions & FRAMEOPTION_END_CURRENT_ROW) != 0;
+		bound_shrinks = (frameOptions & FRAMEOPTION_END_OFFSET_PRECEDING) != 0;
+		bound_grows = (frameOptions & FRAMEOPTION_END_OFFSET_FOLLOWING) != 0;
+		offset = wc->endOffset;
+	}
+
+	/*
+	 * within_group: the frame end can never pass beyond the current row's
+	 * peer group, so the frame never contains rows after the peer group.
+	 * This holds for CURRENT ROW (the peer group's edge in RANGE and GROUPS
+	 * mode, the current row itself in ROWS mode), for any PRECEDING offset
+	 * (the executor ensures offsets aren't negative), and for a constant
+	 * zero FOLLOWING offset in ROWS or GROUPS mode, where it's equivalent
+	 * to CURRENT ROW.  If the frame end is UNBOUNDED FOLLOWING or can
+	 * otherwise pass the peer group, all of these are false and only
+	 * exclusions that are unconditionally safe are allowed below.
+	 */
+	within_group = bound_current || bound_shrinks ||
+		(bound_grows &&
+		 (frameOptions & (FRAMEOPTION_ROWS | FRAMEOPTION_GROUPS)) &&
+		 count_wfunc_offset_matches(offset, false));
+
+	/*
+	 * before_current: the current row itself can never be in the frame,
+	 * which requires a constant PRECEDING offset greater than zero.  We
+	 * cannot verify RANGE mode offsets, whose type depends on the ORDER BY
+	 * column.  Note that in ROWS mode earlier peers of the current row may
+	 * still be in the frame.
+	 */
+	before_current = bound_shrinks &&
+		(frameOptions & (FRAMEOPTION_ROWS | FRAMEOPTION_GROUPS)) &&
+		count_wfunc_offset_matches(offset, true);
+
+	if (frameOptions & FRAMEOPTION_EXCLUDE_CURRENT_ROW)
+	{
+		/*
+		 * For COUNT(*), excluding the current row is always safe: the count
+		 * is the frame size, less one when the current row is within the
+		 * frame.  For the current row to newly enter the frame, the frame
+		 * end must advance past it, growing the frame by at least the row
+		 * that the exclusion removes, so the count never goes down.
+		 *
+		 * For COUNT(any), the current row's argument may be NULL, making
+		 * the count's dependence on the current row vary from row to row.
+		 * That's safe when the current row can never be in the frame, so
+		 * the exclusion never does anything (before_current); or in ROWS
+		 * mode when the frame cannot extend past the current row
+		 * (within_group), where the result is simply the count over the
+		 * rows before the current row.  It is not safe in RANGE or GROUPS
+		 * mode with the frame end at CURRENT ROW: there the frame covers
+		 * the whole peer group, so the count changes with each row's
+		 * argument as the current row moves through the group.
+		 */
+		if (!count_any)
+			return true;
+		if (frameOptions & FRAMEOPTION_ROWS)
+			return within_group;
+		return before_current;
+	}
+	else if (frameOptions & FRAMEOPTION_EXCLUDE_GROUP)
+	{
+		/*
+		 * Excluding the whole peer group is safe as long as the frame end
+		 * cannot pass beyond it: the result is then the count over the rows
+		 * before the peer group (or before the frame end, whichever comes
+		 * first), and both of those bounds only move forwards.  If the
+		 * frame end can pass the peer group, rows beyond the group are
+		 * counted too, and their number can shrink again when the current
+		 * row moves into a larger peer group.
+		 */
+		return within_group;
+	}
+	else
+	{
+		Assert(frameOptions & FRAMEOPTION_EXCLUDE_TIES);
+
+		/*
+		 * EXCLUDE TIES removes the current row's peers, but not the current
+		 * row itself.  For COUNT(*) this is safe under the same condition
+		 * as EXCLUDE GROUP: with the frame end confined to the peer group,
+		 * the count is the number of rows before the peer group, plus one
+		 * if the current row is within the frame.  The latter is the same
+		 * for every row of a peer group, and crossing into the next peer
+		 * group grows the former by the size of the group just left, so
+		 * the count never goes down.
+		 *
+		 * For COUNT(any) the current row stays in the frame with its
+		 * possibly-NULL argument while its earlier peers are excluded, so
+		 * the count can move both ways as the current row moves through a
+		 * peer group.  It's only safe when the current row can never be in
+		 * the frame, making the result the count of frame rows before the
+		 * peer group.
+		 */
+		return count_any ? before_current : within_group;
+	}
+}
+
 /*
  * int8inc_support
  *		prosupport function for int8inc() and int8inc_any()
@@ -793,29 +964,56 @@ int8inc_support(PG_FUNCTION_ARGS)
 	{
 		SupportRequestWFuncMonotonic *req = (SupportRequestWFuncMonotonic *) rawreq;
 		MonotonicFunction monotonic = MONOTONICFUNC_NONE;
-		int			frameOptions = req->window_clause->frameOptions;
+		WindowClause *wc = req->window_clause;
+		int			frameOptions = wc->frameOptions;
+		bool		increasing;
+		bool		decreasing;
 
-		/* No ORDER BY clause then all rows are peers */
-		if (req->window_clause->orderClause == NIL)
-			monotonic = MONOTONICFUNC_BOTH;
-		else
+		/*
+		 * Frame bounds only ever move forwards as the current row advances
+		 * through the partition, so the count is monotonically increasing
+		 * whenever the frame start is pinned to the partition start, and
+		 * monotonically decreasing whenever the frame end is pinned to the
+		 * partition end.
+		 */
+		increasing = (frameOptions & FRAMEOPTION_START_UNBOUNDED_PRECEDING) != 0;
+		decreasing = (frameOptions & FRAMEOPTION_END_UNBOUNDED_FOLLOWING) != 0;
+
+		/*
+		 * When there's no ORDER BY clause, all rows are peers of one
+		 * another, so in RANGE mode every permitted frame bound degenerates
+		 * to a partition edge and the count is the same for every row.
+		 * This does not apply in ROWS mode, where frame bounds count
+		 * individual rows regardless of any peerage; those are handled by
+		 * the frame bound checks above.  (GROUPS mode requires an ORDER BY
+		 * clause.)
+		 */
+		if (wc->orderClause == NIL && frameOptions & FRAMEOPTION_RANGE)
+			increasing = decreasing = true;
+
+		/*
+		 * A frame EXCLUDE clause can break the monotonicity established
+		 * above, since rows excluded from the count for one current row may
+		 * be counted again for a later one, and vice versa.  Each direction
+		 * must be re-checked separately.
+		 */
+		if (frameOptions & FRAMEOPTION_EXCLUSION)
 		{
-			/*
-			 * Otherwise take into account the frame options.  When the frame
-			 * bound is the start of the window then the resulting value can
-			 * never decrease, therefore is monotonically increasing
-			 */
-			if (frameOptions & FRAMEOPTION_START_UNBOUNDED_PRECEDING)
-				monotonic |= MONOTONICFUNC_INCREASING;
+			bool		count_any;
 
-			/*
-			 * Likewise, if the frame bound is the end of the window then the
-			 * resulting value can never decrease.
-			 */
-			if (frameOptions & FRAMEOPTION_END_UNBOUNDED_FOLLOWING)
-				monotonic |= MONOTONICFUNC_DECREASING;
+			count_any = req->window_func->winfnoid == F_COUNT_ANY;
+
+			if (increasing)
+				increasing = count_wfunc_exclusion_ok(wc, count_any, false);
+			if (decreasing)
+				decreasing = count_wfunc_exclusion_ok(wc, count_any, true);
 		}
 
+		if (increasing)
+			monotonic |= MONOTONICFUNC_INCREASING;
+		if (decreasing)
+			monotonic |= MONOTONICFUNC_DECREASING;
+
 		req->monotonic = monotonic;
 		PG_RETURN_POINTER(req);
 	}
diff --git a/src/test/regress/expected/window.out b/src/test/regress/expected/window.out
index 90d9f953b81..a7f689362b4 100644
--- a/src/test/regress/expected/window.out
+++ b/src/test/regress/expected/window.out
@@ -4436,6 +4436,349 @@ WHERE c = 1;
                ->  Seq Scan on empsalary
 (9 rows)
 
+--
+-- Tests for run condition pushdown with EXCLUDE clauses in the frame
+--
+-- Excluding the current row keeps COUNT(*) monotonic with any frame bounds
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) c
+   FROM empsalary) emp
+WHERE c <= 3;
+                                                        QUERY PLAN                                                        
+--------------------------------------------------------------------------------------------------------------------------
+ WindowAgg
+   Window: w1 AS (ORDER BY empsalary.salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW)
+   Run Condition: (count(*) OVER w1 <= 3)
+   ->  Sort
+         Sort Key: empsalary.salary
+         ->  Seq Scan on empsalary
+(6 rows)
+
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND random(1,10) FOLLOWING EXCLUDE CURRENT ROW) c
+   FROM empsalary) emp
+WHERE c <= 3;
+                                                          QUERY PLAN                                                          
+------------------------------------------------------------------------------------------------------------------------------
+ WindowAgg
+   Window: w1 AS (ORDER BY empsalary.salary ROWS BETWEEN UNBOUNDED PRECEDING AND random(1, 10) FOLLOWING EXCLUDE CURRENT ROW)
+   Run Condition: (count(*) OVER w1 <= 3)
+   ->  Sort
+         Sort Key: empsalary.salary
+         ->  Seq Scan on empsalary
+(6 rows)
+
+-- but not COUNT(any), whose argument for the excluded row may be NULL
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) c
+   FROM empsalary) emp
+WHERE c <= 3;
+                                                           QUERY PLAN                                                           
+--------------------------------------------------------------------------------------------------------------------------------
+ Subquery Scan on emp
+   Filter: (emp.c <= 3)
+   ->  WindowAgg
+         Window: w1 AS (ORDER BY empsalary.salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW)
+         ->  Sort
+               Sort Key: empsalary.salary
+               ->  Seq Scan on empsalary
+(7 rows)
+
+-- COUNT(any) with EXCLUDE CURRENT ROW is fine in ROWS mode when the frame
+-- cannot extend past the current row
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW) c
+   FROM empsalary) emp
+WHERE c <= 3;
+                                                    QUERY PLAN                                                    
+------------------------------------------------------------------------------------------------------------------
+ WindowAgg
+   Window: w1 AS (ORDER BY empsalary.salary ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW)
+   Run Condition: (count(empsalary.empno) OVER w1 <= 3)
+   ->  Sort
+         Sort Key: empsalary.salary
+         ->  Seq Scan on empsalary
+(6 rows)
+
+-- but not in RANGE or GROUPS mode, where the frame covers the whole peer
+-- group while the current row moves through it
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ORDER BY salary RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW) c
+   FROM empsalary) emp
+WHERE c <= 3;
+                                                       QUERY PLAN                                                        
+-------------------------------------------------------------------------------------------------------------------------
+ Subquery Scan on emp
+   Filter: (emp.c <= 3)
+   ->  WindowAgg
+         Window: w1 AS (ORDER BY empsalary.salary RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW)
+         ->  Sort
+               Sort Key: empsalary.salary
+               ->  Seq Scan on empsalary
+(7 rows)
+
+-- EXCLUDE GROUP is fine as long as the frame end cannot pass the peer group
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ORDER BY salary GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE GROUP) c
+   FROM empsalary) emp
+WHERE c <= 3;
+                                                  QUERY PLAN                                                  
+--------------------------------------------------------------------------------------------------------------
+ WindowAgg
+   Window: w1 AS (ORDER BY empsalary.salary GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE GROUP)
+   Run Condition: (count(empsalary.empno) OVER w1 <= 3)
+   ->  Sort
+         Sort Key: empsalary.salary
+         ->  Seq Scan on empsalary
+(6 rows)
+
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ORDER BY salary GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING EXCLUDE GROUP) c
+   FROM empsalary) emp
+WHERE c <= 3;
+                                                       QUERY PLAN                                                       
+------------------------------------------------------------------------------------------------------------------------
+ WindowAgg
+   Window: w1 AS (ORDER BY empsalary.salary GROUPS BETWEEN UNBOUNDED PRECEDING AND '1'::bigint PRECEDING EXCLUDE GROUP)
+   Run Condition: (count(*) OVER w1 <= 3)
+   ->  Sort
+         Sort Key: empsalary.salary
+         ->  Seq Scan on empsalary
+(6 rows)
+
+-- with a frame end beyond the peer group, the count is 10 minus the size of
+-- the current row's peer group, which can both rise and fall
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) c
+   FROM empsalary) emp
+WHERE c >= 8;
+                                                        QUERY PLAN                                                        
+--------------------------------------------------------------------------------------------------------------------------
+ Subquery Scan on emp
+   Filter: (emp.c >= 8)
+   ->  WindowAgg
+         Window: w1 AS (ORDER BY empsalary.salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP)
+         ->  Sort
+               Sort Key: empsalary.salary
+               ->  Seq Scan on empsalary
+(7 rows)
+
+-- Check the results are sane without the pushdown
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) c
+   FROM empsalary) emp
+WHERE c >= 8 ORDER BY empno;
+ empno | salary | c 
+-------+--------+---
+     1 |   5000 | 9
+     2 |   3900 | 9
+     3 |   4800 | 8
+     4 |   4800 | 8
+     5 |   3500 | 9
+     7 |   4200 | 9
+     8 |   6000 | 9
+     9 |   4500 | 9
+    10 |   5200 | 8
+    11 |   5200 | 8
+(10 rows)
+
+-- EXCLUDE TIES is like EXCLUDE GROUP for COUNT(*) ...
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE TIES) c
+   FROM empsalary) emp
+WHERE c <= 3;
+                                                     QUERY PLAN                                                      
+---------------------------------------------------------------------------------------------------------------------
+ WindowAgg
+   Window: w1 AS (ORDER BY empsalary.salary ROWS BETWEEN UNBOUNDED PRECEDING AND '0'::bigint PRECEDING EXCLUDE TIES)
+   Run Condition: (count(*) OVER w1 <= 3)
+   ->  Sort
+         Sort Key: empsalary.salary
+         ->  Seq Scan on empsalary
+(6 rows)
+
+-- ... but for COUNT(any) the current row stays in the frame with its
+-- possibly-NULL argument while its earlier peers are excluded, so the frame
+-- may not contain the current row at all
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES) c
+   FROM empsalary) emp
+WHERE c <= 3;
+                                                   QUERY PLAN                                                    
+-----------------------------------------------------------------------------------------------------------------
+ Subquery Scan on emp
+   Filter: (emp.c <= 3)
+   ->  WindowAgg
+         Window: w1 AS (ORDER BY empsalary.salary ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES)
+         ->  Sort
+               Sort Key: empsalary.salary
+               ->  Seq Scan on empsalary
+(7 rows)
+
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ORDER BY salary GROUPS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE TIES) c
+   FROM empsalary) emp
+WHERE c <= 3;
+                                                         QUERY PLAN                                                          
+-----------------------------------------------------------------------------------------------------------------------------
+ Subquery Scan on emp
+   Filter: (emp.c <= 3)
+   ->  WindowAgg
+         Window: w1 AS (ORDER BY empsalary.salary GROUPS BETWEEN UNBOUNDED PRECEDING AND '0'::bigint FOLLOWING EXCLUDE TIES)
+         ->  Sort
+               Sort Key: empsalary.salary
+               ->  Seq Scan on empsalary
+(7 rows)
+
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ORDER BY salary GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING EXCLUDE TIES) c
+   FROM empsalary) emp
+WHERE c <= 3;
+                                                      QUERY PLAN                                                       
+-----------------------------------------------------------------------------------------------------------------------
+ WindowAgg
+   Window: w1 AS (ORDER BY empsalary.salary GROUPS BETWEEN UNBOUNDED PRECEDING AND '1'::bigint PRECEDING EXCLUDE TIES)
+   Run Condition: (count(empsalary.empno) OVER w1 <= 3)
+   ->  Sort
+         Sort Key: empsalary.salary
+         ->  Seq Scan on empsalary
+(6 rows)
+
+-- The monotonically decreasing case must apply the same checks to the frame
+-- start.  The count of rows from the start of each peer group to the end of
+-- the partition never increases ...
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ORDER BY salary GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP) c
+   FROM empsalary) emp
+WHERE c >= 3;
+                                                  QUERY PLAN                                                  
+--------------------------------------------------------------------------------------------------------------
+ WindowAgg
+   Window: w1 AS (ORDER BY empsalary.salary GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP)
+   Run Condition: (count(empsalary.empno) OVER w1 >= 3)
+   ->  Sort
+         Sort Key: empsalary.salary
+         ->  Seq Scan on empsalary
+(6 rows)
+
+-- ... but from an earlier peer group onwards, it can both rise and fall
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ORDER BY salary GROUPS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) c
+   FROM empsalary) emp
+WHERE c >= 3;
+                                                          QUERY PLAN                                                          
+------------------------------------------------------------------------------------------------------------------------------
+ Subquery Scan on emp
+   Filter: (emp.c >= 3)
+   ->  WindowAgg
+         Window: w1 AS (ORDER BY empsalary.salary GROUPS BETWEEN '1'::bigint PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP)
+         ->  Sort
+               Sort Key: empsalary.salary
+               ->  Seq Scan on empsalary
+(7 rows)
+
+--
+-- Frames without an ORDER BY clause.  In RANGE mode all rows are peers, so
+-- the frame always covers the whole partition and the count is constant.
+-- In ROWS mode the frame bounds count rows as usual, so only the frame
+-- bounds determine monotonicity.
+--
+-- Ensure we get a pushdown in ROWS mode when the frame starts at the start
+-- of the partition
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) c
+   FROM empsalary) emp
+WHERE c <= 3;
+                             QUERY PLAN                             
+--------------------------------------------------------------------
+ WindowAgg
+   Window: w1 AS (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+   Run Condition: (count(empsalary.empno) OVER w1 <= 3)
+   ->  Seq Scan on empsalary
+(4 rows)
+
+-- The count here is the row number counted from the end of the partition,
+-- i.e. monotonically decreasing, so ensure we get a pushdown for >=
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) c
+   FROM empsalary) emp
+WHERE c >= 9;
+                             QUERY PLAN                             
+--------------------------------------------------------------------
+ WindowAgg
+   Window: w1 AS (ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
+   Run Condition: (count(*) OVER w1 >= 9)
+   ->  Seq Scan on empsalary
+(4 rows)
+
+-- Ensure no pushdown when neither frame bound is the partition edge; the
+-- count is not monotonic in either direction
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ROWS BETWEEN CURRENT ROW AND CURRENT ROW) c
+   FROM empsalary) emp
+WHERE c <= 3;
+                            QUERY PLAN                            
+------------------------------------------------------------------
+ Subquery Scan on emp
+   Filter: (emp.c <= 3)
+   ->  WindowAgg
+         Window: w1 AS (ROWS BETWEEN CURRENT ROW AND CURRENT ROW)
+         ->  Seq Scan on empsalary
+(5 rows)
+
 -- Test Sort node collapsing
 EXPLAIN (COSTS OFF)
 SELECT * FROM
diff --git a/src/test/regress/sql/window.sql b/src/test/regress/sql/window.sql
index 5ac3a486e16..d79ad51f9db 100644
--- a/src/test/regress/sql/window.sql
+++ b/src/test/regress/sql/window.sql
@@ -1460,6 +1460,184 @@ SELECT * FROM
    FROM empsalary) emp
 WHERE c = 1;
 
+--
+-- Tests for run condition pushdown with EXCLUDE clauses in the frame
+--
+
+-- Excluding the current row keeps COUNT(*) monotonic with any frame bounds
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) c
+   FROM empsalary) emp
+WHERE c <= 3;
+
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND random(1,10) FOLLOWING EXCLUDE CURRENT ROW) c
+   FROM empsalary) emp
+WHERE c <= 3;
+
+-- but not COUNT(any), whose argument for the excluded row may be NULL
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW) c
+   FROM empsalary) emp
+WHERE c <= 3;
+
+-- COUNT(any) with EXCLUDE CURRENT ROW is fine in ROWS mode when the frame
+-- cannot extend past the current row
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW) c
+   FROM empsalary) emp
+WHERE c <= 3;
+
+-- but not in RANGE or GROUPS mode, where the frame covers the whole peer
+-- group while the current row moves through it
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ORDER BY salary RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW) c
+   FROM empsalary) emp
+WHERE c <= 3;
+
+-- EXCLUDE GROUP is fine as long as the frame end cannot pass the peer group
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ORDER BY salary GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE GROUP) c
+   FROM empsalary) emp
+WHERE c <= 3;
+
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ORDER BY salary GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING EXCLUDE GROUP) c
+   FROM empsalary) emp
+WHERE c <= 3;
+
+-- with a frame end beyond the peer group, the count is 10 minus the size of
+-- the current row's peer group, which can both rise and fall
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) c
+   FROM empsalary) emp
+WHERE c >= 8;
+
+-- Check the results are sane without the pushdown
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) c
+   FROM empsalary) emp
+WHERE c >= 8 ORDER BY empno;
+
+-- EXCLUDE TIES is like EXCLUDE GROUP for COUNT(*) ...
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND 0 PRECEDING EXCLUDE TIES) c
+   FROM empsalary) emp
+WHERE c <= 3;
+
+-- ... but for COUNT(any) the current row stays in the frame with its
+-- possibly-NULL argument while its earlier peers are excluded, so the frame
+-- may not contain the current row at all
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES) c
+   FROM empsalary) emp
+WHERE c <= 3;
+
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ORDER BY salary GROUPS BETWEEN UNBOUNDED PRECEDING AND 0 FOLLOWING EXCLUDE TIES) c
+   FROM empsalary) emp
+WHERE c <= 3;
+
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ORDER BY salary GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING EXCLUDE TIES) c
+   FROM empsalary) emp
+WHERE c <= 3;
+
+-- The monotonically decreasing case must apply the same checks to the frame
+-- start.  The count of rows from the start of each peer group to the end of
+-- the partition never increases ...
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ORDER BY salary GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP) c
+   FROM empsalary) emp
+WHERE c >= 3;
+
+-- ... but from an earlier peer group onwards, it can both rise and fall
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ORDER BY salary GROUPS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP) c
+   FROM empsalary) emp
+WHERE c >= 3;
+
+--
+-- Frames without an ORDER BY clause.  In RANGE mode all rows are peers, so
+-- the frame always covers the whole partition and the count is constant.
+-- In ROWS mode the frame bounds count rows as usual, so only the frame
+-- bounds determine monotonicity.
+--
+
+-- Ensure we get a pushdown in ROWS mode when the frame starts at the start
+-- of the partition
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) c
+   FROM empsalary) emp
+WHERE c <= 3;
+
+-- The count here is the row number counted from the end of the partition,
+-- i.e. monotonically decreasing, so ensure we get a pushdown for >=
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(*) OVER (ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) c
+   FROM empsalary) emp
+WHERE c >= 9;
+
+-- Ensure no pushdown when neither frame bound is the partition edge; the
+-- count is not monotonic in either direction
+EXPLAIN (COSTS OFF)
+SELECT * FROM
+  (SELECT empno,
+          salary,
+          count(empno) OVER (ROWS BETWEEN CURRENT ROW AND CURRENT ROW) c
+   FROM empsalary) emp
+WHERE c <= 3;
+
 -- Test Sort node collapsing
 EXPLAIN (COSTS OFF)
 SELECT * FROM
-- 
2.54.0



view thread (15+ messages)  latest in thread

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: [email protected]
  Cc: [email protected], [email protected], [email protected], [email protected], [email protected], [email protected]
  Subject: Re: BUG #19533: Wrong results from WindowAgg run-condition pushdown on count() with EXCLUDE CURRENT ROW
  In-Reply-To: <CANWCAZap+k7-E2f-XoC36Hk4izZjbN8w2c9OuomummGfZ5d20w@mail.gmail.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox