From 8b6d37d8bc074528da24281cea03d17b3f9e55e8 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 8 Oct 2009 13:42:28 +0000 Subject: [PATCH] Fix a problem in the legacy genfkey code to do with column names that require quoting. FossilOrigin-Name: 273ccbf18af5191807678a0a0c09cda82408b29c --- manifest | 14 +++++------ manifest.uuid | 2 +- src/shell.c | 12 +++++----- tool/genfkey.test | 60 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 78c3726921..274330f67b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stests\sto\stest/e_fkey.test. -D 2009-10-08T11:57:25 +C Fix\sa\sproblem\sin\sthe\slegacy\sgenfkey\scode\sto\sdo\swith\scolumn\snames\sthat\srequire\squoting. +D 2009-10-08T13:42:28 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in 4ca3f1dd6efa2075bcb27f4dc43eef749877740d F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -161,7 +161,7 @@ F src/random.c 676b9d7ac820fe81e6fb2394ac8c10cff7f38628 F src/resolve.c 941843301f6fda6c6350839c6955a172441a0782 F src/rowset.c c64dafba1f9fd876836c8db8682966b9d197eb1f F src/select.c 1d0a13137532321b4364f964e46f057d271691e3 -F src/shell.c d6e64471aafb81f355262533393169a70529847a +F src/shell.c 270231b3f587f1f86391b9994fdfcd5d472c3fdf F src/sqlite.h.in 2c9fa83525b14fe3dda38146fb3005847d57a14e F src/sqlite3ext.h 1db7d63ab5de4b3e6b83dd03d1a4e64fef6d2a17 F src/sqliteInt.h 61c55f5f83c63813903f374e9b33173572f0559a @@ -734,7 +734,7 @@ F test/zeroblob.test caaecfb4f908f7bc086ed238668049f96774d688 F tool/diffdb.c 7524b1b5df217c20cd0431f6789851a4e0cb191b F tool/fragck.tcl 5265a95126abcf6ab357f7efa544787e5963f439 F tool/genfkey.README cf68fddd4643bbe3ff8e31b8b6d8b0a1b85e20f4 -F tool/genfkey.test 405a43d54f1646bfaa7a84b03bb959aef62a3a49 +F tool/genfkey.test 4196a8928b78f51d54ef58e99e99401ab2f0a7e5 F tool/lemon.c 0eb9829c494dfcea449de36ad677efe7f0742801 F tool/lempar.c 2ed70b3fc896a47e07fedfe543324f008f53d223 F tool/mkkeywordhash.c 8c9f8e3253555101aaa4bf7a0459cbfc8ddc41cc @@ -756,7 +756,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 5806925283b889867567c4ad92518bad000e9d9d -R 97b0c9624c1352ee1bd2b4c1a280677a +P 533703d78ab4330b2dc8e08aaba89b4667e46331 +R ab684cf0fa4376c5eb1747e06c0968a4 U dan -Z b579362d2c03d6f47ae2f91d34cdcb70 +Z 3e243fab4d4da81ce8aeeb768378731e diff --git a/manifest.uuid b/manifest.uuid index 35b5cc82fa..f87d5f9217 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -533703d78ab4330b2dc8e08aaba89b4667e46331 \ No newline at end of file +273ccbf18af5191807678a0a0c09cda82408b29c \ No newline at end of file diff --git a/src/shell.c b/src/shell.c index 9dde40b932..2186f4f621 100644 --- a/src/shell.c +++ b/src/shell.c @@ -876,8 +876,8 @@ static int genfkey_create_triggers( ", '/ref/', dq(to_tbl)" ", '/key_notnull/', sj('new.' || dq(from_col) || ' IS NOT NULL', ' AND ')" - ", '/fkey_list/', sj(to_col, ', ')" - ", '/rkey_list/', sj(from_col, ', ')" + ", '/fkey_list/', sj(dq(to_col), ', ')" + ", '/rkey_list/', sj(dq(from_col), ', ')" ", '/cond1/', sj(multireplace('new./from/ == /to/'" ", '/from/', dq(from_col)" @@ -891,9 +891,9 @@ static int genfkey_create_triggers( ", '/update_action/', CASE on_update " "WHEN 'SET NULL' THEN " "multireplace('UPDATE /tbl/ SET /setlist/ WHERE /where/;' " - ", '/setlist/', sj(from_col||' = NULL',', ')" + ", '/setlist/', sj(dq(from_col)||' = NULL',', ')" ", '/tbl/', dq(from_tbl)" - ", '/where/', sj(from_col||' = old.'||dq(to_col),' AND ')" + ", '/where/', sj(dq(from_col)||' = old.'||dq(to_col),' AND ')" ")" "WHEN 'CASCADE' THEN " "multireplace('UPDATE /tbl/ SET /setlist/ WHERE /where/;' " @@ -908,9 +908,9 @@ static int genfkey_create_triggers( ", '/delete_action/', CASE on_delete " "WHEN 'SET NULL' THEN " "multireplace('UPDATE /tbl/ SET /setlist/ WHERE /where/;' " - ", '/setlist/', sj(from_col||' = NULL',', ')" + ", '/setlist/', sj(dq(from_col)||' = NULL',', ')" ", '/tbl/', dq(from_tbl)" - ", '/where/', sj(from_col||' = old.'||dq(to_col),' AND ')" + ", '/where/', sj(dq(from_col)||' = old.'||dq(to_col),' AND ')" ")" "WHEN 'CASCADE' THEN " "multireplace('DELETE FROM /tbl/ WHERE /where/;' " diff --git a/tool/genfkey.test b/tool/genfkey.test index e1011d62f1..3c0073e953 100644 --- a/tool/genfkey.test +++ b/tool/genfkey.test @@ -292,3 +292,63 @@ do_test genfkey-5.5 { } } {0 {}} +# Test also column names that require quoting. +do_test genfkey-6.1 { + execsql { + DROP TABLE "t.3"; + DROP TABLE t13; + CREATE TABLE p( + "a.1 first", "b.2 second", + UNIQUE("a.1 first", "b.2 second") + ); + CREATE TABLE c( + "c.1 I", "d.2 II", + FOREIGN KEY("c.1 I", "d.2 II") + REFERENCES p("a.1 first", "b.2 second") + ON UPDATE CASCADE ON DELETE CASCADE + ); + } +} {} +do_test genfkey-6.2 { + set rc [catch {exec ./sqlite3 test.db .genfkey} msg] +} {0} +do_test genfkey-6.3 { + execsql $msg + execsql { + INSERT INTO p VALUES('A', 'B'); + INSERT INTO p VALUES('C', 'D'); + INSERT INTO c VALUES('A', 'B'); + INSERT INTO c VALUES('C', 'D'); + UPDATE p SET "a.1 first" = 'X' WHERE rowid = 1; + DELETE FROM p WHERE rowid = 2; + } + execsql { SELECT * FROM c } +} {X B} + +do_test genfkey-6.4 { + execsql { + DROP TABLE p; + DROP TABLE c; + CREATE TABLE parent("a.1", PRIMARY KEY("a.1")); + CREATE TABLE child("b.2", FOREIGN KEY("b.2") REFERENCES parent("a.1")); + } + set rc [catch {exec ./sqlite3 test.db .genfkey} msg] +} {0} +do_test genfkey-6.5 { + execsql $msg + execsql { + INSERT INTO parent VALUES(1); + INSERT INTO child VALUES(1); + } + catchsql { UPDATE parent SET "a.1"=0 } +} {1 {constraint failed}} +do_test genfkey-6.6 { + catchsql { UPDATE child SET "b.2"=7 } +} {1 {constraint failed}} +do_test genfkey-6.7 { + execsql { + SELECT * FROM parent; + SELECT * FROM child; + } +} {1 1} +