-C Avoid\sunnecessary\scursor\sseeking\swhen\sperforming\san\sUPSERT.
-D 2018-04-20T17:02:16.531
+C Add\stests\sfor\sname\sresolution\sin\sON\sCONFLICT\sclauses.
+D 2018-04-20T17:50:49.589
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F Makefile.in 5ce9343cba9c189046f1afe6d2bcc1f68079439febc05267b98aec6ecc752439
F test/upsert1.test 934315888a04b4e119ebb6abf558d92bf01d9f94fc8ff0bbc1c7c6015005340f
F test/upsert2.test 9c3cdbb1a890227f6504ce4b0e3de68f4cdfa16bb21d8641208a9239896c5a09
F test/upsert3.test 88d7d590a1948a9cb6eac1b54b0642f67a9f35a1fc0f19b200e97d5d39e3179c
-F test/upsert4.test c70b9dd9ae9952d8942ae2558dcecdeb1128097b1d03a22d8ae42660112ffc73
+F test/upsert4.test 1674e23c9d831e39464865a9fa63d855e148eeced8a147e8911febfe7c11f771
F test/uri.test 3481026f00ade6dfe8adb7acb6e1e47b04369568
F test/uri2.test 9d3ba7a53ee167572d53a298ee4a5d38ec4a8fb7
F test/userauth01.test e740a2697a7b40d7c5003a7d7edaee16acd349a9
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P d8eb9f8d9b61400c7e12f01ef5c233257b03532221f7c7a8386f7ac2db439626 131ed95e1452a5b0d92341c48a5d3915b328ccfce2cf605f702428ae7ee3e21b
-R 18734526551b7a3f2bbebfc4bb6f5573
-T +closed 131ed95e1452a5b0d92341c48a5d3915b328ccfce2cf605f702428ae7ee3e21b
-U drh
-Z 23a2cba3b6d85936a323e52ae5cb1690
+P 693a3dcbdd8fb2d516c0f46fdbb478838cde675afc1026740e942705aac3c07f
+R edb0f8d75d196edc7e220a2b21ed76d2
+U dan
+Z 98b6f0b67bad58c0b46cab1188f88f7f
} {1 {ON CONFLICT clause does not match any PRIMARY KEY or UNIQUE constraint}}
#-------------------------------------------------------------------------
+# Test that ON CONFLICT constraint processing occurs before any REPLACE
+# constraint processing.
#
-do_execsql_test 6.0 {
- CREATE TABLE t1(a INTEGER PRIMARY KEY, b UNIQUE, c);
- INSERT INTO t1 VALUES(1, 1, 'one');
- INSERT INTO t1 VALUES(2, 2, 'two');
- INSERT OR REPLACE INTO t1 VALUES(1, 2, 'two') ON CONFLICT(b) DO NOTHING;
- PRAGMA integrity_check;
-} {ok}
+foreach {tn sql} {
+ 1 {
+ CREATE TABLE t1(a INTEGER PRIMARY KEY, b UNIQUE, c);
+ }
+ 2 {
+ CREATE TABLE t1(a INT PRIMARY KEY, b UNIQUE, c);
+ }
+ 3 {
+ CREATE TABLE t1(a INT PRIMARY KEY, b UNIQUE, c) WITHOUT ROWID;
+ }
+} {
+ reset_db
+ execsql $sql
+ do_execsql_test 6.1.$tn {
+ INSERT INTO t1 VALUES(1, 1, 'one');
+ INSERT INTO t1 VALUES(2, 2, 'two');
+ INSERT OR REPLACE INTO t1 VALUES(1, 2, 'two') ON CONFLICT(b) DO NOTHING;
+ PRAGMA integrity_check;
+ } {ok}
+}
-finish_test
+foreach {tn sql} {
+ 1 {
+ CREATE TABLE t1(a INTEGER PRIMARY KEY, b UNIQUE, c UNIQUE);
+ }
+} {
+ reset_db
+ execsql $sql
+
+ do_execsql_test 6.2.$tn.1 {
+ INSERT INTO t1 VALUES(1, 1, 1);
+ INSERT INTO t1 VALUES(2, 2, 2);
+ }
+
+ do_execsql_test 6.2.$tn.2 {
+ INSERT OR REPLACE INTO t1 VALUES(3, 1, 1) ON CONFLICT(b) DO NOTHING;
+ SELECT * FROM t1;
+ PRAGMA integrity_check;
+ } {1 1 1 2 2 2 ok}
+
+ do_execsql_test 6.2.$tn.3 {
+ INSERT OR REPLACE INTO t1 VALUES(3, 2, 2) ON CONFLICT(c) DO NOTHING;
+ SELECT * FROM t1;
+ PRAGMA integrity_check;
+ } {1 1 1 2 2 2 ok}
+
+ do_execsql_test 6.2.$tn.2 {
+ INSERT OR REPLACE INTO t1 VALUES(3, 1, 1) ON CONFLICT(b)
+ DO UPDATE SET b=b||'x';
+ SELECT * FROM t1;
+ PRAGMA integrity_check;
+ } {1 1x 1 2 2 2 ok}
+
+ do_execsql_test 6.2.$tn.2 {
+ INSERT OR REPLACE INTO t1 VALUES(3, 2, 2) ON CONFLICT(c)
+ DO UPDATE SET c=c||'x';
+ SELECT * FROM t1;
+ PRAGMA integrity_check;
+ } {1 1x 1 2 2 2x ok}
+}
+
+#-------------------------------------------------------------------------
+# Test references to "excluded". And using an alias in an INSERT
+# statement.
+#
+foreach {tn sql} {
+ 1 {
+ CREATE TABLE t1(w, x, y, z, PRIMARY KEY(x, y));
+ CREATE UNIQUE INDEX zz ON t1(z);
+ }
+ 2 {
+ CREATE TABLE t1(w, x, y, z, PRIMARY KEY(x, y)) WITHOUT ROWID;
+ CREATE UNIQUE INDEX zz ON t1(z);
+ }
+} {
+ reset_db
+ execsql $sql
+ do_execsql_test 7.$tn.0 {
+ INSERT INTO t1 VALUES('a', 1, 1, 1);
+ INSERT INTO t1 VALUES('b', 2, 2, 2);
+ }
+
+ do_execsql_test 7.$tn.1 {
+ INSERT INTO t1 VALUES('c', 3, 3, 1) ON CONFLICT(z)
+ DO UPDATE SET w = excluded.w;
+ SELECT * FROM t1;
+ } {c 1 1 1 b 2 2 2}
+
+ do_execsql_test 7.$tn.2 {
+ INSERT INTO t1 VALUES('c', 2, 2, 3) ON CONFLICT(y, x)
+ DO UPDATE SET w = w||w;
+ SELECT * FROM t1;
+ } {c 1 1 1 bb 2 2 2}
+
+ do_execsql_test 7.$tn.3 {
+ INSERT INTO t1 VALUES('c', 2, 2, 3) ON CONFLICT(y, x)
+ DO UPDATE SET w = w||t1.w;
+ SELECT * FROM t1;
+ } {c 1 1 1 bbbb 2 2 2}
+
+ do_execsql_test 7.$tn.4 {
+ INSERT INTO t1 AS tbl VALUES('c', 2, 2, 3) ON CONFLICT(y, x)
+ DO UPDATE SET w = w||tbl.w;
+ SELECT * FROM t1;
+ } {c 1 1 1 bbbbbbbb 2 2 2}
+}
+
+foreach {tn sql} {
+ 1 {
+ CREATE TABLE excluded(w, x, 'a b', z, PRIMARY KEY(x, 'a b'));
+ CREATE UNIQUE INDEX zz ON excluded(z);
+ }
+ 2 {
+ CREATE TABLE excluded(w, x, 'a b', z, PRIMARY KEY(x, 'a b')) WITHOUT ROWID;
+ CREATE UNIQUE INDEX zz ON excluded(z);
+ }
+} {
+ reset_db
+ execsql $sql
+ do_execsql_test 8.$tn.0 {
+ INSERT INTO excluded VALUES('a', 1, 1, 1);
+ INSERT INTO excluded VALUES('b', 2, 2, 2);
+ }
+
+ # Note: An error in Postgres: "table reference "excluded" is ambiguous".
+ #
+ do_execsql_test 8.$tn.1 {
+ INSERT INTO excluded VALUES('hello', 1, 1, NULL) ON CONFLICT(x, "a b")
+ DO UPDATE SET w=excluded.w;
+ SELECT * FROM excluded;
+ } {a 1 1 1 b 2 2 2}
+ do_execsql_test 8.$tn.2 {
+ INSERT INTO excluded AS x1 VALUES('hello', 1, 1, NULL) ON CONFLICT(x, [a b])
+ DO UPDATE SET w=excluded.w;
+ SELECT * FROM excluded;
+ } {hello 1 1 1 b 2 2 2}
+}
+
+
+finish_test