| # 2018 May 8 |
| # |
| # The author disclaims copyright to this source code. In place of |
| # a legal notice, here is a blessing: |
| # |
| # May you do good and not evil. |
| # May you find forgiveness for yourself and forgive others. |
| # May you share freely, never taking more than you give. |
| # |
| #*********************************************************************** |
| # This file implements regression tests for SQLite library. |
| # |
| |
| set testdir [file dirname $argv0] |
| source $testdir/tester.tcl |
| set testprefix windowfault |
| |
| ifcapable !windowfunc { |
| finish_test |
| return |
| } |
| |
| do_execsql_test 1.0 { |
| CREATE TABLE t1(a, b, c, d); |
| INSERT INTO t1 VALUES(1, 2, 3, 4); |
| INSERT INTO t1 VALUES(5, 6, 7, 8); |
| INSERT INTO t1 VALUES(9, 10, 11, 12); |
| } |
| faultsim_save_and_close |
| |
| do_faultsim_test 1 -start 1 -faults oom-t* -prep { |
| faultsim_restore_and_reopen |
| } -body { |
| execsql { |
| SELECT row_number() OVER win, |
| rank() OVER win, |
| dense_rank() OVER win, |
| ntile(2) OVER win, |
| first_value(d) OVER win, |
| last_value(d) OVER win, |
| nth_value(d,2) OVER win, |
| lead(d) OVER win, |
| lag(d) OVER win, |
| max(d) OVER win, |
| min(d) OVER win |
| FROM t1 |
| WINDOW win AS (ORDER BY a) |
| } |
| } -test { |
| faultsim_test_result {0 {1 1 1 1 4 4 {} 8 {} 4 4 2 2 2 1 4 8 8 12 4 8 4 3 3 3 2 4 12 8 {} 8 12 4}} |
| } |
| |
| do_faultsim_test 1.1 -faults oom-t* -prep { |
| faultsim_restore_and_reopen |
| } -body { |
| execsql { |
| SELECT row_number() OVER win, |
| rank() OVER win, |
| dense_rank() OVER win |
| FROM t1 |
| WINDOW win AS (PARTITION BY c<7 ORDER BY a) |
| } |
| } -test { |
| faultsim_test_result {0 {1 1 1 2 2 2 1 1 1}} |
| } |
| |
| do_faultsim_test 1.2 -faults oom-t* -prep { |
| faultsim_restore_and_reopen |
| } -body { |
| execsql { |
| SELECT ntile(105) |
| OVER ( RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) |
| FROM t1 |
| } |
| } -test { |
| faultsim_test_result {0 {1 2 3}} |
| } |
| |
| do_faultsim_test 2 -start 1 -faults oom-* -prep { |
| faultsim_restore_and_reopen |
| } -body { |
| execsql { |
| SELECT round(percent_rank() OVER win, 2), |
| round(cume_dist() OVER win, 2) |
| FROM t1 |
| WINDOW win AS (ORDER BY a) |
| } |
| } -test { |
| faultsim_test_result {0 {0.0 0.33 0.5 0.67 1.0 1.0}} |
| } |
| |
| do_faultsim_test 3 -faults oom-* -prep { |
| faultsim_restore_and_reopen |
| } -body { |
| execsql { |
| SELECT min(d) OVER win, max(d) OVER win |
| FROM t1 |
| WINDOW win AS (ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) |
| } |
| } -test { |
| faultsim_test_result {0 {4 12 8 12 12 12}} |
| } |
| |
| do_faultsim_test 4 -faults oom-* -prep { |
| faultsim_restore_and_reopen |
| } -body { |
| execsql { |
| CREATE VIEW aaa AS |
| SELECT min(d) OVER w, max(d) OVER w |
| FROM t1 |
| WINDOW w AS (ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING); |
| SELECT * FROM aaa; |
| } |
| } -test { |
| faultsim_test_result {0 {4 12 8 12 12 12}} |
| } |
| |
| do_faultsim_test 5 -start 1 -faults oom-* -prep { |
| faultsim_restore_and_reopen |
| } -body { |
| execsql { |
| SELECT last_value(a) OVER win1, |
| last_value(a) OVER win2 |
| FROM t1 |
| WINDOW win1 AS (ORDER BY a ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING), |
| win2 AS (ORDER BY a) |
| } |
| } -test { |
| faultsim_test_result {0 {5 1 9 5 9 9}} |
| } |
| |
| do_faultsim_test 6 -faults oom-* -prep { |
| faultsim_restore_and_reopen |
| } -body { |
| execsql { |
| SELECT percent_rank() OVER (), cume_dist() OVER () FROM t1 |
| } |
| } -test { |
| faultsim_test_result {0 {0.0 1.0 0.0 1.0 0.0 1.0}} |
| } |
| |
| do_faultsim_test 7 -faults oom-* -prep { |
| faultsim_restore_and_reopen |
| } -body { |
| execsql { |
| SELECT percent_rank() OVER (), cume_dist() OVER () FROM t1 |
| } |
| } -test { |
| faultsim_test_result {0 {0.0 1.0 0.0 1.0 0.0 1.0}} |
| } |
| |
| do_faultsim_test 8 -faults oom-t* -prep { |
| faultsim_restore_and_reopen |
| } -body { |
| execsql { |
| SELECT a, sum(b) OVER win1 FROM t1 |
| WINDOW win1 AS (PARTITION BY a ), |
| win2 AS (PARTITION BY b ) |
| ORDER BY a; |
| } |
| } -test { |
| faultsim_test_result {0 {1 2 5 6 9 10}} |
| } |
| |
| finish_test |