github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/date2.test (about) 1 # 2017-07-20 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. The 12 # focus of this file is testing date and time functions used in 13 # check constraints and index expressions. 14 # 15 16 set testdir [file dirname $argv0] 17 source $testdir/tester.tcl 18 19 # Skip this whole file if date and time functions are omitted 20 # at compile-time 21 # 22 ifcapable {!datetime} { 23 finish_test 24 return 25 } 26 27 do_execsql_test date2-100 { 28 CREATE TABLE t1(x, y, CHECK( date(x) BETWEEN '2017-07-01' AND '2017-07-31' )); 29 INSERT INTO t1(x,y) VALUES('2017-07-20','one'); 30 } {} 31 do_catchsql_test date2-110 { 32 INSERT INTO t1(x,y) VALUES('now','two'); 33 } {1 {non-deterministic use of date() in a CHECK constraint}} 34 do_execsql_test date2-120 { 35 SELECT * FROM t1; 36 } {2017-07-20 one} 37 do_catchsql_test date2-130 { 38 INSERT INTO t1(x,y) VALUES('2017-08-01','two'); 39 } {1 {CHECK constraint failed: date(x) BETWEEN '2017-07-01' AND '2017-07-31'}} 40 41 # 2021-03-16 Forum post https://sqlite.org/forum/forumpost/464afd4086 42 do_catchsql_test date2-140 { 43 DROP TABLE t1; 44 CREATE TABLE t1(x, y, z AS (date())); 45 INSERT INTO t1(x,y) VALUES(1,2); 46 } {1 {non-deterministic use of date() in a generated column}} 47 48 do_execsql_test date2-200 { 49 CREATE TABLE t2(x,y); 50 INSERT INTO t2(x,y) VALUES(1, '2017-07-20'), (2, 'xyzzy'); 51 CREATE INDEX t2y ON t2(date(y)); 52 } 53 do_catchsql_test date2-210 { 54 INSERT INTO t2(x,y) VALUES(3, 'now'); 55 } {1 {non-deterministic use of date() in an index}} 56 do_execsql_test date2-220 { 57 SELECT x, y FROM t2 ORDER BY x; 58 } {1 2017-07-20 2 xyzzy} 59 60 do_execsql_test date2-300 { 61 CREATE TABLE t3(a INTEGER PRIMARY KEY,b); 62 WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<1000) 63 INSERT INTO t3(a,b) SELECT x, julianday('2017-07-01')+x FROM c; 64 UPDATE t3 SET b='now' WHERE a=500; 65 } 66 do_catchsql_test date2-310 { 67 CREATE INDEX t3b1 ON t3(datetime(b)); 68 } {1 {non-deterministic use of datetime() in an index}} 69 do_catchsql_test date2-320 { 70 CREATE INDEX t3b1 ON t3(datetime(b)) WHERE typeof(b)='real'; 71 } {0 {}} 72 do_execsql_test date2-330 { 73 EXPLAIN QUERY PLAN 74 SELECT a FROM t3 75 WHERE typeof(b)='real' 76 AND datetime(b) BETWEEN '2017-07-04' AND '2017-07-08'; 77 } {/USING INDEX t3b/} 78 do_execsql_test date2-331 { 79 SELECT a FROM t3 80 WHERE typeof(b)='real' 81 AND datetime(b) BETWEEN '2017-07-04' AND '2017-07-08' 82 ORDER BY a; 83 } {3 4 5 6} 84 85 do_execsql_test date2-400 { 86 CREATE TABLE t4(a INTEGER PRIMARY KEY,b); 87 WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<1000) 88 INSERT INTO t4(a,b) SELECT x, julianday('2017-07-01')+x FROM c; 89 UPDATE t4 SET b='now' WHERE a=500; 90 } 91 do_catchsql_test date2-410 { 92 CREATE INDEX t4b1 ON t4(b) 93 WHERE date(b) BETWEEN '2017-06-01' AND '2017-08-31'; 94 } {1 {non-deterministic use of date() in an index}} 95 do_execsql_test date2-420 { 96 DELETE FROM t4 WHERE a=500; 97 CREATE INDEX t4b1 ON t4(b) 98 WHERE date(b) BETWEEN '2017-06-01' AND '2017-08-31'; 99 } 100 do_catchsql_test date2-430 { 101 INSERT INTO t4(a,b) VALUES(9999,'now'); 102 } {1 {non-deterministic use of date() in an index}} 103 104 do_execsql_test date2-500 { 105 CREATE TABLE mods(x); 106 INSERT INTO mods(x) VALUES 107 ('+10 days'), 108 ('-10 days'), 109 ('+10 hours'), 110 ('-10 hours'), 111 ('+10 minutes'), 112 ('-10 minutes'), 113 ('+10 seconds'), 114 ('-10 seconds'), 115 ('+10 months'), 116 ('-10 months'), 117 ('+10 years'), 118 ('-10 years'), 119 ('start of month'), 120 ('start of year'), 121 ('start of day'), 122 ('weekday 1'), 123 ('unixepoch'); 124 CREATE TABLE t5(y,m); 125 WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<5) 126 INSERT INTO t5(y,m) SELECT julianday('2017-07-01')+c.x, mods.x FROM c, mods; 127 CREATE INDEX t5x1 on t5(y) WHERE datetime(y,m) IS NOT NULL; 128 } 129 do_catchsql_test date2-510 { 130 INSERT INTO t5(y,m) VALUES('2017-07-20','localtime'); 131 } {1 {non-deterministic use of datetime() in an index}} 132 do_catchsql_test date2-520 { 133 INSERT INTO t5(y,m) VALUES('2017-07-20','utc'); 134 } {1 {non-deterministic use of datetime() in an index}} 135 136 # 2019-10-30 Ticket 830277d9db6c3ba1 137 # 138 do_catchsql_test date2-600 { 139 CREATE TABLE t600(a REAL CHECK( a<julianday('now') )); 140 INSERT INTO t600(a) VALUES(1.0); 141 } {1 {non-deterministic use of julianday() in a CHECK constraint}} 142 do_catchsql_test date2-601 { 143 CREATE TABLE t601(a REAL, b TEXT, CHECK( a<julianday(b) )); 144 INSERT INTO t601(a,b) VALUES(1.0, '1970-01-01'); 145 } {0 {}} 146 do_catchsql_test date2-602 { 147 INSERT INTO t601(a,b) VALUES(1e100, '1970-01-01'); 148 } {1 {CHECK constraint failed: a<julianday(b)}} 149 do_catchsql_test date2-603 { 150 INSERT INTO t601(a,b) VALUES(10, 'now'); 151 } {1 {non-deterministic use of julianday() in a CHECK constraint}} 152 do_catchsql_test date2-604 { 153 INSERT INTO t600(a) VALUES(julianday('now')+10); 154 } {1 {non-deterministic use of julianday() in a CHECK constraint}} 155 156 157 do_catchsql_test date2-610 { 158 CREATE TABLE t610(a,b); 159 CREATE INDEX t610x1 ON t610(julianday('now')+b); 160 INSERT INTO t610(a,b) VALUES(123,456); 161 } {1 {non-deterministic use of julianday() in an index}} 162 do_catchsql_test date2-611 { 163 CREATE TABLE t611(a,b); 164 CREATE INDEX t611x1 ON t611(julianday(a)+b); 165 INSERT INTO t611(a,b) VALUES('1970-01-01',10.0); 166 } {0 {}} 167 do_catchsql_test date2-612 { 168 INSERT INTO t611(a,b) VALUES('now',10.0); 169 } {1 {non-deterministic use of julianday() in an index}} 170 171 do_catchsql_test date3-620 { 172 CREATE TABLE t620(a, b AS (a+julianday('now'))); 173 INSERT INTO t620 VALUES(10); 174 } {1 {non-deterministic use of julianday() in a generated column}} 175 176 finish_test