# LogicTest: default parallel-stmts distsql

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

statement ok
ROLLBACK

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

statement ok
ROLLBACK

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

statement ok
ROLLBACK

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

statement ok
ROLLBACK

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 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 TT
SHOW CREATE TABLE kv
----
kv  CREATE TABLE kv (
            k INT NOT NULL,
            v INT NULL,
            CONSTRAINT "primary" PRIMARY KEY (k ASC),
            FAMILY "primary" (k, v),
            CONSTRAINT check_v CHECK (v < 100)
    )

query T
SHOW TRANSACTION STATUS
----
Open

query TTTT colnames
HELP LEAST
----
Function    Signature                           Category            Details
least       (anyelement...) -> anyelement       Comparison			Returns the element with the lowest value.

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

statement ok
ROLLBACK

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
