collate4.test 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704
  1. #
  2. # 2001 September 15
  3. #
  4. # The author disclaims copyright to this source code. In place of
  5. # a legal notice, here is a blessing:
  6. #
  7. # May you do good and not evil.
  8. # May you find forgiveness for yourself and forgive others.
  9. # May you share freely, never taking more than you give.
  10. #
  11. #***********************************************************************
  12. # This file implements regression tests for SQLite library. The
  13. # focus of this script is page cache subsystem.
  14. #
  15. # $Id: collate4.test,v 1.9 2008/01/05 17:39:30 danielk1977 Exp $
  16. set testdir [file dirname $argv0]
  17. source $testdir/tester.tcl
  18. db collate TEXT text_collate
  19. proc text_collate {a b} {
  20. return [string compare $a $b]
  21. }
  22. # Do an SQL statement. Append the search count to the end of the result.
  23. #
  24. proc count sql {
  25. set ::sqlite_search_count 0
  26. return [concat [execsql $sql] $::sqlite_search_count]
  27. }
  28. # This procedure executes the SQL. Then it checks the generated program
  29. # for the SQL and appends a "nosort" to the result if the program contains the
  30. # SortCallback opcode. If the program does not contain the SortCallback
  31. # opcode it appends "sort"
  32. #
  33. proc cksort {sql} {
  34. set ::sqlite_sort_count 0
  35. set data [execsql $sql]
  36. if {$::sqlite_sort_count} {set x sort} {set x nosort}
  37. lappend data $x
  38. return $data
  39. }
  40. #
  41. # Test cases are organized roughly as follows:
  42. #
  43. # collate4-1.* ORDER BY.
  44. # collate4-2.* WHERE clauses.
  45. # collate4-3.* constraints (primary key, unique).
  46. # collate4-4.* simple min() or max() queries.
  47. # collate4-5.* REINDEX command
  48. # collate4-6.* INTEGER PRIMARY KEY indices.
  49. #
  50. #
  51. # These tests - collate4-1.* - check that indices are correctly
  52. # selected or not selected to implement ORDER BY clauses when
  53. # user defined collation sequences are involved.
  54. #
  55. # Because these tests also exercise all the different ways indices
  56. # can be created, they also serve to verify that indices are correctly
  57. # initialized with user-defined collation sequences when they are
  58. # created.
  59. #
  60. # Tests named collate4-1.1.* use indices with a single column. Tests
  61. # collate4-1.2.* use indices with two columns.
  62. #
  63. do_test collate4-1.1.0 {
  64. execsql {
  65. CREATE TABLE collate4t1(a COLLATE NOCASE, b COLLATE TEXT);
  66. INSERT INTO collate4t1 VALUES( 'a', 'a' );
  67. INSERT INTO collate4t1 VALUES( 'b', 'b' );
  68. INSERT INTO collate4t1 VALUES( NULL, NULL );
  69. INSERT INTO collate4t1 VALUES( 'B', 'B' );
  70. INSERT INTO collate4t1 VALUES( 'A', 'A' );
  71. CREATE INDEX collate4i1 ON collate4t1(a);
  72. CREATE INDEX collate4i2 ON collate4t1(b);
  73. }
  74. } {}
  75. do_test collate4-1.1.1 {
  76. cksort {SELECT a FROM collate4t1 ORDER BY a}
  77. } {{} a A b B nosort}
  78. do_test collate4-1.1.2 {
  79. cksort {SELECT a FROM collate4t1 ORDER BY a COLLATE NOCASE}
  80. } {{} a A b B nosort}
  81. do_test collate4-1.1.3 {
  82. cksort {SELECT a FROM collate4t1 ORDER BY a COLLATE TEXT}
  83. } {{} A B a b sort}
  84. do_test collate4-1.1.4 {
  85. cksort {SELECT b FROM collate4t1 ORDER BY b}
  86. } {{} A B a b nosort}
  87. do_test collate4-1.1.5 {
  88. cksort {SELECT b FROM collate4t1 ORDER BY b COLLATE TEXT}
  89. } {{} A B a b nosort}
  90. do_test collate4-1.1.6 {
  91. cksort {SELECT b FROM collate4t1 ORDER BY b COLLATE NOCASE, rowid}
  92. } {{} a A b B sort}
  93. do_test collate4-1.1.7 {
  94. execsql {
  95. CREATE TABLE collate4t2(
  96. a PRIMARY KEY COLLATE NOCASE,
  97. b UNIQUE COLLATE TEXT
  98. );
  99. INSERT INTO collate4t2 VALUES( 'a', 'a' );
  100. INSERT INTO collate4t2 VALUES( NULL, NULL );
  101. INSERT INTO collate4t2 VALUES( 'B', 'B' );
  102. }
  103. } {}
  104. do_test collate4-1.1.8 {
  105. cksort {SELECT a FROM collate4t2 ORDER BY a}
  106. } {{} a B nosort}
  107. do_test collate4-1.1.9 {
  108. cksort {SELECT a FROM collate4t2 ORDER BY a COLLATE NOCASE}
  109. } {{} a B nosort}
  110. do_test collate4-1.1.10 {
  111. cksort {SELECT a FROM collate4t2 ORDER BY a COLLATE TEXT}
  112. } {{} B a sort}
  113. do_test collate4-1.1.11 {
  114. cksort {SELECT b FROM collate4t2 ORDER BY b}
  115. } {{} B a nosort}
  116. do_test collate4-1.1.12 {
  117. cksort {SELECT b FROM collate4t2 ORDER BY b COLLATE TEXT}
  118. } {{} B a nosort}
  119. do_test collate4-1.1.13 {
  120. cksort {SELECT b FROM collate4t2 ORDER BY b COLLATE NOCASE}
  121. } {{} a B sort}
  122. do_test collate4-1.1.14 {
  123. execsql {
  124. CREATE TABLE collate4t3(
  125. b COLLATE TEXT,
  126. a COLLATE NOCASE,
  127. UNIQUE(a), PRIMARY KEY(b)
  128. );
  129. INSERT INTO collate4t3 VALUES( 'a', 'a' );
  130. INSERT INTO collate4t3 VALUES( NULL, NULL );
  131. INSERT INTO collate4t3 VALUES( 'B', 'B' );
  132. }
  133. } {}
  134. do_test collate4-1.1.15 {
  135. cksort {SELECT a FROM collate4t3 ORDER BY a}
  136. } {{} a B nosort}
  137. do_test collate4-1.1.16 {
  138. cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE NOCASE}
  139. } {{} a B nosort}
  140. do_test collate4-1.1.17 {
  141. cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE TEXT}
  142. } {{} B a sort}
  143. do_test collate4-1.1.18 {
  144. cksort {SELECT b FROM collate4t3 ORDER BY b}
  145. } {{} B a nosort}
  146. do_test collate4-1.1.19 {
  147. cksort {SELECT b FROM collate4t3 ORDER BY b COLLATE TEXT}
  148. } {{} B a nosort}
  149. do_test collate4-1.1.20 {
  150. cksort {SELECT b FROM collate4t3 ORDER BY b COLLATE NOCASE}
  151. } {{} a B sort}
  152. do_test collate4-1.1.21 {
  153. execsql {
  154. CREATE TABLE collate4t4(a COLLATE NOCASE, b COLLATE TEXT);
  155. INSERT INTO collate4t4 VALUES( 'a', 'a' );
  156. INSERT INTO collate4t4 VALUES( 'b', 'b' );
  157. INSERT INTO collate4t4 VALUES( NULL, NULL );
  158. INSERT INTO collate4t4 VALUES( 'B', 'B' );
  159. INSERT INTO collate4t4 VALUES( 'A', 'A' );
  160. CREATE INDEX collate4i3 ON collate4t4(a COLLATE TEXT);
  161. CREATE INDEX collate4i4 ON collate4t4(b COLLATE NOCASE);
  162. }
  163. } {}
  164. do_test collate4-1.1.22 {
  165. cksort {SELECT a FROM collate4t4 ORDER BY a, rowid}
  166. } {{} a A b B sort}
  167. do_test collate4-1.1.23 {
  168. cksort {SELECT a FROM collate4t4 ORDER BY a COLLATE NOCASE, rowid}
  169. } {{} a A b B sort}
  170. do_test collate4-1.1.24 {
  171. cksort {SELECT a FROM collate4t4 ORDER BY a COLLATE TEXT, rowid}
  172. } {{} A B a b nosort}
  173. do_test collate4-1.1.25 {
  174. cksort {SELECT b FROM collate4t4 ORDER BY b}
  175. } {{} A B a b sort}
  176. do_test collate4-1.1.26 {
  177. cksort {SELECT b FROM collate4t4 ORDER BY b COLLATE TEXT}
  178. } {{} A B a b sort}
  179. do_test collate4-1.1.27 {
  180. cksort {SELECT b FROM collate4t4 ORDER BY b COLLATE NOCASE}
  181. } {{} a A b B nosort}
  182. do_test collate4-1.1.30 {
  183. execsql {
  184. DROP TABLE collate4t1;
  185. DROP TABLE collate4t2;
  186. DROP TABLE collate4t3;
  187. DROP TABLE collate4t4;
  188. }
  189. } {}
  190. do_test collate4-1.2.0 {
  191. execsql {
  192. CREATE TABLE collate4t1(a COLLATE NOCASE, b COLLATE TEXT);
  193. INSERT INTO collate4t1 VALUES( 'a', 'a' );
  194. INSERT INTO collate4t1 VALUES( 'b', 'b' );
  195. INSERT INTO collate4t1 VALUES( NULL, NULL );
  196. INSERT INTO collate4t1 VALUES( 'B', 'B' );
  197. INSERT INTO collate4t1 VALUES( 'A', 'A' );
  198. CREATE INDEX collate4i1 ON collate4t1(a, b);
  199. }
  200. } {}
  201. do_test collate4-1.2.1 {
  202. cksort {SELECT a FROM collate4t1 ORDER BY a}
  203. } {{} A a B b nosort}
  204. do_test collate4-1.2.2 {
  205. cksort {SELECT a FROM collate4t1 ORDER BY a COLLATE nocase}
  206. } {{} A a B b nosort}
  207. do_test collate4-1.2.3 {
  208. cksort {SELECT a FROM collate4t1 ORDER BY a COLLATE text}
  209. } {{} A B a b sort}
  210. do_test collate4-1.2.4 {
  211. cksort {SELECT a FROM collate4t1 ORDER BY a, b}
  212. } {{} A a B b nosort}
  213. do_test collate4-1.2.5 {
  214. cksort {SELECT a FROM collate4t1 ORDER BY a, b COLLATE nocase, rowid}
  215. } {{} a A b B sort}
  216. do_test collate4-1.2.6 {
  217. cksort {SELECT a FROM collate4t1 ORDER BY a, b COLLATE text}
  218. } {{} A a B b nosort}
  219. do_test collate4-1.2.7 {
  220. execsql {
  221. CREATE TABLE collate4t2(
  222. a COLLATE NOCASE,
  223. b COLLATE TEXT,
  224. PRIMARY KEY(a, b)
  225. );
  226. INSERT INTO collate4t2 VALUES( 'a', 'a' );
  227. INSERT INTO collate4t2 VALUES( NULL, NULL );
  228. INSERT INTO collate4t2 VALUES( 'B', 'B' );
  229. }
  230. } {}
  231. do_test collate4-1.2.8 {
  232. cksort {SELECT a FROM collate4t2 ORDER BY a}
  233. } {{} a B nosort}
  234. do_test collate4-1.2.9 {
  235. cksort {SELECT a FROM collate4t2 ORDER BY a COLLATE nocase}
  236. } {{} a B nosort}
  237. do_test collate4-1.2.10 {
  238. cksort {SELECT a FROM collate4t2 ORDER BY a COLLATE text}
  239. } {{} B a sort}
  240. do_test collate4-1.2.11 {
  241. cksort {SELECT a FROM collate4t2 ORDER BY a, b}
  242. } {{} a B nosort}
  243. do_test collate4-1.2.12 {
  244. cksort {SELECT a FROM collate4t2 ORDER BY a, b COLLATE nocase}
  245. } {{} a B sort}
  246. do_test collate4-1.2.13 {
  247. cksort {SELECT a FROM collate4t2 ORDER BY a, b COLLATE text}
  248. } {{} a B nosort}
  249. do_test collate4-1.2.14 {
  250. execsql {
  251. CREATE TABLE collate4t3(a COLLATE NOCASE, b COLLATE TEXT);
  252. INSERT INTO collate4t3 VALUES( 'a', 'a' );
  253. INSERT INTO collate4t3 VALUES( 'b', 'b' );
  254. INSERT INTO collate4t3 VALUES( NULL, NULL );
  255. INSERT INTO collate4t3 VALUES( 'B', 'B' );
  256. INSERT INTO collate4t3 VALUES( 'A', 'A' );
  257. CREATE INDEX collate4i2 ON collate4t3(a COLLATE TEXT, b COLLATE NOCASE);
  258. }
  259. } {}
  260. do_test collate4-1.2.15 {
  261. cksort {SELECT a FROM collate4t3 ORDER BY a, rowid}
  262. } {{} a A b B sort}
  263. do_test collate4-1.2.16 {
  264. cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE nocase, rowid}
  265. } {{} a A b B sort}
  266. do_test collate4-1.2.17 {
  267. cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE text}
  268. } {{} A B a b nosort}
  269. do_test collate4-1.2.18 {
  270. cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE text, b}
  271. } {{} A B a b sort}
  272. do_test collate4-1.2.19 {
  273. cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE text, b COLLATE nocase}
  274. } {{} A B a b nosort}
  275. do_test collate4-1.2.20 {
  276. cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE text, b COLLATE text}
  277. } {{} A B a b sort}
  278. do_test collate4-1.2.21 {
  279. cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE text DESC}
  280. } {b a B A {} nosort}
  281. do_test collate4-1.2.22 {
  282. cksort {SELECT a FROM collate4t3 ORDER BY a COLLATE text DESC, b}
  283. } {b a B A {} sort}
  284. do_test collate4-1.2.23 {
  285. cksort {SELECT a FROM collate4t3
  286. ORDER BY a COLLATE text DESC, b COLLATE nocase}
  287. } {b a B A {} sort}
  288. do_test collate4-1.2.24 {
  289. cksort {SELECT a FROM collate4t3
  290. ORDER BY a COLLATE text DESC, b COLLATE nocase DESC}
  291. } {b a B A {} nosort}
  292. do_test collate4-1.2.25 {
  293. execsql {
  294. DROP TABLE collate4t1;
  295. DROP TABLE collate4t2;
  296. DROP TABLE collate4t3;
  297. }
  298. } {}
  299. #
  300. # These tests - collate4-2.* - check that indices are correctly
  301. # selected or not selected to implement WHERE clauses when user
  302. # defined collation sequences are involved.
  303. #
  304. # Indices may optimise WHERE clauses using <, >, <=, >=, = or IN
  305. # operators.
  306. #
  307. do_test collate4-2.1.0 {
  308. execsql {
  309. PRAGMA automatic_index=OFF;
  310. CREATE TABLE collate4t1(a COLLATE NOCASE);
  311. CREATE TABLE collate4t2(b COLLATE TEXT);
  312. INSERT INTO collate4t1 VALUES('a');
  313. INSERT INTO collate4t1 VALUES('A');
  314. INSERT INTO collate4t1 VALUES('b');
  315. INSERT INTO collate4t1 VALUES('B');
  316. INSERT INTO collate4t1 VALUES('c');
  317. INSERT INTO collate4t1 VALUES('C');
  318. INSERT INTO collate4t1 VALUES('d');
  319. INSERT INTO collate4t1 VALUES('D');
  320. INSERT INTO collate4t1 VALUES('e');
  321. INSERT INTO collate4t1 VALUES('D');
  322. INSERT INTO collate4t2 VALUES('A');
  323. INSERT INTO collate4t2 VALUES('Z');
  324. }
  325. } {}
  326. do_test collate4-2.1.1 {
  327. count {
  328. SELECT * FROM collate4t2, collate4t1 WHERE a = b;
  329. }
  330. } {A a A A 19}
  331. do_test collate4-2.1.2 {
  332. execsql {
  333. CREATE INDEX collate4i1 ON collate4t1(a);
  334. }
  335. count {
  336. SELECT * FROM collate4t2, collate4t1 WHERE a = b;
  337. }
  338. } {A a A A 5}
  339. do_test collate4-2.1.3 {
  340. count {
  341. SELECT * FROM collate4t2, collate4t1 WHERE b = a;
  342. }
  343. } {A A 19}
  344. do_test collate4-2.1.4 {
  345. execsql {
  346. DROP INDEX collate4i1;
  347. CREATE INDEX collate4i1 ON collate4t1(a COLLATE TEXT);
  348. }
  349. count {
  350. SELECT * FROM collate4t2, collate4t1 WHERE a = b
  351. ORDER BY collate4t2.rowid, collate4t1.rowid
  352. }
  353. } {A a A A 19}
  354. do_test collate4-2.1.5 {
  355. count {
  356. SELECT * FROM collate4t2, collate4t1 WHERE b = a;
  357. }
  358. } {A A 4}
  359. ifcapable subquery {
  360. do_test collate4-2.1.6 {
  361. count {
  362. SELECT a FROM collate4t1 WHERE a IN (SELECT * FROM collate4t2)
  363. ORDER BY rowid
  364. }
  365. } {a A 10}
  366. do_test collate4-2.1.7 {
  367. execsql {
  368. DROP INDEX collate4i1;
  369. CREATE INDEX collate4i1 ON collate4t1(a);
  370. }
  371. count {
  372. SELECT a FROM collate4t1 WHERE a IN (SELECT * FROM collate4t2)
  373. ORDER BY rowid
  374. }
  375. } {a A 6}
  376. do_test collate4-2.1.8 {
  377. count {
  378. SELECT a FROM collate4t1 WHERE a IN ('z', 'a');
  379. }
  380. } {a A 5}
  381. do_test collate4-2.1.9 {
  382. execsql {
  383. DROP INDEX collate4i1;
  384. CREATE INDEX collate4i1 ON collate4t1(a COLLATE TEXT);
  385. }
  386. count {
  387. SELECT a FROM collate4t1 WHERE a IN ('z', 'a') ORDER BY rowid;
  388. }
  389. } {a A 9}
  390. }
  391. do_test collate4-2.1.10 {
  392. execsql {
  393. DROP TABLE collate4t1;
  394. DROP TABLE collate4t2;
  395. }
  396. } {}
  397. do_test collate4-2.2.0 {
  398. execsql {
  399. CREATE TABLE collate4t1(a COLLATE nocase, b COLLATE text, c);
  400. CREATE TABLE collate4t2(a COLLATE nocase, b COLLATE text, c COLLATE TEXT);
  401. INSERT INTO collate4t1 VALUES('0', '0', '0');
  402. INSERT INTO collate4t1 VALUES('0', '0', '1');
  403. INSERT INTO collate4t1 VALUES('0', '1', '0');
  404. INSERT INTO collate4t1 VALUES('0', '1', '1');
  405. INSERT INTO collate4t1 VALUES('1', '0', '0');
  406. INSERT INTO collate4t1 VALUES('1', '0', '1');
  407. INSERT INTO collate4t1 VALUES('1', '1', '0');
  408. INSERT INTO collate4t1 VALUES('1', '1', '1');
  409. insert into collate4t2 SELECT * FROM collate4t1;
  410. }
  411. } {}
  412. do_test collate4-2.2.1 {
  413. count {
  414. SELECT * FROM collate4t2 NOT INDEXED NATURAL JOIN collate4t1 NOT INDEXED;
  415. }
  416. } {0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 63}
  417. do_test collate4-2.2.1b {
  418. execsql {
  419. CREATE INDEX collate4i1 ON collate4t1(a, b, c);
  420. }
  421. count {
  422. SELECT * FROM collate4t2 NATURAL JOIN collate4t1;
  423. }
  424. } {0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 29}
  425. do_test collate4-2.2.2 {
  426. execsql {
  427. DROP INDEX collate4i1;
  428. CREATE INDEX collate4i1 ON collate4t1(a, b, c COLLATE text);
  429. }
  430. count {
  431. SELECT * FROM collate4t2 NATURAL JOIN collate4t1;
  432. }
  433. } {0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 22}
  434. do_test collate4-2.2.10 {
  435. execsql {
  436. DROP TABLE collate4t1;
  437. DROP TABLE collate4t2;
  438. }
  439. } {}
  440. #
  441. # These tests - collate4-3.* verify that indices that implement
  442. # UNIQUE and PRIMARY KEY constraints operate correctly with user
  443. # defined collation sequences.
  444. #
  445. do_test collate4-3.0 {
  446. execsql {
  447. CREATE TABLE collate4t1(a PRIMARY KEY COLLATE NOCASE);
  448. }
  449. } {}
  450. do_test collate4-3.1 {
  451. catchsql {
  452. INSERT INTO collate4t1 VALUES('abc');
  453. INSERT INTO collate4t1 VALUES('ABC');
  454. }
  455. } {1 {column a is not unique}}
  456. do_test collate4-3.2 {
  457. execsql {
  458. SELECT * FROM collate4t1;
  459. }
  460. } {abc}
  461. do_test collate4-3.3 {
  462. catchsql {
  463. INSERT INTO collate4t1 SELECT upper(a) FROM collate4t1;
  464. }
  465. } {1 {column a is not unique}}
  466. do_test collate4-3.4 {
  467. catchsql {
  468. INSERT INTO collate4t1 VALUES(1);
  469. UPDATE collate4t1 SET a = 'abc';
  470. }
  471. } {1 {column a is not unique}}
  472. do_test collate4-3.5 {
  473. execsql {
  474. DROP TABLE collate4t1;
  475. CREATE TABLE collate4t1(a COLLATE NOCASE UNIQUE);
  476. }
  477. } {}
  478. do_test collate4-3.6 {
  479. catchsql {
  480. INSERT INTO collate4t1 VALUES('abc');
  481. INSERT INTO collate4t1 VALUES('ABC');
  482. }
  483. } {1 {column a is not unique}}
  484. do_test collate4-3.7 {
  485. execsql {
  486. SELECT * FROM collate4t1;
  487. }
  488. } {abc}
  489. do_test collate4-3.8 {
  490. catchsql {
  491. INSERT INTO collate4t1 SELECT upper(a) FROM collate4t1;
  492. }
  493. } {1 {column a is not unique}}
  494. do_test collate4-3.9 {
  495. catchsql {
  496. INSERT INTO collate4t1 VALUES(1);
  497. UPDATE collate4t1 SET a = 'abc';
  498. }
  499. } {1 {column a is not unique}}
  500. do_test collate4-3.10 {
  501. execsql {
  502. DROP TABLE collate4t1;
  503. CREATE TABLE collate4t1(a);
  504. CREATE UNIQUE INDEX collate4i1 ON collate4t1(a COLLATE NOCASE);
  505. }
  506. } {}
  507. do_test collate4-3.11 {
  508. catchsql {
  509. INSERT INTO collate4t1 VALUES('abc');
  510. INSERT INTO collate4t1 VALUES('ABC');
  511. }
  512. } {1 {column a is not unique}}
  513. do_test collate4-3.12 {
  514. execsql {
  515. SELECT * FROM collate4t1;
  516. }
  517. } {abc}
  518. do_test collate4-3.13 {
  519. catchsql {
  520. INSERT INTO collate4t1 SELECT upper(a) FROM collate4t1;
  521. }
  522. } {1 {column a is not unique}}
  523. do_test collate4-3.14 {
  524. catchsql {
  525. INSERT INTO collate4t1 VALUES(1);
  526. UPDATE collate4t1 SET a = 'abc';
  527. }
  528. } {1 {column a is not unique}}
  529. do_test collate4-3.15 {
  530. execsql {
  531. DROP TABLE collate4t1;
  532. }
  533. } {}
  534. # Mimic the SQLite 2 collation type NUMERIC.
  535. db collate numeric numeric_collate
  536. proc numeric_collate {lhs rhs} {
  537. if {$lhs == $rhs} {return 0}
  538. return [expr ($lhs>$rhs)?1:-1]
  539. }
  540. #
  541. # These tests - collate4-4.* check that min() and max() only ever
  542. # use indices constructed with built-in collation type numeric.
  543. #
  544. # CHANGED: min() and max() now use the collation type. If there
  545. # is an indice that can be used, it is used.
  546. #
  547. do_test collate4-4.0 {
  548. execsql {
  549. CREATE TABLE collate4t1(a COLLATE TEXT);
  550. INSERT INTO collate4t1 VALUES('2');
  551. INSERT INTO collate4t1 VALUES('10');
  552. INSERT INTO collate4t1 VALUES('20');
  553. INSERT INTO collate4t1 VALUES('104');
  554. }
  555. } {}
  556. do_test collate4-4.1 {
  557. count {
  558. SELECT max(a) FROM collate4t1
  559. }
  560. } {20 3}
  561. do_test collate4-4.2 {
  562. count {
  563. SELECT min(a) FROM collate4t1
  564. }
  565. } {10 3}
  566. do_test collate4-4.3 {
  567. # Test that the index with collation type TEXT is used.
  568. execsql {
  569. CREATE INDEX collate4i1 ON collate4t1(a);
  570. }
  571. count {
  572. SELECT min(a) FROM collate4t1;
  573. }
  574. } {10 1}
  575. do_test collate4-4.4 {
  576. count {
  577. SELECT max(a) FROM collate4t1;
  578. }
  579. } {20 0}
  580. do_test collate4-4.5 {
  581. # Test that the index with collation type NUMERIC is not used.
  582. execsql {
  583. DROP INDEX collate4i1;
  584. CREATE INDEX collate4i1 ON collate4t1(a COLLATE NUMERIC);
  585. }
  586. count {
  587. SELECT min(a) FROM collate4t1;
  588. }
  589. } {10 3}
  590. do_test collate4-4.6 {
  591. count {
  592. SELECT max(a) FROM collate4t1;
  593. }
  594. } {20 3}
  595. do_test collate4-4.7 {
  596. execsql {
  597. DROP TABLE collate4t1;
  598. }
  599. } {}
  600. # Also test the scalar min() and max() functions.
  601. #
  602. do_test collate4-4.8 {
  603. execsql {
  604. CREATE TABLE collate4t1(a COLLATE TEXT, b COLLATE NUMERIC);
  605. INSERT INTO collate4t1 VALUES('11', '101');
  606. INSERT INTO collate4t1 VALUES('101', '11')
  607. }
  608. } {}
  609. do_test collate4-4.9 {
  610. execsql {
  611. SELECT max(a, b) FROM collate4t1;
  612. }
  613. } {11 11}
  614. do_test collate4-4.10 {
  615. execsql {
  616. SELECT max(b, a) FROM collate4t1;
  617. }
  618. } {101 101}
  619. do_test collate4-4.11 {
  620. execsql {
  621. SELECT max(a, '101') FROM collate4t1;
  622. }
  623. } {11 101}
  624. do_test collate4-4.12 {
  625. execsql {
  626. SELECT max('101', a) FROM collate4t1;
  627. }
  628. } {11 101}
  629. do_test collate4-4.13 {
  630. execsql {
  631. SELECT max(b, '101') FROM collate4t1;
  632. }
  633. } {101 101}
  634. do_test collate4-4.14 {
  635. execsql {
  636. SELECT max('101', b) FROM collate4t1;
  637. }
  638. } {101 101}
  639. do_test collate4-4.15 {
  640. execsql {
  641. DROP TABLE collate4t1;
  642. }
  643. } {}
  644. #
  645. # These tests - collate4.6.* - ensure that implict INTEGER PRIMARY KEY
  646. # indices do not confuse collation sequences.
  647. #
  648. # These indices are never used for sorting in SQLite. And you can't
  649. # create another index on an INTEGER PRIMARY KEY column, so we don't have
  650. # to test that.
  651. # (Revised 2004-Nov-22): The ROWID can be used for sorting now.
  652. #
  653. do_test collate4-6.0 {
  654. execsql {
  655. CREATE TABLE collate4t1(a INTEGER PRIMARY KEY);
  656. INSERT INTO collate4t1 VALUES(101);
  657. INSERT INTO collate4t1 VALUES(10);
  658. INSERT INTO collate4t1 VALUES(15);
  659. }
  660. } {}
  661. do_test collate4-6.1 {
  662. cksort {
  663. SELECT * FROM collate4t1 ORDER BY 1;
  664. }
  665. } {10 15 101 nosort}
  666. do_test collate4-6.2 {
  667. cksort {
  668. SELECT * FROM collate4t1 ORDER BY oid;
  669. }
  670. } {10 15 101 nosort}
  671. do_test collate4-6.3 {
  672. cksort {
  673. SELECT * FROM collate4t1 ORDER BY oid||'' COLLATE TEXT;
  674. }
  675. } {10 101 15 sort}
  676. finish_test