Annotation of embedaddon/sqlite3/test/date.test, revision 1.1.1.1

1.1       misho       1: # 2003 October 31
                      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.
                     13: #
                     14: # $Id: date.test,v 1.34 2009/04/16 12:58:03 drh Exp $
                     15: 
                     16: set testdir [file dirname $argv0]
                     17: source $testdir/tester.tcl
                     18: 
                     19: # Do not use a codec for tests in this file, as the database file is
                     20: # manipulated directly using tcl scripts (using the [hexio_write] command).
                     21: #
                     22: do_not_use_codec
                     23: 
                     24: # Skip this whole file if date and time functions are omitted
                     25: # at compile-time
                     26: #
                     27: ifcapable {!datetime} {
                     28:   finish_test
                     29:   return
                     30: }
                     31: 
                     32: proc datetest {tnum expr result} {
                     33:   do_test date-$tnum [subst {
                     34:     execsql "SELECT coalesce($expr,'NULL')"
                     35:   }] [list $result]
                     36: }
                     37: set tcl_precision 15
                     38: datetest 1.1 julianday('2000-01-01') 2451544.5
                     39: datetest 1.2 julianday('1970-01-01') 2440587.5
                     40: datetest 1.3 julianday('1910-04-20') 2418781.5
                     41: datetest 1.4 julianday('1986-02-09') 2446470.5
                     42: datetest 1.5 julianday('12:00:00') 2451545.0
                     43: datetest 1.6 {julianday('2000-01-01 12:00:00')} 2451545.0
                     44: datetest 1.7 {julianday('2000-01-01 12:00')} 2451545.0
                     45: datetest 1.8 julianday('bogus') NULL
                     46: datetest 1.9 julianday('1999-12-31') 2451543.5
                     47: datetest 1.10 julianday('1999-12-32') NULL
                     48: datetest 1.11 julianday('1999-13-01') NULL
                     49: datetest 1.12 julianday('2003-02-31') 2452701.5
                     50: datetest 1.13 julianday('2003-03-03') 2452701.5
                     51: datetest 1.14 julianday('+2000-01-01') NULL
                     52: datetest 1.15 julianday('200-01-01') NULL
                     53: datetest 1.16 julianday('2000-1-01') NULL
                     54: datetest 1.17 julianday('2000-01-1') NULL
                     55: datetest 1.18.1 {julianday('2000-01-01     12:00:00')} 2451545.0
                     56: datetest 1.18.2 {julianday('2000-01-01T12:00:00')} 2451545.0
                     57: datetest 1.18.3 {julianday('2000-01-01 T12:00:00')} 2451545.0
                     58: datetest 1.18.4 {julianday('2000-01-01T 12:00:00')} 2451545.0
                     59: datetest 1.18.4 {julianday('2000-01-01 T 12:00:00')} 2451545.0
                     60: datetest 1.19 {julianday('2000-01-01 12:00:00.1')}   2451545.00000116
                     61: datetest 1.20 {julianday('2000-01-01 12:00:00.01')}  2451545.00000012
                     62: datetest 1.21 {julianday('2000-01-01 12:00:00.001')} 2451545.00000001
                     63: datetest 1.22 {julianday('2000-01-01 12:00:00.')} NULL
                     64: datetest 1.23 julianday(12345.6) 12345.6
                     65: datetest 1.23b julianday('12345.6') 12345.6
                     66: datetest 1.24 {julianday('2001-01-01 12:00:00 bogus')} NULL
                     67: datetest 1.25 {julianday('2001-01-01 bogus')} NULL
                     68: datetest 1.26 {julianday('2001-01-01 12:60:00')} NULL
                     69: datetest 1.27 {julianday('2001-01-01 12:59:60')} NULL
                     70: datetest 1.28 {julianday('2001-00-01')} NULL
                     71: datetest 1.29 {julianday('2001-01-00')} NULL
                     72: 
                     73: datetest 2.1 datetime(0,'unixepoch') {1970-01-01 00:00:00}
                     74: datetest 2.1b datetime(0,'unixepoc') NULL
                     75: datetest 2.1c datetime(0,'unixepochx') NULL
                     76: datetest 2.1d datetime('2003-10-22','unixepoch') NULL
                     77: datetest 2.2 datetime(946684800,'unixepoch') {2000-01-01 00:00:00}
                     78: datetest 2.2b datetime('946684800','unixepoch') {2000-01-01 00:00:00}
                     79: for {set i 0} {$i<1000} {incr i} {
                     80:   set sql [format {strftime('%%H:%%M:%%f',1237962480.%03d,'unixepoch')} $i]
                     81:   set res [format {06:28:00.%03d} $i]
                     82:   datetest 2.2c-$i $sql $res
                     83: }
                     84: datetest 2.3 {date('2003-10-22','weekday 0')} 2003-10-26
                     85: datetest 2.4 {date('2003-10-22','weekday 1')} 2003-10-27
                     86: datetest 2.4a {date('2003-10-22','weekday  1')} 2003-10-27
                     87: datetest 2.4b {date('2003-10-22','weekday  1x')} NULL
                     88: datetest 2.4c {date('2003-10-22','weekday  -1')} NULL
                     89: datetest 2.4d {date('2003-10-22','weakday  1x')} NULL
                     90: datetest 2.4e {date('2003-10-22','weekday ')} NULL
                     91: datetest 2.5 {date('2003-10-22','weekday 2')} 2003-10-28
                     92: datetest 2.6 {date('2003-10-22','weekday 3')} 2003-10-22
                     93: datetest 2.7 {date('2003-10-22','weekday 4')} 2003-10-23
                     94: datetest 2.8 {date('2003-10-22','weekday 5')} 2003-10-24
                     95: datetest 2.9 {date('2003-10-22','weekday 6')} 2003-10-25
                     96: datetest 2.10 {date('2003-10-22','weekday 7')} NULL
                     97: datetest 2.11 {date('2003-10-22','weekday 5.5')} NULL
                     98: datetest 2.12 {datetime('2003-10-22 12:34','weekday 0')} {2003-10-26 12:34:00}
                     99: datetest 2.13 {datetime('2003-10-22 12:34','start of month')} \
                    100:    {2003-10-01 00:00:00}
                    101: datetest 2.14 {datetime('2003-10-22 12:34','start of year')} \
                    102:    {2003-01-01 00:00:00}
                    103: datetest 2.15 {datetime('2003-10-22 12:34','start of day')} \
                    104:    {2003-10-22 00:00:00}
                    105: datetest 2.15a {datetime('2003-10-22 12:34','start of')} NULL
                    106: datetest 2.15b {datetime('2003-10-22 12:34','start of bogus')} NULL
                    107: datetest 2.16 time('12:34:56.43') 12:34:56
                    108: datetest 2.17 {datetime('2003-10-22 12:34','1 day')} {2003-10-23 12:34:00}
                    109: datetest 2.18 {datetime('2003-10-22 12:34','+1 day')} {2003-10-23 12:34:00}
                    110: datetest 2.19 {datetime('2003-10-22 12:34','+1.25 day')} {2003-10-23 18:34:00}
                    111: datetest 2.20 {datetime('2003-10-22 12:34','-1.0 day')} {2003-10-21 12:34:00}
                    112: datetest 2.21 {datetime('2003-10-22 12:34','1 month')} {2003-11-22 12:34:00}
                    113: datetest 2.22 {datetime('2003-10-22 12:34','11 month')} {2004-09-22 12:34:00}
                    114: datetest 2.23 {datetime('2003-10-22 12:34','-13 month')} {2002-09-22 12:34:00}
                    115: datetest 2.24 {datetime('2003-10-22 12:34','1.5 months')} {2003-12-07 12:34:00}
                    116: datetest 2.25 {datetime('2003-10-22 12:34','-5 years')} {1998-10-22 12:34:00}
                    117: datetest 2.26 {datetime('2003-10-22 12:34','+10.5 minutes')} \
                    118:   {2003-10-22 12:44:30}
                    119: datetest 2.27 {datetime('2003-10-22 12:34','-1.25 hours')} \
                    120:   {2003-10-22 11:19:00}
                    121: datetest 2.28 {datetime('2003-10-22 12:34','11.25 seconds')} \
                    122:   {2003-10-22 12:34:11}
                    123: datetest 2.29 {datetime('2003-10-22 12:24','+5 bogus')} NULL
                    124: datetest 2.30 {datetime('2003-10-22 12:24','+++')} NULL
                    125: datetest 2.31 {datetime('2003-10-22 12:24','+12.3e4 femtoseconds')} NULL
                    126: datetest 2.32 {datetime('2003-10-22 12:24','+12.3e4 uS')} NULL
                    127: datetest 2.33 {datetime('2003-10-22 12:24','+1 abc')} NULL
                    128: datetest 2.34 {datetime('2003-10-22 12:24','+1 abcd')} NULL
                    129: datetest 2.35 {datetime('2003-10-22 12:24','+1 abcde')} NULL
                    130: datetest 2.36 {datetime('2003-10-22 12:24','+1 abcdef')} NULL
                    131: datetest 2.37 {datetime('2003-10-22 12:24','+1 abcdefg')} NULL
                    132: datetest 2.38 {datetime('2003-10-22 12:24','+1 abcdefgh')} NULL
                    133: datetest 2.39 {datetime('2003-10-22 12:24','+1 abcdefghi')} NULL
                    134: set sqlite_current_time 1199243045
                    135: datetest 2.40 {datetime()} {2008-01-02 03:04:05}
                    136: set sqlite_current_time 0
                    137: datetest 2.41 {datetime('2003-10-22 12:24','23 seconds')} {2003-10-22 12:24:23}
                    138: datetest 2.42 {datetime('2003-10-22 12:24','345 second')} {2003-10-22 12:29:45}
                    139: datetest 2.43 {datetime('2003-10-22 12:24','4 second')} {2003-10-22 12:24:04}
                    140: datetest 2.44 {datetime('2003-10-22 12:24','56 second')} {2003-10-22 12:24:56}
                    141: datetest 2.45 {datetime('2003-10-22 12:24','60 second')} {2003-10-22 12:25:00}
                    142: datetest 2.46 {datetime('2003-10-22 12:24','70 second')} {2003-10-22 12:25:10}
                    143: datetest 2.47 {datetime('2003-10-22 12:24','8.6 seconds')} {2003-10-22 12:24:08}
                    144: datetest 2.48 {datetime('2003-10-22 12:24','9.4 second')} {2003-10-22 12:24:09}
                    145: datetest 2.49 {datetime('2003-10-22 12:24','0000 second')} {2003-10-22 12:24:00}
                    146: datetest 2.50 {datetime('2003-10-22 12:24','0001 second')} {2003-10-22 12:24:01}
                    147: datetest 2.51 {datetime('2003-10-22 12:24','nonsense')} NULL
                    148: 
                    149: datetest 3.1 {strftime('%d','2003-10-31 12:34:56.432')} 31
                    150: datetest 3.2.1 {strftime('pre%fpost','2003-10-31 12:34:56.432')} pre56.432post
                    151: datetest 3.2.2 {strftime('%f','2003-10-31 12:34:59.9999999')} 59.999
                    152: datetest 3.3 {strftime('%H','2003-10-31 12:34:56.432')} 12
                    153: datetest 3.4 {strftime('%j','2003-10-31 12:34:56.432')} 304
                    154: datetest 3.5 {strftime('%J','2003-10-31 12:34:56.432')} 2452944.02426426
                    155: datetest 3.6 {strftime('%m','2003-10-31 12:34:56.432')} 10
                    156: datetest 3.7 {strftime('%M','2003-10-31 12:34:56.432')} 34
                    157: datetest 3.8.1 {strftime('%s','2003-10-31 12:34:56.432')} 1067603696
                    158: datetest 3.8.2 {strftime('%s','2038-01-19 03:14:07')} 2147483647
                    159: datetest 3.8.3 {strftime('%s','2038-01-19 03:14:08')} 2147483648
                    160: datetest 3.8.4 {strftime('%s','2201-04-09 12:00:00')} 7298164800
                    161: datetest 3.8.5 {strftime('%s','9999-12-31 23:59:59')} 253402300799
                    162: datetest 3.8.6 {strftime('%s','1969-12-31 23:59:59')} -1
                    163: datetest 3.8.7 {strftime('%s','1901-12-13 20:45:52')} -2147483648
                    164: datetest 3.8.8 {strftime('%s','1901-12-13 20:45:51')} -2147483649
                    165: datetest 3.8.9 {strftime('%s','1776-07-04 00:00:00')} -6106060800
                    166: datetest 3.9 {strftime('%S','2003-10-31 12:34:56.432')} 56
                    167: datetest 3.10 {strftime('%w','2003-10-31 12:34:56.432')} 5
                    168: datetest 3.11.1 {strftime('%W','2003-10-31 12:34:56.432')} 43
                    169: datetest 3.11.2 {strftime('%W','2004-01-01')} 00
                    170: datetest 3.11.3 {strftime('%W','2004-01-02')} 00
                    171: datetest 3.11.4 {strftime('%W','2004-01-03')} 00
                    172: datetest 3.11.5 {strftime('abc%Wxyz','2004-01-04')} abc00xyz
                    173: datetest 3.11.6 {strftime('%W','2004-01-05')} 01
                    174: datetest 3.11.7 {strftime('%W','2004-01-06')} 01
                    175: datetest 3.11.8 {strftime('%W','2004-01-07')} 01
                    176: datetest 3.11.9 {strftime('%W','2004-01-08')} 01
                    177: datetest 3.11.10 {strftime('%W','2004-01-09')} 01
                    178: datetest 3.11.11 {strftime('%W','2004-07-18')} 28
                    179: datetest 3.11.12 {strftime('%W','2004-12-31')} 52
                    180: datetest 3.11.13 {strftime('%W','2007-12-31')} 53
                    181: datetest 3.11.14 {strftime('%W','2007-01-01')} 01
                    182: datetest 3.11.15 {strftime('%W %j',2454109.04140970)} {02 008}
                    183: datetest 3.11.16 {strftime('%W %j',2454109.04140971)} {02 008}
                    184: datetest 3.11.17 {strftime('%W %j',2454109.04140972)} {02 008}
                    185: datetest 3.11.18 {strftime('%W %j',2454109.04140973)} {02 008}
                    186: datetest 3.11.19 {strftime('%W %j',2454109.04140974)} {02 008}
                    187: datetest 3.11.20 {strftime('%W %j',2454109.04140975)} {02 008}
                    188: datetest 3.11.21 {strftime('%W %j',2454109.04140976)} {02 008}
                    189: datetest 3.11.22 {strftime('%W %j',2454109.04140977)} {02 008}
                    190: datetest 3.11.23 {strftime('%W %j',2454109.04140978)} {02 008}
                    191: datetest 3.11.24 {strftime('%W %j',2454109.04140979)} {02 008}
                    192: datetest 3.11.25 {strftime('%W %j',2454109.04140980)} {02 008}
                    193: datetest 3.11.99 {strftime('%W %j','2454109.04140970')} {02 008}
                    194: datetest 3.12 {strftime('%Y','2003-10-31 12:34:56.432')} 2003
                    195: datetest 3.13 {strftime('%%','2003-10-31 12:34:56.432')} %
                    196: datetest 3.14 {strftime('%_','2003-10-31 12:34:56.432')} NULL
                    197: datetest 3.15 {strftime('%Y-%m-%d','2003-10-31')} 2003-10-31
                    198: proc repeat {n txt} {
                    199:   set x {} 
                    200:   while {$n>0} {
                    201:     append x $txt
                    202:     incr n -1
                    203:   }
                    204:   return $x
                    205: }
                    206: datetest 3.16 "strftime('[repeat 200 %Y]','2003-10-31')" [repeat 200 2003]
                    207: datetest 3.17 "strftime('[repeat 200 abc%m123]','2003-10-31')" \
                    208:     [repeat 200 abc10123]
                    209: 
                    210: foreach c {a b c e g h i k l n o p q r t v x y z
                    211:            A B C D E F G I K L N O P Q R T U V Z
                    212:            0 1 2 3 4 5 6 6 7 9 _} {
                    213:   datetest 3.18.$c "strftime('%$c','2003-10-31')" NULL
                    214: }
                    215: 
                    216: # Ticket #2276.  Make sure leading zeros are inserted where appropriate.
                    217: #
                    218: datetest 3.20 \
                    219:    {strftime('%d/%f/%H/%W/%j/%m/%M/%S/%Y','0421-01-02 03:04:05.006')} \
                    220:    02/05.006/03/00/002/01/04/05/0421
                    221: 
                    222: set sqlite_current_time 1157124367
                    223: datetest 4.1 {date('now')} {2006-09-01}
                    224: set sqlite_current_time 0
                    225: 
                    226: datetest 5.1 {datetime('1994-04-16 14:00:00 +05:00')} {1994-04-16 09:00:00}
                    227: datetest 5.2 {datetime('1994-04-16 14:00:00 -05:15')} {1994-04-16 19:15:00}
                    228: datetest 5.3 {datetime('1994-04-16 05:00:00 +08:30')} {1994-04-15 20:30:00}
                    229: datetest 5.4 {datetime('1994-04-16 14:00:00 -11:55')} {1994-04-17 01:55:00}
                    230: datetest 5.5 {datetime('1994-04-16 14:00:00 -11:60')} NULL
                    231: datetest 5.6 {datetime('1994-04-16 14:00:00 -11:55  ')} {1994-04-17 01:55:00}
                    232: datetest 5.7 {datetime('1994-04-16 14:00:00 -11:55 x')} NULL
                    233: datetest 5.8 {datetime('1994-04-16T14:00:00Z')} {1994-04-16 14:00:00}
                    234: datetest 5.9 {datetime('1994-04-16 14:00:00z')} {1994-04-16 14:00:00}
                    235: datetest 5.10 {datetime('1994-04-16 14:00:00 Z')} {1994-04-16 14:00:00}
                    236: datetest 5.11 {datetime('1994-04-16 14:00:00z    ')} {1994-04-16 14:00:00}
                    237: datetest 5.12 {datetime('1994-04-16 14:00:00     z    ')} {1994-04-16 14:00:00}
                    238: datetest 5.13 {datetime('1994-04-16 14:00:00Zulu')} NULL
                    239: datetest 5.14 {datetime('1994-04-16 14:00:00Z +05:00')} NULL
                    240: datetest 5.15 {datetime('1994-04-16 14:00:00 +05:00 Z')} NULL
                    241: 
                    242: # localtime->utc and utc->localtime conversions.  These tests only work
                    243: # if the localtime is in the US Eastern Time (the time in Charlotte, NC
                    244: # and in New York.)
                    245: #
                    246: # On non-Vista Windows platform, '2006-03-31' is treated incorrectly as being
                    247: # in DST giving a 4 hour offset instead of 5.  In 2007, DST was extended to 
                    248: # start three weeks earlier (second Sunday in March) and end one week
                    249: # later (first Sunday in November).  Older Windows systems apply this
                    250: # new rule incorrectly to dates prior to 2007.
                    251: #
                    252: # It might be argued that this is masking a problem on non-Vista Windows
                    253: # platform.  A ticket has already been opened for this issue 
                    254: # (http://www.sqlite.org/cvstrac/tktview?tn=2322).  This is just to prevent
                    255: # more confusion/reports of the issue.
                    256: #
                    257: 
                    258: # $tzoffset_old should be 5 if DST is working correctly.
                    259: set tzoffset_old [db one {
                    260:   SELECT CAST(24*(julianday('2006-03-31') -
                    261:                   julianday('2006-03-31','localtime'))+0.5
                    262:               AS INT)
                    263: }]
                    264: 
                    265: # $tzoffset_new should be 4 if DST is working correctly.
                    266: set tzoffset_new [db one {
                    267:   SELECT CAST(24*(julianday('2007-03-31') -
                    268:                   julianday('2007-03-31','localtime'))+0.5
                    269:               AS INT)
                    270: }]
                    271: 
                    272: # Warn about possibly broken Windows DST implementations.
                    273: if {$::tcl_platform(platform)=="windows" && $tzoffset_new==4 && $tzoffset_old==4} {
                    274:   puts "******************************************************************"
                    275:   puts "N.B.:  The DST support provided by your current O/S seems to be"
                    276:   puts "suspect in that it is reporting incorrect DST values for dates"
                    277:   puts "prior to 2007.  This is the known case for most (all?) non-Vista"
                    278:   puts "Windows versions.  Please see ticket #2322 for more information."
                    279:   puts "******************************************************************"
                    280: }
                    281: 
                    282: if {$tzoffset_new==4} {
                    283:   datetest 6.1 {datetime('2000-10-29 05:59:00','localtime')}\
                    284:       {2000-10-29 01:59:00}
                    285:   datetest 6.1.1 {datetime('2006-10-29 05:59:00','localtime')}\
                    286:       {2006-10-29 01:59:00}
                    287:   datetest 6.1.2 {datetime('2007-11-04 05:59:00','localtime')}\
                    288:       {2007-11-04 01:59:00}
                    289: 
                    290:   # If the new and old DST rules seem to be working correctly...
                    291:   if {$tzoffset_new==4 && $tzoffset_old==5} {
                    292:     datetest 6.2 {datetime('2000-10-29 06:00:00','localtime')}\
                    293:         {2000-10-29 01:00:00}
                    294:     datetest 6.2.1 {datetime('2006-10-29 06:00:00','localtime')}\
                    295:         {2006-10-29 01:00:00}
                    296:   }
                    297:   datetest 6.2.2 {datetime('2007-11-04 06:00:00','localtime')}\
                    298:       {2007-11-04 01:00:00}
                    299: 
                    300:   # If the new and old DST rules seem to be working correctly...
                    301:   if {$tzoffset_new==4 && $tzoffset_old==5} {
                    302:     datetest 6.3 {datetime('2000-04-02 06:59:00','localtime')}\
                    303:         {2000-04-02 01:59:00}
                    304:     datetest 6.3.1 {datetime('2006-04-02 06:59:00','localtime')}\
                    305:         {2006-04-02 01:59:00}
                    306:   }
                    307:   datetest 6.3.2 {datetime('2007-03-11 07:00:00','localtime')}\
                    308:       {2007-03-11 03:00:00}
                    309: 
                    310:   datetest 6.4 {datetime('2000-04-02 07:00:00','localtime')}\
                    311:       {2000-04-02 03:00:00}
                    312:   datetest 6.4.1 {datetime('2006-04-02 07:00:00','localtime')}\
                    313:       {2006-04-02 03:00:00}
                    314:   datetest 6.4.2 {datetime('2007-03-11 07:00:00','localtime')}\
                    315:       {2007-03-11 03:00:00}
                    316:       
                    317:   datetest 6.5 {datetime('2000-10-29 01:59:00','utc')} {2000-10-29 05:59:00}
                    318:   datetest 6.5.1 {datetime('2006-10-29 01:59:00','utc')} {2006-10-29 05:59:00}
                    319:   datetest 6.5.2 {datetime('2007-11-04 01:59:00','utc')} {2007-11-04 05:59:00}
                    320: 
                    321:   # If the new and old DST rules seem to be working correctly...
                    322:   if {$tzoffset_new==4 && $tzoffset_old==5} {
                    323:     datetest 6.6 {datetime('2000-10-29 02:00:00','utc')} {2000-10-29 07:00:00}
                    324:     datetest 6.6.1 {datetime('2006-10-29 02:00:00','utc')} {2006-10-29 07:00:00}
                    325:   }
                    326:   datetest 6.6.2 {datetime('2007-11-04 02:00:00','utc')} {2007-11-04 07:00:00}
                    327: 
                    328:   # If the new and old DST rules seem to be working correctly...
                    329:   if {$tzoffset_new==4 && $tzoffset_old==5} {
                    330:     datetest 6.7 {datetime('2000-04-02 01:59:00','utc')} {2000-04-02 06:59:00}
                    331:     datetest 6.7.1 {datetime('2006-04-02 01:59:00','utc')} {2006-04-02 06:59:00}
                    332:   }
                    333:   datetest 6.7.2 {datetime('2007-03-11 01:59:00','utc')} {2007-03-11 06:59:00}
                    334: 
                    335:   datetest 6.8 {datetime('2000-04-02 02:00:00','utc')} {2000-04-02 06:00:00}
                    336:   datetest 6.8.1 {datetime('2006-04-02 02:00:00','utc')} {2006-04-02 06:00:00}
                    337:   datetest 6.8.2 {datetime('2007-03-11 02:00:00','utc')} {2007-03-11 06:00:00}
                    338: 
                    339:   datetest 6.10 {datetime('2000-01-01 12:00:00','localtime')} \
                    340:       {2000-01-01 07:00:00}
                    341:   datetest 6.11 {datetime('1969-01-01 12:00:00','localtime')} \
                    342:       {1969-01-01 07:00:00}
                    343:   datetest 6.12 {datetime('2039-01-01 12:00:00','localtime')} \
                    344:       {2039-01-01 07:00:00}
                    345:   datetest 6.13 {datetime('2000-07-01 12:00:00','localtime')} \
                    346:       {2000-07-01 08:00:00}
                    347:   datetest 6.14 {datetime('1969-07-01 12:00:00','localtime')} \
                    348:       {1969-07-01 07:00:00}
                    349:   datetest 6.15 {datetime('2039-07-01 12:00:00','localtime')} \
                    350:       {2039-07-01 07:00:00}
                    351:   set sqlite_current_time \
                    352:      [db eval {SELECT strftime('%s','2000-07-01 12:34:56')}]
                    353:   datetest 6.16 {datetime('now','localtime')} {2000-07-01 08:34:56}
                    354:   datetest 6.17 {datetime('now','localtimex')} NULL
                    355:   datetest 6.18 {datetime('now','localtim')} NULL
                    356:   set sqlite_current_time 0
                    357: }
                    358: 
                    359: # These two are a bit of a scam. They are added to ensure that 100% of
                    360: # the date.c file is covered by testing, even when the time-zone
                    361: # is not -0400 (the condition for running of the block of tests above).
                    362: #
                    363: datetest 6.19 {datetime('2039-07-01 12:00:00','localtime',null)} NULL
                    364: datetest 6.20 {datetime('2039-07-01 12:00:00','utc',null)} NULL
                    365: 
                    366: # Date-time functions that contain NULL arguments return a NULL
                    367: # result.
                    368: #
                    369: datetest 7.1 {datetime(null)} NULL
                    370: datetest 7.2 {datetime('now',null)} NULL
                    371: datetest 7.3 {datetime('now','localtime',null)} NULL
                    372: datetest 7.4 {time(null)} NULL
                    373: datetest 7.5 {time('now',null)} NULL
                    374: datetest 7.6 {time('now','localtime',null)} NULL
                    375: datetest 7.7 {date(null)} NULL
                    376: datetest 7.8 {date('now',null)} NULL
                    377: datetest 7.9 {date('now','localtime',null)} NULL
                    378: datetest 7.10 {julianday(null)} NULL
                    379: datetest 7.11 {julianday('now',null)} NULL
                    380: datetest 7.12 {julianday('now','localtime',null)} NULL
                    381: datetest 7.13 {strftime(null,'now')} NULL
                    382: datetest 7.14 {strftime('%s',null)} NULL
                    383: datetest 7.15 {strftime('%s','now',null)} NULL
                    384: datetest 7.16 {strftime('%s','now','localtime',null)} NULL
                    385: 
                    386: # Test modifiers when the date begins as a julian day number - to
                    387: # make sure the HH:MM:SS is preserved.  Ticket #551.
                    388: #
                    389: set sqlite_current_time [db eval {SELECT strftime('%s','2003-10-22 12:34:00')}]
                    390: datetest 8.1 {datetime('now','weekday 0')} {2003-10-26 12:34:00}
                    391: datetest 8.2 {datetime('now','weekday 1')} {2003-10-27 12:34:00}
                    392: datetest 8.3 {datetime('now','weekday 2')} {2003-10-28 12:34:00}
                    393: datetest 8.4 {datetime('now','weekday 3')} {2003-10-22 12:34:00}
                    394: datetest 8.5 {datetime('now','start of month')} {2003-10-01 00:00:00}
                    395: datetest 8.6 {datetime('now','start of year')} {2003-01-01 00:00:00}
                    396: datetest 8.7 {datetime('now','start of day')} {2003-10-22 00:00:00}
                    397: datetest 8.8 {datetime('now','1 day')} {2003-10-23 12:34:00}
                    398: datetest 8.9 {datetime('now','+1 day')} {2003-10-23 12:34:00}
                    399: datetest 8.10 {datetime('now','+1.25 day')} {2003-10-23 18:34:00}
                    400: datetest 8.11 {datetime('now','-1.0 day')} {2003-10-21 12:34:00}
                    401: datetest 8.12 {datetime('now','1 month')} {2003-11-22 12:34:00}
                    402: datetest 8.13 {datetime('now','11 month')} {2004-09-22 12:34:00}
                    403: datetest 8.14 {datetime('now','-13 month')} {2002-09-22 12:34:00}
                    404: datetest 8.15 {datetime('now','1.5 months')} {2003-12-07 12:34:00}
                    405: datetest 8.16 {datetime('now','-5 years')} {1998-10-22 12:34:00}
                    406: datetest 8.17 {datetime('now','+10.5 minutes')} {2003-10-22 12:44:30}
                    407: datetest 8.18 {datetime('now','-1.25 hours')} {2003-10-22 11:19:00}
                    408: datetest 8.19 {datetime('now','11.25 seconds')} {2003-10-22 12:34:11}
                    409: datetest 8.90 {datetime('now','abcdefghijklmnopqrstuvwyxzABCDEFGHIJLMNOP')} NULL
                    410: set sqlite_current_time 0
                    411: 
                    412: # Negative years work.  Example:  '-4713-11-26' is JD 1.5.
                    413: #
                    414: datetest 9.1 {julianday('-4713-11-24 12:00:00')} {0.0}
                    415: datetest 9.2 {julianday(datetime(5))} {5.0}
                    416: datetest 9.3 {julianday(datetime(10))} {10.0}
                    417: datetest 9.4 {julianday(datetime(100))} {100.0}
                    418: datetest 9.5 {julianday(datetime(1000))} {1000.0}
                    419: datetest 9.6 {julianday(datetime(10000))} {10000.0}
                    420: datetest 9.7 {julianday(datetime(100000))} {100000.0}
                    421: 
                    422: # datetime() with just an HH:MM:SS correctly inserts the date 2000-01-01.
                    423: #
                    424: datetest 10.1 {datetime('01:02:03')}  {2000-01-01 01:02:03}
                    425: datetest 10.2 {date('01:02:03')}  {2000-01-01}
                    426: datetest 10.3 {strftime('%Y-%m-%d %H:%M','01:02:03')} {2000-01-01 01:02}
                    427: 
                    428: # Test the new HH:MM:SS modifier
                    429: #
                    430: datetest 11.1 {datetime('2004-02-28 20:00:00', '-01:20:30')} \
                    431:    {2004-02-28 18:39:30}
                    432: datetest 11.2 {datetime('2004-02-28 20:00:00', '+12:30:00')} \
                    433:    {2004-02-29 08:30:00}
                    434: datetest 11.3 {datetime('2004-02-28 20:00:00', '+12:30')} \
                    435:    {2004-02-29 08:30:00}
                    436: datetest 11.4 {datetime('2004-02-28 20:00:00', '12:30')} \
                    437:    {2004-02-29 08:30:00}
                    438: datetest 11.5 {datetime('2004-02-28 20:00:00', '-12:00')} \
                    439:    {2004-02-28 08:00:00}
                    440: datetest 11.6 {datetime('2004-02-28 20:00:00', '-12:01')} \
                    441:    {2004-02-28 07:59:00}
                    442: datetest 11.7 {datetime('2004-02-28 20:00:00', '-11:59')} \
                    443:    {2004-02-28 08:01:00}
                    444: datetest 11.8 {datetime('2004-02-28 20:00:00', '11:59')} \
                    445:    {2004-02-29 07:59:00}
                    446: datetest 11.9 {datetime('2004-02-28 20:00:00', '12:01')} \
                    447:    {2004-02-29 08:01:00}
                    448: datetest 11.10 {datetime('2004-02-28 20:00:00', '12:60')} NULL
                    449: 
                    450: # Ticket #1964
                    451: datetest 12.1 {datetime('2005-09-01')} {2005-09-01 00:00:00}
                    452: datetest 12.2 {datetime('2005-09-01','+0 hours')} {2005-09-01 00:00:00}
                    453: 
                    454: # Ticket #1991
                    455: do_test date-13.1 {
                    456:   execsql {
                    457:     SELECT strftime('%Y-%m-%d %H:%M:%f', julianday('2006-09-24T10:50:26.047'))
                    458:   }
                    459: } {{2006-09-24 10:50:26.047}}
                    460: 
                    461: # Ticket #2153
                    462: datetest 13.2 {strftime('%Y-%m-%d %H:%M:%S', '2007-01-01 12:34:59.6')} \
                    463:   {2007-01-01 12:34:59}
                    464: datetest 13.3 {strftime('%Y-%m-%d %H:%M:%f', '2007-01-01 12:34:59.6')} \
                    465:   {2007-01-01 12:34:59.600}
                    466: datetest 13.4 {strftime('%Y-%m-%d %H:%M:%S', '2007-01-01 12:59:59.6')} \
                    467:   {2007-01-01 12:59:59}
                    468: datetest 13.5 {strftime('%Y-%m-%d %H:%M:%f', '2007-01-01 12:59:59.6')} \
                    469:   {2007-01-01 12:59:59.600}
                    470: datetest 13.6 {strftime('%Y-%m-%d %H:%M:%S', '2007-01-01 23:59:59.6')} \
                    471:   {2007-01-01 23:59:59}
                    472: datetest 13.7 {strftime('%Y-%m-%d %H:%M:%f', '2007-01-01 23:59:59.6')} \
                    473:   {2007-01-01 23:59:59.600}
                    474: 
                    475: # Ticket #3618
                    476: datetest 13.11 {julianday(2454832.5,'-1 day')} {2454831.5}
                    477: datetest 13.12 {julianday(2454832.5,'+1 day')} {2454833.5}
                    478: datetest 13.13 {julianday(2454832.5,'-1.5 day')} {2454831.0}
                    479: datetest 13.14 {julianday(2454832.5,'+1.5 day')} {2454834.0}
                    480: datetest 13.15 {julianday(2454832.5,'-3 hours')} {2454832.375}
                    481: datetest 13.16 {julianday(2454832.5,'+3 hours')} {2454832.625}
                    482: datetest 13.17 {julianday(2454832.5,'-45 minutes')} {2454832.46875}
                    483: datetest 13.18 {julianday(2454832.5,'+45 minutes')} {2454832.53125}
                    484: datetest 13.19 {julianday(2454832.5,'-675 seconds')} {2454832.4921875}
                    485: datetest 13.20 {julianday(2454832.5,'+675 seconds')} {2454832.5078125}
                    486: datetest 13.21 {julianday(2454832.5,'-1.5 months')} {2454786.5}
                    487: datetest 13.22 {julianday(2454832.5,'+1.5 months')} {2454878.5}
                    488: datetest 13.23 {julianday(2454832.5,'-1.5 years')} {2454284.0}
                    489: datetest 13.24 {julianday(2454832.5,'+1.5 years')} {2455380.0}
                    490: 
                    491: datetest 13.30 {date('2000-01-01','+1.5 years')} {2001-07-02}
                    492: datetest 13.31 {date('2001-01-01','+1.5 years')} {2002-07-02}
                    493: datetest 13.32 {date('2002-01-01','+1.5 years')} {2003-07-02}
                    494: datetest 13.33 {date('2002-01-01','-1.5 years')} {2000-07-02}
                    495: datetest 13.34 {date('2001-01-01','-1.5 years')} {1999-07-02}
                    496: 
                    497: # Test for issues reported by BareFeet (list.sql at tandb.com.au)
                    498: # on mailing list on 2008-06-12.
                    499: #
                    500: # Put a floating point number in the database so that we can manipulate
                    501: # raw bits using the hexio interface.
                    502: #
                    503: if {0==[sqlite3 -has-codec]} {
                    504:   do_test date-14.1 {
                    505:     execsql {
                    506:       PRAGMA auto_vacuum=OFF;
                    507:       PRAGMA page_size = 1024;
                    508:       CREATE TABLE t1(x);
                    509:       INSERT INTO t1 VALUES(1.1);
                    510:     }
                    511:     db close
                    512:     hexio_write test.db 2040 4142ba32bffffff9
                    513:     sqlite3 db test.db
                    514:     db eval {SELECT * FROM t1}
                    515:   } {2454629.5}
                    516:   
                    517:   # Changing the least significant byte of the floating point value between
                    518:   # 00 and FF should always generate a time of either 23:59:59 or 00:00:00,
                    519:   # never 24:00:00
                    520:   #
                    521:   for {set i 0} {$i<=255} {incr i} {
                    522:     db close
                    523:     hexio_write test.db 2047 [format %02x $i]
                    524:     sqlite3 db test.db
                    525:     do_test date-14.2.$i {
                    526:       set date [db one {SELECT datetime(x) FROM t1}]
                    527:       expr {$date eq "2008-06-12 00:00:00" || $date eq "2008-06-11 23:59:59"}
                    528:     } {1}
                    529:   }
                    530: }
                    531: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>