]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix the ".lint fkey" shell tool command so that it works for foreign keys that
authordan <dan@noemail.net>
Thu, 6 Apr 2017 12:06:56 +0000 (12:06 +0000)
committerdan <dan@noemail.net>
Thu, 6 Apr 2017 12:06:56 +0000 (12:06 +0000)
refer implicitly to primary key columns with non-BINARY default collation
sequences.

FossilOrigin-Name: 327eff25ba2420267cc8dc49dd3c3aab45f4bf9e060d1ad480e25d016d21f3ba

manifest
manifest.uuid
src/shell.c
test/shell6.test

index ad4644ec59fb992a2f429b225599584ea6359125..768c769f241f1cab7f7304337ef2686481b1a444 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Remove\sa\sconfusing\sand\spointless\ssentence\sfrom\sthe\sdocumentation\sfor\sthe\nsqlite3_interrupt()\sinterface.
-D 2017-04-05T13:44:40.495
+C Fix\sthe\s".lint\sfkey"\sshell\stool\scommand\sso\sthat\sit\sworks\sfor\sforeign\skeys\sthat\nrefer\simplicitly\sto\sprimary\skey\scolumns\swith\snon-BINARY\sdefault\scollation\nsequences.
+D 2017-04-06T12:06:56.710
 F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc a4c0613a18663bda56d8cf76079ab6590a7c3602e54befb4bbdef76bcaa38b6a
@@ -402,7 +402,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
 F src/resolve.c 3e518b962d932a997fae373366880fc028c75706
 F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac
 F src/select.c afcf31d8ed7c890328a31d3f350467ccd273af345b24562382b398d6d9cd0664
-F src/shell.c ceb2b2f1f958ea2c47a7f37972d0f715fbf9dcf6a34a5e98c886b85e3ce6a238
+F src/shell.c 358aaf2642749697283969d3287bd1088047b08b3f5b98959aa5d1658e358199
 F src/sqlite.h.in ab77e511620eebbd4ed7e4f52fae697b6870dda66c945acd2d3066f99c98e17e
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h 58fd0676d3111d02e62e5a35992a7d3da5d3f88753acc174f2d37b774fbbdd28
@@ -1120,7 +1120,7 @@ F test/shell2.test e242a9912f44f4c23c3d1d802a83e934e84c853b
 F test/shell3.test 9b95ba643eaa228376f06a898fb410ee9b6e57c1
 F test/shell4.test 89ad573879a745974ff2df20ff97c5d6ffffbd5d
 F test/shell5.test 50a732c1c2158b1cd62cf53975ce1ea7ce6b9dc9
-F test/shell6.test cff624fadf71bdb5e3a9b0f86eaf59a43c0622b1
+F test/shell6.test 0abf96c5ba713b6868ba93b9c787d636e9a95b437c7fd410b4c5a0178503f18b
 F test/shell7.test 07751911b294698e0c5df67bcbd29e7d2f0f2907
 F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3
 F test/show_speedtest1_rtree.tcl 32e6c5f073d7426148a6936a0408f4b5b169aba5
@@ -1570,7 +1570,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P ad90e8bb5e47945607c8fb47b6ade8cfc52a9b684805cc40132629be0ecc14cc
-R 0da0d3fa99b145cb80d7d7b7e70ff343
-U drh
-Z 6dd2cf9dfbc2819a60bcde96dd9394fa
+P c5f1a2b6eb3df879d247a22b3f92f4f74fcf4f0d219450abc420ae6d02481324
+R 38865868241e76c5f4d0751e4191f43b
+U dan
+Z 648bbd72dcc7b5fa391514717251386d
index 912a998fe7466427355357d30b64fc2ce054d32f..3a5b11b74fed936c57da9bda55311478ee3cd924 100644 (file)
@@ -1 +1 @@
-c5f1a2b6eb3df879d247a22b3f92f4f74fcf4f0d219450abc420ae6d02481324
\ No newline at end of file
+327eff25ba2420267cc8dc49dd3c3aab45f4bf9e060d1ad480e25d016d21f3ba
\ No newline at end of file
index 1236b12a0e909d4b739c18a20d400d3b32bf453b..ab26865f3b671c0984caa0c9c69fdef62351f59f 100644 (file)
@@ -4331,26 +4331,26 @@ static int lintFkeyIndexes(
   "SELECT "
     "     'EXPLAIN QUERY PLAN SELECT rowid FROM ' || quote(s.name) || ' WHERE '"
     "  || group_concat(quote(s.name) || '.' || quote(f.[from]) || '=?' "
-    "  || fkey_collate_clause(f.[table], f.[to], s.name, f.[from]),' AND ')"
+    "  || fkey_collate_clause("
+    "       f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]),' AND ')"
     ", "
     "     'SEARCH TABLE ' || s.name || ' USING COVERING INDEX*('"
     "  || group_concat('*=?', ' AND ') || ')'"
     ", "
     "     s.name  || '(' || group_concat(f.[from],  ', ') || ')'"
     ", "
-    "     f.[table] || '(' || group_concat(COALESCE(f.[to], "
-    "       (SELECT name FROM pragma_table_info(f.[table]) WHERE pk=seq+1)"
-    "     )) || ')'"
+    "     f.[table] || '(' || group_concat(COALESCE(f.[to], p.[name])) || ')'"
     ", "
     "     'CREATE INDEX ' || quote(s.name ||'_'|| group_concat(f.[from], '_'))"
     "  || ' ON ' || quote(s.name) || '('"
     "  || group_concat(quote(f.[from]) ||"
-    "        fkey_collate_clause(f.[table], f.[to], s.name, f.[from]), ', ')"
+    "        fkey_collate_clause("
+    "          f.[table], COALESCE(f.[to], p.[name]), s.name, f.[from]), ', ')"
     "  || ');'"
     ", "
     "     f.[table] "
-
     "FROM sqlite_master AS s, pragma_foreign_key_list(s.name) AS f "
+    "LEFT JOIN pragma_table_info AS p ON (pk-1=seq AND p.arg=f.[table]) "
     "GROUP BY s.name, f.id "
     "ORDER BY (CASE WHEN ? THEN f.[table] ELSE s.name END)"
   ;
index a70c4b429833fa32c3a7fe069108d2111168fda2..d762732d598b169678bb2f01570b8c3bccac8a70 100644 (file)
@@ -73,6 +73,20 @@ foreach {tn schema output} {
     CREATE INDEX 'y1_a' ON 'y1'('a' COLLATE nocase); --> x1(a)
   }
 
+  7 {
+    CREATE TABLE x1(a PRIMARY KEY COLLATE nocase, b);
+    CREATE TABLE y1(a REFERENCES x1);
+  } {
+    CREATE INDEX 'y1_a' ON 'y1'('a' COLLATE nocase); --> x1(a)
+  }
+
+  8 {
+    CREATE TABLE x1(a, b COLLATE nocase, c COLLATE rtrim, PRIMARY KEY(c, b, a));
+    CREATE TABLE y1(d, e, f, FOREIGN KEY(d, e, f) REFERENCES x1);
+  } {
+    CREATE INDEX 'y1_d_e_f' ON 'y1'('d' COLLATE rtrim, 'e' COLLATE nocase, 'f'); --> x1(c,b,a)
+  }
+
 } {
   forcedelete test.db
   sqlite3 db test.db