fkey5.test 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. # 2012 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 tests the PRAGMA foreign_key_check command.
  14. #
  15. # EVIDENCE-OF: R-05426-18119 PRAGMA foreign_key_check; PRAGMA
  16. # foreign_key_check(table-name);
  17. set testdir [file dirname $argv0]
  18. source $testdir/tester.tcl
  19. set testprefix fkey5
  20. ifcapable {!foreignkey} {
  21. finish_test
  22. return
  23. }
  24. do_test fkey5-1.1 {
  25. db eval {
  26. CREATE TABLE p1(a INTEGER PRIMARY KEY); INSERT INTO p1 VALUES(88),(89);
  27. CREATE TABLE p2(a INT PRIMARY KEY); INSERT INTO p2 VALUES(77),(78);
  28. CREATE TABLE p3(a TEXT PRIMARY KEY);
  29. INSERT INTO p3 VALUES(66),(67),('alpha'),('BRAVO');
  30. CREATE TABLE p4(a TEXT PRIMARY KEY COLLATE nocase);
  31. INSERT INTO p4 VALUES('alpha'),('BRAVO'),('55'),('Delta'),('ECHO');
  32. CREATE TABLE p5(a INTEGER PRIMARY KEY, b, c, UNIQUE(b,c));
  33. INSERT INTO p5 VALUES(1,'Alpha','abc'),(2,'beta','def');
  34. CREATE TABLE p6(a INTEGER PRIMARY KEY, b TEXT COLLATE nocase,
  35. c TEXT COLLATE rtrim, UNIQUE(b,c));
  36. INSERT INTO p6 VALUES(1,'Alpha','abc '),(2,'bETA','def ');
  37. CREATE TABLE c1(x INTEGER PRIMARY KEY references p1);
  38. CREATE TABLE c2(x INTEGER PRIMARY KEY references p2);
  39. CREATE TABLE c3(x INTEGER PRIMARY KEY references p3);
  40. CREATE TABLE c4(x INTEGER PRIMARY KEY references p4);
  41. CREATE TABLE c5(x INT references p1);
  42. CREATE TABLE c6(x INT references p2);
  43. CREATE TABLE c7(x INT references p3);
  44. CREATE TABLE c8(x INT references p4);
  45. CREATE TABLE c9(x TEXT UNIQUE references p1);
  46. CREATE TABLE c10(x TEXT UNIQUE references p2);
  47. CREATE TABLE c11(x TEXT UNIQUE references p3);
  48. CREATE TABLE c12(x TEXT UNIQUE references p4);
  49. CREATE TABLE c13(x TEXT COLLATE nocase references p3);
  50. CREATE TABLE c14(x TEXT COLLATE nocase references p4);
  51. CREATE TABLE c15(x, y, FOREIGN KEY(x,y) REFERENCES p5(b,c));
  52. CREATE TABLE c16(x, y, FOREIGN KEY(x,y) REFERENCES p5(c,b));
  53. CREATE TABLE c17(x, y, FOREIGN KEY(x,y) REFERENCES p6(b,c));
  54. CREATE TABLE c18(x, y, FOREIGN KEY(x,y) REFERENCES p6(c,b));
  55. CREATE TABLE c19(x TEXT COLLATE nocase, y TEXT COLLATE rtrim,
  56. FOREIGN KEY(x,y) REFERENCES p5(b,c));
  57. CREATE TABLE c20(x TEXT COLLATE nocase, y TEXT COLLATE rtrim,
  58. FOREIGN KEY(x,y) REFERENCES p5(c,b));
  59. CREATE TABLE c21(x TEXT COLLATE nocase, y TEXT COLLATE rtrim,
  60. FOREIGN KEY(x,y) REFERENCES p6(b,c));
  61. CREATE TABLE c22(x TEXT COLLATE nocase, y TEXT COLLATE rtrim,
  62. FOREIGN KEY(x,y) REFERENCES p6(c,b));
  63. PRAGMA foreign_key_check;
  64. }
  65. } {}
  66. do_test fkey5-1.2 {
  67. db eval {
  68. INSERT INTO c1 VALUES(90),(87),(88);
  69. PRAGMA foreign_key_check;
  70. }
  71. } {c1 87 p1 0 c1 90 p1 0}
  72. do_test fkey5-1.3 {
  73. db eval {
  74. PRAGMA foreign_key_check(c1);
  75. }
  76. } {c1 87 p1 0 c1 90 p1 0}
  77. do_test fkey5-1.4 {
  78. db eval {
  79. PRAGMA foreign_key_check(c2);
  80. }
  81. } {}
  82. # EVIDENCE-OF: R-45728-08709 There are four columns in each result row.
  83. #
  84. # EVIDENCE-OF: R-55672-01620 The first column is the name of the table
  85. # that contains the REFERENCES clause.
  86. #
  87. # EVIDENCE-OF: R-25219-25618 The second column is the rowid of the row
  88. # that contains the invalid REFERENCES clause.
  89. #
  90. # EVIDENCE-OF: R-40482-20265 The third column is the name of the table
  91. # that is referred to.
  92. #
  93. # EVIDENCE-OF: R-62839-07969 The fourth column is the index of the
  94. # specific foreign key constraint that failed.
  95. #
  96. do_test fkey5-2.0 {
  97. db eval {
  98. INSERT INTO c5 SELECT x FROM c1;
  99. DELETE FROM c1;
  100. PRAGMA foreign_key_check;
  101. }
  102. } {c5 1 p1 0 c5 3 p1 0}
  103. do_test fkey5-2.1 {
  104. db eval {
  105. PRAGMA foreign_key_check(c5);
  106. }
  107. } {c5 1 p1 0 c5 3 p1 0}
  108. do_test fkey5-2.2 {
  109. db eval {
  110. PRAGMA foreign_key_check(c1);
  111. }
  112. } {}
  113. do_execsql_test fkey5-2.3 {
  114. PRAGMA foreign_key_list(c5);
  115. } {0 0 p1 x {} {NO ACTION} {NO ACTION} NONE}
  116. do_test fkey5-3.0 {
  117. db eval {
  118. INSERT INTO c9 SELECT x FROM c5;
  119. DELETE FROM c5;
  120. PRAGMA foreign_key_check;
  121. }
  122. } {c9 1 p1 0 c9 3 p1 0}
  123. do_test fkey5-3.1 {
  124. db eval {
  125. PRAGMA foreign_key_check(c9);
  126. }
  127. } {c9 1 p1 0 c9 3 p1 0}
  128. do_test fkey5-3.2 {
  129. db eval {
  130. PRAGMA foreign_key_check(c5);
  131. }
  132. } {}
  133. do_test fkey5-4.0 {
  134. db eval {
  135. DELETE FROM c9;
  136. INSERT INTO c2 VALUES(79),(77),(76);
  137. PRAGMA foreign_key_check;
  138. }
  139. } {c2 76 p2 0 c2 79 p2 0}
  140. do_test fkey5-4.1 {
  141. db eval {
  142. PRAGMA foreign_key_check(c2);
  143. }
  144. } {c2 76 p2 0 c2 79 p2 0}
  145. do_test fkey5-4.2 {
  146. db eval {
  147. INSERT INTO c6 SELECT x FROM c2;
  148. DELETE FROM c2;
  149. PRAGMA foreign_key_check;
  150. }
  151. } {c6 1 p2 0 c6 3 p2 0}
  152. do_test fkey5-4.3 {
  153. db eval {
  154. PRAGMA foreign_key_check(c6);
  155. }
  156. } {c6 1 p2 0 c6 3 p2 0}
  157. do_test fkey5-4.4 {
  158. db eval {
  159. INSERT INTO c10 SELECT x FROM c6;
  160. DELETE FROM c6;
  161. PRAGMA foreign_key_check;
  162. }
  163. } {c10 1 p2 0 c10 3 p2 0}
  164. do_test fkey5-4.5 {
  165. db eval {
  166. PRAGMA foreign_key_check(c10);
  167. }
  168. } {c10 1 p2 0 c10 3 p2 0}
  169. do_test fkey5-5.0 {
  170. db eval {
  171. DELETE FROM c10;
  172. INSERT INTO c3 VALUES(68),(67),(65);
  173. PRAGMA foreign_key_check;
  174. }
  175. } {c3 65 p3 0 c3 68 p3 0}
  176. do_test fkey5-5.1 {
  177. db eval {
  178. PRAGMA foreign_key_check(c3);
  179. }
  180. } {c3 65 p3 0 c3 68 p3 0}
  181. do_test fkey5-5.2 {
  182. db eval {
  183. INSERT INTO c7 SELECT x FROM c3;
  184. INSERT INTO c7 VALUES('Alpha'),('alpha'),('foxtrot');
  185. DELETE FROM c3;
  186. PRAGMA foreign_key_check;
  187. }
  188. } {c7 1 p3 0 c7 3 p3 0 c7 4 p3 0 c7 6 p3 0}
  189. do_test fkey5-5.3 {
  190. db eval {
  191. PRAGMA foreign_key_check(c7);
  192. }
  193. } {c7 1 p3 0 c7 3 p3 0 c7 4 p3 0 c7 6 p3 0}
  194. do_test fkey5-5.4 {
  195. db eval {
  196. INSERT INTO c11 SELECT x FROM c7;
  197. DELETE FROM c7;
  198. PRAGMA foreign_key_check;
  199. }
  200. } {c11 1 p3 0 c11 3 p3 0 c11 4 p3 0 c11 6 p3 0}
  201. do_test fkey5-5.5 {
  202. db eval {
  203. PRAGMA foreign_key_check(c11);
  204. }
  205. } {c11 1 p3 0 c11 3 p3 0 c11 4 p3 0 c11 6 p3 0}
  206. do_test fkey5-6.0 {
  207. db eval {
  208. DELETE FROM c11;
  209. INSERT INTO c4 VALUES(54),(55),(56);
  210. PRAGMA foreign_key_check;
  211. }
  212. } {c4 54 p4 0 c4 56 p4 0}
  213. do_test fkey5-6.1 {
  214. db eval {
  215. PRAGMA foreign_key_check(c4);
  216. }
  217. } {c4 54 p4 0 c4 56 p4 0}
  218. do_test fkey5-6.2 {
  219. db eval {
  220. INSERT INTO c8 SELECT x FROM c4;
  221. INSERT INTO c8 VALUES('Alpha'),('ALPHA'),('foxtrot');
  222. DELETE FROM c4;
  223. PRAGMA foreign_key_check;
  224. }
  225. } {c8 1 p4 0 c8 3 p4 0 c8 6 p4 0}
  226. do_test fkey5-6.3 {
  227. db eval {
  228. PRAGMA foreign_key_check(c8);
  229. }
  230. } {c8 1 p4 0 c8 3 p4 0 c8 6 p4 0}
  231. do_test fkey5-6.4 {
  232. db eval {
  233. INSERT INTO c12 SELECT x FROM c8;
  234. DELETE FROM c8;
  235. PRAGMA foreign_key_check;
  236. }
  237. } {c12 1 p4 0 c12 3 p4 0 c12 6 p4 0}
  238. do_test fkey5-6.5 {
  239. db eval {
  240. PRAGMA foreign_key_check(c12);
  241. }
  242. } {c12 1 p4 0 c12 3 p4 0 c12 6 p4 0}
  243. do_test fkey5-7.1 {
  244. db eval {
  245. INSERT OR IGNORE INTO c13 SELECT * FROM c12;
  246. INSERT OR IGNORE INTO C14 SELECT * FROM c12;
  247. DELETE FROM c12;
  248. PRAGMA foreign_key_check;
  249. }
  250. } {c14 1 p4 0 c14 3 p4 0 c14 6 p4 0 c13 1 p3 0 c13 2 p3 0 c13 3 p3 0 c13 4 p3 0 c13 5 p3 0 c13 6 p3 0}
  251. do_test fkey5-7.2 {
  252. db eval {
  253. PRAGMA foreign_key_check(c14);
  254. }
  255. } {c14 1 p4 0 c14 3 p4 0 c14 6 p4 0}
  256. do_test fkey5-7.3 {
  257. db eval {
  258. PRAGMA foreign_key_check(c13);
  259. }
  260. } {c13 1 p3 0 c13 2 p3 0 c13 3 p3 0 c13 4 p3 0 c13 5 p3 0 c13 6 p3 0}
  261. do_test fkey5-8.0 {
  262. db eval {
  263. DELETE FROM c13;
  264. DELETE FROM c14;
  265. INSERT INTO c19 VALUES('alpha','abc');
  266. PRAGMA foreign_key_check(c19);
  267. }
  268. } {c19 1 p5 0}
  269. do_test fkey5-8.1 {
  270. db eval {
  271. DELETE FROM c19;
  272. INSERT INTO c19 VALUES('Alpha','abc');
  273. PRAGMA foreign_key_check(c19);
  274. }
  275. } {}
  276. do_test fkey5-8.2 {
  277. db eval {
  278. INSERT INTO c20 VALUES('Alpha','abc');
  279. PRAGMA foreign_key_check(c20);
  280. }
  281. } {c20 1 p5 0}
  282. do_test fkey5-8.3 {
  283. db eval {
  284. DELETE FROM c20;
  285. INSERT INTO c20 VALUES('abc','Alpha');
  286. PRAGMA foreign_key_check(c20);
  287. }
  288. } {}
  289. do_test fkey5-8.4 {
  290. db eval {
  291. INSERT INTO c21 VALUES('alpha','abc ');
  292. PRAGMA foreign_key_check(c21);
  293. }
  294. } {}
  295. do_test fkey5-8.5 {
  296. db eval {
  297. DELETE FROM c21;
  298. INSERT INTO c19 VALUES('Alpha','abc');
  299. PRAGMA foreign_key_check(c21);
  300. }
  301. } {}
  302. do_test fkey5-8.6 {
  303. db eval {
  304. INSERT INTO c22 VALUES('Alpha','abc');
  305. PRAGMA foreign_key_check(c22);
  306. }
  307. } {c22 1 p6 0}
  308. do_test fkey5-8.7 {
  309. db eval {
  310. DELETE FROM c22;
  311. INSERT INTO c22 VALUES('abc ','ALPHA');
  312. PRAGMA foreign_key_check(c22);
  313. }
  314. } {}
  315. #-------------------------------------------------------------------------
  316. # Tests 9.* verify that missing parent tables are handled correctly.
  317. #
  318. do_execsql_test 9.1.1 {
  319. CREATE TABLE k1(x REFERENCES s1);
  320. PRAGMA foreign_key_check(k1);
  321. } {}
  322. do_execsql_test 9.1.2 {
  323. INSERT INTO k1 VALUES(NULL);
  324. PRAGMA foreign_key_check(k1);
  325. } {}
  326. do_execsql_test 9.1.3 {
  327. INSERT INTO k1 VALUES(1);
  328. PRAGMA foreign_key_check(k1);
  329. } {k1 2 s1 0}
  330. do_execsql_test 9.2.1 {
  331. CREATE TABLE k2(x, y, FOREIGN KEY(x, y) REFERENCES s1(a, b));
  332. PRAGMA foreign_key_check(k2);
  333. } {}
  334. do_execsql_test 9.2 {
  335. INSERT INTO k2 VALUES(NULL, 'five');
  336. PRAGMA foreign_key_check(k2);
  337. } {}
  338. do_execsql_test 9.3 {
  339. INSERT INTO k2 VALUES('one', NULL);
  340. PRAGMA foreign_key_check(k2);
  341. } {}
  342. do_execsql_test 9.4 {
  343. INSERT INTO k2 VALUES('six', 'seven');
  344. PRAGMA foreign_key_check(k2);
  345. } {k2 3 s1 0}
  346. finish_test