1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
|
# 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-* -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
|