github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/window1.test (about)

     1  # 2018 May 8
     2  #
     3  # The author disclaims copyright to this source code.  In place of
     4  # a legal notice, here is a blessing:
     5  #
     6  #    May you do good and not evil.
     7  #    May you find forgiveness for yourself and forgive others.
     8  #    May you share freely, never taking more than you give.
     9  #
    10  #***********************************************************************
    11  # This file implements regression tests for SQLite library.
    12  #
    13  
    14  set testdir [file dirname $argv0]
    15  source $testdir/tester.tcl
    16  set testprefix window1
    17  
    18  ifcapable !windowfunc {
    19    finish_test
    20    return
    21  }
    22  
    23  do_execsql_test 1.0 {
    24    CREATE TABLE t1(a, b, c, d);
    25    INSERT INTO t1 VALUES(1, 2, 3, 4);
    26    INSERT INTO t1 VALUES(5, 6, 7, 8);
    27    INSERT INTO t1 VALUES(9, 10, 11, 12);
    28  }
    29  
    30  do_execsql_test 1.1 {
    31    SELECT sum(b) OVER () FROM t1
    32  } {18 18 18}
    33  
    34  do_execsql_test 1.2 {
    35    SELECT a, sum(b) OVER () FROM t1
    36  } {1 18 5 18 9 18}
    37  
    38  do_execsql_test 1.3 {
    39    SELECT a, 4 + sum(b) OVER () FROM t1
    40  } {1 22 5 22 9 22}
    41  
    42  do_execsql_test 1.4 {
    43    SELECT a + 4 + sum(b) OVER () FROM t1
    44  } {23 27 31}
    45  
    46  do_execsql_test 1.5 {
    47    SELECT a, sum(b) OVER (PARTITION BY c) FROM t1
    48  } {1 2 5 6 9 10}
    49  
    50  foreach {tn sql} {
    51    1 "SELECT sum(b) OVER () FROM t1"
    52    2 "SELECT sum(b) OVER (PARTITION BY c) FROM t1"
    53    3 "SELECT sum(b) OVER (ORDER BY c) FROM t1"
    54    4 "SELECT sum(b) OVER (PARTITION BY d ORDER BY c) FROM t1"
    55    5 "SELECT sum(b) FILTER (WHERE a>0) OVER (PARTITION BY d ORDER BY c) FROM t1"
    56    6 "SELECT sum(b) OVER (ORDER BY c RANGE UNBOUNDED PRECEDING) FROM t1"
    57    7 "SELECT sum(b) OVER (ORDER BY c ROWS 45 PRECEDING) FROM t1"
    58    8 "SELECT sum(b) OVER (ORDER BY c RANGE CURRENT ROW) FROM t1"
    59    9 "SELECT sum(b) OVER (ORDER BY c RANGE BETWEEN UNBOUNDED PRECEDING 
    60       AND CURRENT ROW) FROM t1"
    61   10 "SELECT sum(b) OVER (ORDER BY c ROWS BETWEEN UNBOUNDED PRECEDING 
    62       AND UNBOUNDED FOLLOWING) FROM t1"
    63  } {
    64    do_test 2.$tn { lindex [catchsql $sql] 0 } 0
    65  }
    66  
    67  foreach {tn sql} {
    68    1 "SELECT * FROM t1 WHERE sum(b) OVER ()"
    69    2 "SELECT * FROM t1 GROUP BY sum(b) OVER ()"
    70    3 "SELECT * FROM t1 GROUP BY a HAVING sum(b) OVER ()"
    71  } {
    72    do_catchsql_test 3.$tn $sql {1 {misuse of window function sum()}}
    73  }
    74  
    75  do_execsql_test 4.0 {
    76    CREATE TABLE t2(a, b, c);
    77    INSERT INTO t2 VALUES(0, 0, 0);
    78    INSERT INTO t2 VALUES(1, 1, 1);
    79    INSERT INTO t2 VALUES(2, 0, 2);
    80    INSERT INTO t2 VALUES(3, 1, 0);
    81    INSERT INTO t2 VALUES(4, 0, 1);
    82    INSERT INTO t2 VALUES(5, 1, 2);
    83    INSERT INTO t2 VALUES(6, 0, 0);
    84  }
    85  
    86  do_execsql_test 4.1 {
    87    SELECT a, sum(a) OVER (PARTITION BY b) FROM t2;
    88  } {
    89    0 12  2 12  4 12  6 12   1  9  3  9  5  9 
    90  }
    91  
    92  do_execsql_test 4.2 {
    93    SELECT a, sum(a) OVER (PARTITION BY b) FROM t2 ORDER BY a;
    94  } {
    95    0 12  1  9  2 12  3  9  4 12  5  9 6 12   
    96  }
    97  
    98  do_execsql_test 4.3 {
    99    SELECT a, sum(a) OVER () FROM t2 ORDER BY a;
   100  } {
   101    0 21  1  21  2 21  3  21  4 21  5  21 6 21   
   102  }
   103  
   104  do_execsql_test 4.4 {
   105    SELECT a, sum(a) OVER (ORDER BY a) FROM t2;
   106  } {
   107    0 0  1 1  2 3  3 6  4 10  5 15  6 21
   108  }
   109  
   110  do_execsql_test 4.5 {
   111    SELECT a, sum(a) OVER (PARTITION BY b ORDER BY a) FROM t2 ORDER BY a
   112  } {
   113    0 0  1 1  2 2  3 4  4 6  5 9  6 12
   114  }
   115  
   116  do_execsql_test 4.6 {
   117    SELECT a, sum(a) OVER (PARTITION BY c ORDER BY a) FROM t2 ORDER BY a
   118  } {
   119    0 0  1 1  2 2  3 3  4 5  5 7  6 9
   120  }
   121  
   122  do_execsql_test 4.7 {
   123    SELECT a, sum(a) OVER (PARTITION BY b ORDER BY a DESC) FROM t2 ORDER BY a
   124  } {
   125    0 12  1 9  2 12  3 8  4 10  5 5  6 6
   126  }
   127  
   128  do_execsql_test 4.8 {
   129    SELECT a, 
   130      sum(a) OVER (PARTITION BY b ORDER BY a DESC),
   131      sum(a) OVER (PARTITION BY c ORDER BY a) 
   132    FROM t2 ORDER BY a
   133  } {
   134    0  12  0
   135    1   9  1 
   136    2  12  2 
   137    3   8  3 
   138    4  10  5 
   139    5   5  7 
   140    6   6  9
   141  }
   142  
   143  do_execsql_test 4.9 {
   144    SELECT a, 
   145      sum(a) OVER (ORDER BY a), 
   146      avg(a) OVER (ORDER BY a) 
   147    FROM t2 ORDER BY a
   148  } {
   149    0  0       0.0
   150    1  1       0.5
   151    2  3       1.0
   152    3  6       1.5
   153    4  10      2.0
   154    5  15      2.5
   155    6  21      3.0
   156  }
   157  
   158  do_execsql_test 4.10.1 {
   159    SELECT a, 
   160      count() OVER (ORDER BY a DESC),
   161      group_concat(a, '.') OVER (ORDER BY a DESC) 
   162    FROM t2 ORDER BY a DESC
   163  } {
   164    6 1 6
   165    5 2 6.5
   166    4 3 6.5.4
   167    3 4 6.5.4.3
   168    2 5 6.5.4.3.2
   169    1 6 6.5.4.3.2.1
   170    0 7 6.5.4.3.2.1.0
   171  }
   172  
   173  do_execsql_test 4.10.2 {
   174    SELECT a, 
   175      count(*) OVER (ORDER BY a DESC),
   176      group_concat(a, '.') OVER (ORDER BY a DESC) 
   177    FROM t2 ORDER BY a DESC
   178  } {
   179    6 1 6
   180    5 2 6.5
   181    4 3 6.5.4
   182    3 4 6.5.4.3
   183    2 5 6.5.4.3.2
   184    1 6 6.5.4.3.2.1
   185    0 7 6.5.4.3.2.1.0
   186  }
   187  
   188  do_catchsql_test 5.1 {
   189    SELECT ntile(0) OVER (ORDER BY a) FROM t2;
   190  } {1 {argument of ntile must be a positive integer}}
   191  do_catchsql_test 5.2 {
   192    SELECT ntile(-1) OVER (ORDER BY a) FROM t2;
   193  } {1 {argument of ntile must be a positive integer}}
   194  do_catchsql_test 5.3 {
   195    SELECT ntile('zbc') OVER (ORDER BY a) FROM t2;
   196  } {1 {argument of ntile must be a positive integer}}
   197  do_execsql_test 5.4 {
   198    CREATE TABLE t4(a, b);
   199    SELECT ntile(1) OVER (ORDER BY a) FROM t4;
   200  } {}
   201  
   202  #-------------------------------------------------------------------------
   203  reset_db
   204  do_execsql_test 6.1 {
   205    CREATE TABLE t1(x);
   206    INSERT INTO t1 VALUES(7), (6), (5), (4), (3), (2), (1);
   207  
   208    CREATE TABLE t2(x);
   209    INSERT INTO t2 VALUES('b'), ('a');
   210  
   211    SELECT x, count(*) OVER (ORDER BY x) FROM t1;
   212  } {1 1 2 2 3 3 4 4 5 5 6 6 7 7}
   213  
   214  do_execsql_test 6.2 {
   215    SELECT * FROM t2, (SELECT x, count(*) OVER (ORDER BY x) FROM t1);
   216  } {
   217    b 1 1 b 2 2 b 3 3 b 4 4 b 5 5 b 6 6 b 7 7
   218    a 1 1 a 2 2 a 3 3 a 4 4 a 5 5 a 6 6 a 7 7
   219  }
   220  
   221  do_catchsql_test 6.3 {
   222    SELECT x, lag(x) FILTER (WHERE (x%2)=0) OVER w FROM t1 
   223    WINDOW w AS (ORDER BY x)
   224  } {1 {FILTER clause may only be used with aggregate window functions}}
   225   
   226  #-------------------------------------------------------------------------
   227  # Attempt to use a window function as an aggregate. And other errors.
   228  #
   229  reset_db
   230  do_execsql_test 7.0 {
   231    CREATE TABLE t1(x, y);
   232    INSERT INTO t1 VALUES(1, 2);
   233    INSERT INTO t1 VALUES(3, 4);
   234    INSERT INTO t1 VALUES(5, 6);
   235    INSERT INTO t1 VALUES(7, 8);
   236    INSERT INTO t1 VALUES(9, 10);
   237  }
   238  
   239  do_catchsql_test 7.1.1 {
   240    SELECT nth_value(x, 1) FROM t1;
   241  } {1 {misuse of window function nth_value()}}
   242  do_catchsql_test 7.1.2 {
   243    SELECT * FROM t1 WHERE nth_value(x, 1) OVER (ORDER BY y);
   244  } {1 {misuse of window function nth_value()}}
   245  do_catchsql_test 7.1.3 {
   246    SELECT count(*) FROM t1 GROUP BY y HAVING nth_value(x, 1) OVER (ORDER BY y);
   247  } {1 {misuse of window function nth_value()}}
   248  do_catchsql_test 7.1.4 {
   249    SELECT count(*) FROM t1 GROUP BY nth_value(x, 1) OVER (ORDER BY y);
   250  } {1 {misuse of window function nth_value()}}
   251  do_catchsql_test 7.1.5 {
   252    SELECT count(*) FROM t1 LIMIT nth_value(x, 1) OVER ();
   253  } {1 {no such column: x}}
   254  do_catchsql_test 7.1.6 {
   255    SELECT trim(x) OVER (ORDER BY y) FROM t1;
   256  } {1 {trim() may not be used as a window function}}
   257  do_catchsql_test 7.1.7 {
   258    SELECT max(x) OVER abc FROM t1 WINDOW def AS (ORDER BY y);
   259  } {1 {no such window: abc}}
   260  do_catchsql_test 7.1.8 {
   261    SELECT row_number(x) OVER () FROM t1
   262  } {1 {wrong number of arguments to function row_number()}}
   263  
   264  do_execsql_test 7.2 {
   265    SELECT 
   266      lead(y) OVER win, 
   267      lead(y, 2) OVER win, 
   268      lead(y, 3, 'default') OVER win
   269    FROM t1
   270    WINDOW win AS (ORDER BY x)
   271  } {
   272    4 6 8   6 8 10   8 10 default   10 {} default   {} {} default
   273  }
   274  
   275  do_execsql_test 7.3 {
   276    SELECT row_number() OVER (ORDER BY x) FROM t1
   277  } {1 2 3 4 5}
   278  
   279  do_execsql_test 7.4 {
   280    SELECT 
   281      row_number() OVER win,
   282      lead(x) OVER win
   283    FROM t1
   284    WINDOW win AS (ORDER BY x ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
   285  } {1 3  2 5  3 7  4 9   5 {}}
   286  
   287  #-------------------------------------------------------------------------
   288  # Attempt to use a window function in a view.
   289  #
   290  do_execsql_test 8.0 {
   291    CREATE TABLE t3(a, b, c);
   292  
   293    WITH s(i) AS ( VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<6 )
   294    INSERT INTO t3 SELECT i, i, i FROM s;
   295  
   296    CREATE VIEW v1 AS SELECT
   297      sum(b) OVER (ORDER BY c),
   298      min(b) OVER (ORDER BY c),
   299      max(b) OVER (ORDER BY c)
   300    FROM t3;
   301  
   302    CREATE VIEW v2 AS SELECT
   303      sum(b) OVER win,
   304      min(b) OVER win,
   305      max(b) OVER win
   306    FROM t3
   307    WINDOW win AS (ORDER BY c);
   308  }
   309  
   310  do_execsql_test 8.1.1 {
   311    SELECT * FROM v1
   312  } {1 1 1  3 1 2  6 1 3  10 1 4  15 1 5  21 1 6}
   313  do_execsql_test 8.1.2 {
   314    SELECT * FROM v2
   315  } {1 1 1  3 1 2  6 1 3  10 1 4  15 1 5  21 1 6}
   316  
   317  db close
   318  sqlite3 db test.db
   319  do_execsql_test 8.2.1 {
   320    SELECT * FROM v1
   321  } {1 1 1  3 1 2  6 1 3  10 1 4  15 1 5  21 1 6}
   322  do_execsql_test 8.2.2 {
   323    SELECT * FROM v2
   324  } {1 1 1  3 1 2  6 1 3  10 1 4  15 1 5  21 1 6}
   325  
   326  #-------------------------------------------------------------------------
   327  # Attempt to use a window function in a trigger.
   328  #
   329  do_execsql_test 9.0 {
   330    CREATE TABLE t4(x, y);
   331    INSERT INTO t4 VALUES(1, 'g');
   332    INSERT INTO t4 VALUES(2, 'i');
   333    INSERT INTO t4 VALUES(3, 'l');
   334    INSERT INTO t4 VALUES(4, 'g');
   335    INSERT INTO t4 VALUES(5, 'a');
   336  
   337    CREATE TABLE t5(x, y, m);
   338    CREATE TRIGGER t4i AFTER INSERT ON t4 BEGIN
   339      DELETE FROM t5;
   340      INSERT INTO t5 
   341        SELECT x, y, max(y) OVER xyz FROM t4
   342        WINDOW xyz AS (PARTITION BY (x%2) ORDER BY x);
   343    END;
   344  }
   345  
   346  do_execsql_test 9.1.1 {
   347    SELECT x, y, max(y) OVER xyz FROM t4
   348        WINDOW xyz AS (PARTITION BY (x%2) ORDER BY x) ORDER BY 1
   349  } {1 g g   2 i i   3 l l   4 g i   5 a l}
   350  
   351  do_execsql_test 9.1.2 {
   352    INSERT INTO t4 VALUES(6, 'm');
   353    SELECT x, y, max(y) OVER xyz FROM t4
   354        WINDOW xyz AS (PARTITION BY (x%2) ORDER BY x) ORDER BY 1
   355  } {1 g g   2 i i   3 l l   4 g i   5 a l   6 m m}
   356  
   357  do_execsql_test 9.1.3 {
   358    SELECT * FROM t5 ORDER BY 1
   359  } {1 g g   2 i i   3 l l   4 g i   5 a l   6 m m}
   360  
   361  do_execsql_test 9.2 {
   362    WITH aaa(x, y, z) AS (
   363      SELECT x, y, max(y) OVER xyz FROM t4
   364      WINDOW xyz AS (PARTITION BY (x%2) ORDER BY x)
   365    )
   366    SELECT * FROM aaa ORDER BY 1;
   367  } {1 g g   2 i i   3 l l   4 g i   5 a l   6 m m}
   368  
   369  do_execsql_test 9.3 {
   370    WITH aaa(x, y, z) AS (
   371      SELECT x, y, max(y) OVER xyz FROM t4
   372      WINDOW xyz AS (ORDER BY x)
   373    )
   374    SELECT *, min(z) OVER (ORDER BY x) FROM aaa ORDER BY 1;
   375  } {1 g g g   2 i i g   3 l l g   4 g l g   5 a l g   6 m m g}
   376  
   377  do_catchsql_test 9.4 {
   378    -- 2021-04-17 dbsqlfuzz d9cf66100064952b66951845dfab41de1c124611
   379    DROP TABLE IF EXISTS t1;
   380    CREATE TABLE t1(a,b,c,d);
   381    DROP TABLE IF EXISTS t2;
   382    CREATE TABLE t2(x,y);
   383    CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN
   384      INSERT INTO t2(x,y)
   385        SELECT a, max(d) OVER w1 FROM t1
   386          WINDOW w1 AS (PARTITION BY EXISTS(SELECT 1 FROM t1 WHERE c=?1) );
   387    END;
   388  } {1 {trigger cannot use variables}}
   389  
   390  do_catchsql_test 9.4.2 {
   391    CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN
   392      INSERT INTO t1(a,b) 
   393          SELECT a, max(d) OVER w1 FROM t1
   394          WINDOW w1 AS (
   395            ORDER BY a ROWS BETWEEN ? PRECEDING AND UNBOUNDED FOLLOWING
   396          );
   397    END;
   398  } {1 {trigger cannot use variables}}
   399  do_catchsql_test 9.4.3 {
   400    CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN
   401      INSERT INTO t1(a,b) 
   402          SELECT a, max(d) OVER w1 FROM t1
   403          WINDOW w1 AS (
   404            ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND ? FOLLOWING
   405          );
   406    END;
   407  } {1 {trigger cannot use variables}}
   408  
   409  #-------------------------------------------------------------------------
   410  #
   411  do_execsql_test 10.0 {
   412    CREATE TABLE sales(emp TEXT PRIMARY KEY, region, total);
   413    INSERT INTO sales VALUES
   414        ('Alice',     'North', 34),
   415        ('Frank',     'South', 22),
   416        ('Charles',   'North', 45),
   417        ('Darrell',   'South', 8),
   418        ('Grant',     'South', 23),
   419        ('Brad' ,     'North', 22),
   420        ('Elizabeth', 'South', 99),
   421        ('Horace',    'East',   1);
   422  }
   423  
   424  # Best two salespeople from each region
   425  #
   426  do_execsql_test 10.1 {
   427    SELECT emp, region, total FROM (
   428      SELECT 
   429        emp, region, total,
   430        row_number() OVER (PARTITION BY region ORDER BY total DESC) AS rank
   431      FROM sales
   432    ) WHERE rank<=2 ORDER BY region, total DESC
   433  } {
   434    Horace      East     1
   435    Charles     North   45
   436    Alice       North   34
   437    Elizabeth   South   99
   438    Grant       South   23
   439  }
   440  
   441  do_execsql_test 10.2 {
   442    SELECT emp, region, sum(total) OVER win FROM sales
   443    WINDOW win AS (PARTITION BY region ORDER BY total)
   444  } {
   445    Horace East       1  
   446    Brad North       22 
   447    Alice North      56 
   448    Charles North   101 
   449    Darrell South     8 
   450    Frank South      30 
   451    Grant South      53 
   452    Elizabeth South 152
   453  }
   454  
   455  do_execsql_test 10.3 {
   456    SELECT emp, region, sum(total) OVER win FROM sales
   457    WINDOW win AS (PARTITION BY region ORDER BY total)
   458    LIMIT 5
   459  } {
   460    Horace East       1  
   461    Brad North       22 
   462    Alice North      56 
   463    Charles North   101 
   464    Darrell South     8 
   465  }
   466  
   467  do_execsql_test 10.4 {
   468    SELECT emp, region, sum(total) OVER win FROM sales
   469    WINDOW win AS (PARTITION BY region ORDER BY total)
   470    LIMIT 5 OFFSET 2
   471  } {
   472    Alice North      56 
   473    Charles North   101 
   474    Darrell South     8 
   475    Frank South      30 
   476    Grant South      53 
   477  }
   478  
   479  do_execsql_test 10.5 {
   480    SELECT emp, region, sum(total) OVER win FROM sales
   481    WINDOW win AS (
   482      PARTITION BY region ORDER BY total 
   483      ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
   484    )
   485  } {
   486    Horace East       1  
   487    Brad North      101
   488    Alice North      79 
   489    Charles North    45 
   490    Darrell South   152
   491    Frank South     144 
   492    Grant South     122 
   493    Elizabeth South  99
   494  }
   495  
   496  do_execsql_test 10.6 {
   497    SELECT emp, region, sum(total) OVER win FROM sales
   498    WINDOW win AS (
   499      PARTITION BY region ORDER BY total 
   500      ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
   501    ) LIMIT 5 OFFSET 2
   502  } {
   503    Alice North      79 
   504    Charles North    45 
   505    Darrell South   152
   506    Frank South     144 
   507    Grant South     122 
   508  }
   509  
   510  do_execsql_test 10.7 {
   511    SELECT emp, region, (
   512      SELECT sum(total) OVER (
   513        ORDER BY total RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
   514      ) || outer.emp FROM sales
   515    ) FROM sales AS outer;
   516  } {
   517    Alice North 254Alice 
   518    Frank South 254Frank 
   519    Charles North 254Charles 
   520    Darrell South 254Darrell 
   521    Grant South 254Grant 
   522    Brad North 254Brad 
   523    Elizabeth South 254Elizabeth 
   524    Horace East 254Horace
   525  }
   526  
   527  do_execsql_test 10.8 {
   528    SELECT emp, region, (
   529      SELECT sum(total) FILTER (WHERE sales.emp!=outer.emp) OVER (
   530        ORDER BY total RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
   531      ) FROM sales
   532    ) FROM sales AS outer;
   533  } {
   534    Alice North 220 
   535    Frank South 232 
   536    Charles North 209 
   537    Darrell South 246
   538    Grant South 231 
   539    Brad North 232 
   540    Elizabeth South 155 
   541    Horace East 253
   542  }
   543  
   544  #-------------------------------------------------------------------------
   545  # Check that it is not possible to use a window function in a CREATE INDEX
   546  # statement.
   547  #
   548  do_execsql_test 11.0 { CREATE TABLE t6(a, b, c); }
   549  
   550  do_catchsql_test 11.1 {
   551    CREATE INDEX t6i ON t6(a) WHERE sum(b) OVER ();
   552  } {1 {misuse of window function sum()}}
   553  do_catchsql_test 11.2 {
   554    CREATE INDEX t6i ON t6(a) WHERE lead(b) OVER ();
   555  } {1 {misuse of window function lead()}}
   556  
   557  do_catchsql_test 11.3 {
   558    CREATE INDEX t6i ON t6(sum(b) OVER ());
   559  } {1 {misuse of window function sum()}}
   560  do_catchsql_test 11.4 {
   561    CREATE INDEX t6i ON t6(lead(b) OVER ());
   562  } {1 {misuse of window function lead()}}
   563  
   564  # 2018-09-17 ticket 510cde277783b5fb5de628393959849dff377eb3
   565  # Endless loop on a query with window functions and a limit
   566  #
   567  do_execsql_test 12.100 {
   568    DROP TABLE IF EXISTS t1;
   569    CREATE TABLE t1(id INT, b VARCHAR, c VARCHAR);
   570    INSERT INTO t1 VALUES(1, 'A', 'one');
   571    INSERT INTO t1 VALUES(2, 'B', 'two');
   572    INSERT INTO t1 VALUES(3, 'C', 'three');
   573    INSERT INTO t1 VALUES(4, 'D', 'one');
   574    INSERT INTO t1 VALUES(5, 'E', 'two');
   575    SELECT id, b, lead(c,1) OVER(ORDER BY c) AS x 
   576      FROM t1 WHERE id>1
   577     ORDER BY b LIMIT 1;
   578  } {2 B two}
   579  do_execsql_test 12.110 {
   580    INSERT INTO t1 VALUES(6, 'F', 'three');
   581    INSERT INTO t1 VALUES(7, 'G', 'one');
   582    SELECT id, b, lead(c,1) OVER(ORDER BY c) AS x
   583      FROM t1 WHERE id>1
   584     ORDER BY b LIMIT 2;
   585  } {2 B two 3 C three}
   586  
   587  #-------------------------------------------------------------------------
   588  
   589  do_execsql_test 13.1 {
   590    DROP TABLE IF EXISTS t1;
   591    CREATE TABLE t1(a int, b int);
   592    INSERT INTO t1 VALUES(1,11);
   593    INSERT INTO t1 VALUES(2,12);
   594  }
   595  
   596  do_execsql_test 13.2.1 {
   597    SELECT a, rank() OVER(ORDER BY b) FROM t1;
   598    SELECT a, rank() OVER(ORDER BY b DESC) FROM t1;
   599  } {
   600    1 1   2 2   2 1   1 2
   601  }
   602  do_execsql_test 13.2.2 {
   603    SELECT a, rank() OVER(ORDER BY b) FROM t1
   604      UNION ALL
   605    SELECT a, rank() OVER(ORDER BY b DESC) FROM t1;
   606  } {
   607    1 1   2 2   2 1   1 2
   608  }
   609  do_execsql_test 13.3 {
   610    SELECT a, rank() OVER(ORDER BY b) FROM t1
   611      UNION 
   612    SELECT a, rank() OVER(ORDER BY b DESC) FROM t1;
   613  } {
   614    1 1   1 2   2 1   2 2  
   615  }
   616  
   617  do_execsql_test 13.4 {
   618    SELECT a, rank() OVER(ORDER BY b) FROM t1
   619      EXCEPT 
   620    SELECT a, rank() OVER(ORDER BY b DESC) FROM t1;
   621  } {
   622    1 1   2 2 
   623  }
   624  
   625  do_execsql_test 13.5 {
   626    SELECT a, rank() OVER(ORDER BY b) FROM t1
   627      INTERSECT 
   628    SELECT a, rank() OVER(ORDER BY b DESC) FROM t1;
   629  } {}
   630  
   631  # 2018-12-06
   632  # https://www.sqlite.org/src/info/f09fcd17810f65f7
   633  # Assertion fault when window functions are used.
   634  #
   635  # Root cause is the query flattener invoking sqlite3ExprDup() on
   636  # expressions that contain subqueries with window functions.  The
   637  # sqlite3ExprDup() routine is not making correctly initializing
   638  # Select.pWin field of the subqueries.
   639  #
   640  sqlite3 db :memory:
   641  do_execsql_test 14.0 {
   642    SELECT * FROM(
   643      SELECT * FROM (SELECT 1 AS c) WHERE c IN (
   644          SELECT (row_number() OVER()) FROM (VALUES (0))
   645      )
   646    );
   647  } {1}
   648  do_execsql_test 14.1 {
   649    CREATE TABLE t1(x); INSERT INTO t1(x) VALUES(12345);
   650    CREATE TABLE t2(c); INSERT INTO t2(c) VALUES(1);
   651    SELECT y, y+1, y+2 FROM (
   652      SELECT c IN (
   653        SELECT (row_number() OVER()) FROM t1
   654      ) AS y FROM t2
   655    );
   656  } {1 2 3}
   657  
   658  # 2018-12-31
   659  # https://www.sqlite.org/src/info/d0866b26f83e9c55
   660  # Window function in correlated subquery causes assertion fault 
   661  #
   662  do_catchsql_test 15.0 {
   663    WITH t(id, parent) AS (
   664    SELECT CAST(1 AS INT), CAST(NULL AS INT)
   665    UNION ALL
   666    SELECT 2, NULL
   667    UNION ALL
   668    SELECT 3, 1
   669    UNION ALL
   670    SELECT 4, 1
   671    UNION ALL
   672    SELECT 5, 2
   673    UNION ALL
   674    SELECT 6, 2
   675    ), q AS (
   676    SELECT t.*, ROW_NUMBER() OVER (ORDER BY t.id) AS rn
   677      FROM t
   678     WHERE parent IS NULL
   679     UNION ALL
   680    SELECT t.*, ROW_NUMBER() OVER (ORDER BY t.id) AS rn
   681      FROM q
   682      JOIN t
   683        ON t.parent = q.id
   684    )
   685    SELECT *
   686      FROM q;
   687  } {1 {cannot use window functions in recursive queries}}
   688  do_execsql_test 15.1 {
   689    DROP TABLE IF EXISTS t1;
   690    DROP TABLE IF EXISTS t2;
   691    CREATE TABLE t1(x);
   692    INSERT INTO t1 VALUES('a'), ('b'), ('c');
   693    CREATE TABLE t2(a, b);
   694    INSERT INTO t2 VALUES('X', 1), ('X', 2), ('Y', 2), ('Y', 3);
   695    SELECT x, (
   696      SELECT sum(b)
   697        OVER (PARTITION BY a ROWS BETWEEN UNBOUNDED PRECEDING
   698                                      AND UNBOUNDED FOLLOWING)
   699      FROM t2 WHERE b<x
   700    ) FROM t1;
   701  } {a 3 b 3 c 3}
   702  
   703  do_execsql_test 15.2 {
   704    SELECT(
   705      WITH c AS(
   706        VALUES(1)
   707      ) SELECT '' FROM c,c
   708    ) x WHERE x+x;
   709  } {}
   710  
   711  #-------------------------------------------------------------------------
   712  
   713  do_execsql_test 16.0 {
   714    CREATE TABLE t7(a,b); 
   715    INSERT INTO t7(rowid, a, b) VALUES
   716        (1, 1, 3),
   717        (2, 10, 4),
   718        (3, 100, 2);
   719  }
   720  
   721  do_execsql_test 16.1 {
   722    SELECT rowid, sum(a) OVER (PARTITION BY b IN (SELECT rowid FROM t7)) FROM t7;
   723  } {
   724    2 10
   725    1 101
   726    3 101
   727  }
   728  
   729  do_execsql_test 16.2 {
   730    SELECT rowid, sum(a) OVER w1 FROM t7 
   731    WINDOW w1 AS (PARTITION BY b IN (SELECT rowid FROM t7));
   732  } {
   733    2 10
   734    1 101
   735    3 101
   736  }
   737  
   738  #-------------------------------------------------------------------------
   739  do_execsql_test 17.0 {
   740    CREATE TABLE t8(a);
   741    INSERT INTO t8 VALUES(1), (2), (3);
   742  }
   743  
   744  do_execsql_test 17.1 {
   745    SELECT +sum(0) OVER () ORDER BY +sum(0) OVER ();
   746  } {0}
   747  
   748  do_execsql_test 17.2 {
   749    select +sum(a) OVER () FROM t8 ORDER BY +sum(a) OVER () DESC;
   750  } {6 6 6}
   751  
   752  do_execsql_test 17.3 {
   753    SELECT 10+sum(a) OVER (ORDER BY a) 
   754    FROM t8 
   755    ORDER BY 10+sum(a) OVER (ORDER BY a) DESC;
   756  } {16 13 11}
   757  
   758  
   759  #-------------------------------------------------------------------------
   760  # Test error cases from chaining window definitions.
   761  #
   762  reset_db
   763  do_execsql_test 18.0 {
   764    DROP TABLE IF EXISTS t1;
   765    CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT, c TEXT, d INTEGER);
   766    INSERT INTO t1 VALUES(1, 'odd',  'one',   1);
   767    INSERT INTO t1 VALUES(2, 'even', 'two',   2);
   768    INSERT INTO t1 VALUES(3, 'odd',  'three', 3);
   769    INSERT INTO t1 VALUES(4, 'even', 'four',  4);
   770    INSERT INTO t1 VALUES(5, 'odd',  'five',  5);
   771    INSERT INTO t1 VALUES(6, 'even', 'six',   6);
   772  }
   773  
   774  foreach {tn sql error} {
   775    1 {
   776      SELECT c, sum(d) OVER win2 FROM t1
   777        WINDOW win1 AS (ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING), 
   778               win2 AS (win1 ORDER BY b)
   779    } {cannot override frame specification of window: win1}
   780  
   781    2 {
   782      SELECT c, sum(d) OVER win2 FROM t1
   783        WINDOW win1 AS (),
   784               win2 AS (win4 ORDER BY b)
   785    } {no such window: win4}
   786  
   787    3 {
   788      SELECT c, sum(d) OVER win2 FROM t1
   789        WINDOW win1 AS (),
   790               win2 AS (win1 PARTITION BY d)
   791    } {cannot override PARTITION clause of window: win1}
   792  
   793    4 {
   794      SELECT c, sum(d) OVER win2 FROM t1
   795        WINDOW win1 AS (ORDER BY b),
   796               win2 AS (win1 ORDER BY d)
   797    } {cannot override ORDER BY clause of window: win1}
   798  } {
   799    do_catchsql_test 18.1.$tn $sql [list 1 $error]
   800  }
   801  
   802  foreach {tn sql error} {
   803    1 {
   804      SELECT c, sum(d) OVER (win1 ORDER BY b) FROM t1
   805        WINDOW win1 AS (ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
   806    } {cannot override frame specification of window: win1}
   807  
   808    2 {
   809      SELECT c, sum(d) OVER (win4 ORDER BY b) FROM t1
   810        WINDOW win1 AS ()
   811    } {no such window: win4}
   812  
   813    3 {
   814      SELECT c, sum(d) OVER (win1 PARTITION BY d) FROM t1
   815        WINDOW win1 AS ()
   816    } {cannot override PARTITION clause of window: win1}
   817  
   818    4 {
   819      SELECT c, sum(d) OVER (win1 ORDER BY d) FROM t1
   820        WINDOW win1 AS (ORDER BY b)
   821    } {cannot override ORDER BY clause of window: win1}
   822  } {
   823    do_catchsql_test 18.2.$tn $sql [list 1 $error]
   824  }
   825  
   826  do_execsql_test 18.3.1 {
   827    SELECT group_concat(c, '.') OVER (PARTITION BY b ORDER BY c)
   828    FROM t1
   829  } {four four.six four.six.two five five.one five.one.three}
   830  
   831  do_execsql_test 18.3.2 {
   832    SELECT group_concat(c, '.') OVER (win1 ORDER BY c)
   833    FROM t1
   834    WINDOW win1 AS (PARTITION BY b)
   835  } {four four.six four.six.two five five.one five.one.three}
   836  
   837  do_execsql_test 18.3.3 {
   838    SELECT group_concat(c, '.') OVER win2
   839    FROM t1
   840    WINDOW win1 AS (PARTITION BY b),
   841           win2 AS (win1 ORDER BY c)
   842  } {four four.six four.six.two five five.one five.one.three}
   843  
   844  do_execsql_test 18.3.4 {
   845    SELECT group_concat(c, '.') OVER (win2)
   846    FROM t1
   847    WINDOW win1 AS (PARTITION BY b),
   848           win2 AS (win1 ORDER BY c)
   849  } {four four.six four.six.two five five.one five.one.three}
   850  
   851  do_execsql_test 18.3.5 {
   852    SELECT group_concat(c, '.') OVER win5
   853    FROM t1
   854    WINDOW win1 AS (PARTITION BY b),
   855           win2 AS (win1),
   856           win3 AS (win2),
   857           win4 AS (win3),
   858           win5 AS (win4 ORDER BY c)
   859  } {four four.six four.six.two five five.one five.one.three}
   860  
   861  #-------------------------------------------------------------------------
   862  # Test RANGE <expr> PRECEDING/FOLLOWING when there are string, blob
   863  # and NULL values in the dataset.
   864  #
   865  reset_db
   866  do_execsql_test 19.0 {
   867    CREATE TABLE t1(a, b);
   868    INSERT INTO t1 VALUES
   869      (1, 1), (2, 2), (3, 3), (4, 4), (5, 5),
   870      ('a', 6), ('b', 7), ('c', 8), ('d', 9), ('e', 10);
   871  }
   872  do_execsql_test 19.1 {
   873    SELECT a, sum(b) OVER (ORDER BY a) FROM t1;
   874  } {1 1  2 3  3 6  4 10  5 15  a 21 b 28 c 36 d 45 e 55}
   875  
   876  do_execsql_test 19.2.1 {
   877    SELECT a, sum(b) OVER (
   878      ORDER BY a RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING
   879    ) FROM t1;
   880  } {1 3 2 6 3 9 4 12 5 9 a 6 b 7 c 8 d 9 e 10}
   881  do_execsql_test 19.2.2 {
   882    SELECT a, sum(b) OVER (
   883      ORDER BY a DESC RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING
   884    ) FROM t1 ORDER BY a ASC;
   885  } {1 3 2 6 3 9 4 12 5 9 a 6 b 7 c 8 d 9 e 10}
   886  
   887  do_execsql_test 19.3.1 {
   888    SELECT a, sum(b) OVER (
   889      ORDER BY a RANGE BETWEEN 2 PRECEDING AND 1 FOLLOWING
   890    ) FROM t1;
   891  } {1 3 2 6 3 10 4 14 5 12 a 6 b 7 c 8 d 9 e 10}
   892  do_execsql_test 19.3.2 {
   893    SELECT a, sum(b) OVER (
   894      ORDER BY a DESC RANGE BETWEEN 1 PRECEDING AND 2 FOLLOWING
   895    ) FROM t1 ORDER BY a ASC;
   896  } {1 3 2 6 3 10 4 14 5 12 a 6 b 7 c 8 d 9 e 10}
   897  
   898  
   899  reset_db
   900  do_execsql_test 20.0 {
   901    CREATE TABLE t1(a, b);
   902    INSERT INTO t1 VALUES
   903      (NULL, 100), (NULL, 100), 
   904      (1, 1), (2, 2), (3, 3), (4, 4), (5, 5),
   905      ('a', 6), ('b', 7), ('c', 8), ('d', 9), ('e', 10);
   906  }
   907  do_execsql_test 20.1 {
   908    SELECT a, sum(b) OVER (ORDER BY a) FROM t1;
   909  } {
   910    {} 200 {} 200 1 201  2 203  3 206  4 210  5 215  
   911    a 221 b 228 c 236 d 245 e 255
   912  }
   913  
   914  do_execsql_test 20.2.1 {
   915    SELECT a, sum(b) OVER (
   916      ORDER BY a RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING
   917    ) FROM t1;
   918  } {{} 200 {} 200 1 3 2 6 3 9 4 12 5 9 a 6 b 7 c 8 d 9 e 10}
   919  do_execsql_test 20.2.2 {
   920    SELECT a, sum(b) OVER (
   921      ORDER BY a DESC RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING
   922    ) FROM t1 ORDER BY a ASC;
   923  } {{} 200 {} 200 1 3 2 6 3 9 4 12 5 9 a 6 b 7 c 8 d 9 e 10}
   924  
   925  do_execsql_test 20.3.1 {
   926    SELECT a, sum(b) OVER (
   927      ORDER BY a RANGE BETWEEN 2 PRECEDING AND 1 FOLLOWING
   928    ) FROM t1;
   929  } {{} 200 {} 200 1 3 2 6 3 10 4 14 5 12 a 6 b 7 c 8 d 9 e 10}
   930  do_execsql_test 20.3.2 {
   931    SELECT a, sum(b) OVER (
   932      ORDER BY a DESC RANGE BETWEEN 1 PRECEDING AND 2 FOLLOWING
   933    ) FROM t1 ORDER BY a ASC;
   934  } {{} 200 {} 200 1 3 2 6 3 10 4 14 5 12 a 6 b 7 c 8 d 9 e 10}
   935  
   936  #-------------------------------------------------------------------------
   937  do_execsql_test 21.0 {
   938    CREATE TABLE keyword_tab(
   939      current, exclude, filter, following, groups, no, others, over,
   940      partition, preceding, range, ties, unbounded, window
   941    );
   942  }
   943  do_execsql_test 21.1 {
   944    SELECT
   945      current, exclude, filter, following, groups, no, others, over,
   946      partition, preceding, range, ties, unbounded, window
   947    FROM keyword_tab
   948  }
   949  
   950  #-------------------------------------------------------------------------
   951  foreach {tn expr err} {
   952    1   4.5      0
   953    2   NULL     1
   954    3   0.0      0
   955    4   0.1      0
   956    5  -0.1      1
   957    6  ''        1
   958    7  '2.0'     0
   959    8  '2.0x'    1
   960    9  x'1234'   1
   961   10  '1.2'     0
   962  } {
   963    set res {0 1}
   964    if {$err} {set res {1 {frame starting offset must be a non-negative number}} }
   965    do_catchsql_test 22.$tn.1 "
   966      WITH a(x, y) AS ( VALUES(1, 2) )
   967      SELECT sum(x) OVER (
   968        ORDER BY y RANGE BETWEEN $expr PRECEDING AND UNBOUNDED FOLLOWING
   969      ) FROM a
   970    " $res
   971  
   972    set res {0 1}
   973    if {$err} {set res {1 {frame ending offset must be a non-negative number}} }
   974    do_catchsql_test 22.$tn.2 "
   975      WITH a(x, y) AS ( VALUES(1, 2) )
   976      SELECT sum(x) OVER (
   977        ORDER BY y RANGE BETWEEN UNBOUNDED PRECEDING AND $expr FOLLOWING
   978      ) FROM a
   979    " $res
   980  }
   981  
   982  #-------------------------------------------------------------------------
   983  reset_db
   984  do_execsql_test 23.0 {
   985    CREATE TABLE t5(a, b, c);
   986    CREATE INDEX t5ab ON t5(a, b);
   987  }
   988  
   989  proc do_ordercount_test {tn sql nOrderBy} {
   990    set plan [execsql "EXPLAIN QUERY PLAN $sql"]
   991    uplevel [list do_test $tn [list regexp -all ORDER $plan] $nOrderBy]
   992  }
   993  
   994  do_ordercount_test 23.1 {
   995    SELECT 
   996      sum(c) OVER (ORDER BY a, b),
   997      sum(c) OVER (PARTITION BY a ORDER BY b)
   998    FROM t5
   999  } 0
  1000  
  1001  do_ordercount_test 23.2 {
  1002    SELECT 
  1003      sum(c) OVER (ORDER BY b, a),
  1004      sum(c) OVER (PARTITION BY b ORDER BY a)
  1005    FROM t5
  1006  } 1
  1007  
  1008  do_ordercount_test 23.3 {
  1009    SELECT 
  1010      sum(c) OVER (ORDER BY b, a),
  1011      sum(c) OVER (ORDER BY c, b)
  1012    FROM t5
  1013  } 2
  1014  
  1015  do_ordercount_test 23.4 {
  1016    SELECT 
  1017      sum(c) OVER (ORDER BY b ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),
  1018      sum(c) OVER (ORDER BY b RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),
  1019      sum(c) OVER (ORDER BY b GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
  1020    FROM t5
  1021  } 1
  1022  
  1023  do_ordercount_test 23.5 {
  1024    SELECT 
  1025      sum(c) OVER (ORDER BY b+1 ROWS UNBOUNDED PRECEDING),
  1026      sum(c) OVER (ORDER BY b+1 RANGE UNBOUNDED PRECEDING),
  1027      sum(c) OVER (ORDER BY b+1 GROUPS UNBOUNDED PRECEDING)
  1028    FROM t5
  1029  } 1
  1030  
  1031  do_ordercount_test 23.6 {
  1032    SELECT 
  1033      sum(c) OVER (ORDER BY b+1 ROWS UNBOUNDED PRECEDING),
  1034      sum(c) OVER (ORDER BY b+2 RANGE UNBOUNDED PRECEDING),
  1035      sum(c) OVER (ORDER BY b+3 GROUPS UNBOUNDED PRECEDING)
  1036    FROM t5
  1037  } 3
  1038  
  1039  do_execsql_test 24.1 {
  1040    SELECT sum(44) OVER ()
  1041  } {44}
  1042  
  1043  do_execsql_test 24.2 {
  1044    SELECT lead(44) OVER ()
  1045  } {{}}
  1046  
  1047  #-------------------------------------------------------------------------
  1048  #
  1049  reset_db
  1050  do_execsql_test 25.0 {
  1051    CREATE TABLE t1 ( t1_id INTEGER PRIMARY KEY );
  1052    CREATE TABLE t2 ( t2_id INTEGER PRIMARY KEY );
  1053    CREATE TABLE t3 ( t3_id INTEGER PRIMARY KEY );
  1054  
  1055    INSERT INTO t1 VALUES(1),  (3), (5);
  1056    INSERT INTO t2 VALUES      (3), (5);
  1057    INSERT INTO t3 VALUES(10), (11), (12);
  1058  }
  1059  
  1060  do_execsql_test 25.1 {
  1061    SELECT t1.* FROM t1, t2 WHERE 
  1062      t1_id=t2_id AND t1_id IN (
  1063          SELECT t1_id + row_number() OVER ( ORDER BY t1_id ) FROM t3
  1064      )
  1065  }
  1066  
  1067  do_execsql_test 25.2 {
  1068    SELECT t1.* FROM t1, t2 WHERE 
  1069      t1_id=t2_id AND t1_id IN (
  1070          SELECT         row_number() OVER ( ORDER BY t1_id ) FROM t3
  1071      )
  1072  } {3}
  1073  
  1074  #-------------------------------------------------------------------------
  1075  reset_db
  1076  do_execsql_test 26.0 {
  1077    CREATE TABLE t1(x);
  1078    CREATE TABLE t2(c);
  1079  }
  1080  
  1081  do_execsql_test 26.1 {
  1082    SELECT ( SELECT row_number() OVER () FROM ( SELECT c FROM t1 ) ) FROM t2
  1083  } {}
  1084  
  1085  do_execsql_test 26.2 {
  1086    INSERT INTO t1 VALUES(1), (2), (3), (4);
  1087    INSERT INTO t2 VALUES(2), (6), (8), (4);
  1088    SELECT c, c IN ( 
  1089      SELECT row_number() OVER () FROM ( SELECT c FROM t1 )
  1090    ) FROM t2
  1091  } {2 1  6 0  8 0  4 1}
  1092  
  1093  do_execsql_test 26.3 {
  1094    DELETE FROM t1;
  1095    DELETE FROM t2;
  1096  
  1097    INSERT INTO t2 VALUES(1), (2), (3), (4);
  1098    INSERT INTO t1 VALUES(1), (1), (2), (3), (3), (3), (3), (4), (4);
  1099  
  1100    SELECT c, c IN ( 
  1101      SELECT row_number() OVER () FROM ( SELECT 1 FROM t1 WHERE x=c )
  1102    ) FROM t2
  1103  } {1 1  2 0  3 1  4 0}
  1104  
  1105  #-------------------------------------------------------------------------
  1106  reset_db
  1107  do_execsql_test 27.0 {
  1108    CREATE TABLE t1(x);
  1109    INSERT INTO t1 VALUES(NULL), (1), (2), (3), (4), (5);
  1110  }
  1111  do_execsql_test 27.1 {
  1112    SELECT min(x) FROM t1;
  1113  } {1}
  1114  do_execsql_test 27.2 {
  1115    SELECT min(x) OVER win FROM t1
  1116    WINDOW win AS (ORDER BY rowid ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
  1117  } {1 1 1 2 3 4}
  1118  
  1119  #-------------------------------------------------------------------------
  1120  
  1121  reset_db
  1122  do_execsql_test 28.1.1 {
  1123    CREATE TABLE t1(a INTEGER PRIMARY KEY, b CHAR(1), c CHAR(2), d ANY);
  1124    INSERT INTO t1 VALUES (3, 'C', 'cc', 1.0);
  1125    INSERT INTO t1 VALUES (13,'M', 'cc', NULL);
  1126  }
  1127  
  1128  do_execsql_test 28.1.2 {
  1129    SELECT group_concat(b,'') OVER w1 FROM t1
  1130      WINDOW w1 AS (ORDER BY a RANGE BETWEEN 3 PRECEDING AND 1 PRECEDING)
  1131  } {
  1132    {} {}
  1133  }
  1134  
  1135  do_execsql_test 28.2.1 {
  1136    CREATE TABLE t2(a TEXT, b INTEGER);
  1137    INSERT INTO t2 VALUES('A', NULL);
  1138    INSERT INTO t2 VALUES('B', NULL);
  1139  }
  1140  
  1141  do_execsql_test 28.2.1 {
  1142    DROP TABLE IF EXISTS t1;
  1143    CREATE TABLE t1(a INTEGER PRIMARY KEY, b CHAR(1), c CHAR(2), d ANY);
  1144    INSERT INTO t1 VALUES
  1145      (10,'J', 'cc', NULL),
  1146      (11,'K', 'cc', 'xyz'),
  1147      (13,'M', 'cc', NULL);
  1148  }
  1149  
  1150  do_execsql_test 28.2.2 {
  1151    SELECT a, b, c, quote(d), group_concat(b,'') OVER w1, '|' FROM t1
  1152      WINDOW w1 AS
  1153      (ORDER BY d DESC RANGE BETWEEN 7.0 PRECEDING AND 2.5 PRECEDING)
  1154      ORDER BY c, d, a;
  1155  } {
  1156    10 J cc NULL JM |
  1157    13 M cc NULL JM | 
  1158    11 K cc 'xyz' K |
  1159  }
  1160  
  1161  #-------------------------------------------------------------------------
  1162  reset_db
  1163  
  1164  do_execsql_test 29.1 {
  1165    DROP TABLE IF EXISTS t1;
  1166    CREATE TABLE t1(a INTEGER PRIMARY KEY, b CHAR(1), c CHAR(2), d ANY);
  1167    INSERT INTO t1 VALUES
  1168      (1, 'A', 'aa', 2.5),
  1169      (2, 'B', 'bb', 3.75),
  1170      (3, 'C', 'cc', 1.0),
  1171      (4, 'D', 'cc', 8.25),
  1172      (5, 'E', 'bb', 6.5),
  1173      (6, 'F', 'aa', 6.5),
  1174      (7, 'G', 'aa', 6.0),
  1175      (8, 'H', 'bb', 9.0),
  1176      (9, 'I', 'aa', 3.75),
  1177      (10,'J', 'cc', NULL),
  1178      (11,'K', 'cc', 'xyz'),
  1179      (12,'L', 'cc', 'xyZ'),
  1180      (13,'M', 'cc', NULL);
  1181  }
  1182  
  1183  do_execsql_test 29.2 {
  1184    SELECT a, b, c, quote(d), group_concat(b,'') OVER w1, '|' FROM t1
  1185      WINDOW w1 AS
  1186      (PARTITION BY c ORDER BY d DESC
  1187       RANGE BETWEEN 7.0 PRECEDING AND 2.5 PRECEDING)
  1188      ORDER BY c, d, a;
  1189  } {
  1190    1 A aa 2.5 FG | 
  1191    9 I aa 3.75 F | 
  1192    7 G aa 6 {} | 
  1193    6 F aa 6.5 {} | 
  1194    2 B bb 3.75 HE |
  1195    5 E bb 6.5 H | 
  1196    8 H bb 9 {} | 
  1197    10 J cc NULL JM | 
  1198    13 M cc NULL JM | 
  1199    3 C cc 1 {} | 
  1200    4 D cc 8.25 {} | 
  1201    12 L cc 'xyZ' L | 
  1202    11 K cc 'xyz' K |
  1203  }
  1204  
  1205  # 2019-07-18
  1206  # Check-in [7ef7b23cbb1b9ace] (which was itself a fix for ticket
  1207  # https://www.sqlite.org/src/info/1be72aab9) introduced a new problem
  1208  # if the LHS of a BETWEEN operator is a WINDOW function.  The problem
  1209  # was found by (the recently enhanced) dbsqlfuzz.
  1210  #
  1211  do_execsql_test 30.0 {
  1212    DROP TABLE IF EXISTS t1;
  1213    CREATE TABLE t1(a, b, c);
  1214    INSERT INTO t1 VALUES('BB','aa',399);
  1215    SELECT
  1216      count () OVER win1 NOT BETWEEN 'a' AND 'mmm',
  1217      count () OVER win3
  1218    FROM t1
  1219    WINDOW win1 AS (ORDER BY a GROUPS BETWEEN 4 PRECEDING AND 1 FOLLOWING
  1220                    EXCLUDE CURRENT ROW),
  1221           win2 AS (PARTITION BY b ORDER BY a),
  1222           win3 AS (win2 RANGE BETWEEN 5.2 PRECEDING AND true PRECEDING );
  1223  } {1 1}
  1224  
  1225  #-------------------------------------------------------------------------
  1226  reset_db
  1227  do_execsql_test 31.1 {
  1228    CREATE TABLE t1(a, b);
  1229    CREATE TABLE t2(c, d);
  1230    CREATE TABLE t3(e, f);
  1231  
  1232    INSERT INTO t1 VALUES(1, 1);
  1233    INSERT INTO t2 VALUES(1, 1);
  1234    INSERT INTO t3 VALUES(1, 1);
  1235  }
  1236  
  1237  do_execsql_test 31.2 {
  1238    SELECT d IN (SELECT sum(c) OVER (ORDER BY e+c) FROM t3) FROM (
  1239      SELECT * FROM t2
  1240    );
  1241  } {1}
  1242  
  1243  do_execsql_test 31.3 {
  1244    SELECT d IN (SELECT sum(c) OVER (PARTITION BY d ORDER BY e+c) FROM t3) FROM (
  1245      SELECT * FROM t2
  1246    );
  1247  } {1}
  1248  
  1249  do_catchsql_test 31.3 {
  1250    SELECT d IN (
  1251      SELECT sum(c) OVER ( ROWS BETWEEN d FOLLOWING AND UNBOUNDED FOLLOWING) 
  1252      FROM t3
  1253    )
  1254    FROM (
  1255      SELECT * FROM t2
  1256    );
  1257  } {1 {frame starting offset must be a non-negative integer}}
  1258  
  1259  do_catchsql_test 31.3 {
  1260    SELECT d IN (
  1261      SELECT sum(c) OVER ( ROWS BETWEEN CURRENT ROW AND c FOLLOWING) 
  1262      FROM t3
  1263    )
  1264    FROM (
  1265      SELECT * FROM t2
  1266    );
  1267  } {1 {frame ending offset must be a non-negative integer}}
  1268  
  1269  # 2019-11-16 chromium issue 1025467
  1270  db close
  1271  sqlite3 db :memory:
  1272  do_catchsql_test 32.10 {
  1273    CREATE VIEW a AS SELECT NULL INTERSECT SELECT NULL ORDER BY s() OVER R;
  1274    CREATE TABLE a0 AS SELECT 0;
  1275    ALTER TABLE a0 RENAME TO S;
  1276  } {1 {error in view a: 1st ORDER BY term does not match any column in the result set}}
  1277  
  1278  reset_db
  1279  do_execsql_test 33.1 {
  1280    CREATE TABLE t1(aa, bb);
  1281    INSERT INTO t1 VALUES(1, 2);
  1282    INSERT INTO t1 VALUES(5, 6);
  1283    CREATE TABLE t2(x);
  1284    INSERT INTO t2 VALUES(1);
  1285  }
  1286  do_execsql_test 33.2 {
  1287    SELECT (SELECT DISTINCT sum(aa) OVER() FROM t1 ORDER BY 1), x FROM t2 
  1288    ORDER BY 1;
  1289  } {6 1}
  1290  
  1291  reset_db
  1292  do_execsql_test 34.1 {
  1293    CREATE TABLE t1(a,b,c);
  1294  }
  1295  do_execsql_test 34.2 {
  1296    SELECT avg(a) OVER (
  1297        ORDER BY (SELECT sum(b) OVER ()
  1298          FROM t1 ORDER BY (
  1299            SELECT total(d) OVER (ORDER BY c)
  1300            FROM (SELECT 1 AS d) ORDER BY 1
  1301            )
  1302          )
  1303        )
  1304    FROM t1;
  1305  }
  1306  
  1307  #-------------------------------------------------------------------------
  1308  reset_db
  1309  do_catchsql_test 35.0 {
  1310    SELECT * WINDOW f AS () ORDER BY name COLLATE nocase;
  1311  } {1 {no tables specified}}
  1312  
  1313  do_catchsql_test 35.1 {
  1314    VALUES(1) INTERSECT SELECT * WINDOW f AS () ORDER BY x COLLATE nocase;
  1315  } {1 {no tables specified}}
  1316  
  1317  do_execsql_test 35.2 {
  1318    CREATE TABLE t1(x);
  1319    INSERT INTO t1 VALUES(1), (2), (3);
  1320    VALUES(1) INTERSECT 
  1321    SELECT sum(x) OVER f FROM t1 WINDOW f AS (ORDER BY x) ORDER BY 1;
  1322  } {1}
  1323  
  1324  do_execsql_test 35.3 {
  1325    VALUES(8) EXCEPT 
  1326    SELECT sum(x) OVER f FROM t1 WINDOW f AS (ORDER BY x) ORDER BY 1;
  1327  } {8}
  1328  
  1329  do_execsql_test 35.4 {
  1330    VALUES(1) UNION 
  1331    SELECT sum(x) OVER f FROM t1 WINDOW f AS (ORDER BY x) ORDER BY 1;
  1332  } {1 3 6}
  1333  
  1334  # 2019-12-07 gramfuzz find
  1335  #
  1336  do_execsql_test 36.10 {
  1337    VALUES(count(*)OVER());
  1338  } {1}
  1339  do_execsql_test 36.20 {
  1340    VALUES(count(*)OVER()),(2);
  1341  } {1 2}
  1342  do_execsql_test 36.30 {
  1343    VALUES(2),(count(*)OVER());
  1344  } {2 1}
  1345  do_execsql_test 36.40 {
  1346    VALUES(2),(3),(count(*)OVER()),(4),(5);
  1347  } {2 3 1 4 5}
  1348  
  1349  # 2019-12-17 crash test case found by Yongheng and Rui
  1350  # See check-in 1ca0bd982ab1183b
  1351  #
  1352  reset_db
  1353  do_execsql_test 37.10 {
  1354    CREATE TABLE t0(a UNIQUE, b PRIMARY KEY);
  1355    CREATE VIEW v0(c) AS SELECT max((SELECT count(a)OVER(ORDER BY 1))) FROM t0;
  1356    SELECT c FROM v0 WHERE c BETWEEN 10 AND 20;
  1357  } {}
  1358  do_execsql_test 37.20 {
  1359    DROP VIEW v0;
  1360    CREATE VIEW v0(c) AS SELECT max((SELECT count(a)OVER(ORDER BY 1234))) FROM t0;
  1361    SELECT c FROM v0 WHERE c BETWEEN -10 AND 20;
  1362  } {}
  1363  
  1364  # 2019-12-20 mrigger reported problem with a FILTER clause on an aggregate
  1365  # in a join.
  1366  #
  1367  reset_db
  1368  do_catchsql_test 38.10 {
  1369    CREATE TABLE t0(c0);
  1370    CREATE TABLE t1(c0, c1 UNIQUE);
  1371    INSERT INTO t0(c0) VALUES(1);
  1372    INSERT INTO t1(c0,c1) VALUES(2,3);
  1373    SELECT COUNT(*) FROM t0, t1 WHERE (SELECT AVG(0) FILTER(WHERE t1.c1));
  1374  } {1 {misuse of aggregate: AVG()}}
  1375  do_execsql_test 38.20 {
  1376    SELECT COUNT(*), AVG(1) FILTER(WHERE t1.c1) FROM t0, t1;
  1377  } {1 1.0}
  1378  do_catchsql_test 38.30 {
  1379    SELECT COUNT(*) FROM t0, t1 WHERE (SELECT AVG(1) FILTER(WHERE t1.c1));
  1380  } {1 {misuse of aggregate: AVG()}}
  1381  
  1382  reset_db
  1383  do_execsql_test 39.1 {
  1384    CREATE TABLE t0(c0 UNIQUE);
  1385  }
  1386  do_execsql_test 39.2 {
  1387    SELECT FIRST_VALUE(0) OVER();
  1388  } {0}
  1389  do_execsql_test 39.3 {
  1390    SELECT * FROM t0 WHERE(c0, 0) IN(SELECT FIRST_VALUE(0) OVER(), 0);
  1391  }
  1392  do_execsql_test 39.4 {
  1393    SELECT * FROM t0 WHERE (t0.c0, 1) IN(SELECT NTILE(1) OVER(), 0 FROM t0);
  1394  }
  1395  
  1396  ifcapable rtree {
  1397    # 2019-12-25 ticket d87336c81c7d0873
  1398    #
  1399    reset_db
  1400    do_catchsql_test 40.1 {
  1401      CREATE VIRTUAL TABLE t0 USING rtree(c0, c1, c2);
  1402      SELECT * FROM t0
  1403       WHERE ((0,0) IN (SELECT COUNT(*),LAG(5)OVER(PARTITION BY 0) FROM t0),0)<=(c1,0);
  1404    } {0 {}}
  1405  }
  1406  
  1407  #-------------------------------------------------------------------------
  1408  reset_db
  1409  do_execsql_test 41.1 {
  1410    CREATE TABLE t1(a, b, c);
  1411    INSERT INTO t1 VALUES(NULL,'bb',355);
  1412    INSERT INTO t1 VALUES('CC','aa',158);
  1413    INSERT INTO t1 VALUES('GG','bb',929);
  1414    INSERT INTO t1 VALUES('FF','Rb',574);
  1415  }
  1416  
  1417  do_execsql_test 41.2 {
  1418    SELECT min(c) OVER (
  1419      ORDER BY a RANGE BETWEEN 5.2 PRECEDING AND 0.1 PRECEDING
  1420    ) FROM t1
  1421  } {355 158 574 929}
  1422  
  1423  do_execsql_test 41.2 {
  1424    SELECT min(c) OVER (
  1425      ORDER BY a RANGE BETWEEN 5.2 PRECEDING AND 0.1 PRECEDING
  1426    ) << 100 FROM t1
  1427  } {0 0 0 0}
  1428  
  1429  do_execsql_test 41.3 {
  1430    SELECT
  1431      min(c) OVER win3 << first_value(c) OVER win3,
  1432      min(c) OVER win3 << first_value(c) OVER win3
  1433    FROM t1
  1434    WINDOW win3 AS (
  1435      PARTITION BY 6 ORDER BY a RANGE BETWEEN 5.2 PRECEDING AND 0.1 PRECEDING
  1436    );
  1437  } {0 0  0 0  0 0  0 0}
  1438  
  1439  #-------------------------------------------------------------------------
  1440  reset_db
  1441  do_execsql_test 42.1 {
  1442    CREATE TABLE t1(a, b, c);
  1443    INSERT INTO t1 VALUES(1, 1, 1);
  1444    INSERT INTO t1 VALUES(2, 2, 2);
  1445  }
  1446  do_execsql_test 42.2 {
  1447    SELECT * FROM t1 WHERE (0, 0) IN ( SELECT count(*), 0 FROM t1 )
  1448  } {}
  1449  do_execsql_test 42.3 {
  1450    SELECT * FROM t1 WHERE (2, 0) IN ( SELECT count(*), 0 FROM t1 )
  1451  } {1 1 1 2 2 2}
  1452  
  1453  do_execsql_test 42.3 {
  1454    SELECT count(*), max(a) OVER () FROM t1 GROUP BY c; 
  1455  } {1 2 1 2}
  1456  
  1457  do_execsql_test 42.4 {
  1458    SELECT sum(a), max(b) OVER () FROM t1;
  1459  } {3 1}
  1460  
  1461  do_execsql_test 42.5 {
  1462    CREATE TABLE t2(a, b);
  1463    INSERT INTO t2 VALUES('a', 1);
  1464    INSERT INTO t2 VALUES('a', 2);
  1465    INSERT INTO t2 VALUES('a', 3);
  1466    INSERT INTO t2 VALUES('b', 4);
  1467    INSERT INTO t2 VALUES('b', 5);
  1468    INSERT INTO t2 VALUES('b', 6);
  1469  }
  1470  
  1471  do_execsql_test 42.6 {
  1472    SELECT a, sum(b), sum( sum(b) ) OVER (ORDER BY a) FROM t2 GROUP BY a;
  1473  } {a 6 6   b 15 21}
  1474  
  1475  do_execsql_test 42.7 {
  1476    SELECT sum(b), sum( sum(b) ) OVER (ORDER BY a) FROM t2;
  1477  } {21 21}
  1478  
  1479  #-------------------------------------------------------------------------
  1480  reset_db
  1481  do_execsql_test 43.1.1 {
  1482    CREATE TABLE t1(x INTEGER PRIMARY KEY);
  1483    INSERT INTO t1 VALUES (10);
  1484  }
  1485  do_catchsql_test 43.1.2 {
  1486    SELECT count() OVER() AS m FROM t1 ORDER BY (SELECT m);
  1487  } {1 {misuse of aliased window function m}}
  1488  
  1489  reset_db
  1490  do_execsql_test 43.2.1 {
  1491    CREATE TABLE t1(a INTEGER PRIMARY KEY, b INTEGER);
  1492    INSERT INTO t1(a, b) VALUES(1,  10); -- 10
  1493    INSERT INTO t1(a, b) VALUES(2,  15); -- 25
  1494    INSERT INTO t1(a, b) VALUES(3,  -5); -- 20
  1495    INSERT INTO t1(a, b) VALUES(4,  -5); -- 15
  1496    INSERT INTO t1(a, b) VALUES(5,  20); -- 35
  1497    INSERT INTO t1(a, b) VALUES(6, -11); -- 24
  1498  }
  1499  
  1500  do_execsql_test 43.2.2 {
  1501    SELECT a, sum(b) OVER (ORDER BY a) AS abc FROM t1 ORDER BY 2
  1502  } {
  1503    1 10   4 15   3 20   6 24   2 25   5 35
  1504  }
  1505  
  1506  do_execsql_test 43.2.3 {
  1507    SELECT a, sum(b) OVER (ORDER BY a) AS abc FROM t1 ORDER BY abc
  1508  } {
  1509    1 10   4 15   3 20   6 24   2 25   5 35
  1510  }
  1511  
  1512  do_execsql_test 43.2.4 {
  1513    SELECT a, sum(b) OVER (ORDER BY a) AS abc FROM t1 ORDER BY abc+5
  1514  } {
  1515    1 10   4 15   3 20   6 24   2 25   5 35
  1516  }
  1517  
  1518  do_catchsql_test 43.2.5 {
  1519    SELECT a, sum(b) OVER (ORDER BY a) AS abc FROM t1 ORDER BY (SELECT abc)
  1520  } {1 {misuse of aliased window function abc}}
  1521  
  1522  do_catchsql_test 43.2.6 {
  1523    SELECT a, 1+sum(b) OVER (ORDER BY a) AS abc FROM t1 ORDER BY (SELECT abc)
  1524  } {1 {misuse of aliased window function abc}}
  1525  
  1526  #-------------------------------------------------------------------------
  1527  reset_db
  1528  do_execsql_test 44.1 {
  1529    CREATE TABLE t0(c0);
  1530  }
  1531  
  1532  do_catchsql_test 44.2.1 {
  1533    SELECT ntile(0) OVER ();
  1534  } {1 {argument of ntile must be a positive integer}}
  1535  do_catchsql_test 44.2.2 {
  1536    SELECT (0, 0) IN(SELECT MIN(c0), NTILE(0) OVER()) FROM t0;
  1537  } {1 {argument of ntile must be a positive integer}}
  1538  
  1539  do_execsql_test 44.3.1 {
  1540    SELECT ntile(1) OVER ();
  1541  } {1}
  1542  do_execsql_test 44.3.2 {
  1543    SELECT (0, 0) IN(SELECT MIN(c0), NTILE(1) OVER()) FROM t0;
  1544  } {0}
  1545  
  1546  do_execsql_test 44.4.2 {
  1547    INSERT INTO t0 VALUES(2), (1), (0);
  1548    SELECT (0, 1) IN(SELECT MIN(c0), NTILE(1) OVER()) FROM t0;
  1549  } {1}
  1550  
  1551  #-------------------------------------------------------------------------
  1552  reset_db
  1553  do_execsql_test 45.1 {
  1554    CREATE TABLE t0(x);
  1555    CREATE TABLE t1(a);
  1556    INSERT INTO t1 VALUES(1000);
  1557    INSERT INTO t1 VALUES(1000);
  1558    INSERT INTO t0 VALUES(10000);
  1559  }
  1560  do_execsql_test 45.2 {
  1561    SELECT * FROM (
  1562        SELECT sum (a) OVER() FROM t1 UNION ALL SELECT x FROM t0
  1563    );
  1564  } {2000 2000 10000}
  1565  
  1566  #-------------------------------------------------------------------------
  1567  reset_db
  1568  do_execsql_test 46.1 {
  1569    CREATE TABLE t1 (a);
  1570    CREATE INDEX i1 ON t1(a);
  1571  
  1572    INSERT INTO t1 VALUES (10);
  1573  }
  1574  
  1575  do_execsql_test 46.2 {
  1576    SELECT (SELECT sum(a) OVER(ORDER BY a)) FROM t1
  1577  } 10
  1578  
  1579  do_execsql_test 46.3 {
  1580    SELECT * FROM t1 WHERE (SELECT sum(a) OVER(ORDER BY a));
  1581  } 10
  1582  
  1583  do_execsql_test 46.4 {
  1584    SELECT * FROM t1 NATURAL JOIN t1
  1585      WHERE a=1
  1586      OR ((SELECT sum(a)OVER(ORDER BY a)) AND a<=10)
  1587  } 10
  1588  
  1589  #-------------------------------------------------------------------------
  1590  reset_db
  1591  do_execsql_test 47.0 {
  1592    CREATE TABLE t1(
  1593        a,
  1594        e,
  1595        f,
  1596        g UNIQUE,
  1597        h UNIQUE
  1598    );
  1599  }
  1600  
  1601  do_execsql_test 47.1 {
  1602    CREATE VIEW t2(k) AS
  1603       SELECT e FROM t1 WHERE g = 'abc' OR h BETWEEN 10 AND f;
  1604  }
  1605  
  1606  do_catchsql_test 47.2 {
  1607    SELECT 234 FROM t2
  1608      WHERE k=1
  1609      OR (SELECT k FROM t2 WHERE (SELECT sum(a) OVER() FROM t1 GROUP BY 1));
  1610  } {1 {misuse of window function sum()}}
  1611  
  1612  #-------------------------------------------------------------------------
  1613  reset_db
  1614  do_execsql_test 48.0 {
  1615    CREATE TABLE t1(a);
  1616    INSERT INTO t1 VALUES(1);
  1617    INSERT INTO t1 VALUES(2);
  1618    INSERT INTO t1 VALUES(3);
  1619    SELECT (SELECT max(x)OVER(ORDER BY x) + min(x)OVER(ORDER BY x))
  1620      FROM (SELECT (SELECT sum(a) FROM t1) AS x FROM t1);
  1621  } {12 12 12}
  1622  
  1623  do_execsql_test 48.1 {
  1624    SELECT (SELECT max(x)OVER(ORDER BY x) + min(x)OVER(ORDER BY x))
  1625      FROM (SELECT (SELECT sum(a) FROM t1 GROUP BY a) AS x FROM t1);
  1626  } {2 2 2}
  1627  
  1628  #-------------------------------------------------------------------------
  1629  reset_db
  1630  do_execsql_test 49.1 {
  1631    CREATE TABLE t1 (a PRIMARY KEY);
  1632    INSERT INTO t1 VALUES(1);
  1633  }
  1634  
  1635  do_execsql_test 49.2 {
  1636    SELECT b AS c FROM (
  1637      SELECT a AS b FROM (
  1638        SELECT a FROM t1 WHERE a=1 OR (SELECT sum(a) OVER ())
  1639      ) 
  1640      WHERE b=1 OR b<10
  1641    ) 
  1642    WHERE c=1 OR c>=10;
  1643  } {1}
  1644  
  1645  
  1646  #-------------------------------------------------------------------------
  1647  reset_db
  1648  do_execsql_test 50.0 {
  1649    CREATE TABLE t1 (a DOUBLE PRIMARY KEY);
  1650    INSERT INTO t1 VALUES(10.0);
  1651  }
  1652  
  1653  do_execsql_test 50.1 {
  1654    SELECT * FROM t1 WHERE a%1 OR (SELECT sum(a) OVER (ORDER BY a%2))
  1655  } {10.0}
  1656  
  1657  do_execsql_test 50.2 {
  1658    SELECT * FROM (
  1659      SELECT * FROM t1 WHERE a%1 OR (SELECT sum(a) OVER (ORDER BY a%2))
  1660    ) 
  1661    WHERE a=1 OR ( (SELECT sum(a) OVER (ORDER BY a%4)) AND a<=10 )
  1662  } {10.0}
  1663  
  1664  do_execsql_test 50.3 {
  1665    SELECT a FROM (
  1666      SELECT * FROM (
  1667        SELECT * FROM t1 WHERE a%1 OR (SELECT sum(a) OVER (ORDER BY a%2))
  1668      ) 
  1669      WHERE a=1 OR ( (SELECT sum(a) OVER (ORDER BY a%4)) AND a<=10 )
  1670    ) 
  1671    WHERE a=1 OR a=10.0
  1672  } {10.0}
  1673  
  1674  do_execsql_test 50.4 {
  1675    SELECT a FROM (
  1676      SELECT * FROM (
  1677        SELECT * FROM t1 WHERE a%1 OR (SELECT sum(a) OVER (ORDER BY a%2))
  1678      ) 
  1679      WHERE a=1 OR ( (SELECT sum(a) OVER (ORDER BY a%4)) AND a<=10 )
  1680    ) 
  1681    WHERE a=1 OR ((SELECT sum(a) OVER(ORDER BY a%8)) AND 10<=a)
  1682  } {10.0}
  1683  
  1684  do_execsql_test 50.5 {
  1685  SELECT * FROM (SELECT * FROM t1 NATURAL JOIN t1 WHERE a%1 OR ((SELECT sum(a)OVER(ORDER BY a)) AND a<=10)) NATURAL JOIN t1 WHERE a=1 OR ((SELECT sum((SELECT * FROM (SELECT * FROM (SELECT * FROM t1 NATURAL JOIN t1 WHERE a%1 OR ((SELECT sum(a)OVER(ORDER BY a)) AND a<=10)) NATURAL JOIN t1 WHERE a=1 OR ((SELECT sum((SELECT * FROM t1 NATURAL JOIN t1 WHERE a=1 OR ((SELECT sum(a)OVER(ORDER BY a)) AND a<=10)))OVER(ORDER BY a% 1 )) AND a<=10)) NATURAL JOIN t1 WHERE a=1 OR ((SELECT sum(a)OVER(ORDER BY a)) AND 10<=a)))OVER(ORDER BY a%5)) AND a<=10);
  1686  } {10.0}
  1687  
  1688  # 2020-04-03 ticket af4556bb5c285c08
  1689  #
  1690  reset_db
  1691  do_catchsql_test 51.1 {
  1692    CREATE TABLE a(b, c);
  1693    SELECT c FROM a GROUP BY c
  1694      HAVING(SELECT(sum(b) OVER(ORDER BY b),
  1695                    sum(b) OVER(PARTITION BY min(DISTINCT c), c ORDER BY b)));
  1696  } {1 {row value misused}}
  1697  
  1698  #-------------------------------------------------------------------------
  1699  reset_db
  1700  do_execsql_test 52.1 {
  1701    CREATE TABLE t1(a, b, c);
  1702    INSERT INTO t1 VALUES('AA','bb',356);
  1703    INSERT INTO t1 VALUES('CC','aa',158);
  1704    INSERT INTO t1 VALUES('BB','aa',399);
  1705    INSERT INTO t1 VALUES('FF','bb',938);
  1706  }
  1707  
  1708  do_execsql_test 52.2 {
  1709    SELECT
  1710      count() OVER win1,
  1711      sum(c) OVER win2, 
  1712      first_value(c) OVER win2,
  1713      count(a) OVER (ORDER BY b)
  1714        FROM t1
  1715        WINDOW
  1716        win1 AS (ORDER BY a),
  1717      win2 AS (PARTITION BY 6 ORDER BY a
  1718          RANGE BETWEEN 5 PRECEDING AND 0 PRECEDING );
  1719  } {
  1720    1 356 356 4 
  1721    2 399 399 2 
  1722    3 158 158 2 
  1723    4 938 938 4
  1724  }
  1725  
  1726  do_execsql_test 52.3 {
  1727  SELECT
  1728    count() OVER (),
  1729    sum(c) OVER win2, 
  1730    first_value(c) OVER win2,
  1731    count(a) OVER (ORDER BY b)
  1732  FROM t1
  1733  WINDOW
  1734    win1 AS (ORDER BY a),
  1735    win2 AS (PARTITION BY 6 COLLATE binary ORDER BY a
  1736             RANGE BETWEEN 5 PRECEDING AND 0 PRECEDING );
  1737  } {
  1738    4 356 356 4 
  1739    4 399 399 2 
  1740    4 158 158 2 
  1741    4 938 938 4
  1742  }
  1743  
  1744  do_execsql_test 52.4 {
  1745    SELECT
  1746      count() OVER win1,
  1747      sum(c) OVER win2, 
  1748      first_value(c) OVER win2,
  1749      count(a) OVER (ORDER BY b)
  1750    FROM t1
  1751    WINDOW
  1752      win1 AS (ORDER BY a),
  1753      win2 AS (PARTITION BY 6 COLLATE binary ORDER BY a
  1754               RANGE BETWEEN 5 PRECEDING AND 0 PRECEDING );
  1755  } {
  1756    1 356 356 4 
  1757    2 399 399 2 
  1758    3 158 158 2 
  1759    4 938 938 4
  1760  }
  1761  
  1762  # 2020-05-23
  1763  # ticket 7a5279a25c57adf1
  1764  #
  1765  reset_db
  1766  do_execsql_test 53.0 {
  1767    CREATE TABLE a(c UNIQUE);
  1768    INSERT INTO a VALUES(4),(0),(9),(-9);
  1769    SELECT a.c
  1770      FROM a
  1771      JOIN a AS b ON a.c=4
  1772      JOIN a AS e ON a.c=e.c
  1773     WHERE a.c=(SELECT (SELECT coalesce(lead(2) OVER(),0) + sum(d.c))
  1774                  FROM a AS d
  1775                 WHERE a.c);
  1776  } {4 4 4 4}
  1777  
  1778  #-------------------------------------------------------------------------
  1779  reset_db
  1780  do_execsql_test 54.1 {
  1781    CREATE TABLE t1(a VARCHAR(20), b FLOAT);
  1782    INSERT INTO t1 VALUES('1',10.0);
  1783  }
  1784  
  1785  do_catchsql_test 54.2 {
  1786    SELECT * FROM ( 
  1787      SELECT sum(b) OVER() AS c FROM t1 
  1788        UNION
  1789      SELECT b AS c FROM t1
  1790    ) WHERE c>10;
  1791  } {0 {}}
  1792  
  1793  do_execsql_test 54.3 {
  1794    INSERT INTO t1 VALUES('2',5.0);
  1795    INSERT INTO t1 VALUES('3',15.0);
  1796  }
  1797  
  1798  do_catchsql_test 54.4 {
  1799    SELECT * FROM ( 
  1800      SELECT sum(b) OVER() AS c FROM t1 
  1801        UNION
  1802      SELECT b AS c FROM t1
  1803    ) WHERE c>10;
  1804  } {0 {15.0 30.0}}
  1805  
  1806  # 2020-06-05 ticket c8d3b9f0a750a529
  1807  reset_db
  1808  do_execsql_test 55.1 {
  1809     CREATE TABLE a(b);
  1810     SELECT
  1811        (SELECT b FROM a
  1812          GROUP BY b
  1813          HAVING (SELECT COUNT()OVER() + lead(b)OVER(ORDER BY SUM(DISTINCT b) + b))
  1814        ) 
  1815      FROM a
  1816    UNION
  1817     SELECT 99
  1818      ORDER BY 1;
  1819  } {99}
  1820  
  1821  #------------------------------------------------------------------------
  1822  reset_db
  1823  do_execsql_test 56.1 {
  1824    CREATE TABLE t1(a, b INTEGER); 
  1825    CREATE TABLE t2(c, d); 
  1826  }
  1827  do_catchsql_test 56.2 {
  1828    SELECT avg(b) FROM t1 
  1829      UNION ALL 
  1830    SELECT min(c) OVER () FROM t2 
  1831    ORDER BY nosuchcolumn;
  1832  } {1 {1st ORDER BY term does not match any column in the result set}}
  1833  
  1834  reset_db
  1835  do_execsql_test 57.1 {
  1836    CREATE TABLE t4(a, b, c, d, e);
  1837  }
  1838  
  1839  do_catchsql_test 57.2  {
  1840    SELECT b FROM t4
  1841    UNION
  1842    SELECT a FROM t4
  1843    ORDER BY (
  1844      SELECT sum(x) OVER() FROM (
  1845        SELECT c AS x FROM t4
  1846        UNION
  1847        SELECT d FROM t4
  1848        ORDER BY (SELECT e FROM t4)
  1849      )
  1850    );
  1851  } {1 {1st ORDER BY term does not match any column in the result set}}
  1852  
  1853  # 2020-06-06 various dbsqlfuzz finds and
  1854  # ticket 0899cf62f597d7e7
  1855  #
  1856  reset_db
  1857  do_execsql_test 57.1 {
  1858    CREATE TABLE t1(a, b, c);
  1859    INSERT INTO t1 VALUES(NULL,NULL,NULL);
  1860    SELECT 
  1861      sum(a),
  1862      min(b) OVER (),
  1863      count(c) OVER (ORDER BY b)
  1864    FROM t1;
  1865  } {{} {} 0}
  1866  do_execsql_test 57.2 {
  1867    CREATE TABLE v0 ( v1 INTEGER PRIMARY KEY ) ; 
  1868    INSERT INTO v0 VALUES ( 10 ) ; 
  1869    SELECT DISTINCT v1, lead(v1) OVER() FROM v0 GROUP BY v1 ORDER BY 2;
  1870  } {10 {}}
  1871  do_catchsql_test 57.3 {
  1872    DROP TABLE t1;
  1873    CREATE TABLE t1(a);
  1874    INSERT INTO t1(a) VALUES(22);
  1875    CREATE TABLE t3(y);
  1876    INSERT INTO t3(y) VALUES(5),(11),(-9);
  1877    SELECT (
  1878      SELECT max(y) OVER( ORDER BY (SELECT x FROM (SELECT sum(y) AS x FROM t1)))
  1879    )
  1880    FROM t3;
  1881  } {1 {misuse of aggregate: sum()}}
  1882  
  1883  # 2020-06-06 ticket 1f6f353b684fc708
  1884  reset_db
  1885  do_execsql_test 58.1 {
  1886    CREATE TABLE a(a, b, c);
  1887    INSERT INTO a VALUES(1, 2, 3);
  1888    INSERT INTO a VALUES(4, 5, 6);
  1889    SELECT sum(345+b)      OVER (ORDER BY b),
  1890           sum(avg(678)) OVER (ORDER BY c) FROM a;
  1891  } {347 678.0}
  1892  
  1893  # 2020-06-06 ticket e5504e987e419fb0
  1894  do_catchsql_test 59.1 {
  1895    DROP TABLE IF EXISTS t1;
  1896    CREATE TABLE t1(x INTEGER PRIMARY KEY);
  1897    INSERT INTO t1 VALUES (123);
  1898    SELECT
  1899       ntile( (SELECT sum(x)) ) OVER(ORDER BY x),
  1900       min(x) OVER(ORDER BY x)
  1901      FROM t1; 
  1902  } {1 {misuse of aggregate: sum()}}
  1903  
  1904  # 2020-06-07 ticket f7d890858f361402
  1905  do_execsql_test 60.1 {
  1906    DROP TABLE IF EXISTS t1;
  1907    CREATE TABLE t1 (x INTEGER PRIMARY KEY);
  1908    INSERT INTO t1 VALUES (99);
  1909    SELECT EXISTS(SELECT count(*) OVER() FROM t1 ORDER BY sum(x) OVER());
  1910  } {1}
  1911  
  1912  # 2020-06-07 test case generated by dbsqlfuzz showing how an AggInfo
  1913  # object might be referenced after the sqlite3Select() call that created
  1914  # it returns.  This proves the need to persist all AggInfo objects until
  1915  # the Parse object is destroyed.
  1916  #
  1917  reset_db
  1918  do_catchsql_test 61.1 {
  1919  CREATE TABLE t1(a);
  1920  INSERT INTO t1 VALUES(5),(NULL),('seventeen');
  1921  SELECT (SELECT max(x)OVER(ORDER BY x) % min(x)OVER(ORDER BY CASE x WHEN 889 THEN x WHEN x THEN x END)) FROM (SELECT (SELECT sum(CAST(a IN(SELECT (SELECT max(x)OVER(ORDER BY CASE x WHEN 889 THEN 299 WHEN 863 THEN 863 END)) FROM (SELECT (SELECT sum(CAST((SELECT (SELECT max(x)OVER(ORDER BY x) / min(x)OVER(ORDER BY CASE x WHEN 889 THEN 299 WHEN -true THEN 863 END)) FROM (SELECT (SELECT sum(CAST(a IN(SELECT (SELECT max(x) & sum ( a )OVER(ORDER BY CASE x WHEN -8 THEN 299 WHEN 863 THEN 863 END)) FROM (SELECT (SELECT sum(CAST(a AS )) FROM t1) AS x FROM t1)) AS t1 )) FROM t1) AS x FROM t1)) AS x )) FROM t1) AS x FROM t1)) AS real)) FROM t1) AS x FROM t1);
  1922  } {0 {{} {} {}}}
  1923  
  1924  foreach tn {1 2} {
  1925    if {$tn==2} { optimization_control db query-flattener 0 }
  1926    do_catchsql_test 61.2.$tn {
  1927      SELECT 
  1928        (SELECT max(x)OVER(ORDER BY x) / min(x) OVER() ) 
  1929      FROM (
  1930        SELECT (SELECT sum(a) FROM t1 ) AS x FROM t1
  1931      )
  1932  
  1933    } {0 {1.0 1.0 1.0}}
  1934  }
  1935  
  1936  reset_db
  1937  optimization_control db all 0 
  1938  do_execsql_test 61.3.0 {
  1939    CREATE TABLE t1(a);
  1940    CREATE TABLE t2(y);
  1941  }
  1942  
  1943  do_execsql_test 61.3.1 {
  1944    SELECT (
  1945      SELECT count(a) OVER ( ORDER BY (SELECT sum(y) FROM t2) )
  1946           + total(a) OVER() 
  1947    )
  1948    FROM t1
  1949  } {}
  1950  do_execsql_test 61.4.2 {
  1951    SELECT (
  1952      SELECT count(a) OVER ( ORDER BY sum(a) )
  1953           + total(a) OVER() 
  1954    )
  1955    FROM t1
  1956  } {0.0}
  1957  
  1958  do_catchsql_test 61.4.3 {
  1959    SELECT 
  1960      sum(a) OVER ( ORDER BY a ) 
  1961    FROM t1 
  1962    ORDER BY (SELECT sum(a) FROM t2)
  1963  } {1 {misuse of aggregate: sum()}}
  1964  do_execsql_test 61.4.4 {
  1965    SELECT 
  1966      sum(a) OVER ( ORDER BY a ) 
  1967    FROM t1 
  1968    ORDER BY (SELECT sum(y) FROM t2)
  1969  } 
  1970  
  1971  
  1972  #-------------------------------------------------------------------------
  1973  reset_db
  1974  do_execsql_test 62.1 {
  1975    CREATE TABLE t1(a VARCHAR(20), b FLOAT);
  1976    INSERT INTO t1 VALUES('1',10.0);
  1977  }
  1978  
  1979  do_execsql_test 62.2 {
  1980    SELECT * FROM ( 
  1981        SELECT sum(b) OVER() AS c FROM t1 
  1982        UNION
  1983        SELECT b AS c FROM t1
  1984        ) WHERE c>10;
  1985  }
  1986  
  1987  do_execsql_test 62.3 {
  1988    INSERT INTO t1 VALUES('2',5.0);
  1989    INSERT INTO t1 VALUES('3',15.0);
  1990  }
  1991  
  1992  do_execsql_test 62.4 {
  1993    SELECT * FROM ( 
  1994        SELECT sum(b) OVER() AS c FROM t1 
  1995        UNION
  1996        SELECT b AS c FROM t1
  1997        ) WHERE c>10;
  1998  } {15.0 30.0}
  1999  
  2000  #-------------------------------------------------------------------------
  2001  reset_db
  2002  do_execsql_test 63.1 {
  2003    CREATE TABLE t1(b, x);
  2004    CREATE TABLE t2(c, d);
  2005    CREATE TABLE t3(e, f);
  2006  }
  2007  
  2008  do_execsql_test 63.2 {
  2009    SELECT max(b) OVER(
  2010        ORDER BY SUM(
  2011          (SELECT c FROM t2 UNION SELECT x ORDER BY c)
  2012        )
  2013    ) FROM t1;
  2014  } {{}}
  2015  
  2016  do_execsql_test 63.3 {
  2017    SELECT sum(b) over(
  2018        ORDER BY (
  2019          SELECT max(b) OVER(
  2020            ORDER BY sum(
  2021              (SELECT x AS c UNION SELECT 1234 ORDER BY c)
  2022            )
  2023          ) AS e
  2024          ORDER BY e
  2025        )
  2026      )
  2027    FROM t1;
  2028  } {{}}
  2029  
  2030  #-------------------------------------------------------------------------
  2031  reset_db 
  2032  do_execsql_test 64.1 {
  2033    CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
  2034    INSERT INTO t1 VALUES(1, 'abcd');
  2035    INSERT INTO t1 VALUES(2, 'BCDE');
  2036    INSERT INTO t1 VALUES(3, 'cdef');
  2037    INSERT INTO t1 VALUES(4, 'DEFG');
  2038  }
  2039  
  2040  do_execsql_test 64.2 {
  2041    SELECT rowid, max(b COLLATE nocase)||'' 
  2042    FROM t1 
  2043    GROUP BY rowid
  2044    ORDER BY max(b COLLATE nocase)||'';
  2045  } {1 abcd 2 BCDE 3 cdef 4 DEFG}
  2046  
  2047  do_execsql_test 64.3 {
  2048    SELECT count() OVER (), rowid, max(b COLLATE nocase)||'' 
  2049    FROM t1 
  2050    GROUP BY rowid
  2051    ORDER BY max(b COLLATE nocase)||'';
  2052  } {4 1 abcd   4 2 BCDE   4 3 cdef   4 4 DEFG}
  2053  
  2054  do_execsql_test 64.4 {
  2055    SELECT count() OVER (), rowid, max(b COLLATE nocase)
  2056    FROM t1 
  2057    GROUP BY rowid
  2058    ORDER BY max(b COLLATE nocase);
  2059  } {4 1 abcd   4 2 BCDE   4 3 cdef   4 4 DEFG}
  2060  
  2061  #-------------------------------------------------------------------------
  2062  reset_db 
  2063  do_execsql_test 65.1 {
  2064    CREATE TABLE t1(c1);
  2065    INSERT INTO t1 VALUES('abcd');
  2066  }
  2067  do_execsql_test 65.2 {
  2068    SELECT max(c1 COLLATE nocase) IN (SELECT 'aBCd') FROM t1;
  2069  } {1}
  2070  
  2071  do_execsql_test 65.3 {
  2072    SELECT 
  2073       count() OVER (), 
  2074       group_concat(c1 COLLATE nocase) IN (SELECT 'aBCd') FROM t1;
  2075  } {1 1}
  2076  
  2077  do_execsql_test 65.4 {
  2078    SELECT COUNT() OVER () LIKE lead(102030) OVER(
  2079        ORDER BY sum('abcdef' COLLATE nocase) IN (SELECT 54321) 
  2080    )
  2081    FROM t1;
  2082  } {{}}
  2083  
  2084  #-------------------------------------------------------------------------
  2085  reset_db
  2086  
  2087  do_execsql_test 66.1 {
  2088    CREATE TABLE t1(a INTEGER);
  2089    INSERT INTO t1 VALUES(3578824042033200656);
  2090    INSERT INTO t1 VALUES(3029012920382354029);
  2091  }
  2092  
  2093  foreach {tn spec} {
  2094    1 "ORDER BY a RANGE BETWEEN 0.3 PRECEDING AND 10 FOLLOWING"
  2095    2 "ORDER BY a RANGE BETWEEN 0.3 PRECEDING AND 0.1 PRECEDING"
  2096    3 "ORDER BY a RANGE BETWEEN 0.3 FOLLOWING AND 10 FOLLOWING"
  2097    4 "ORDER BY a DESC RANGE BETWEEN 0.3 PRECEDING AND 10 FOLLOWING"
  2098    5 "ORDER BY a NULLS LAST RANGE BETWEEN 0.3 PRECEDING AND 10 FOLLOWING"
  2099    6 "ORDER BY a RANGE BETWEEN 1.0 PRECEDING AND 2.0 PRECEDING"
  2100  } {
  2101    do_execsql_test 66.2.$tn "
  2102      SELECT total(a) OVER ( $spec ) FROM t1 ORDER BY a
  2103    " {
  2104      3.02901292038235e+18 3.5788240420332e+18
  2105    }
  2106  }
  2107  
  2108  
  2109  do_execsql_test 66.3 {
  2110    CREATE TABLE t2(a INTEGER);
  2111    INSERT INTO t2 VALUES(45);
  2112    INSERT INTO t2 VALUES(30);
  2113  }
  2114  
  2115  foreach {tn spec res} {
  2116    1 "ORDER BY a RANGE BETWEEN 0.3 PRECEDING AND 10 FOLLOWING"   {30.0 45.0}
  2117    2 "ORDER BY a RANGE BETWEEN 0.3 PRECEDING AND 0.1 PRECEDING"  {0.0 0.0}
  2118    3 "ORDER BY a RANGE BETWEEN 0.3 FOLLOWING AND 10 FOLLOWING"   {0.0 0.0}
  2119    4 "ORDER BY a DESC RANGE BETWEEN 0.3 PRECEDING AND 10 FOLLOWING" {30.0 45.0}
  2120    5 "ORDER BY a NULLS LAST RANGE BETWEEN 0.3 PRECEDING AND 10 FOLLOWING" {30.0 45.0}
  2121    6 "ORDER BY a RANGE BETWEEN 1.0 PRECEDING AND 2.0 PRECEDING" {0.0 0.0}
  2122  } {
  2123    do_execsql_test 66.2.$tn "
  2124      SELECT total(a) OVER ( $spec ) FROM t2 ORDER BY a
  2125    " $res
  2126  }
  2127  
  2128  
  2129  #-------------------------------------------------------------------------
  2130  reset_db
  2131  do_execsql_test 67.0 {
  2132    CREATE TABLE t1(a, b, c);
  2133    CREATE TABLE t2(a, b, c);
  2134  }
  2135  
  2136  do_catchsql_test 67.1 {
  2137    SELECT a,c,b FROM t1 INTERSECT SELECT a,b,c FROM t1 ORDER BY (             
  2138        SELECT nth_value(a,2) OVER w1 
  2139        WINDOW w1 AS ( ORDER BY ((SELECT 1 FROM v1)) )
  2140    )
  2141  } {1 {no such table: v1}}
  2142  
  2143  do_catchsql_test 67.2 {
  2144    SELECT a,c,b FROM t1 INTERSECT SELECT a,b,c FROM t1 ORDER BY (             
  2145        SELECT nth_value(a,2) OVER w1 
  2146        WINDOW w1 AS ( ORDER BY ((SELECT 1 FROM t2)) )
  2147    )
  2148  } {1 {1st ORDER BY term does not match any column in the result set}}
  2149  
  2150  # 2021-05-07
  2151  # Do not allow aggregate functions in the ORDER BY clause even if
  2152  # there are window functions in the result set.
  2153  # Forum: /forumpost/540fdfef77
  2154  #
  2155  reset_db
  2156  do_catchsql_test 68.0 {
  2157    CREATE TABLE t1(a,b);
  2158    INSERT INTO t1(a,b) VALUES(0,0),(1,1),(2,4),(3,9),(4,99);
  2159    SELECT rowid, a, b, sum(a)OVER() FROM t1 ORDER BY count(b);
  2160  } {1 {misuse of aggregate: count()}}
  2161  
  2162  # 2021-05-22
  2163  # Forum https://sqlite.org/forum/forumpost/7e484e225c
  2164  #
  2165  reset_db
  2166  do_catchsql_test 69.0 {
  2167    CREATE TABLE t1(a,b);
  2168    CREATE INDEX t1ba ON t1(b,a);
  2169    SELECT * FROM t1 WHERE b = (SELECT b FROM t1 ORDER BY lead(b) OVER () AND sum(a));
  2170  } {1 {misuse of aggregate: sum()}}
  2171  do_catchsql_test 69.1 {
  2172    SELECT * FROM t1 WHERE b >= (SELECT b FROM t1 ORDER BY lead(b) OVER () AND sum(a));
  2173  } {1 {misuse of aggregate: sum()}}
  2174  do_catchsql_test 69.2 {
  2175    SELECT * FROM t1 WHERE b <= (SELECT b FROM t1 ORDER BY lead(b) OVER () AND sum(a));
  2176  } {1 {misuse of aggregate: sum()}}
  2177  
  2178  
  2179  finish_test