# LogicTest: local local-opt local-parallel-stmts

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

statement error value type tuple{int, int} doesn't match type INT of column "v"
UPDATE kv SET v = (SELECT (10, 11))

statement error value type decimal doesn't match type INT of column "v"
UPDATE kv SET v = 3.2

statement error value type decimal doesn't match type INT of column "v"
UPDATE kv SET (k, v) = (3, 3.2)

statement error value type decimal doesn't match type INT of column "v"
UPDATE kv SET (k, v) = (SELECT 3, 3.2)

statement count 4
INSERT INTO kv VALUES (1, 2), (3, 4), (5, 6), (7, 8)

statement count 2
UPDATE kv SET v = 9 WHERE k IN (1, 3)

query II rowsort
SELECT * FROM kv
----
1 9
3 9
5 6
7 8

statement count 4
UPDATE kv SET v = k + v

query II rowsort
SELECT * FROM kv
----
1 10
3 12
5 11
7 15

statement error pgcode 42703 column "m" does not exist
UPDATE kv SET m = 9 WHERE k IN (1, 3)

statement error unimplemented at or near "k"
UPDATE kv SET kv.k = 9

statement error unimplemented at or near "*"
UPDATE kv SET k.* = 9

statement error unimplemented at or near "v"
UPDATE kv SET k.v = 9

statement ok
CREATE VIEW kview as SELECT k,v from kv

query II rowsort
SELECT * FROM kview
----
1 10
3 12
5 11
7 15

statement error "kview" is not a table
UPDATE kview SET v = 99 WHERE k IN (1, 3)

query II rowsort
SELECT * FROM kview
----
1 10
3 12
5 11
7 15

statement ok
CREATE TABLE kv2 (
  k CHAR PRIMARY KEY,
  v CHAR,
  UNIQUE INDEX a (v),
  FAMILY (k),
  FAMILY (v)
)

statement count 4
INSERT INTO kv2 VALUES ('a', 'b'), ('c', 'd'), ('e', 'f'), ('f', 'g')

query TT rowsort
SELECT * FROM kv2
----
a   b
c   d
e   f
f   g

statement error duplicate key value \(v\)=\('g'\) violates unique constraint "a"
UPDATE kv2 SET v = 'g' WHERE k IN ('a')

statement count 1
UPDATE kv2 SET v = 'i' WHERE k IN ('a')

query TT rowsort
SELECT * FROM kv2
----
a   i
c   d
e   f
f   g

statement count 1
UPDATE kv2 SET v = 'b' WHERE k IN ('a')

query TT rowsort
SELECT * FROM kv2
----
a   b
c   d
e   f
f   g

statement ok
CREATE TABLE kv3 (
  k CHAR PRIMARY KEY,
  v CHAR NOT NULL
)

statement count 1
INSERT INTO kv3 VALUES ('a', 'b')

statement error null value in column "v" violates not-null constraint
UPDATE kv3 SET v = NULL WHERE k = 'a'

query TT
SELECT * FROM kv3
----
a   b

statement error column "nonexistent" does not exist
UPDATE kv3 SET v = NULL WHERE nonexistent = 'a'

statement ok
CREATE TABLE abc (
  a INT PRIMARY KEY,
  b INT,
  c INT,
  UNIQUE INDEX d (c)
)

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

statement error number of columns \(2\) does not match number of values \(1\)
UPDATE abc SET (b, c) = (4)

statement error DEFAULT can only appear in a VALUES list within INSERT or on the right side of a SET
UPDATE abc SET (b, c) = (SELECT (VALUES (DEFAULT, DEFAULT)))

statement count 1
UPDATE abc SET (b, c) = (4, 5)

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

statement count 1
UPDATE abc SET a = 1, (b, c) = (SELECT 1, 2)

query III colnames
UPDATE abc SET (b, c) = (8, 9) RETURNING abc.b, c, 4 AS d
----
b  c  d
8  9  4

query III colnames
UPDATE abc SET (b, c) = (8, 9) RETURNING b as col1, c as col2, 4 as col3
----
col1 col2 col3
8    9    4

query I colnames
UPDATE abc SET (b, c) = (8, 9) RETURNING a
----
a
1

query IIII colnames
UPDATE abc SET (b, c) = (5, 6) RETURNING a, b, c, 4 AS d
----
a  b  c  d
1  5  6  4

query III colnames
UPDATE abc SET (b, c) = (7, 8) RETURNING *
----
a b c
1 7 8

query IIII colnames
UPDATE abc SET (b, c) = (7, 8) RETURNING *, 4 AS d
----
a  b  c  d
1  7  8  4

query III colnames
UPDATE abc SET (b, c) = (8, 9) RETURNING abc.*
----
a b c
1 8 9

statement error pq: "abc.*" cannot be aliased
UPDATE abc SET (b, c) = (8, 9) RETURNING abc.* as x

query III
SELECT * FROM abc
----
1 8 9

statement count 1
INSERT INTO abc VALUES (4, 5, 6)

statement error duplicate key value \(a\)=\(4\) violates unique constraint "primary"
UPDATE abc SET a = 4, b = 3

statement error duplicate key value \(c\)=\(6\) violates unique constraint "d"
UPDATE abc SET a = 2, c = 6

query III
UPDATE abc SET a = 2, b = 3 WHERE a = 1 RETURNING *
----
2 3 9

query III rowsort
SELECT * FROM abc
----
2 3 9
4 5 6

query III
SELECT * FROM abc@d WHERE c = 9
----
2 3 9

statement error multiple assignments to the same column "b"
UPDATE abc SET b = 10, b = 11

statement error multiple assignments to the same column "b"
UPDATE abc SET (b, b) = (10, 11)

statement error multiple assignments to the same column "b"
UPDATE abc SET (b, c) = (10, 11), b = 12

statement ok
CREATE TABLE xyz (
  x INT PRIMARY KEY,
  y INT,
  z INT
)

statement count 1
INSERT INTO xyz VALUES (111, 222, 333)

statement count 1
UPDATE xyz SET (z, y) = (SELECT 666, 777), x = (SELECT 2)

query III
SELECT * from xyz
----
2 777 666

statement ok
CREATE TABLE lots (
  k1 INT,
  k2 INT,
  k3 INT,
  k4 INT,
  k5 INT
)

statement count 1
INSERT INTO lots VALUES (1, 2, 3, 4, 5)

statement count 1
UPDATE lots SET (k1, k2) = (6, 7), k3 = 8, (k4, k5) = (9, 10)

query IIIII
SELECT * FROM lots
----
6  7  8  9  10

statement count 1
UPDATE lots SET (k5, k4, k3, k2, k1) = (SELECT * FROM lots)

query IIIII
SELECT * FROM lots
----
10  9  8  7  6

statement ok
CREATE TABLE pks (
  k1 INT,
  k2 INT,
  v INT,
  PRIMARY KEY (k1, k2),
  UNIQUE INDEX i (k2, v),
  FAMILY (k1, k2),
  FAMILY (v)
)

statement count 2
INSERT INTO pks VALUES (1, 2, 3), (4, 5, 3)

statement error duplicate key value \(k2,v\)=\(5,3\) violates unique constraint "i"
UPDATE pks SET k2 = 5 where k1 = 1

# Test updating only one of the columns of a multi-column primary key.

statement count 1
UPDATE pks SET k1 = 2 WHERE k1 = 1

query III
SELECT * FROM pks
----
2  2  3
4  5  3

# Check that UPDATE properly supports ORDER BY (MySQL extension)

statement count 0
TRUNCATE kv

statement count 4
INSERT INTO kv VALUES (1, 9), (8, 2), (3, 7), (6, 4)

query II
UPDATE kv SET v = v + 1 ORDER BY v DESC RETURNING k,v
----
1  10
3  8
6  5
8  3

# Use case for UPDATE ... ORDER BY: renumbering a PK without unique violation.

statement error duplicate key value \(k\)=\(6\) violates unique constraint "primary"
UPDATE kv SET k = k * 2

statement count 4
UPDATE kv SET k = k * 2 ORDER BY k DESC

# Check that UPDATE properly supports LIMIT (MySQL extension)

statement count 3
TRUNCATE kv; INSERT INTO kv VALUES (1, 2), (2, 3), (3, 4)

query II
UPDATE kv SET v = v - 1 WHERE k < 10 ORDER BY k LIMIT 1 RETURNING k, v
----
1  1

query II
SELECT * FROM kv
----
1  1
2  3
3  4

# Check that updates on tables with multiple column families behave as
# they should.

statement ok
CREATE TABLE tu (a INT PRIMARY KEY, b INT, c INT, d INT, FAMILY (a), FAMILY (b), FAMILY (c,d));
  INSERT INTO tu VALUES (1, 2, 3, 4)

statement ok
UPDATE tu SET b = NULL, c = NULL, d = NULL

query IIII rowsort
SELECT * FROM tu
----
1 NULL NULL NULL

subtest contraint_check_validation_ordering

# Verification of column constraints vs CHECK handling. The column
# constraint verification must take place first.
#
# This test requires that the error message for a CHECK constraint
# validation error be different than a column validation error. So we
# test the former first, as a sanity check.
statement ok
CREATE TABLE tn(x INT NULL CHECK(x IS NOT NULL), y CHAR(4) CHECK(length(y) < 4));
  INSERT INTO tn(x, y) VALUES (123, 'abc');

statement error failed to satisfy CHECK constraint
UPDATE tn SET x = NULL

statement error failed to satisfy CHECK constraint
UPDATE tn SET y = 'abcd'

# Now we test that the column validation occurs before the CHECK constraint.
statement ok
CREATE TABLE tn2(x INT NOT NULL CHECK(x IS NOT NULL), y CHAR(3) CHECK(length(y) < 4));
  INSERT INTO tn2(x, y) VALUES (123, 'abc');

statement error null value in column "x" violates not-null constraint
UPDATE tn2 SET x = NULL

statement error value too long for type CHAR\(3\)
UPDATE tn2 SET y = 'abcd'

subtest fk_contraint_check_validation_ordering

# Verify that column constraints and CHECK handling occur before
# foreign key validation.
statement ok
CREATE TABLE src(x VARCHAR PRIMARY KEY);
  INSERT INTO src(x) VALUES ('abc');
  CREATE TABLE derived(x CHAR(3) REFERENCES src(x),
                       y VARCHAR CHECK(length(y) < 4) REFERENCES src(x));
  INSERT INTO derived(x, y) VALUES ('abc', 'abc')

# Sanity check that the FK constraints gets actually validated
statement error foreign key violation
UPDATE derived SET x = 'xxx'

statement error value too long for type CHAR\(3\)
UPDATE derived SET x = 'abcd'

statement error failed to satisfy CHECK constraint
UPDATE derived SET y = 'abcd'

subtest regression_29494

statement ok
CREATE TABLE t29494(x INT PRIMARY KEY); INSERT INTO t29494 VALUES (12)

statement ok
BEGIN; ALTER TABLE t29494 ADD COLUMN y INT NOT NULL DEFAULT 123

# Check that the new column is not visible
query T
SELECT create_statement FROM [SHOW CREATE t29494]
----
CREATE TABLE t29494 (
   x INT NOT NULL,
   CONSTRAINT "primary" PRIMARY KEY (x ASC),
   FAMILY "primary" (x)
)

# Check that the new column is not usable in RETURNING
statement error column "y" does not exist
UPDATE t29494 SET x = 123 RETURNING y

# Check the new column is not assignable. We need to restart
# the txn because the error above trashed it.
statement ok
ROLLBACK; BEGIN; ALTER TABLE t29494 ADD COLUMN y INT NOT NULL DEFAULT 123

# Returning * doesn't return y
query I
UPDATE t29494 SET x = 124 WHERE x = 12 RETURNING *
----
124

statement error column "y" does not exist
UPDATE t29494 SET y = 123

# Check the new column is not usable in assignments. We need to
# restart the txn because the error above trashed it.
statement ok
ROLLBACK; BEGIN; ALTER TABLE t29494 ADD COLUMN y INT NOT NULL DEFAULT 123

statement error column "y" is being backfilled
UPDATE t29494 SET x = y

statement ok
COMMIT

#regression test for #32477
subtest reject_special_funcs_inset

statement ok
CREATE TABLE t32477(x) AS SELECT 1

statement error aggregate functions are not allowed in UPDATE SET
UPDATE t32477 SET x = count(x)

statement error window functions are not allowed in UPDATE SET
UPDATE t32477 SET x = rank(x) OVER ()

statement error generator functions are not allowed in UPDATE SET
UPDATE t32477 SET x = generate_series(1,2)
