diff --git a/CHANGELOG.md b/CHANGELOG.md index f6298ed..aa94a9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,22 @@ +5.2.3 +===== +BUG FIXES +--------- + - Fixed replica identity inheritance not working when the USING INDEX clause is used to set the replica identity of the parent table. (Github Issue #721) + + 5.2.2 ===== BUG FIXES --------- - - Corrected SQL statements and updated functions missing from the 5.1.0 to 5.2.0 update files. If pg_partman was installed initially with 5.2.0, there are no known issues. If errors about missing functions or columns are encountered during maintenance after updating to 5.2.x, please make sure you are on this latest release. Thank you to all the users helping to test this issues! + - Corrected SQL statements and updated functions missing from the 5.1.0 to 5.2.0 update files. If pg_partman was installed initially with 5.2.0, there are no known issues. If errors about missing functions or columns are encountered during maintenance after updating to 5.2.x, please make sure you are on this latest release. Thank you to all the users helping to test this issues! (Github Issue #718) 5.2.1 ===== BUG FIXES --------- - - Corrected a syntax error in the 5.1.0 to 5.2.0 update file. There are no problems with a direct install of 5.2.0 and there is no technical need to update to 5.2.1. The issue was encountered only when updating from any prior version to 5.2.0. New release was tagged to ease rolling out the fix for package managers. + - Corrected a syntax error in the 5.1.0 to 5.2.0 update file. There are no problems with a direct install of 5.2.0 and there is no technical need to update to 5.2.1. The issue was encountered only when updating from any prior version to 5.2.0. New release was tagged to ease rolling out the fix for package managers. (Github Issue #711) 5.2.0 diff --git a/META.json b/META.json index 91fa606..a183f7a 100644 --- a/META.json +++ b/META.json @@ -1,7 +1,7 @@ { "name": "pg_partman", "abstract": "Extension to manage partitioned tables by time or ID", - "version": "5.2.2", + "version": "5.2.3", "maintainer": [ "Keith Fiske " ], @@ -20,9 +20,9 @@ }, "provides": { "pg_partman": { - "file": "sql/pg_partman--5.2.2.sql", + "file": "sql/pg_partman--5.2.3.sql", "docfile": "doc/pg_partman.md", - "version": "5.2.2", + "version": "5.2.3", "abstract": "Extension to manage partitioned tables by time or ID" } }, diff --git a/pg_partman.control b/pg_partman.control index 531fcae..3f3a44e 100644 --- a/pg_partman.control +++ b/pg_partman.control @@ -1,4 +1,4 @@ -default_version = '5.2.2' +default_version = '5.2.3' comment = 'Extension to manage partitioned tables by time or ID' relocatable = false superuser = false diff --git a/sql/functions/inherit_replica_identity.sql b/sql/functions/inherit_replica_identity.sql index cc73f8a..7dfc0c7 100644 --- a/sql/functions/inherit_replica_identity.sql +++ b/sql/functions/inherit_replica_identity.sql @@ -3,6 +3,8 @@ CREATE FUNCTION @extschema@.inherit_replica_identity (p_parent_schemaname text, AS $$ DECLARE +v_child_partition_index text; +v_child_partition_oid oid; v_parent_oid oid; v_parent_replident char; v_parent_replident_index name; @@ -12,7 +14,7 @@ v_sql text; BEGIN /* -* Set the given child table's replica idenitity to the same as the parent +* Set the given child table's replica identity to the same as the parent NOTE: Replication identity not automatically inherited as of PG16 (revisit in future versions) */ @@ -26,20 +28,38 @@ WHERE n.nspname = p_parent_schemaname AND c.relname = p_parent_tablename; IF v_parent_replident = 'i' THEN + SELECT c.relname INTO v_parent_replident_index FROM pg_catalog.pg_class c JOIN pg_catalog.pg_index i ON i.indexrelid = c.oid WHERE i.indrelid = v_parent_oid AND indisreplident; + + SELECT c.oid + INTO v_child_partition_oid + FROM pg_catalog.pg_class c + JOIN pg_catalog.pg_namespace n ON c.relnamespace = n.oid + WHERE n.nspname = p_parent_schemaname + AND c.relname = p_child_tablename; + + SELECT partition_index.indexrelid::regclass::text + INTO v_child_partition_index + FROM pg_index parent_index -- parent index + INNER JOIN pg_inherits index_inheritance ON (index_inheritance.inhparent=parent_index.indexrelid) -- parent partition index + INNER JOIN pg_index partition_index ON (index_inheritance.inhrelid=partition_index.indexrelid) -- connection between parent and partition indexes + INNER JOIN pg_class partition_table ON (partition_table.oid=partition_index.indrelid) -- connection between child table and child index + WHERE partition_table.oid=v_child_partition_oid -- child partition table + AND parent_index.indexrelid=v_parent_replident_index::regclass; -- parent partition index + END IF; -RAISE DEBUG 'inherit_replica_ident: v_parent_oid: %, v_parent_replident: %, v_parent_replident_index: %', v_parent_oid, v_parent_replident, v_parent_replident_index; +RAISE DEBUG 'inherit_replica_ident: v_parent_oid: %, v_parent_replident: %, v_parent_replident_index: %, v_child_partition_oid: %, v_child_partition_index: %', v_parent_oid, v_parent_replident, v_parent_replident_index, v_child_partition_oid, v_child_partition_index; IF v_parent_replident != 'd' THEN CASE v_parent_replident WHEN 'f' THEN v_replident_string := 'FULL'; - WHEN 'i' THEN v_replident_string := format('USING INDEX %I', v_parent_replident_index); + WHEN 'i' THEN v_replident_string := format('USING INDEX %I', v_child_partition_index); WHEN 'n' THEN v_replident_string := 'NOTHING'; ELSE RAISE EXCEPTION 'inherit_replica_identity: Unknown replication identity encountered (%). Please report as a bug on pg_partman''s github', v_parent_replident; diff --git a/updates/pg_partman--5.2.2--5.2.3.sql b/updates/pg_partman--5.2.2--5.2.3.sql new file mode 100644 index 0000000..b08a6ed --- /dev/null +++ b/updates/pg_partman--5.2.2--5.2.3.sql @@ -0,0 +1,77 @@ + +CREATE OR REPLACE FUNCTION @extschema@.inherit_replica_identity (p_parent_schemaname text, p_parent_tablename text, p_child_tablename text) RETURNS void + LANGUAGE plpgsql + AS $$ +DECLARE + +v_child_partition_index text; +v_child_partition_oid oid; +v_parent_oid oid; +v_parent_replident char; +v_parent_replident_index name; +v_replident_string text; +v_sql text; + +BEGIN + +/* +* Set the given child table's replica identity to the same as the parent + NOTE: Replication identity not automatically inherited as of PG16 (revisit in future versions) +*/ + +SELECT c.oid + , c.relreplident +INTO v_parent_oid + , v_parent_replident +FROM pg_catalog.pg_class c +JOIN pg_catalog.pg_namespace n ON c.relnamespace = n.oid +WHERE n.nspname = p_parent_schemaname +AND c.relname = p_parent_tablename; + +IF v_parent_replident = 'i' THEN + + SELECT c.relname + INTO v_parent_replident_index + FROM pg_catalog.pg_class c + JOIN pg_catalog.pg_index i ON i.indexrelid = c.oid + WHERE i.indrelid = v_parent_oid + AND indisreplident; + + SELECT c.oid + INTO v_child_partition_oid + FROM pg_catalog.pg_class c + JOIN pg_catalog.pg_namespace n ON c.relnamespace = n.oid + WHERE n.nspname = p_parent_schemaname + AND c.relname = p_child_tablename; + + SELECT partition_index.indexrelid::regclass::text + INTO v_child_partition_index + FROM pg_index parent_index -- parent index + INNER JOIN pg_inherits index_inheritance ON (index_inheritance.inhparent=parent_index.indexrelid) -- parent partition index + INNER JOIN pg_index partition_index ON (index_inheritance.inhrelid=partition_index.indexrelid) -- connection between parent and partition indexes + INNER JOIN pg_class partition_table ON (partition_table.oid=partition_index.indrelid) -- connection between child table and child index + WHERE partition_table.oid=v_child_partition_oid -- child partition table + AND parent_index.indexrelid=v_parent_replident_index::regclass; -- parent partition index + +END IF; + +RAISE DEBUG 'inherit_replica_ident: v_parent_oid: %, v_parent_replident: %, v_parent_replident_index: %, v_child_partition_oid: %, v_child_partition_index: %', v_parent_oid, v_parent_replident, v_parent_replident_index, v_child_partition_oid, v_child_partition_index; + +IF v_parent_replident != 'd' THEN + CASE v_parent_replident + WHEN 'f' THEN v_replident_string := 'FULL'; + WHEN 'i' THEN v_replident_string := format('USING INDEX %I', v_child_partition_index); + WHEN 'n' THEN v_replident_string := 'NOTHING'; + ELSE + RAISE EXCEPTION 'inherit_replica_identity: Unknown replication identity encountered (%). Please report as a bug on pg_partman''s github', v_parent_replident; + END CASE; + v_sql := format('ALTER TABLE %I.%I REPLICA IDENTITY %s' + , p_parent_schemaname + , p_child_tablename + , v_replident_string); + RAISE DEBUG 'inherit_replica_identity: replident v_sql: %', v_sql; + EXECUTE v_sql; +END IF; + +END +$$;