--- Test for updating a table that has a foreign key reference to another reference table.
--- Issue #7477: Distributed deadlock after issuing a simple UPDATE statement
--- https://github.com/citusdata/citus/issues/7477
CREATE TABLE table1 (id INT PRIMARY KEY);
SELECT create_reference_table('table1');
 create_reference_table
---------------------------------------------------------------------

(1 row)

INSERT INTO table1 VALUES (1);
CREATE TABLE table2 (
    id INT,
    info TEXT,
    CONSTRAINT table1_id_fk FOREIGN KEY (id) REFERENCES table1 (id)
    );
SELECT create_reference_table('table2');
 create_reference_table
---------------------------------------------------------------------

(1 row)

INSERT INTO table2 VALUES (1, 'test');
--- Runs the update command in parallel on workers.
--- Due to bug #7477, before the fix, the result is non-deterministic
--- and have several rows of the form:
---  localhost |     57638 | f       | ERROR:  deadlock detected
---  localhost |     57637 | f       | ERROR:  deadlock detected
---  localhost |     57637 | f       | ERROR:  canceling the transaction since it was involved in a distributed deadlock
SELECT * FROM master_run_on_worker(
    ARRAY['localhost', 'localhost','localhost', 'localhost','localhost',
            'localhost','localhost', 'localhost','localhost', 'localhost']::text[],
    ARRAY[57638, 57637, 57637, 57638, 57637, 57638, 57637, 57638, 57638, 57637]::int[],
    ARRAY['UPDATE table2 SET info = ''test_update'' WHERE id = 1',
            'UPDATE table2 SET info = ''test_update'' WHERE id = 1',
            'UPDATE table2 SET info = ''test_update'' WHERE id = 1',
            'UPDATE table2 SET info = ''test_update'' WHERE id = 1',
            'UPDATE table2 SET info = ''test_update'' WHERE id = 1',
            'UPDATE table2 SET info = ''test_update'' WHERE id = 1',
            'UPDATE table2 SET info = ''test_update'' WHERE id = 1',
            'UPDATE table2 SET info = ''test_update'' WHERE id = 1',
            'UPDATE table2 SET info = ''test_update'' WHERE id = 1',
            'UPDATE table2 SET info = ''test_update'' WHERE id = 1'
            ]::text[],
    true);
 node_name | node_port | success |                                      result
---------------------------------------------------------------------
 localhost |     57638 | t       | UPDATE 1
 localhost |     57637 | t       | UPDATE 1
 localhost |     57637 | t       | UPDATE 1
 localhost |     57638 | t       | UPDATE 1
 localhost |     57637 | t       | UPDATE 1
 localhost |     57638 | t       | UPDATE 1
 localhost |     57637 | t       | UPDATE 1
 localhost |     57638 | t       | UPDATE 1
 localhost |     57638 | t       | UPDATE 1
 localhost |     57637 | t       | UPDATE 1
(10 rows)

--- cleanup
DROP TABLE table2;
DROP TABLE table1;
