mirror of https://github.com/citusdata/citus.git
Move all the newly supported features of PG Merge into a separate test
parent
dbcf217050
commit
5e23685f42
|
@ -1228,7 +1228,7 @@ ErrorIfMergeQueryQualAndTargetListNotSupported(Oid targetRelationId, Query *orig
|
||||||
MergeQualAndTargetListFunctionsSupported(
|
MergeQualAndTargetListFunctionsSupported(
|
||||||
targetRelationId,
|
targetRelationId,
|
||||||
originalQuery,
|
originalQuery,
|
||||||
originalQuery->jointree->mergeConditions,
|
originalQuery->mergeJoinCondition,
|
||||||
originalQuery->targetList,
|
originalQuery->targetList,
|
||||||
originalQuery->commandType);
|
originalQuery->commandType);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,106 @@
|
||||||
|
SHOW server_version \gset
|
||||||
|
SELECT substring(:'server_version', '\d+')::int >= 15 AS server_version_ge_15
|
||||||
|
\gset
|
||||||
|
\if :server_version_ge_15
|
||||||
|
\else
|
||||||
|
\q
|
||||||
|
\endif
|
||||||
|
--
|
||||||
|
-- MERGE test from PG community (adapted to Citus by converting all tables to Citus local)
|
||||||
|
--
|
||||||
|
DROP SCHEMA IF EXISTS pgmerge_schema CASCADE;
|
||||||
|
NOTICE: schema "pgmerge_schema" does not exist, skipping
|
||||||
|
CREATE SCHEMA pgmerge_schema;
|
||||||
|
SET search_path TO pgmerge_schema;
|
||||||
|
SET citus.use_citus_managed_tables to true;
|
||||||
|
DROP TABLE IF EXISTS target;
|
||||||
|
NOTICE: table "target" does not exist, skipping
|
||||||
|
DROP TABLE IF EXISTS source;
|
||||||
|
NOTICE: table "source" does not exist, skipping
|
||||||
|
CREATE TABLE target (tid integer, balance integer)
|
||||||
|
WITH (autovacuum_enabled=off);
|
||||||
|
CREATE TABLE source (sid integer, delta integer) -- no index
|
||||||
|
WITH (autovacuum_enabled=off);
|
||||||
|
SELECT citus_add_local_table_to_metadata('target');
|
||||||
|
citus_add_local_table_to_metadata
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT citus_add_local_table_to_metadata('source');
|
||||||
|
citus_add_local_table_to_metadata
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
\set SHOW_CONTEXT errors
|
||||||
|
-- used in a CTE
|
||||||
|
WITH foo AS (
|
||||||
|
MERGE INTO target USING source ON (true)
|
||||||
|
WHEN MATCHED THEN DELETE
|
||||||
|
) SELECT * FROM foo;
|
||||||
|
ERROR: WITH query "foo" does not have a RETURNING clause
|
||||||
|
-- used in COPY
|
||||||
|
COPY (
|
||||||
|
MERGE INTO target USING source ON (true)
|
||||||
|
WHEN MATCHED THEN DELETE
|
||||||
|
) TO stdout;
|
||||||
|
ERROR: MERGE not supported in COPY
|
||||||
|
-- used in a CTE with RETURNING
|
||||||
|
WITH foo AS (
|
||||||
|
MERGE INTO target USING source ON (true)
|
||||||
|
WHEN MATCHED THEN DELETE RETURNING target.*
|
||||||
|
) SELECT * FROM foo;
|
||||||
|
ERROR: MERGE with RETURNING is not yet supported
|
||||||
|
-- used in COPY with RETURNING
|
||||||
|
COPY (
|
||||||
|
MERGE INTO target USING source ON (true)
|
||||||
|
WHEN MATCHED THEN DELETE RETURNING target.*
|
||||||
|
) TO stdout;
|
||||||
|
ERROR: MERGE not supported in COPY
|
||||||
|
-- unsupported relation types
|
||||||
|
-- view
|
||||||
|
CREATE VIEW tv AS SELECT count(tid) AS tid FROM target;
|
||||||
|
MERGE INTO tv t
|
||||||
|
USING source s
|
||||||
|
ON t.tid = s.sid
|
||||||
|
WHEN NOT MATCHED THEN
|
||||||
|
INSERT DEFAULT VALUES;
|
||||||
|
ERROR: cannot insert into view "tv"
|
||||||
|
DETAIL: Views that return aggregate functions are not automatically updatable.
|
||||||
|
HINT: To enable inserting into the view using MERGE, provide an INSTEAD OF INSERT trigger.
|
||||||
|
DROP VIEW tv;
|
||||||
|
CREATE TABLE sq_target (tid integer NOT NULL, balance integer)
|
||||||
|
WITH (autovacuum_enabled=off);
|
||||||
|
CREATE TABLE sq_source (delta integer, sid integer, balance integer DEFAULT 0)
|
||||||
|
WITH (autovacuum_enabled=off);
|
||||||
|
SELECT citus_add_local_table_to_metadata('sq_target');
|
||||||
|
citus_add_local_table_to_metadata
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT citus_add_local_table_to_metadata('sq_source');
|
||||||
|
citus_add_local_table_to_metadata
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
INSERT INTO sq_target(tid, balance) VALUES (1,100), (2,200), (3,300);
|
||||||
|
INSERT INTO sq_source(sid, delta) VALUES (1,10), (2,20), (4,40);
|
||||||
|
CREATE VIEW v AS SELECT * FROM sq_source WHERE sid < 2;
|
||||||
|
-- RETURNING
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO sq_source (sid, balance, delta) VALUES (-1, -1, -10);
|
||||||
|
MERGE INTO sq_target t
|
||||||
|
USING v
|
||||||
|
ON tid = sid
|
||||||
|
WHEN MATCHED AND tid > 2 THEN
|
||||||
|
UPDATE SET balance = t.balance + delta
|
||||||
|
WHEN NOT MATCHED THEN
|
||||||
|
INSERT (balance, tid) VALUES (balance + delta, sid)
|
||||||
|
WHEN MATCHED AND tid < 2 THEN
|
||||||
|
DELETE
|
||||||
|
RETURNING *;
|
||||||
|
ERROR: MERGE with RETURNING is not yet supported
|
||||||
|
ROLLBACK;
|
|
@ -162,41 +162,13 @@ ON tid = tid
|
||||||
WHEN MATCHED THEN DO NOTHING;
|
WHEN MATCHED THEN DO NOTHING;
|
||||||
ERROR: name "target" specified more than once
|
ERROR: name "target" specified more than once
|
||||||
DETAIL: The name is used both as MERGE target table and data source.
|
DETAIL: The name is used both as MERGE target table and data source.
|
||||||
-- used in a CTE
|
|
||||||
WITH foo AS (
|
|
||||||
MERGE INTO target USING source ON (true)
|
|
||||||
WHEN MATCHED THEN DELETE
|
|
||||||
) SELECT * FROM foo;
|
|
||||||
ERROR: MERGE not supported in WITH query
|
|
||||||
-- used in COPY
|
-- used in COPY
|
||||||
COPY (
|
COPY (
|
||||||
MERGE INTO target USING source ON (true)
|
MERGE INTO target USING source ON (true)
|
||||||
WHEN MATCHED THEN DELETE
|
WHEN MATCHED THEN DELETE
|
||||||
) TO stdout;
|
) TO stdout;
|
||||||
ERROR: MERGE not supported in COPY
|
ERROR: MERGE not supported in COPY
|
||||||
-- used in a CTE with RETURNING
|
|
||||||
WITH foo AS (
|
|
||||||
MERGE INTO target USING source ON (true)
|
|
||||||
WHEN MATCHED THEN DELETE RETURNING target.*
|
|
||||||
) SELECT * FROM foo;
|
|
||||||
ERROR: syntax error at or near "RETURNING"
|
|
||||||
-- used in COPY with RETURNING
|
|
||||||
COPY (
|
|
||||||
MERGE INTO target USING source ON (true)
|
|
||||||
WHEN MATCHED THEN DELETE RETURNING target.*
|
|
||||||
) TO stdout;
|
|
||||||
ERROR: syntax error at or near "RETURNING"
|
|
||||||
-- unsupported relation types
|
-- unsupported relation types
|
||||||
-- view
|
|
||||||
CREATE VIEW tv AS SELECT count(tid) AS tid FROM target;
|
|
||||||
MERGE INTO tv t
|
|
||||||
USING source s
|
|
||||||
ON t.tid = s.sid
|
|
||||||
WHEN NOT MATCHED THEN
|
|
||||||
INSERT DEFAULT VALUES;
|
|
||||||
ERROR: cannot execute MERGE on relation "tv"
|
|
||||||
DETAIL: This operation is not supported for views.
|
|
||||||
DROP VIEW tv;
|
|
||||||
-- materialized view
|
-- materialized view
|
||||||
CREATE MATERIALIZED VIEW mv AS SELECT * FROM target;
|
CREATE MATERIALIZED VIEW mv AS SELECT * FROM target;
|
||||||
MERGE INTO mv t
|
MERGE INTO mv t
|
||||||
|
@ -1388,21 +1360,6 @@ WHEN NOT MATCHED THEN
|
||||||
WHEN MATCHED AND tid < 2 THEN
|
WHEN MATCHED AND tid < 2 THEN
|
||||||
DELETE;
|
DELETE;
|
||||||
ROLLBACK;
|
ROLLBACK;
|
||||||
-- RETURNING
|
|
||||||
BEGIN;
|
|
||||||
INSERT INTO sq_source (sid, balance, delta) VALUES (-1, -1, -10);
|
|
||||||
MERGE INTO sq_target t
|
|
||||||
USING v
|
|
||||||
ON tid = sid
|
|
||||||
WHEN MATCHED AND tid > 2 THEN
|
|
||||||
UPDATE SET balance = t.balance + delta
|
|
||||||
WHEN NOT MATCHED THEN
|
|
||||||
INSERT (balance, tid) VALUES (balance + delta, sid)
|
|
||||||
WHEN MATCHED AND tid < 2 THEN
|
|
||||||
DELETE
|
|
||||||
RETURNING *;
|
|
||||||
ERROR: syntax error at or near "RETURNING"
|
|
||||||
ROLLBACK;
|
|
||||||
-- EXPLAIN
|
-- EXPLAIN
|
||||||
CREATE TABLE ex_mtarget (a int, b int)
|
CREATE TABLE ex_mtarget (a int, b int)
|
||||||
WITH (autovacuum_enabled=off);
|
WITH (autovacuum_enabled=off);
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -118,7 +118,7 @@ test: merge pgmerge
|
||||||
test: merge_repartition2
|
test: merge_repartition2
|
||||||
test: merge_repartition1 merge_schema_sharding
|
test: merge_repartition1 merge_schema_sharding
|
||||||
test: merge_partition_tables
|
test: merge_partition_tables
|
||||||
test: merge_vcore
|
test: merge_vcore merge_unsupported
|
||||||
|
|
||||||
# ---------
|
# ---------
|
||||||
# test that no tests leaked intermediate results. This should always be last
|
# test that no tests leaked intermediate results. This should always be last
|
||||||
|
|
|
@ -0,0 +1,89 @@
|
||||||
|
|
||||||
|
|
||||||
|
SHOW server_version \gset
|
||||||
|
SELECT substring(:'server_version', '\d+')::int >= 15 AS server_version_ge_15
|
||||||
|
\gset
|
||||||
|
\if :server_version_ge_15
|
||||||
|
\else
|
||||||
|
\q
|
||||||
|
\endif
|
||||||
|
|
||||||
|
--
|
||||||
|
-- MERGE test from PG community (adapted to Citus by converting all tables to Citus local)
|
||||||
|
--
|
||||||
|
DROP SCHEMA IF EXISTS pgmerge_schema CASCADE;
|
||||||
|
CREATE SCHEMA pgmerge_schema;
|
||||||
|
SET search_path TO pgmerge_schema;
|
||||||
|
|
||||||
|
SET citus.use_citus_managed_tables to true;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS target;
|
||||||
|
DROP TABLE IF EXISTS source;
|
||||||
|
CREATE TABLE target (tid integer, balance integer)
|
||||||
|
WITH (autovacuum_enabled=off);
|
||||||
|
CREATE TABLE source (sid integer, delta integer) -- no index
|
||||||
|
WITH (autovacuum_enabled=off);
|
||||||
|
|
||||||
|
SELECT citus_add_local_table_to_metadata('target');
|
||||||
|
SELECT citus_add_local_table_to_metadata('source');
|
||||||
|
|
||||||
|
|
||||||
|
\set SHOW_CONTEXT errors
|
||||||
|
-- used in a CTE
|
||||||
|
WITH foo AS (
|
||||||
|
MERGE INTO target USING source ON (true)
|
||||||
|
WHEN MATCHED THEN DELETE
|
||||||
|
) SELECT * FROM foo;
|
||||||
|
-- used in COPY
|
||||||
|
COPY (
|
||||||
|
MERGE INTO target USING source ON (true)
|
||||||
|
WHEN MATCHED THEN DELETE
|
||||||
|
) TO stdout;
|
||||||
|
-- used in a CTE with RETURNING
|
||||||
|
WITH foo AS (
|
||||||
|
MERGE INTO target USING source ON (true)
|
||||||
|
WHEN MATCHED THEN DELETE RETURNING target.*
|
||||||
|
) SELECT * FROM foo;
|
||||||
|
-- used in COPY with RETURNING
|
||||||
|
COPY (
|
||||||
|
MERGE INTO target USING source ON (true)
|
||||||
|
WHEN MATCHED THEN DELETE RETURNING target.*
|
||||||
|
) TO stdout;
|
||||||
|
|
||||||
|
-- unsupported relation types
|
||||||
|
-- view
|
||||||
|
CREATE VIEW tv AS SELECT count(tid) AS tid FROM target;
|
||||||
|
MERGE INTO tv t
|
||||||
|
USING source s
|
||||||
|
ON t.tid = s.sid
|
||||||
|
WHEN NOT MATCHED THEN
|
||||||
|
INSERT DEFAULT VALUES;
|
||||||
|
DROP VIEW tv;
|
||||||
|
|
||||||
|
CREATE TABLE sq_target (tid integer NOT NULL, balance integer)
|
||||||
|
WITH (autovacuum_enabled=off);
|
||||||
|
CREATE TABLE sq_source (delta integer, sid integer, balance integer DEFAULT 0)
|
||||||
|
WITH (autovacuum_enabled=off);
|
||||||
|
|
||||||
|
SELECT citus_add_local_table_to_metadata('sq_target');
|
||||||
|
SELECT citus_add_local_table_to_metadata('sq_source');
|
||||||
|
|
||||||
|
INSERT INTO sq_target(tid, balance) VALUES (1,100), (2,200), (3,300);
|
||||||
|
INSERT INTO sq_source(sid, delta) VALUES (1,10), (2,20), (4,40);
|
||||||
|
|
||||||
|
CREATE VIEW v AS SELECT * FROM sq_source WHERE sid < 2;
|
||||||
|
|
||||||
|
-- RETURNING
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO sq_source (sid, balance, delta) VALUES (-1, -1, -10);
|
||||||
|
MERGE INTO sq_target t
|
||||||
|
USING v
|
||||||
|
ON tid = sid
|
||||||
|
WHEN MATCHED AND tid > 2 THEN
|
||||||
|
UPDATE SET balance = t.balance + delta
|
||||||
|
WHEN NOT MATCHED THEN
|
||||||
|
INSERT (balance, tid) VALUES (balance + delta, sid)
|
||||||
|
WHEN MATCHED AND tid < 2 THEN
|
||||||
|
DELETE
|
||||||
|
RETURNING *;
|
||||||
|
ROLLBACK;
|
|
@ -116,37 +116,13 @@ MERGE INTO target
|
||||||
USING target
|
USING target
|
||||||
ON tid = tid
|
ON tid = tid
|
||||||
WHEN MATCHED THEN DO NOTHING;
|
WHEN MATCHED THEN DO NOTHING;
|
||||||
-- used in a CTE
|
|
||||||
WITH foo AS (
|
|
||||||
MERGE INTO target USING source ON (true)
|
|
||||||
WHEN MATCHED THEN DELETE
|
|
||||||
) SELECT * FROM foo;
|
|
||||||
-- used in COPY
|
-- used in COPY
|
||||||
COPY (
|
COPY (
|
||||||
MERGE INTO target USING source ON (true)
|
MERGE INTO target USING source ON (true)
|
||||||
WHEN MATCHED THEN DELETE
|
WHEN MATCHED THEN DELETE
|
||||||
) TO stdout;
|
) TO stdout;
|
||||||
-- used in a CTE with RETURNING
|
|
||||||
WITH foo AS (
|
|
||||||
MERGE INTO target USING source ON (true)
|
|
||||||
WHEN MATCHED THEN DELETE RETURNING target.*
|
|
||||||
) SELECT * FROM foo;
|
|
||||||
-- used in COPY with RETURNING
|
|
||||||
COPY (
|
|
||||||
MERGE INTO target USING source ON (true)
|
|
||||||
WHEN MATCHED THEN DELETE RETURNING target.*
|
|
||||||
) TO stdout;
|
|
||||||
|
|
||||||
-- unsupported relation types
|
-- unsupported relation types
|
||||||
-- view
|
|
||||||
CREATE VIEW tv AS SELECT count(tid) AS tid FROM target;
|
|
||||||
MERGE INTO tv t
|
|
||||||
USING source s
|
|
||||||
ON t.tid = s.sid
|
|
||||||
WHEN NOT MATCHED THEN
|
|
||||||
INSERT DEFAULT VALUES;
|
|
||||||
DROP VIEW tv;
|
|
||||||
|
|
||||||
-- materialized view
|
-- materialized view
|
||||||
CREATE MATERIALIZED VIEW mv AS SELECT * FROM target;
|
CREATE MATERIALIZED VIEW mv AS SELECT * FROM target;
|
||||||
MERGE INTO mv t
|
MERGE INTO mv t
|
||||||
|
@ -915,21 +891,6 @@ WHEN MATCHED AND tid < 2 THEN
|
||||||
DELETE;
|
DELETE;
|
||||||
ROLLBACK;
|
ROLLBACK;
|
||||||
|
|
||||||
-- RETURNING
|
|
||||||
BEGIN;
|
|
||||||
INSERT INTO sq_source (sid, balance, delta) VALUES (-1, -1, -10);
|
|
||||||
MERGE INTO sq_target t
|
|
||||||
USING v
|
|
||||||
ON tid = sid
|
|
||||||
WHEN MATCHED AND tid > 2 THEN
|
|
||||||
UPDATE SET balance = t.balance + delta
|
|
||||||
WHEN NOT MATCHED THEN
|
|
||||||
INSERT (balance, tid) VALUES (balance + delta, sid)
|
|
||||||
WHEN MATCHED AND tid < 2 THEN
|
|
||||||
DELETE
|
|
||||||
RETURNING *;
|
|
||||||
ROLLBACK;
|
|
||||||
|
|
||||||
-- EXPLAIN
|
-- EXPLAIN
|
||||||
CREATE TABLE ex_mtarget (a int, b int)
|
CREATE TABLE ex_mtarget (a int, b int)
|
||||||
WITH (autovacuum_enabled=off);
|
WITH (autovacuum_enabled=off);
|
||||||
|
|
Loading…
Reference in New Issue