PageRenderTime 31ms CodeModel.GetById 0ms RepoModel.GetById 0ms app.codeStats 0ms

/test/boundary2.tcl

https://bitbucket.org/aware/sqlite
TCL | 445 lines | 363 code | 40 blank | 42 comment | 21 complexity | dcef8abe195a2cd34d19ac499adb76a8 MD5 | raw file
  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. # $Id:$
  17. set testdir [file dirname $argv0]
  18. source $testdir/tester.tcl
  19. # Many of the boundary tests depend on a working 64-bit implementation.
  20. if {![working_64bit_int]} { finish_test; return }
  21. }
  22. expr srand(0)
  23. # Generate interesting boundary numbers
  24. #
  25. foreach x {
  26. 0
  27. 1
  28. 0x7f
  29. 0x7fff
  30. 0x7fffff
  31. 0x7fffffff
  32. 0x7fffffffff
  33. 0x7fffffffffff
  34. 0x7fffffffffffff
  35. 0x7fffffffffffffff
  36. } {
  37. set x [expr {wide($x)}]
  38. set boundarynum($x) 1
  39. set boundarynum([expr {$x+1}]) 1
  40. set boundarynum([expr {-($x+1)}]) 1
  41. set boundarynum([expr {-($x+2)}]) 1
  42. set boundarynum([expr {$x+$x+1}]) 1
  43. set boundarynum([expr {$x+$x+2}]) 1
  44. }
  45. set x [expr {wide(127)}]
  46. for {set i 1} {$i<=9} {incr i} {
  47. set boundarynum($x) 1
  48. set boundarynum([expr {$x+1}]) 1
  49. set x [expr {wide($x*128 + 127)}]
  50. }
  51. # Scramble the $inlist into a random order.
  52. #
  53. proc scramble {inlist} {
  54. set y {}
  55. foreach x $inlist {
  56. lappend y [list [expr {rand()}] $x]
  57. }
  58. set y [lsort $y]
  59. set outlist {}
  60. foreach x $y {
  61. lappend outlist [lindex $x 1]
  62. }
  63. return $outlist
  64. }
  65. # A simple selection sort. Not trying to be efficient.
  66. #
  67. proc sort {inlist} {
  68. set outlist {}
  69. set mn [lindex $inlist 0]
  70. foreach x $inlist {
  71. if {$x<$mn} {set mn $x}
  72. }
  73. set outlist $mn
  74. set mx $mn
  75. while {1} {
  76. set valid 0
  77. foreach x $inlist {
  78. if {$x>$mx && (!$valid || $mn>$x)} {
  79. set mn $x
  80. set valid 1
  81. }
  82. }
  83. if {!$valid} break
  84. lappend outlist $mn
  85. set mx $mn
  86. }
  87. return $outlist
  88. }
  89. # Reverse the order of a list
  90. #
  91. proc reverse {inlist} {
  92. set i [llength $inlist]
  93. set outlist {}
  94. for {incr i -1} {$i>=0} {incr i -1} {
  95. lappend outlist [lindex $inlist $i]
  96. }
  97. return $outlist
  98. }
  99. set nums1 [scramble [array names boundarynum]]
  100. set nums2 [scramble [array names boundarynum]]
  101. set tname boundary2
  102. puts "do_test $tname-1.1 \173"
  103. puts " db eval \173"
  104. puts " CREATE TABLE t1(r INTEGER, a INTEGER, x TEXT);"
  105. set a 0
  106. foreach r $nums1 {
  107. incr a
  108. set t1ra($r) $a
  109. set t1ar($a) $r
  110. set x [format %08x%08x [expr {wide($r)>>32}] $r]
  111. set t1rx($r) $x
  112. set t1xr($x) $r
  113. puts " INSERT INTO t1 VALUES($r,$a,'$x');"
  114. }
  115. puts " CREATE INDEX t1i1 ON t1(r);"
  116. puts " CREATE INDEX t1i2 ON t1(a);"
  117. puts " CREATE INDEX t1i3 ON t1(x);"
  118. puts " \175"
  119. puts "\175 {}"
  120. puts "do_test $tname-1.2 \173"
  121. puts " db eval \173"
  122. puts " SELECT count(*) FROM t1"
  123. puts " \175"
  124. puts "\175 {64}"
  125. set nums3 $nums2
  126. lappend nums3 9.22337303685477580800e+18
  127. lappend nums3 -9.22337303685477580800e+18
  128. set i 0
  129. foreach r $nums3 {
  130. incr i
  131. if {abs($r)<9.22337203685477580800e+18} {
  132. set x $t1rx($r)
  133. set a $t1ra($r)
  134. set r5 $r.5
  135. set r0 $r.0
  136. puts "do_test $tname-2.$i.1 \173"
  137. puts " db eval \173"
  138. puts " SELECT * FROM t1 WHERE r=$r"
  139. puts " \175"
  140. puts "\175 {$r $a $x}"
  141. puts "do_test $tname-2.$i.2 \173"
  142. puts " db eval \173"
  143. puts " SELECT r, a FROM t1 WHERE x='$x'"
  144. puts " \175"
  145. puts "\175 {$r $a}"
  146. puts "do_test $tname-2.$i.3 \173"
  147. puts " db eval \173"
  148. puts " SELECT r, x FROM t1 WHERE a=$a"
  149. puts " \175"
  150. puts "\175 {$r $x}"
  151. }
  152. foreach op {> >= < <=} subno {gt ge lt le} {
  153. ################################################################ 2.x.y.1
  154. set rset {}
  155. set aset {}
  156. foreach rx $nums2 {
  157. if "\$rx $op \$r" {
  158. lappend rset $rx
  159. lappend aset $t1ra($rx)
  160. }
  161. }
  162. puts "do_test $tname-2.$i.$subno.1 \173"
  163. puts " db eval \173"
  164. puts " SELECT a FROM t1 WHERE r $op $r ORDER BY a"
  165. puts " \175"
  166. puts "\175 {[sort $aset]}"
  167. ################################################################ 2.x.y.2
  168. puts "do_test $tname-2.$i.$subno.2 \173"
  169. puts " db eval \173"
  170. puts " SELECT a FROM t1 WHERE r $op $r ORDER BY a DESC"
  171. puts " \175"
  172. puts "\175 {[reverse [sort $aset]]}"
  173. ################################################################ 2.x.y.3
  174. set aset {}
  175. foreach rx [sort $rset] {
  176. lappend aset $t1ra($rx)
  177. }
  178. puts "do_test $tname-2.$i.$subno.3 \173"
  179. puts " db eval \173"
  180. puts " SELECT a FROM t1 WHERE r $op $r ORDER BY r"
  181. puts " \175"
  182. puts "\175 {$aset}"
  183. ################################################################ 2.x.y.4
  184. set aset {}
  185. foreach rx [reverse [sort $rset]] {
  186. lappend aset $t1ra($rx)
  187. }
  188. puts "do_test $tname-2.$i.$subno.4 \173"
  189. puts " db eval \173"
  190. puts " SELECT a FROM t1 WHERE r $op $r ORDER BY r DESC"
  191. puts " \175"
  192. puts "\175 {$aset}"
  193. ################################################################ 2.x.y.5
  194. set aset {}
  195. set xset {}
  196. foreach rx $rset {
  197. lappend xset $t1rx($rx)
  198. }
  199. foreach x [sort $xset] {
  200. set rx $t1xr($x)
  201. lappend aset $t1ra($rx)
  202. }
  203. puts "do_test $tname-2.$i.$subno.5 \173"
  204. puts " db eval \173"
  205. puts " SELECT a FROM t1 WHERE r $op $r ORDER BY x"
  206. puts " \175"
  207. puts "\175 {$aset}"
  208. ################################################################ 2.x.y.10
  209. if {abs($r)>9223372036854775808 || [string length $r5]>15} continue
  210. set rset {}
  211. set aset {}
  212. foreach rx $nums2 {
  213. if "\$rx $op \$r0" {
  214. lappend rset $rx
  215. }
  216. }
  217. foreach rx [sort $rset] {
  218. lappend aset $t1ra($rx)
  219. }
  220. puts "do_test $tname-2.$i.$subno.10 \173"
  221. puts " db eval \173"
  222. puts " SELECT a FROM t1 WHERE r $op $r0 ORDER BY r"
  223. puts " \175"
  224. puts "\175 {$aset}"
  225. ################################################################ 2.x.y.11
  226. set aset {}
  227. foreach rx [reverse [sort $rset]] {
  228. lappend aset $t1ra($rx)
  229. }
  230. puts "do_test $tname-2.$i.$subno.11 \173"
  231. puts " db eval \173"
  232. puts " SELECT a FROM t1 WHERE r $op $r0 ORDER BY r DESC"
  233. puts " \175"
  234. puts "\175 {$aset}"
  235. ################################################################ 2.x.y.12
  236. set rset {}
  237. set aset {}
  238. foreach rx $nums2 {
  239. if "\$rx $op \$r5" {
  240. lappend rset $rx
  241. }
  242. }
  243. foreach rx [sort $rset] {
  244. lappend aset $t1ra($rx)
  245. }
  246. puts "do_test $tname-2.$i.$subno.12 \173"
  247. puts " db eval \173"
  248. puts " SELECT a FROM t1 WHERE r $op $r5 ORDER BY r"
  249. puts " \175"
  250. puts "\175 {$aset}"
  251. ################################################################ 2.x.y.13
  252. set aset {}
  253. foreach rx [reverse [sort $rset]] {
  254. lappend aset $t1ra($rx)
  255. }
  256. puts "do_test $tname-2.$i.$subno.13 \173"
  257. puts " db eval \173"
  258. puts " SELECT a FROM t1 WHERE r $op $r5 ORDER BY r DESC"
  259. puts " \175"
  260. puts "\175 {$aset}"
  261. }
  262. }
  263. puts "do_test $tname-3.1 \173"
  264. puts " db eval \173"
  265. puts " DROP INDEX t1i1;"
  266. puts " DROP INDEX t1i2;"
  267. puts " DROP INDEX t1i3;"
  268. puts " \175"
  269. puts "\175 {}"
  270. set i 0
  271. foreach r $nums3 {
  272. incr i
  273. if {abs($r)<9.22337203685477580800e+18} {
  274. set x $t1rx($r)
  275. set a $t1ra($r)
  276. set r5 $r.5
  277. set r0 $r.0
  278. puts "do_test $tname-4.$i.1 \173"
  279. puts " db eval \173"
  280. puts " SELECT * FROM t1 WHERE r=$r"
  281. puts " \175"
  282. puts "\175 {$r $a $x}"
  283. puts "do_test $tname-4.$i.2 \173"
  284. puts " db eval \173"
  285. puts " SELECT r, a FROM t1 WHERE x='$x'"
  286. puts " \175"
  287. puts "\175 {$r $a}"
  288. puts "do_test $tname-4.$i.3 \173"
  289. puts " db eval \173"
  290. puts " SELECT r, x FROM t1 WHERE a=$a"
  291. puts " \175"
  292. puts "\175 {$r $x}"
  293. }
  294. foreach op {> >= < <=} subno {gt ge lt le} {
  295. ################################################################ 2.x.y.1
  296. set rset {}
  297. set aset {}
  298. foreach rx $nums2 {
  299. if "\$rx $op \$r" {
  300. lappend rset $rx
  301. lappend aset $t1ra($rx)
  302. }
  303. }
  304. puts "do_test $tname-4.$i.$subno.1 \173"
  305. puts " db eval \173"
  306. puts " SELECT a FROM t1 WHERE r $op $r ORDER BY a"
  307. puts " \175"
  308. puts "\175 {[sort $aset]}"
  309. ################################################################ 2.x.y.2
  310. puts "do_test $tname-4.$i.$subno.2 \173"
  311. puts " db eval \173"
  312. puts " SELECT a FROM t1 WHERE r $op $r ORDER BY a DESC"
  313. puts " \175"
  314. puts "\175 {[reverse [sort $aset]]}"
  315. ################################################################ 2.x.y.3
  316. set aset {}
  317. foreach rx [sort $rset] {
  318. lappend aset $t1ra($rx)
  319. }
  320. puts "do_test $tname-4.$i.$subno.3 \173"
  321. puts " db eval \173"
  322. puts " SELECT a FROM t1 WHERE r $op $r ORDER BY r"
  323. puts " \175"
  324. puts "\175 {$aset}"
  325. ################################################################ 2.x.y.4
  326. set aset {}
  327. foreach rx [reverse [sort $rset]] {
  328. lappend aset $t1ra($rx)
  329. }
  330. puts "do_test $tname-4.$i.$subno.4 \173"
  331. puts " db eval \173"
  332. puts " SELECT a FROM t1 WHERE r $op $r ORDER BY r DESC"
  333. puts " \175"
  334. puts "\175 {$aset}"
  335. ################################################################ 2.x.y.5
  336. set aset {}
  337. set xset {}
  338. foreach rx $rset {
  339. lappend xset $t1rx($rx)
  340. }
  341. foreach x [sort $xset] {
  342. set rx $t1xr($x)
  343. lappend aset $t1ra($rx)
  344. }
  345. puts "do_test $tname-4.$i.$subno.5 \173"
  346. puts " db eval \173"
  347. puts " SELECT a FROM t1 WHERE r $op $r ORDER BY x"
  348. puts " \175"
  349. puts "\175 {$aset}"
  350. ################################################################ 2.x.y.10
  351. if {abs($r)>9223372036854775808 || [string length $r5]>15} continue
  352. set rset {}
  353. set aset {}
  354. foreach rx $nums2 {
  355. if "\$rx $op \$r0" {
  356. lappend rset $rx
  357. }
  358. }
  359. foreach rx [sort $rset] {
  360. lappend aset $t1ra($rx)
  361. }
  362. puts "do_test $tname-4.$i.$subno.10 \173"
  363. puts " db eval \173"
  364. puts " SELECT a FROM t1 WHERE r $op $r0 ORDER BY r"
  365. puts " \175"
  366. puts "\175 {$aset}"
  367. ################################################################ 2.x.y.11
  368. set aset {}
  369. foreach rx [reverse [sort $rset]] {
  370. lappend aset $t1ra($rx)
  371. }
  372. puts "do_test $tname-4.$i.$subno.11 \173"
  373. puts " db eval \173"
  374. puts " SELECT a FROM t1 WHERE r $op $r0 ORDER BY r DESC"
  375. puts " \175"
  376. puts "\175 {$aset}"
  377. ################################################################ 2.x.y.12
  378. set rset {}
  379. set aset {}
  380. foreach rx $nums2 {
  381. if "\$rx $op \$r5" {
  382. lappend rset $rx
  383. }
  384. }
  385. foreach rx [sort $rset] {
  386. lappend aset $t1ra($rx)
  387. }
  388. puts "do_test $tname-4.$i.$subno.12 \173"
  389. puts " db eval \173"
  390. puts " SELECT a FROM t1 WHERE r $op $r5 ORDER BY r"
  391. puts " \175"
  392. puts "\175 {$aset}"
  393. ################################################################ 2.x.y.13
  394. set aset {}
  395. foreach rx [reverse [sort $rset]] {
  396. lappend aset $t1ra($rx)
  397. }
  398. puts "do_test $tname-4.$i.$subno.13 \173"
  399. puts " db eval \173"
  400. puts " SELECT a FROM t1 WHERE r $op $r5 ORDER BY r DESC"
  401. puts " \175"
  402. puts "\175 {$aset}"
  403. }
  404. }
  405. puts {finish_test}