# LogicTest: default parallel-stmts distsql

statement ok
CREATE TABLE kv (
  k INT PRIMARY KEY,
  v INT
)

statement ok
INSERT INTO kv VALUES (1, 1), (2, 2), (3, 3) ON CONFLICT (k) DO UPDATE SET v = excluded.v

query II
SELECT * FROM kv ORDER BY (k, v)
----
1 1
2 2
3 3

statement ok
INSERT INTO kv VALUES (4, 4), (2, 5), (6, 6) ON CONFLICT (k) DO UPDATE SET v = excluded.v

statement ok
UPSERT INTO kv VALUES (7, 7), (3, 8), (9, 9)

statement ok
INSERT INTO kv VALUES (1, 10) ON CONFLICT (k) DO UPDATE SET v = (SELECT CAST(SUM(k) AS INT) FROM kv)

statement error column reference "v" is ambiguous
INSERT INTO kv VALUES (4, 10) ON CONFLICT (k) DO UPDATE SET v = v + 1

statement ok
INSERT INTO kv VALUES (4, 10) ON CONFLICT (k) DO UPDATE SET v = kv.v + 20

statement error there is no unique or exclusion constraint matching the ON CONFLICT specification
INSERT INTO kv VALUES (4, 10) ON CONFLICT DO UPDATE SET v = kv.v + 20

statement error duplicate key value \(k\)=\(3\) violates unique constraint "primary"
INSERT INTO kv VALUES (2, 10) ON CONFLICT (k) DO UPDATE SET k = 3, v = 10

statement error UPSERT/ON CONFLICT DO UPDATE command cannot affect row a second time
UPSERT INTO kv VALUES (10, 10), (10, 11)

# TODO(dan): Implement RETURNING with upsert
statement error unimplemented: RETURNING is not supported with UPSERT \(see issue https://github.com/cockroachdb/cockroach/issues/6637\)
UPSERT INTO kv VALUES (10, 10) RETURNING *

statement ok
INSERT INTO kv VALUES (9, 9) ON CONFLICT (k) DO UPDATE SET (k, v) = (excluded.k + 2, excluded.v + 3)

statement ok
INSERT INTO kv VALUES (13, 13), (7, 8) ON CONFLICT (k) DO NOTHING

statement error there is no unique or exclusion constraint matching the ON CONFLICT specification
INSERT INTO kv VALUES (13, 13), (7, 8) ON CONFLICT DO NOTHING

query II
SELECT * FROM kv ORDER BY (k, v)
----
1 32
2 5
3 8
4 24
6 6
7 7
11 12
13 13


statement ok
CREATE TABLE abc (
  a INT,
  b INT,
  c INT DEFAULT 7,
  PRIMARY KEY (a, b),
  INDEX y (b),
  UNIQUE INDEX z (c)
)

statement error missing "b" primary key column
UPSERT INTO abc (a, c) VALUES (1, 1)

statement error missing "a" primary key column
UPSERT INTO abc (b, c) VALUES (1, 1)

statement ok
INSERT INTO abc VALUES (1, 2, 3)

statement ok
INSERT INTO abc VALUES (1, 2, 3) ON CONFLICT (c) DO UPDATE SET a = 4

statement ok
INSERT INTO abc VALUES (1, 2, 3) ON CONFLICT (c) DO UPDATE SET b = 5

statement ok
INSERT INTO abc VALUES (1, 2, 3) ON CONFLICT (c) DO UPDATE SET c = 6

query III
SELECT * FROM abc
----
4 5 6

statement ok
INSERT INTO abc (a, b) VALUES (1, 2) ON CONFLICT (a, b) DO UPDATE SET a = 1, b = 2

statement ok
INSERT INTO abc (a, b) VALUES (4, 5) ON CONFLICT (a, b) DO UPDATE SET a = 7, b = 8

query III
SELECT * FROM abc ORDER BY (a, b, c)
----
1 2 7
7 8 6

statement ok
DELETE FROM abc where a = 1

statement ok
UPSERT INTO abc VALUES (1, 2)

query III
SELECT * FROM abc ORDER BY (a, b, c)
----
1 2 7
7 8 6

statement ok
UPSERT INTO abc VALUES (1, 2, 5)

query III
SELECT * FROM abc ORDER BY (a, b, c)
----
1 2 5
7 8 6

statement ok
UPSERT INTO abc VALUES (1, 2)

query III
SELECT * FROM abc ORDER BY (a, b, c)
----
1 2 7
7 8 6

statement ok
DELETE FROM abc where a = 1

statement ok
INSERT INTO abc VALUES (7, 8, 9) ON CONFLICT (a, b) DO UPDATE SET c = DEFAULT

query III
SELECT * FROM abc ORDER BY (a, b, c)
----
7 8 7

statement ok
CREATE TABLE excluded (a INT PRIMARY KEY, b INT)

statement error ambiguous source name: "excluded"
INSERT INTO excluded VALUES (1, 1) ON CONFLICT (a) DO UPDATE SET b = excluded.b

statement error ambiguous source name: "excluded"
UPSERT INTO excluded VALUES (1, 1)

# For #6710. Add an unused column to disable the fast path which doesn't have this bug.
statement ok
CREATE TABLE issue_6710 (a INT PRIMARY KEY, b STRING, c INT)

statement ok
INSERT INTO issue_6710 (a, b) VALUES (1, 'foo'), (2, 'bar')

statement ok
UPSERT INTO issue_6710 (a, b) VALUES (1, 'test1'), (2, 'test2')

query IT rowsort
SELECT a, b from issue_6710
----
1 test1
2 test2

statement ok
CREATE TABLE issue_13962 (a INT PRIMARY KEY, b INT, c INT)

statement ok
INSERT INTO issue_13962 VALUES (1, 1, 1)

statement ok
INSERT INTO issue_13962 VALUES (1, 2, 2) ON CONFLICT (a) DO UPDATE SET b = excluded.b

query III
SELECT * FROM issue_13962
----
1 2 1

statement ok
CREATE TABLE issue_14052 (a INT PRIMARY KEY, b INT, c INT)

statement ok
INSERT INTO issue_14052 (a, b) VALUES (1, 1), (2, 2)

statement ok
UPSERT INTO issue_14052 (a, c) (SELECT a, b from issue_14052)

statement ok
CREATE TABLE issue_14052_2 (
  id SERIAL PRIMARY KEY,
  name VARCHAR(255),
  createdAt INT,
  updatedAt INT
)

statement ok
INSERT INTO issue_14052_2 (id, name, createdAt, updatedAt) VALUES
  (1, 'original', 1, 1)

# Make sure the fast path isn't taken (createdAt is not in the ON CONFLICT clause)
statement ok
INSERT INTO issue_14052_2 (id, name, createdAt, updatedAt) VALUES
  (1, 'UPDATED', 2, 2)
ON CONFLICT (id) DO UPDATE
  SET id = excluded.id, name = excluded.name, updatedAt = excluded.updatedAt

query ITII
SELECT * FROM issue_14052_2;
----
1  UPDATED  1  2

# Make sure the fast path isn't taken (repeating a column in the ON CONFLICT clause doesn't do anything)
statement ok
INSERT INTO issue_14052_2 (id, name, createdAt, updatedAt) VALUES
  (1, 'FOO', 3, 3)
ON CONFLICT (id) DO UPDATE
  SET id = excluded.id, name = excluded.name, name = excluded.name, name = excluded.name

query ITII
SELECT * FROM issue_14052_2;
----
1  FOO  1  2

# Make sure the fast path isn't taken (all clauses in the set must be of the form x = excluded.x)
statement ok
INSERT INTO issue_14052_2 (id, name, createdAt, updatedAt) VALUES
  (1, 'BAR', 4, 5)
ON CONFLICT (id) DO UPDATE
  SET name = excluded.name, createdAt = excluded.updatedAt, updatedAt = excluded.updatedAt

query ITII
SELECT * FROM issue_14052_2;
----
1  BAR  5  5
