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

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

statement ok
CREATE TABLE fk (
  f INT REFERENCES kv
)


# Parallel statements can be run outside of a transaction, but they synchronize immediately

statement ok
INSERT INTO kv VALUES (1, 2) RETURNING NOTHING

statement error duplicate key value \(k\)=\(1\) violates unique constraint "primary"
INSERT INTO kv VALUES (1, 2) RETURNING NOTHING

statement ok
UPSERT INTO kv VALUES (2, 2) RETURNING NOTHING

statement error failed to satisfy CHECK constraint \(v < 100\)
UPSERT INTO kv VALUES (2, 500) RETURNING NOTHING

statement ok
UPDATE kv SET v = k WHERE k = 3 RETURNING NOTHING

statement error duplicate key value \(k\)=\(1\) violates unique constraint "primary"
UPDATE kv SET k = 1 WHERE k = 2 RETURNING NOTHING

statement ok
DELETE FROM kv WHERE k = 1 RETURNING NOTHING

statement ok
INSERT INTO fk VALUES (2)

statement error foreign key violation: values \[2\] in columns \[k\] referenced in table \"fk\"
DELETE FROM kv WHERE k = 2 RETURNING NOTHING

statement ok
DELETE FROM fk

statement ok
DELETE FROM kv


# Successfully perform parallelized inserts

statement ok
BEGIN

statement ok
INSERT INTO kv VALUES (1, 2) RETURNING NOTHING

statement ok
INSERT INTO kv VALUES (2, 3) RETURNING NOTHING

statement ok
INSERT INTO kv VALUES (3, 4) RETURNING NOTHING

statement ok
COMMIT

query II
SELECT k, v FROM kv ORDER BY k
----
1  2
2  3
3  4

# Unsuccessfully perform parallelized inserts

statement ok
BEGIN

statement ok
INSERT INTO kv VALUES (4, 5) RETURNING NOTHING

statement ok
INSERT INTO kv VALUES (2, 3) RETURNING NOTHING

statement ok
INSERT INTO kv VALUES (5, 6) RETURNING NOTHING

statement error duplicate key value \(k\)=\(2\) violates unique constraint "primary"
COMMIT

query T
SHOW TRANSACTION STATUS
----
NoTxn

query II
SELECT k, v FROM kv ORDER BY k
----
1  2
2  3
3  4


# Successfully perform parallelized upserts

statement ok
BEGIN

statement ok
UPSERT INTO kv VALUES (1, 7) RETURNING NOTHING

statement ok
UPSERT INTO kv VALUES (4, 8) RETURNING NOTHING

statement ok
UPSERT INTO kv VALUES (3, 9) RETURNING NOTHING

statement ok
COMMIT

query II
SELECT k, v FROM kv ORDER BY k
----
1  7
2  3
3  9
4  8

# Unsuccessfully perform parallelized upserts

statement ok
BEGIN

statement ok
UPSERT INTO kv VALUES (1, 8) RETURNING NOTHING

statement ok
UPSERT INTO kv VALUES (4, 500) RETURNING NOTHING

statement ok
UPSERT INTO kv VALUES (3, 10) RETURNING NOTHING

statement error failed to satisfy CHECK constraint \(v < 100\)
COMMIT

query II
SELECT k, v FROM kv ORDER BY k
----
1  7
2  3
3  9
4  8


# Successfully perform parallelized updates

statement ok
BEGIN

statement ok
UPDATE kv SET v = k WHERE k = 1 RETURNING NOTHING

statement ok
UPDATE kv SET v = k WHERE k = 3 RETURNING NOTHING

statement ok
UPDATE kv SET v = k WHERE k = 9 RETURNING NOTHING

statement ok
COMMIT

query II
SELECT k, v FROM kv ORDER BY k
----
1  1
2  3
3  3
4  8

# Unsuccessfully perform parallelized updates

statement ok
BEGIN

statement ok
UPDATE kv SET k = 9 WHERE k = 1 RETURNING NOTHING

statement ok
UPDATE kv SET k = 3 WHERE k = 2 RETURNING NOTHING

statement ok
UPDATE kv SET k = 10 WHERE k = 4 RETURNING NOTHING

statement error duplicate key value \(k\)=\(3\) violates unique constraint "primary"
COMMIT

query II
SELECT k, v FROM kv ORDER BY k
----
1  1
2  3
3  3
4  8




# Successfully perform parallelized deletes

statement ok
BEGIN

statement ok
DELETE FROM kv WHERE k = 1 RETURNING NOTHING

statement ok
DELETE FROM kv WHERE k = 5 RETURNING NOTHING

statement ok
COMMIT

query II
SELECT k, v FROM kv ORDER BY k
----
2  3
3  3
4  8

# Unsuccessfully perform parallelized deletes

statement ok
INSERT INTO fk VALUES (2)

statement ok
BEGIN

statement ok
DELETE FROM kv WHERE k = 1 RETURNING NOTHING

statement ok
DELETE FROM kv WHERE k = 2 RETURNING NOTHING

statement ok
DELETE FROM kv WHERE k = 3 RETURNING NOTHING

statement error foreign key violation: values \[2\] in columns \[k\] referenced in table \"fk\"
COMMIT

query II
SELECT k, v FROM kv ORDER BY k
----
2  3
3  3
4  8

statement ok
DELETE FROM fk


# Successfully perform mixed mutations

statement ok
BEGIN

statement ok
INSERT INTO kv VALUES (1, 2) RETURNING NOTHING

statement ok
INSERT INTO kv VALUES (5, 9)

query II
SELECT k, v FROM kv ORDER BY k
----
1  2
2  3
3  3
4  8
5  9

statement ok
UPSERT INTO kv VALUES (6, 10) RETURNING NOTHING

statement ok
UPDATE kv SET v = k+1 WHERE k = 3 RETURNING NOTHING

query II
SELECT k, v FROM kv ORDER BY k
----
1  2
2  3
3  4
4  8
5  9
6  10

statement ok
DELETE FROM kv WHERE k = 2 RETURNING NOTHING

statement ok
COMMIT

query II
SELECT k, v FROM kv ORDER BY k
----
1  2
3  4
4  8
5  9
6  10

# Unsuccessfully perform mixed mutations

statement ok
BEGIN

statement ok
INSERT INTO kv VALUES (1, 2) RETURNING NOTHING

statement error duplicate key value \(k\)=\(1\) violates unique constraint "primary"
INSERT INTO kv VALUES (7, 7)

statement ok
ROLLBACK

query II
SELECT k, v FROM kv ORDER BY k
----
1  2
3  4
4  8
5  9
6  10


# Throw statement planning error

statement ok
BEGIN

statement error pgcode 42703 column "z" does not exist
UPDATE kv SET z = 10 WHERE k = 3 RETURNING NOTHING

statement ok
ROLLBACK


# Statements that are IndependentFromParallelizedPriors should not force a
# parallel execution synchronization.

statement ok
BEGIN

statement ok
INSERT INTO kv VALUES (4, 5) RETURNING NOTHING

query T
SHOW TIME ZONE
----
UTC

query T
SHOW TRANSACTION STATUS
----
Open

statement error duplicate key value \(k\)=\(4\) violates unique constraint "primary"
COMMIT

query II
SELECT k, v FROM kv ORDER BY k
----
1  2
3  4
4  8
5  9
6  10


# Dependent statements must execute serially in the order that they are issued.

statement ok
DELETE FROM kv

statement ok
BEGIN

statement ok
INSERT INTO kv VALUES (1, 1) RETURNING NOTHING

statement ok
UPDATE kv SET k = 2 WHERE k = 1 RETURNING NOTHING

statement ok
DELETE FROM kv WHERE k = 1 RETURNING NOTHING

# If any of the previous three statements are reordered, this result of this
# query will not be correct.
query I
SELECT count(*) FROM kv WHERE k = 2
----
1

statement ok
ROLLBACK


# Parallel statements can be prepared and executed.

statement ok
PREPARE x AS INSERT INTO kv VALUES ($1, $2) RETURNING NOTHING

statement ok
BEGIN

statement ok
EXECUTE x(1, 2)

statement ok
EXECUTE x(1, 2)

# We know the ParallelizeQueue was used because the error was not returned
# when the statement was EXECUTED.
statement error duplicate key value \(k\)=\(1\) violates unique constraint "primary"
COMMIT

statement ok
BEGIN

statement ok
EXECUTE x(1, 2)

statement ok
EXECUTE x(2, 3)

statement ok
EXECUTE x(3, 4)

statement ok
COMMIT

query II
SELECT k, v FROM kv ORDER BY k
----
1  2
2  3
3  4
