--
-- MULTI_APPEND_TABLE_TO_SHARD
--
SET citus.next_shard_id TO 230000;
-- Initialize tables to join
CREATE TABLE multi_append_table_to_shard_right_reference
(
	right_number INTEGER not null,
	right_text TEXT not null
);
SELECT create_reference_table('multi_append_table_to_shard_right_reference');
 create_reference_table 
------------------------
 
(1 row)

CREATE TABLE multi_append_table_to_shard_left
(
	left_number INTEGER not null,
	left_text TEXT not null
);
SELECT create_distributed_table('multi_append_table_to_shard_left', 'left_number', 'append');
 create_distributed_table 
--------------------------
 
(1 row)

CREATE TABLE multi_append_table_to_shard_right_reference_hash
(
	right_number INTEGER not null,
	right_text TEXT not null
);
SET citus.shard_count TO 1;
SET citus.shard_replication_factor TO 1;
SELECT create_distributed_table('multi_append_table_to_shard_right_reference_hash', 'right_number', 'hash');
 create_distributed_table 
--------------------------
 
(1 row)

-- Replicate 'left' table on both workers
SELECT set_config('citus.shard_replication_factor', '2', false);
 set_config 
------------
 2
(1 row)

\copy multi_append_table_to_shard_left FROM '@abs_srcdir@/data/agg.data'
\copy multi_append_table_to_shard_left FROM '@abs_srcdir@/data/agg.data'
-- Place 'right' table on both workers
\copy multi_append_table_to_shard_right_reference FROM '@abs_srcdir@/data/agg.data'
-- Reset shard replication factor to ensure tasks will be assigned to both workers
SELECT set_config('citus.shard_replication_factor', '2', false);
 set_config 
------------
 2
(1 row)

-- All 8 rows in left table match a row in right table
SELECT	COUNT(*)
FROM	multi_append_table_to_shard_left,
		multi_append_table_to_shard_right_reference
WHERE	left_number = right_number;
 count 
-------
     8
(1 row)

-- Now append more data to the 'right' table
CREATE TABLE multi_append_table_to_shard_stage
(
	number INTEGER not null,
	text TEXT not null
);
COPY multi_append_table_to_shard_stage FROM '@abs_srcdir@/data/large_records.data' with delimiter '|';
-- Check that we error out if we try to append data to a hash partitioned table.
SELECT master_create_empty_shard('multi_append_table_to_shard_right_reference_hash');
ERROR:  relation "multi_append_table_to_shard_right_reference_hash" is a hash partitioned table
DETAIL:  We currently don't support creating shards on hash-partitioned tables
SELECT	master_append_table_to_shard(shardid, 'multi_append_table_to_shard_stage', 'localhost', 57636)
FROM
		pg_dist_shard
WHERE	'multi_append_table_to_shard_right_reference_hash'::regclass::oid = logicalrelid;
ERROR:  cannot append to shardId 230001
DETAIL:  We currently don't support appending to shards in hash-partitioned or reference tables
-- Clean up after test
SELECT master_apply_delete_command('DELETE FROM multi_append_table_to_shard_left');
 master_apply_delete_command 
-----------------------------
                           2
(1 row)

DROP TABLE multi_append_table_to_shard_stage;
DROP TABLE multi_append_table_to_shard_right_reference;
DROP TABLE multi_append_table_to_shard_left;
-- Check partitioning by date
CREATE TABLE multi_append_table_to_shard_date
(
	event_date DATE,
	value INT
);
SELECT master_create_distributed_table('multi_append_table_to_shard_date', 'event_date', 'append');
 master_create_distributed_table 
---------------------------------
 
(1 row)

-- Create an empty shard and check that we can query the table
SELECT master_create_empty_shard('multi_append_table_to_shard_date');
 master_create_empty_shard 
---------------------------
                    230004
(1 row)

SELECT * FROM multi_append_table_to_shard_date;
 event_date | value 
------------+-------
(0 rows)

-- Create an empty distributed table and check that we can query it
CREATE TABLE multi_append_table_to_shard_stage (LIKE multi_append_table_to_shard_date);
SELECT	master_append_table_to_shard(shardid, 'multi_append_table_to_shard_stage', 'localhost', 57636)
FROM
		pg_dist_shard
WHERE	'multi_append_table_to_shard_date'::regclass::oid = logicalrelid;
 master_append_table_to_shard 
------------------------------
                            0
(1 row)

SELECT * FROM multi_append_table_to_shard_date;
 event_date | value 
------------+-------
(0 rows)

-- INSERT NULL values and check that we can query the table
INSERT INTO multi_append_table_to_shard_stage VALUES (NULL, NULL);
SELECT	master_append_table_to_shard(shardid, 'multi_append_table_to_shard_stage', 'localhost', 57636)
FROM
		pg_dist_shard
WHERE	'multi_append_table_to_shard_date'::regclass::oid = logicalrelid;
 master_append_table_to_shard 
------------------------------
                   0.00533333
(1 row)

SELECT * FROM multi_append_table_to_shard_date;
 event_date | value 
------------+-------
            |      
(1 row)

-- INSERT regular values and check that we can query the table
INSERT INTO multi_append_table_to_shard_stage VALUES ('2016-01-01', 3);
SELECT	master_append_table_to_shard(shardid, 'multi_append_table_to_shard_stage', 'localhost', 57636)
FROM
		pg_dist_shard
WHERE	'multi_append_table_to_shard_date'::regclass::oid = logicalrelid;
 master_append_table_to_shard 
------------------------------
                   0.00533333
(1 row)

SELECT * FROM multi_append_table_to_shard_date;
 event_date | value 
------------+-------
            |      
            |      
 01-01-2016 |     3
(3 rows)

-- When run inside aborted transaction does not persist changes
INSERT INTO multi_append_table_to_shard_stage VALUES ('2016-02-02', 4);
BEGIN;
SELECT	master_append_table_to_shard(shardid, 'multi_append_table_to_shard_stage', 'localhost', 57636)
FROM
		pg_dist_shard
WHERE	'multi_append_table_to_shard_date'::regclass::oid = logicalrelid;
 master_append_table_to_shard 
------------------------------
                   0.00533333
(1 row)

ROLLBACK;
SELECT * FROM multi_append_table_to_shard_date;
 event_date | value 
------------+-------
            |      
            |      
 01-01-2016 |     3
(3 rows)

DROP TABLE multi_append_table_to_shard_stage;
DROP TABLE multi_append_table_to_shard_date;
