/* * ------------------------------------------- * NOTE: This test behaves differenly on < 11 because planner now turns * Row(Const, Const) into just Const of record type, apparently since 3decd150 * ------------------------------------------- */ \set VERBOSITY terse SET search_path = 'public'; CREATE EXTENSION pg_pathman; CREATE SCHEMA test_updates; /* * Test UPDATEs on a partition with different TupleDescriptor. */ /* create partitioned table */ CREATE TABLE test_updates.test(a FLOAT4, val INT4 NOT NULL, b FLOAT8); INSERT INTO test_updates.test SELECT i, i, i FROM generate_series(1, 100) AS i; SELECT create_range_partitions('test_updates.test', 'val', 1, 10); create_range_partitions ------------------------- 10 (1 row) /* drop column 'a' */ ALTER TABLE test_updates.test DROP COLUMN a; /* append new partition */ SELECT append_range_partition('test_updates.test'); append_range_partition ------------------------ test_updates.test_11 (1 row) INSERT INTO test_updates.test_11 (val, b) VALUES (101, 10); VACUUM ANALYZE; /* tuple descs are the same */ EXPLAIN (COSTS OFF) UPDATE test_updates.test SET b = 0 WHERE val = 1; QUERY PLAN --------------------------- Update on test_1 -> Seq Scan on test_1 Filter: (val = 1) (3 rows) UPDATE test_updates.test SET b = 0 WHERE val = 1 RETURNING *, tableoid::REGCLASS; val | b | tableoid -----+---+--------------------- 1 | 0 | test_updates.test_1 (1 row) /* tuple descs are different */ EXPLAIN (COSTS OFF) UPDATE test_updates.test SET b = 0 WHERE val = 101; QUERY PLAN ----------------------------- Update on test_11 -> Seq Scan on test_11 Filter: (val = 101) (3 rows) UPDATE test_updates.test SET b = 0 WHERE val = 101 RETURNING *, tableoid::REGCLASS; val | b | tableoid -----+---+---------------------- 101 | 0 | test_updates.test_11 (1 row) CREATE TABLE test_updates.test_dummy (val INT4); EXPLAIN (COSTS OFF) UPDATE test_updates.test SET val = val + 1 WHERE val = 101 AND val = ANY (TABLE test_updates.test_dummy) RETURNING *, tableoid::REGCLASS; QUERY PLAN ------------------------------------ Update on test_11 -> Nested Loop Semi Join -> Seq Scan on test_11 Filter: (val = 101) -> Seq Scan on test_dummy Filter: (val = 101) (6 rows) EXPLAIN (COSTS OFF) UPDATE test_updates.test t1 SET b = 0 FROM test_updates.test_dummy t2 WHERE t1.val = 101 AND t1.val = t2.val RETURNING t1.*, t1.tableoid::REGCLASS; QUERY PLAN --------------------------------------- Update on test_11 t1 -> Nested Loop -> Seq Scan on test_11 t1 Filter: (val = 101) -> Seq Scan on test_dummy t2 Filter: (val = 101) (6 rows) EXPLAIN (COSTS OFF) UPDATE test_updates.test SET b = 0 WHERE val = 101 AND test >= (100, 8) RETURNING *, tableoid::REGCLASS; QUERY PLAN ----------------------------------------------------------------------------------- Update on test_11 -> Seq Scan on test_11 Filter: (((test_11.*)::test_updates.test >= ROW(100, 8)) AND (val = 101)) (3 rows) /* execute this one */ UPDATE test_updates.test SET b = 0 WHERE val = 101 AND test >= (100, -1) RETURNING test; test --------- (101,0) (1 row) DROP TABLE test_updates.test_dummy; /* cross-partition updates (& different tuple descs) */ TRUNCATE test_updates.test; SET pg_pathman.enable_partitionrouter = ON; SELECT *, (select count(*) from pg_attribute where attrelid = partition) as columns FROM pathman_partition_list ORDER BY range_min::int, range_max::int; parent | partition | parttype | expr | range_min | range_max | columns -------------------+----------------------+----------+------+-----------+-----------+--------- test_updates.test | test_updates.test_1 | 2 | val | 1 | 11 | 9 test_updates.test | test_updates.test_2 | 2 | val | 11 | 21 | 9 test_updates.test | test_updates.test_3 | 2 | val | 21 | 31 | 9 test_updates.test | test_updates.test_4 | 2 | val | 31 | 41 | 9 test_updates.test | test_updates.test_5 | 2 | val | 41 | 51 | 9 test_updates.test | test_updates.test_6 | 2 | val | 51 | 61 | 9 test_updates.test | test_updates.test_7 | 2 | val | 61 | 71 | 9 test_updates.test | test_updates.test_8 | 2 | val | 71 | 81 | 9 test_updates.test | test_updates.test_9 | 2 | val | 81 | 91 | 9 test_updates.test | test_updates.test_10 | 2 | val | 91 | 101 | 9 test_updates.test | test_updates.test_11 | 2 | val | 101 | 111 | 8 (11 rows) INSERT INTO test_updates.test VALUES (105, 105); UPDATE test_updates.test SET val = 106 WHERE val = 105 RETURNING *, tableoid::REGCLASS; val | b | tableoid -----+-----+---------------------- 106 | 105 | test_updates.test_11 (1 row) UPDATE test_updates.test SET val = 115 WHERE val = 106 RETURNING *, tableoid::REGCLASS; val | b | tableoid -----+-----+---------------------- 115 | 105 | test_updates.test_12 (1 row) UPDATE test_updates.test SET val = 95 WHERE val = 115 RETURNING *, tableoid::REGCLASS; val | b | tableoid -----+-----+---------------------- 95 | 105 | test_updates.test_10 (1 row) UPDATE test_updates.test SET val = -1 WHERE val = 95 RETURNING *, tableoid::REGCLASS; val | b | tableoid -----+-----+---------------------- -1 | 105 | test_updates.test_13 (1 row) DROP SCHEMA test_updates CASCADE; NOTICE: drop cascades to 15 other objects DROP EXTENSION pg_pathman;