@@ -63,7 +63,13 @@ DROP FUNCTION @extschema@.get_attribute_type(REGCLASS, TEXT);
6363DROP FUNCTION @extschema@.create_hash_partitions(REGCLASS, TEXT , INTEGER , BOOLEAN );
6464DROP FUNCTION @extschema@.create_hash_partitions_internal(REGCLASS, TEXT , INTEGER );
6565DROP FUNCTION @extschema@.build_range_condition(TEXT , ANYELEMENT, ANYELEMENT);
66- DROP FUNCTION @extschema@.get_part_range(REGCLASS, ANYELEMENT);
66+ DROP FUNCTION @extschema@.copy_foreign_keys(REGCLASS, REGCLASS);
67+ DROP FUNCTION @extschema@.invoke_on_partition_created_callback(REGCLASS, REGCLASS, REGPROCEDURE, ANYELEMENT, ANYELEMENT);
68+ DROP FUNCTION @extschema@.invoke_on_partition_created_callback(REGCLASS, REGCLASS, REGPROCEDURE);
69+ DROP FUNCTION @extschema@.split_range_partition(REGCLASS, ANYELEMENT, TEXT , TEXT , OUT ANYARRAY);
70+ DROP FUNCTION @extschema@.drop_range_partition(REGCLASS, BOOLEAN );
71+ DROP FUNCTION @extschema@.attach_range_partition(REGCLASS, REGCLASS, ANYELEMENT, ANYELEMENT);
72+ DROP FUNCTION @extschema@.detach_range_partition(REGCLASS);
6773
6874/* ------------------------------------------------------------------------
6975 * Alter functions' modifiers
@@ -441,7 +447,7 @@ LANGUAGE C;
441447
442448
443449CREATE OR REPLACE FUNCTION @extschema@.split_range_partition(
444- partition REGCLASS,
450+ partition_relid REGCLASS,
445451 split_value ANYELEMENT,
446452 partition_name TEXT DEFAULT NULL ,
447453 tablespace TEXT DEFAULT NULL ,
@@ -458,13 +464,13 @@ DECLARE
458464 v_check_name TEXT ;
459465
460466BEGIN
461- v_parent = @extschema@.get_parent_of_partition(partition );
467+ v_parent = @extschema@.get_parent_of_partition(partition_relid );
462468
463469 /* Acquire lock on parent */
464470 PERFORM @extschema@.lock_partitioned_relation(v_parent);
465471
466472 /* Acquire data modification lock (prevent further modifications) */
467- PERFORM @extschema@.prevent_relation_modification(partition );
473+ PERFORM @extschema@.prevent_relation_modification(partition_relid );
468474
469475 v_atttype = @extschema@.get_partition_key_type(v_parent);
470476
@@ -475,13 +481,13 @@ BEGIN
475481
476482 /* Check if this is a RANGE partition */
477483 IF v_part_type != 2 THEN
478- RAISE EXCEPTION ' "%" is not a RANGE partition' , partition ::TEXT ;
484+ RAISE EXCEPTION ' "%" is not a RANGE partition' , partition_relid ::TEXT ;
479485 END IF;
480486
481487 /* Get partition values range */
482488 EXECUTE format(' SELECT @extschema@.get_part_range($1, NULL::%s)' ,
483489 @extschema@.get_base_type(v_atttype)::TEXT )
484- USING partition
490+ USING partition_relid
485491 INTO p_range;
486492
487493 IF p_range IS NULL THEN
@@ -507,21 +513,21 @@ BEGIN
507513 v_attname, split_value, p_range[2 ]);
508514 EXECUTE format(' WITH part_data AS (DELETE FROM %s WHERE %s RETURNING *)
509515 INSERT INTO %s SELECT * FROM part_data' ,
510- partition ::TEXT ,
516+ partition_relid ::TEXT ,
511517 v_cond,
512518 v_new_partition);
513519
514520 /* Alter original partition */
515- v_cond := @extschema@.build_range_condition(partition ::regclass,
521+ v_cond := @extschema@.build_range_condition(partition_relid ::regclass,
516522 v_attname, p_range[1 ], split_value);
517- v_check_name := @extschema@.build_check_constraint_name(partition , v_attname);
523+ v_check_name := @extschema@.build_check_constraint_name(partition_relid , v_attname);
518524
519525 EXECUTE format(' ALTER TABLE %s DROP CONSTRAINT %s' ,
520- partition ::TEXT ,
526+ partition_relid ::TEXT ,
521527 v_check_name);
522528
523529 EXECUTE format(' ALTER TABLE %s ADD CONSTRAINT %s CHECK (%s)' ,
524- partition ::TEXT ,
530+ partition_relid ::TEXT ,
525531 v_check_name,
526532 v_cond);
527533
@@ -747,7 +753,7 @@ LANGUAGE plpgsql;
747753
748754CREATE OR REPLACE FUNCTION @extschema@.attach_range_partition(
749755 parent_relid REGCLASS,
750- partition REGCLASS,
756+ partition_relid REGCLASS,
751757 start_value ANYELEMENT,
752758 end_value ANYELEMENT)
753759RETURNS TEXT AS
@@ -759,29 +765,29 @@ DECLARE
759765
760766BEGIN
761767 PERFORM @extschema@.validate_relname(parent_relid);
762- PERFORM @extschema@.validate_relname(partition );
768+ PERFORM @extschema@.validate_relname(partition_relid );
763769
764770 /* Acquire lock on parent */
765771 PERFORM @extschema@.lock_partitioned_relation(parent_relid);
766772
767773 /* Ignore temporary tables */
768774 SELECT relpersistence FROM pg_catalog .pg_class
769- WHERE oid = partition INTO rel_persistence;
775+ WHERE oid = partition_relid INTO rel_persistence;
770776
771777 IF rel_persistence = ' t' ::CHAR THEN
772778 RAISE EXCEPTION ' temporary table "%" cannot be used as a partition' ,
773- partition ::TEXT ;
779+ partition_relid ::TEXT ;
774780 END IF;
775781
776782 /* check range overlap */
777783 PERFORM @extschema@.check_range_available(parent_relid, start_value, end_value);
778784
779- IF NOT @extschema@.validate_relations_equality(parent_relid, partition ) THEN
785+ IF NOT @extschema@.validate_relations_equality(parent_relid, partition_relid ) THEN
780786 RAISE EXCEPTION ' partition must have the exact same structure as parent' ;
781787 END IF;
782788
783789 /* Set inheritance */
784- EXECUTE format(' ALTER TABLE %s INHERIT %s' , partition , parent_relid);
790+ EXECUTE format(' ALTER TABLE %s INHERIT %s' , partition_relid , parent_relid);
785791
786792 v_attname := attname FROM @extschema@.pathman_config WHERE partrel = parent_relid;
787793
@@ -791,9 +797,9 @@ BEGIN
791797
792798 /* Set check constraint */
793799 EXECUTE format(' ALTER TABLE %s ADD CONSTRAINT %s CHECK (%s)' ,
794- partition ::TEXT ,
795- @extschema@.build_check_constraint_name(partition , v_attname),
796- @extschema@.build_range_condition(partition ,
800+ partition_relid ::TEXT ,
801+ @extschema@.build_check_constraint_name(partition_relid , v_attname),
802+ @extschema@.build_range_condition(partition_relid ,
797803 v_attname,
798804 start_value,
799805 end_value));
@@ -807,30 +813,30 @@ BEGIN
807813 INTO v_init_callback;
808814
809815 PERFORM @extschema@.invoke_on_partition_created_callback(parent_relid,
810- partition ,
816+ partition_relid ,
811817 v_init_callback,
812818 start_value,
813819 end_value);
814820
815821 /* Invalidate cache */
816822 PERFORM @extschema@.on_update_partitions(parent_relid);
817823
818- RETURN partition ;
824+ RETURN partition_relid ;
819825END
820826$$
821827LANGUAGE plpgsql;
822828
823829
824830CREATE OR REPLACE FUNCTION @extschema@.detach_range_partition(
825- partition REGCLASS)
831+ partition_relid REGCLASS)
826832RETURNS TEXT AS
827833$$
828834DECLARE
829835 v_attname TEXT ;
830836 parent_relid REGCLASS;
831837
832838BEGIN
833- parent_relid := @extschema@.get_parent_of_partition(partition );
839+ parent_relid := @extschema@.get_parent_of_partition(partition_relid );
834840
835841 /* Acquire lock on parent */
836842 PERFORM @extschema@.prevent_relation_modification(parent_relid);
@@ -845,23 +851,87 @@ BEGIN
845851
846852 /* Remove inheritance */
847853 EXECUTE format(' ALTER TABLE %s NO INHERIT %s' ,
848- partition ::TEXT ,
854+ partition_relid ::TEXT ,
849855 parent_relid::TEXT );
850856
851857 /* Remove check constraint */
852858 EXECUTE format(' ALTER TABLE %s DROP CONSTRAINT %s' ,
853- partition ::TEXT ,
854- @extschema@.build_check_constraint_name(partition , v_attname));
859+ partition_relid ::TEXT ,
860+ @extschema@.build_check_constraint_name(partition_relid , v_attname));
855861
856862 /* Invalidate cache */
857863 PERFORM @extschema@.on_update_partitions(parent_relid);
858864
859- RETURN partition ;
865+ RETURN partition_relid ;
860866END
861867$$
862868LANGUAGE plpgsql;
863869
864870
871+ CREATE OR REPLACE FUNCTION @extschema@.drop_range_partition(
872+ partition_relid REGCLASS,
873+ delete_data BOOLEAN DEFAULT TRUE)
874+ RETURNS TEXT AS
875+ $$
876+ DECLARE
877+ parent_relid REGCLASS;
878+ part_name TEXT ;
879+ v_relkind CHAR ;
880+ v_rows BIGINT ;
881+ v_part_type INTEGER ;
882+
883+ BEGIN
884+ parent_relid := @extschema@.get_parent_of_partition(partition_relid);
885+ part_name := partition_relid::TEXT ; /* save the name to be returned */
886+
887+ SELECT parttype
888+ FROM @extschema@.pathman_config
889+ WHERE partrel = parent_relid
890+ INTO v_part_type;
891+
892+ /* Check if this is a RANGE partition */
893+ IF v_part_type != 2 THEN
894+ RAISE EXCEPTION ' "%" is not a RANGE partition' , partition_relid::TEXT ;
895+ END IF;
896+
897+ /* Acquire lock on parent */
898+ PERFORM @extschema@.lock_partitioned_relation(parent_relid);
899+
900+ IF NOT delete_data THEN
901+ EXECUTE format(' INSERT INTO %s SELECT * FROM %s' ,
902+ parent_relid::TEXT ,
903+ partition_relid::TEXT );
904+ GET DIAGNOSTICS v_rows = ROW_COUNT;
905+
906+ /* Show number of copied rows */
907+ RAISE NOTICE ' % rows copied from %' , v_rows, partition_relid::TEXT ;
908+ END IF;
909+
910+ SELECT relkind FROM pg_catalog .pg_class
911+ WHERE oid = partition_relid
912+ INTO v_relkind;
913+
914+ /*
915+ * Determine the kind of child relation. It can be either regular
916+ * table (r) or foreign table (f). Depending on relkind we use
917+ * DROP TABLE or DROP FOREIGN TABLE.
918+ */
919+ IF v_relkind = ' f' THEN
920+ EXECUTE format(' DROP FOREIGN TABLE %s' , partition_relid::TEXT );
921+ ELSE
922+ EXECUTE format(' DROP TABLE %s' , partition_relid::TEXT );
923+ END IF;
924+
925+ /* Invalidate cache */
926+ PERFORM @extschema@.on_update_partitions(parent_relid);
927+
928+ RETURN part_name;
929+ END
930+ $$
931+ LANGUAGE plpgsql
932+ SET pg_pathman .enable_partitionfilter = off;
933+
934+
865935CREATE OR REPLACE FUNCTION @extschema@.drop_range_partition_expand_next(
866936 partition REGCLASS)
867937RETURNS VOID AS ' pg_pathman' , ' drop_range_partition_expand_next'
@@ -875,10 +945,3 @@ CREATE OR REPLACE FUNCTION @extschema@.build_range_condition(
875945 end_value ANYELEMENT)
876946RETURNS TEXT AS ' pg_pathman' , ' build_range_condition'
877947LANGUAGE C;
878-
879-
880- CREATE OR REPLACE FUNCTION @extschema@.get_part_range(
881- partition REGCLASS,
882- dummy ANYELEMENT)
883- RETURNS ANYARRAY AS ' pg_pathman' , ' get_part_range_by_oid'
884- LANGUAGE C;
0 commit comments