misc3.test 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. # 2003 December 17
  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 implements tests for miscellanous features that were
  14. # left out of other test files.
  15. #
  16. # $Id: misc3.test,v 1.20 2009/05/06 00:49:01 drh Exp $
  17. set testdir [file dirname $argv0]
  18. source $testdir/tester.tcl
  19. ifcapable {integrityck} {
  20. # Ticket #529. Make sure an ABORT does not damage the in-memory cache
  21. # that will be used by subsequent statements in the same transaction.
  22. #
  23. do_test misc3-1.1 {
  24. execsql {
  25. CREATE TABLE t1(a UNIQUE,b);
  26. INSERT INTO t1
  27. VALUES(1,'a23456789_b23456789_c23456789_d23456789_e23456789_');
  28. UPDATE t1 SET b=b||b;
  29. UPDATE t1 SET b=b||b;
  30. UPDATE t1 SET b=b||b;
  31. UPDATE t1 SET b=b||b;
  32. UPDATE t1 SET b=b||b;
  33. INSERT INTO t1 VALUES(2,'x');
  34. UPDATE t1 SET b=substr(b,1,500);
  35. BEGIN;
  36. }
  37. catchsql {UPDATE t1 SET a=CASE a WHEN 2 THEN 1 ELSE a END, b='y';}
  38. execsql {
  39. CREATE TABLE t2(x,y);
  40. COMMIT;
  41. PRAGMA integrity_check;
  42. }
  43. } ok
  44. }
  45. ifcapable {integrityck} {
  46. do_test misc3-1.2 {
  47. execsql {
  48. DROP TABLE t1;
  49. DROP TABLE t2;
  50. }
  51. ifcapable {vacuum} {execsql VACUUM}
  52. execsql {
  53. CREATE TABLE t1(a UNIQUE,b);
  54. INSERT INTO t1
  55. VALUES(1,'a23456789_b23456789_c23456789_d23456789_e23456789_');
  56. INSERT INTO t1 SELECT a+1, b||b FROM t1;
  57. INSERT INTO t1 SELECT a+2, b||b FROM t1;
  58. INSERT INTO t1 SELECT a+4, b FROM t1;
  59. INSERT INTO t1 SELECT a+8, b FROM t1;
  60. INSERT INTO t1 SELECT a+16, b FROM t1;
  61. INSERT INTO t1 SELECT a+32, b FROM t1;
  62. INSERT INTO t1 SELECT a+64, b FROM t1;
  63. BEGIN;
  64. }
  65. catchsql {UPDATE t1 SET a=CASE a WHEN 128 THEN 127 ELSE a END, b='';}
  66. execsql {
  67. INSERT INTO t1 VALUES(200,'hello out there');
  68. COMMIT;
  69. PRAGMA integrity_check;
  70. }
  71. } ok
  72. }
  73. # Tests of the sqliteAtoF() function in util.c
  74. #
  75. do_test misc3-2.1 {
  76. execsql {SELECT 2e-25*0.5e25}
  77. } 1.0
  78. do_test misc3-2.2 {
  79. execsql {SELECT 2.0e-25*000000.500000000000000000000000000000e+00025}
  80. } 1.0
  81. do_test misc3-2.3 {
  82. execsql {SELECT 000000000002e-0000000025*0.5e25}
  83. } 1.0
  84. do_test misc3-2.4 {
  85. execsql {SELECT 2e-25*0.5e250}
  86. } 1e+225
  87. do_test misc3-2.5 {
  88. execsql {SELECT 2.0e-250*0.5e25}
  89. } 1e-225
  90. do_test misc3-2.6 {
  91. execsql {SELECT '-2.0e-127' * '-0.5e27'}
  92. } 1e-100
  93. do_test misc3-2.7 {
  94. execsql {SELECT '+2.0e-127' * '-0.5e27'}
  95. } -1e-100
  96. do_test misc3-2.8 {
  97. execsql {SELECT 2.0e-27 * '+0.5e+127'}
  98. } 1e+100
  99. do_test misc3-2.9 {
  100. execsql {SELECT 2.0e-27 * '+0.000005e+132'}
  101. } 1e+100
  102. # Ticket #522. Make sure integer overflow is handled properly in
  103. # indices.
  104. #
  105. integrity_check misc3-3.1
  106. do_test misc3-3.2 {
  107. execsql {
  108. CREATE TABLE t2(a INT UNIQUE);
  109. }
  110. } {}
  111. integrity_check misc3-3.2.1
  112. do_test misc3-3.3 {
  113. execsql {
  114. INSERT INTO t2 VALUES(2147483648);
  115. }
  116. } {}
  117. integrity_check misc3-3.3.1
  118. do_test misc3-3.4 {
  119. execsql {
  120. INSERT INTO t2 VALUES(-2147483649);
  121. }
  122. } {}
  123. integrity_check misc3-3.4.1
  124. do_test misc3-3.5 {
  125. execsql {
  126. INSERT INTO t2 VALUES(+2147483649);
  127. }
  128. } {}
  129. integrity_check misc3-3.5.1
  130. do_test misc3-3.6 {
  131. execsql {
  132. INSERT INTO t2 VALUES(+2147483647);
  133. INSERT INTO t2 VALUES(-2147483648);
  134. INSERT INTO t2 VALUES(-2147483647);
  135. INSERT INTO t2 VALUES(2147483646);
  136. SELECT * FROM t2 ORDER BY a;
  137. }
  138. } {-2147483649 -2147483648 -2147483647 2147483646 2147483647 2147483648 2147483649}
  139. do_test misc3-3.7 {
  140. execsql {
  141. SELECT * FROM t2 WHERE a>=-2147483648 ORDER BY a;
  142. }
  143. } {-2147483648 -2147483647 2147483646 2147483647 2147483648 2147483649}
  144. do_test misc3-3.8 {
  145. execsql {
  146. SELECT * FROM t2 WHERE a>-2147483648 ORDER BY a;
  147. }
  148. } {-2147483647 2147483646 2147483647 2147483648 2147483649}
  149. do_test misc3-3.9 {
  150. execsql {
  151. SELECT * FROM t2 WHERE a>-2147483649 ORDER BY a;
  152. }
  153. } {-2147483648 -2147483647 2147483646 2147483647 2147483648 2147483649}
  154. do_test misc3-3.10 {
  155. execsql {
  156. SELECT * FROM t2 WHERE a>=0 AND a<2147483649 ORDER BY a DESC;
  157. }
  158. } {2147483648 2147483647 2147483646}
  159. do_test misc3-3.11 {
  160. execsql {
  161. SELECT * FROM t2 WHERE a>=0 AND a<=2147483648 ORDER BY a DESC;
  162. }
  163. } {2147483648 2147483647 2147483646}
  164. do_test misc3-3.12 {
  165. execsql {
  166. SELECT * FROM t2 WHERE a>=0 AND a<2147483648 ORDER BY a DESC;
  167. }
  168. } {2147483647 2147483646}
  169. do_test misc3-3.13 {
  170. execsql {
  171. SELECT * FROM t2 WHERE a>=0 AND a<=2147483647 ORDER BY a DESC;
  172. }
  173. } {2147483647 2147483646}
  174. do_test misc3-3.14 {
  175. execsql {
  176. SELECT * FROM t2 WHERE a>=0 AND a<2147483647 ORDER BY a DESC;
  177. }
  178. } {2147483646}
  179. # Ticket #565. A stack overflow is occurring when the subquery to the
  180. # right of an IN operator contains many NULLs
  181. #
  182. do_test misc3-4.1 {
  183. execsql {
  184. CREATE TABLE t3(a INTEGER PRIMARY KEY, b);
  185. INSERT INTO t3(b) VALUES('abc');
  186. INSERT INTO t3(b) VALUES('xyz');
  187. INSERT INTO t3(b) VALUES(NULL);
  188. INSERT INTO t3(b) VALUES(NULL);
  189. INSERT INTO t3(b) SELECT b||'d' FROM t3;
  190. INSERT INTO t3(b) SELECT b||'e' FROM t3;
  191. INSERT INTO t3(b) SELECT b||'f' FROM t3;
  192. INSERT INTO t3(b) SELECT b||'g' FROM t3;
  193. INSERT INTO t3(b) SELECT b||'h' FROM t3;
  194. SELECT count(a), count(b) FROM t3;
  195. }
  196. } {128 64}
  197. ifcapable subquery {
  198. do_test misc3-4.2 {
  199. execsql {
  200. SELECT count(a) FROM t3 WHERE b IN (SELECT b FROM t3);
  201. }
  202. } {64}
  203. do_test misc3-4.3 {
  204. execsql {
  205. SELECT count(a) FROM t3 WHERE b IN (SELECT b FROM t3 ORDER BY a+1);
  206. }
  207. } {64}
  208. }
  209. # Ticket #601: Putting a left join inside "SELECT * FROM (<join-here>)"
  210. # gives different results that if the outer "SELECT * FROM ..." is omitted.
  211. #
  212. ifcapable subquery {
  213. do_test misc3-5.1 {
  214. execsql {
  215. CREATE TABLE x1 (b, c);
  216. INSERT INTO x1 VALUES('dog',3);
  217. INSERT INTO x1 VALUES('cat',1);
  218. INSERT INTO x1 VALUES('dog',4);
  219. CREATE TABLE x2 (c, e);
  220. INSERT INTO x2 VALUES(1,'one');
  221. INSERT INTO x2 VALUES(2,'two');
  222. INSERT INTO x2 VALUES(3,'three');
  223. INSERT INTO x2 VALUES(4,'four');
  224. SELECT x2.c AS c, e, b FROM x2 LEFT JOIN
  225. (SELECT b, max(c)+0 AS c FROM x1 GROUP BY b)
  226. USING(c);
  227. }
  228. } {1 one cat 2 two {} 3 three {} 4 four dog}
  229. do_test misc3-5.2 {
  230. execsql {
  231. SELECT * FROM (
  232. SELECT x2.c AS c, e, b FROM x2 LEFT JOIN
  233. (SELECT b, max(c)+0 AS c FROM x1 GROUP BY b)
  234. USING(c)
  235. );
  236. }
  237. } {1 one cat 2 two {} 3 three {} 4 four dog}
  238. }
  239. ifcapable {explain} {
  240. # Ticket #626: make sure EXPLAIN prevents BEGIN and COMMIT from working.
  241. #
  242. do_test misc3-6.1 {
  243. execsql {EXPLAIN BEGIN}
  244. catchsql {BEGIN}
  245. } {0 {}}
  246. do_test misc3-6.2 {
  247. execsql {EXPLAIN COMMIT}
  248. catchsql {COMMIT}
  249. } {0 {}}
  250. do_test misc3-6.3 {
  251. execsql {BEGIN; EXPLAIN ROLLBACK}
  252. catchsql {ROLLBACK}
  253. } {0 {}}
  254. # Do some additional EXPLAIN operations to exercise the displayP4 logic.
  255. do_test misc3-6.10 {
  256. set x [execsql {
  257. CREATE TABLE ex1(
  258. a INTEGER DEFAULT 54321,
  259. b TEXT DEFAULT "hello",
  260. c REAL DEFAULT 3.1415926
  261. );
  262. CREATE UNIQUE INDEX ex1i1 ON ex1(a);
  263. EXPLAIN REINDEX;
  264. }]
  265. ifcapable mergesort {
  266. regexp { SorterCompare \d+ \d+ \d+ } $x
  267. } else {
  268. regexp { IsUnique \d+ \d+ \d+ \d+ } $x
  269. }
  270. } {1}
  271. if {[regexp {16} [db one {PRAGMA encoding}]]} {
  272. do_test misc3-6.11-utf16 {
  273. set x [execsql {
  274. EXPLAIN SELECT a+123456789012, b*4.5678, c FROM ex1 ORDER BY +a, b DESC
  275. }]
  276. set y [regexp { 123456789012 } $x]
  277. lappend y [regexp { 4.5678 } $x]
  278. lappend y [regexp {,-BINARY} $x]
  279. } {1 1 1}
  280. } else {
  281. do_test misc3-6.11-utf8 {
  282. set x [execsql {
  283. EXPLAIN SELECT a+123456789012, b*4.5678, c FROM ex1 ORDER BY +a, b DESC
  284. }]
  285. set y [regexp { 123456789012 } $x]
  286. lappend y [regexp { 4.5678 } $x]
  287. lappend y [regexp { hello } $x]
  288. lappend y [regexp {,-BINARY} $x]
  289. } {1 1 1 1}
  290. }
  291. }
  292. ifcapable {trigger} {
  293. # Ticket #640: vdbe stack overflow with a LIMIT clause on a SELECT inside
  294. # of a trigger.
  295. #
  296. do_test misc3-7.1 {
  297. execsql {
  298. BEGIN;
  299. CREATE TABLE y1(a);
  300. CREATE TABLE y2(b);
  301. CREATE TABLE y3(c);
  302. CREATE TRIGGER r1 AFTER DELETE ON y1 FOR EACH ROW BEGIN
  303. INSERT INTO y3(c) SELECT b FROM y2 ORDER BY b LIMIT 1;
  304. END;
  305. INSERT INTO y1 VALUES(1);
  306. INSERT INTO y1 VALUES(2);
  307. INSERT INTO y1 SELECT a+2 FROM y1;
  308. INSERT INTO y1 SELECT a+4 FROM y1;
  309. INSERT INTO y1 SELECT a+8 FROM y1;
  310. INSERT INTO y1 SELECT a+16 FROM y1;
  311. INSERT INTO y2 SELECT a FROM y1;
  312. COMMIT;
  313. SELECT count(*) FROM y1;
  314. }
  315. } 32
  316. do_test misc3-7.2 {
  317. execsql {
  318. DELETE FROM y1;
  319. SELECT count(*) FROM y1;
  320. }
  321. } 0
  322. do_test misc3-7.3 {
  323. execsql {
  324. SELECT count(*) FROM y3;
  325. }
  326. } 32
  327. } ;# endif trigger
  328. # Ticket #668: VDBE stack overflow occurs when the left-hand side
  329. # of an IN expression is NULL and the result is used as an integer, not
  330. # as a jump.
  331. #
  332. ifcapable subquery {
  333. do_test misc-8.1 {
  334. execsql {
  335. SELECT count(CASE WHEN b IN ('abc','xyz') THEN 'x' END) FROM t3
  336. }
  337. } {2}
  338. do_test misc-8.2 {
  339. execsql {
  340. SELECT count(*) FROM t3 WHERE 1+(b IN ('abc','xyz'))==2
  341. }
  342. } {2}
  343. }
  344. finish_test