boundary3.tcl 7.3 KB

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