```/* <![CDATA[ */
function get_sym_list(){return [];} /* ]]> */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: boundary1.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 boundary1
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
135set nums3 \$nums2
136lappend nums3 9.22337303685477580800e+18
137lappend nums3 -9.22337303685477580800e+18
138
139set i 0
140foreach r \$nums3 {
141  incr i
142
143  if {abs(\$r)<9.22337203685477580800e+18} {
144    set x \$t1rx(\$r)
145    set a \$t1ra(\$r)
146    set r5 \$r.5
147    set r0 \$r.0
148    puts "do_test \$tname-2.\$i.1 \173"
149    puts "  db eval \173"
150    puts "    SELECT * FROM t1 WHERE rowid=\$r"
151    puts "  \175"
152    puts "\175 {\$a \$x}"
153    puts "do_test \$tname-2.\$i.2 \173"
154    puts "  db eval \173"
155    puts "    SELECT rowid, a FROM t1 WHERE x='\$x'"
156    puts "  \175"
157    puts "\175 {\$r \$a}"
158    puts "do_test \$tname-2.\$i.3 \173"
159    puts "  db eval \173"
160    puts "    SELECT rowid, x FROM t1 WHERE a=\$a"
161    puts "  \175"
162    puts "\175 {\$r \$x}"
163  }
164
165  foreach op {> >= < <=} subno {gt ge lt le} {
166
167    ################################################################ 2.x.y.1
168    set rset {}
169    set aset {}
170    foreach rx \$nums2 {
171      if "\\$rx \$op \\$r" {
172        lappend rset \$rx
173        lappend aset \$t1ra(\$rx)
174      }
175    }
176    puts "do_test \$tname-2.\$i.\$subno.1 \173"
177    puts "  db eval \173"
178    puts "    SELECT a FROM t1 WHERE rowid \$op \$r ORDER BY a"
179    puts "  \175"
180    puts "\175 {[sort \$aset]}"
181
182    ################################################################ 2.x.y.2
183    puts "do_test \$tname-2.\$i.\$subno.2 \173"
184    puts "  db eval \173"
185    puts "    SELECT a FROM t1 WHERE rowid \$op \$r ORDER BY a DESC"
186    puts "  \175"
187    puts "\175 {[reverse [sort \$aset]]}"
188
189    ################################################################ 2.x.y.3
190    set aset {}
191    foreach rx [sort \$rset] {
192      lappend aset \$t1ra(\$rx)
193    }
194    puts "do_test \$tname-2.\$i.\$subno.3 \173"
195    puts "  db eval \173"
196    puts "    SELECT a FROM t1 WHERE rowid \$op \$r ORDER BY rowid"
197    puts "  \175"
198    puts "\175 {\$aset}"
199
200    ################################################################ 2.x.y.4
201    set aset {}
202    foreach rx [reverse [sort \$rset]] {
203      lappend aset \$t1ra(\$rx)
204    }
205    puts "do_test \$tname-2.\$i.\$subno.4 \173"
206    puts "  db eval \173"
207    puts "    SELECT a FROM t1 WHERE rowid \$op \$r ORDER BY rowid DESC"
208    puts "  \175"
209    puts "\175 {\$aset}"
210
211    ################################################################ 2.x.y.5
212    set aset {}
213    set xset {}
214    foreach rx \$rset {
215      lappend xset \$t1rx(\$rx)
216    }
217    foreach x [sort \$xset] {
218      set rx \$t1xr(\$x)
219      lappend aset \$t1ra(\$rx)
220    }
221    puts "do_test \$tname-2.\$i.\$subno.5 \173"
222    puts "  db eval \173"
223    puts "    SELECT a FROM t1 WHERE rowid \$op \$r ORDER BY x"
224    puts "  \175"
225    puts "\175 {\$aset}"
226
227    ################################################################ 2.x.y.10
228    if {abs(\$r)>9223372036854775808 || [string length \$r5]>15} continue
229    set rset {}
230    set aset {}
231    foreach rx \$nums2 {
232      if "\\$rx \$op \\$r0" {
233        lappend rset \$rx
234      }
235    }
236    foreach rx [sort \$rset] {
237      lappend aset \$t1ra(\$rx)
238    }
239    puts "do_test \$tname-2.\$i.\$subno.10 \173"
240    puts "  db eval \173"
241    puts "    SELECT a FROM t1 WHERE rowid \$op \$r0 ORDER BY rowid"
242    puts "  \175"
243    puts "\175 {\$aset}"
244
245    ################################################################ 2.x.y.11
246    set aset {}
247    foreach rx [reverse [sort \$rset]] {
248      lappend aset \$t1ra(\$rx)
249    }
250    puts "do_test \$tname-2.\$i.\$subno.11 \173"
251    puts "  db eval \173"
252    puts "    SELECT a FROM t1 WHERE rowid \$op \$r0 ORDER BY rowid DESC"
253    puts "  \175"
254    puts "\175 {\$aset}"
255
256
257    ################################################################ 2.x.y.12
258    set rset {}
259    set aset {}
260    foreach rx \$nums2 {
261      if "\\$rx \$op \\$r5" {
262        lappend rset \$rx
263      }
264    }
265    foreach rx [sort \$rset] {
266      lappend aset \$t1ra(\$rx)
267    }
268    puts "do_test \$tname-2.\$i.\$subno.12 \173"
269    puts "  db eval \173"
270    puts "    SELECT a FROM t1 WHERE rowid \$op \$r5 ORDER BY rowid"
271    puts "  \175"
272    puts "\175 {\$aset}"
273
274    ################################################################ 2.x.y.13
275    set aset {}
276    foreach rx [reverse [sort \$rset]] {
277      lappend aset \$t1ra(\$rx)
278    }
279    puts "do_test \$tname-2.\$i.\$subno.13 \173"
280    puts "  db eval \173"
281    puts "    SELECT a FROM t1 WHERE rowid \$op \$r5 ORDER BY rowid DESC"
282    puts "  \175"
283    puts "\175 {\$aset}"
284  }
285
286}
287
288
289puts {finish_test}
290```