subtest on_conflict_do_nothing

statement ok
CREATE TABLE t_ocdn (a INT PRIMARY KEY, b INT UNIQUE, c INT);

statement ok
CREATE FUNCTION f_ocdn(i INT, j INT, k INT) RETURNS RECORD AS
$$
  INSERT INTO t_ocdn VALUES (i, j, k) ON CONFLICT DO NOTHING RETURNING *;
$$ LANGUAGE SQL;

query T
SELECT f_ocdn(1,1,1);
----
(1,1,1)

query T
SELECT f_ocdn(1,1,1);
----
NULL

query T
SELECT f_ocdn(2,1,1);
----
NULL

query T
SELECT f_ocdn(1,2,1);
----
NULL

query TTTT
SELECT f_ocdn(1,1,1), f_ocdn(3,2,2), f_ocdn(6,6,2), f_ocdn(2,1,1);
----
NULL  (3,2,2)  (6,6,2)  NULL

query T nosort
SELECT f_ocdn(x, y, z) FROM (VALUES (1, 1, 1), (2, 2, 1), (3, 3, 3), (3, 4, 4), (5, 5, 5)) v(x, y, z)
----
NULL
NULL
NULL
NULL
(5,5,5)

query III rowsort
SELECT * FROM t_ocdn
----
1  1  1
3  2  2
5  5  5
6  6  2


statement ok
CREATE FUNCTION f_ocdn_2vals(i INT, j INT, k INT, m INT, n INT, o INT) RETURNS RECORD AS
$$
  INSERT INTO t_ocdn VALUES (i, j, k), (m,n,o) ON CONFLICT DO NOTHING RETURNING *;
$$ LANGUAGE SQL;

statement ok
SELECT f_ocdn_2vals(7,7,7,7,7,7);

query III rowsort
SELECT * FROM t_ocdn;
----
1  1  1
3  2  2
5  5  5
6  6  2
7  7  7

statement ok
CREATE FUNCTION f_multi_ins(i INT, j INT, k INT, m INT, n INT, o INT) RETURNS RECORD AS
$$
  INSERT INTO t_ocdn VALUES (i, j, k) ON CONFLICT DO NOTHING;
  INSERT INTO t_ocdn VALUES (m, n, o) ON CONFLICT DO NOTHING;
  SELECT * FROM t_ocdn WHERE a=i OR a=m ORDER BY a;
$$ LANGUAGE SQL;

query TT
SELECT f_multi_ins(1, 1, 1, 1, 1, 1), f_multi_ins(1, 1, 1, 1, 1, 1)
----
(1,1,1)  (1,1,1)

query TT
SELECT f_multi_ins(2, 2, 2, 3, 3, 3), f_multi_ins(3, 3, 3, 4, 4, 4)
----
(3,2,2)  (3,2,2)

query III rowsort
SELECT * FROM t_ocdn
----
1  1  1
3  2  2
4  4  4
5  5  5
6  6  2
7  7  7

subtest end

subtest on_conflict_do_update

statement ok
CREATE TABLE t_ocdu (a INT PRIMARY KEY, b INT UNIQUE, c INT);

statement ok
CREATE FUNCTION f_ocdu(i INT, j INT, k INT) RETURNS RECORD AS
$$
  INSERT INTO t_ocdu VALUES (i, j, k) ON CONFLICT (a) DO UPDATE SET b = j, c = t_ocdu.c + 1 RETURNING *;
$$ LANGUAGE SQL;

query T
SELECT f_ocdu(1,1,1);
----
(1,1,1)

query T
SELECT f_ocdu(1,1,8);
----
(1,1,2)

query T
SELECT f_ocdu(1,4,6);
----
(1,4,3)

statement error pgcode 23505 pq: duplicate key value violates unique constraint \"t_ocdu_b_key\"
SELECT f_ocdu(2,4,6);


subtest end

subtest upsert

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


statement ok
CREATE FUNCTION f_upsert(i INT, j INT) RETURNS RECORD AS
$$
  UPSERT INTO t_upsert VALUES (i, j) RETURNING *;
$$ LANGUAGE SQL;

query T
SELECT f_upsert(1,1);
----
(1,1)

query T
SELECT f_upsert(1,4);
----
(1,4)

statement ok
CREATE FUNCTION f_upsert_2vals(i INT, j INT, m INT, n INT) RETURNS SETOF RECORD AS
$$
  UPSERT INTO t_upsert VALUES (i, j), (m, n) RETURNING *;
$$ LANGUAGE SQL;

query T rowsort
SELECT f_upsert_2vals(1,9,2,8);
----
(1,9)
(2,8)


subtest end

subtest constraints

statement ok
CREATE TABLE t_check1(a INT NULL CHECK(a IS NOT NULL), b CHAR(4) CHECK(length(b) < 4));

statement ok
CREATE FUNCTION f_check_null() RETURNS RECORD AS
$$
  UPSERT INTO t_check1(a) VALUES (NULL) RETURNING *;
$$ LANGUAGE SQL;

statement error pgcode 23514 failed to satisfy CHECK constraint
SELECT f_check_null();

statement ok
CREATE FUNCTION f_check_len() RETURNS RECORD AS
$$
  UPSERT INTO t_check1(b) VALUES ('abcd') RETURNING *;
$$ LANGUAGE SQL;

statement error pgcode 23514 failed to satisfy CHECK constraint
SELECT f_check_len()

statement ok
CREATE FUNCTION f_check_vals(i INT, j CHAR(4)) RETURNS RECORD AS
$$
  UPSERT INTO t_check1(b,a) VALUES (j,i) RETURNING *;
$$ LANGUAGE SQL;

statement error pgcode 23514 failed to satisfy CHECK constraint
SELECT f_check_vals(NULL, 'ab');

statement error pgcode 23514 failed to satisfy CHECK constraint
SELECT f_check_vals(3, 'abcd');

statement ok
CREATE TABLE t_check2(a INT NOT NULL CHECK(a IS NOT NULL), b CHAR(3) CHECK(length(b) < 4));

statement ok
CREATE FUNCTION f_check_colerr_null() RETURNS RECORD AS
$$
  UPSERT INTO t_check2(a) VALUES (NULL) RETURNING *;
$$ LANGUAGE SQL;

statement error pgcode 23502 null value in column "a" violates not-null constraint
SELECT f_check_colerr_null();

statement ok
CREATE FUNCTION f_check_colerr_len() RETURNS RECORD AS
$$
  UPSERT INTO t_check2(b) VALUES ('abcd') RETURNING *;
$$ LANGUAGE SQL;

statement error pgcode 22001 value too long for type CHAR\(3\)
SELECT f_check_colerr_len()

statement ok
CREATE FUNCTION f_check_colerr_vals(i INT, j CHAR(4)) RETURNS RECORD AS
$$
  UPSERT INTO t_check2(a,b) VALUES (i,j) RETURNING *;
$$ LANGUAGE SQL;

statement error pgcode 23502 null value in column "a" violates not-null constraint
SELECT f_check_colerr_vals(NULL, 'ab')

statement error pgcode 22001 value too long for type CHAR\(3\)
SELECT f_check_colerr_vals(NULL, 'abcd')

subtest end
