1puts {# 2008 December 11
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# This file is automatically generated from a separate TCL script.
14# This file seeks to exercise integer boundary values.
15#
16# $Id: boundary3.tcl,v 1.3 2009/01/02 15:45:48 shane Exp $
17
18set testdir [file dirname $argv0]
19source $testdir/tester.tcl
20
21# Many of the boundary tests depend on a working 64-bit implementation.
22if {![working_64bit_int]} { finish_test; return }
23}
24
25expr srand(0)
26
27# Generate interesting boundary numbers
28#
29foreach x {
30  0
31  1
32  0x7f
33  0x7fff
34  0x7fffff
35  0x7fffffff
36  0x7fffffffff
37  0x7fffffffffff
38  0x7fffffffffffff
39  0x7fffffffffffffff
40} {
41  set x [expr {wide($x)}]
42  set boundarynum($x) 1
43  set boundarynum([expr {$x+1}]) 1
44  set boundarynum([expr {-($x+1)}]) 1
45  set boundarynum([expr {-($x+2)}]) 1
46  set boundarynum([expr {$x+$x+1}]) 1
47  set boundarynum([expr {$x+$x+2}]) 1
48}
49set x [expr {wide(127)}]
50for {set i 1} {$i<=9} {incr i} {
51  set boundarynum($x) 1
52  set boundarynum([expr {$x+1}]) 1
53  set x [expr {wide($x*128 + 127)}]
54}
55
56# Scramble the $inlist into a random order.
57#
58proc scramble {inlist} {
59  set y {}
60  foreach x $inlist {
61    lappend y [list [expr {rand()}] $x]
62  }
63  set y [lsort $y]
64  set outlist {}
65  foreach x $y {
66    lappend outlist [lindex $x 1]
67  }
68  return $outlist
69}
70
71# A simple selection sort.  Not trying to be efficient.
72#
73proc sort {inlist} {
74  set outlist {}
75  set mn [lindex $inlist 0]
76  foreach x $inlist {
77    if {$x<$mn} {set mn $x}
78  }
79  set outlist $mn
80  set mx $mn
81  while {1} {
82    set valid 0
83    foreach x $inlist {
84      if {$x>$mx && (!$valid || $mn>$x)} {
85        set mn $x
86        set valid 1
87      }
88    }
89    if {!$valid} break
90    lappend outlist $mn
91    set mx $mn
92  }
93  return $outlist
94}
95
96# Reverse the order of a list
97#
98proc reverse {inlist} {
99  set i [llength $inlist]
100  set outlist {}
101  for {incr i -1} {$i>=0} {incr i -1} {
102    lappend outlist [lindex $inlist $i]
103  }
104  return $outlist
105}
106
107set nums1 [scramble [array names boundarynum]]
108set nums2 [scramble [array names boundarynum]]
109
110set tname boundary3
111puts "do_test $tname-1.1 \173"
112puts "  db eval \173"
113puts "    CREATE TABLE t1(a,x);"
114set a 0
115foreach r $nums1 {
116  incr a
117  set t1ra($r) $a
118  set t1ar($a) $r
119  set x [format %08x%08x [expr {wide($r)>>32}] $r]
120  set t1rx($r) $x
121  set t1xr($x) $r
122  puts "    INSERT INTO t1(oid,a,x) VALUES($r,$a,'$x');"
123}
124puts "    CREATE INDEX t1i1 ON t1(a);"
125puts "    CREATE INDEX t1i2 ON t1(x);"
126puts "  \175"
127puts "\175 {}"
128
129puts "do_test $tname-1.2 \173"
130puts "  db eval \173"
131puts "    SELECT count(*) FROM t1"
132puts "  \175"
133puts "\175 {64}"
134
135puts "do_test $tname-1.3 \173"
136puts "  db eval \173"
137puts "    CREATE TABLE t2(r,a);"
138puts "    INSERT INTO t2 SELECT rowid, a FROM t1;"
139puts "    CREATE INDEX t2i1 ON t2(r);"
140puts "    CREATE INDEX t2i2 ON t2(a);"
141puts "    INSERT INTO t2 VALUES(9.22337303685477580800e+18,65);"
142set t1ra(9.22337303685477580800e+18) 65
143set t1ar(65) 9.22337303685477580800e+18)
144puts "    INSERT INTO t2 VALUES(-9.22337303685477580800e+18,66);"
145set t1ra(-9.22337303685477580800e+18) 66
146set t1ar(66) -9.22337303685477580800e+18)
147puts "    SELECT count(*) FROM t2;"
148puts "  \175"
149puts "\175 {66}"
150
151set nums3 $nums2
152lappend nums3 9.22337303685477580800e+18
153lappend nums3 -9.22337303685477580800e+18
154
155set i 0
156foreach r $nums3 {
157  incr i
158
159  set r5 $r.5
160  set r0 $r.0
161  if {abs($r)<9.22337203685477580800e+18} {
162    set x $t1rx($r)
163    set a $t1ra($r)
164    puts "do_test $tname-2.$i.1 \173"
165    puts "  db eval \173"
166    puts "    SELECT t1.* FROM t1, t2 WHERE t1.rowid=$r AND t2.a=t1.a"
167    puts "  \175"
168    puts "\175 {$a $x}"
169    puts "do_test $tname-2.$i.2 \173"
170    puts "  db eval \173"
171    puts "    SELECT t2.* FROM t1 JOIN t2 USING(a) WHERE x='$x'"
172    puts "  \175"
173    puts "\175 {$r $a}"
174    puts "do_test $tname-2.$i.3 \173"
175    puts "  db eval \173"
176    puts "    SELECT t1.rowid, x FROM t1 JOIN t2 ON t2.r=t1.rowid WHERE t2.a=$a"
177    puts "  \175"
178    puts "\175 {$r $x}"
179  }
180
181  foreach op {> >= < <=} subno {gt ge lt le} {
182
183    ################################################################ 2.x.y.1
184    set rset {}
185    set aset {}
186    foreach rx $nums2 {
187      if "\$rx $op \$r" {
188        lappend rset $rx
189        lappend aset $t1ra($rx)
190      }
191    }
192    puts "do_test $tname-2.$i.$subno.1 \173"
193    puts "  db eval \173"
194    puts "    SELECT t2.a FROM t1 JOIN t2 USING(a)"
195    puts "     WHERE t1.rowid $op $r ORDER BY t2.a"
196    puts "  \175"
197    puts "\175 {[sort $aset]}"
198
199    ################################################################ 2.x.y.2
200    puts "do_test $tname-2.$i.$subno.2 \173"
201    puts "  db eval \173"
202    puts "    SELECT t2.a FROM t2 NATURAL JOIN t1"
203    puts "     WHERE t1.rowid $op $r ORDER BY t1.a DESC"
204    puts "  \175"
205    puts "\175 {[reverse [sort $aset]]}"
206
207
208    ################################################################ 2.x.y.3
209    set ax $t1ra($r)
210    set aset {}
211    foreach rx [sort $rset] {
212      lappend aset $t1ra($rx)
213    }
214    puts "do_test $tname-2.$i.$subno.3 \173"
215    puts "  db eval \173"
216    puts "    SELECT t1.a FROM t1 JOIN t2 ON t1.rowid $op t2.r"
217    puts "     WHERE t2.a=$ax"
218    puts "     ORDER BY t1.rowid"
219    puts "  \175"
220    puts "\175 {$aset}"
221
222    ################################################################ 2.x.y.4
223    set aset {}
224    foreach rx [reverse [sort $rset]] {
225      lappend aset $t1ra($rx)
226    }
227    puts "do_test $tname-2.$i.$subno.4 \173"
228    puts "  db eval \173"
229    puts "    SELECT t1.a FROM t1 JOIN t2 ON t1.rowid $op t2.r"
230    puts "     WHERE t2.a=$ax"
231    puts "     ORDER BY t1.rowid DESC"
232    puts "  \175"
233    puts "\175 {$aset}"
234
235    ################################################################ 2.x.y.5
236    set aset {}
237    set xset {}
238    foreach rx $rset {
239      lappend xset $t1rx($rx)
240    }
241    foreach x [sort $xset] {
242      set rx $t1xr($x)
243      lappend aset $t1ra($rx)
244    }
245    puts "do_test $tname-2.$i.$subno.5 \173"
246    puts "  db eval \173"
247    puts "    SELECT t1.a FROM t1 JOIN t2 ON t1.rowid $op t2.r"
248    puts "     WHERE t2.a=$ax"
249    puts "     ORDER BY x"
250    puts "  \175"
251    puts "\175 {$aset}"
252
253    ################################################################ 2.x.y.10
254    if {[string length $r5]>15} continue
255    set rset {}
256    set aset {}
257    foreach rx $nums2 {
258      if "\$rx $op \$r0" {
259        lappend rset $rx
260      }
261    }
262    foreach rx [sort $rset] {
263      lappend aset $t1ra($rx)
264    }
265    puts "do_test $tname-2.$i.$subno.10 \173"
266    puts "  db eval \173"
267    puts "    SELECT t1.a FROM t1 JOIN t2 ON t1.rowid $op CAST(t2.r AS real)"
268    puts "     WHERE t2.a=$ax"
269    puts "     ORDER BY t1.rowid"
270    puts "  \175"
271    puts "\175 {$aset}"
272
273    ################################################################ 2.x.y.11
274    set aset {}
275    foreach rx [reverse [sort $rset]] {
276      lappend aset $t1ra($rx)
277    }
278    puts "do_test $tname-2.$i.$subno.11 \173"
279    puts "  db eval \173"
280    puts "    SELECT t1.a FROM t1 JOIN t2 ON t1.rowid $op CAST(t2.r AS real)"
281    puts "     WHERE t2.a=$ax"
282    puts "     ORDER BY t1.rowid DESC"
283    puts "  \175"
284    puts "\175 {$aset}"
285  }
286
287}
288
289
290puts {finish_test}
291