@@ -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
443449CREATEOR REPLACE FUNCTION @extschema@.split_range_partition(
444- partition REGCLASS,
450+ partition_relid REGCLASS,
445451split_valueANYELEMENT,
446452partition_nameTEXT DEFAULTNULL ,
447453tablespaceTEXT DEFAULTNULL ,
@@ -458,13 +464,13 @@ DECLARE
458464v_check_nameTEXT ;
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*/
464470PERFORM @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
469475v_atttype= @extschema@.get_partition_key_type(v_parent);
470476
@@ -475,13 +481,13 @@ BEGIN
475481
476482/* Check if this is a RANGE partition*/
477483IF 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 ;
479485END IF;
480486
481487/* Get partition values range*/
482488EXECUTE format(' SELECT @extschema@.get_part_range($1, NULL::%s)' ,
483489 @extschema@.get_base_type(v_atttype)::TEXT )
484- USINGpartition
490+ USINGpartition_relid
485491INTO p_range;
486492
487493IF p_range ISNULL THEN
@@ -507,21 +513,21 @@ BEGIN
507513v_attname, split_value, p_range[2 ]);
508514EXECUTE format(' WITH part_data AS (DELETE FROM %s WHERE %s RETURNING *)
509515INSERT 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,
516522v_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
519525EXECUTE format(' ALTER TABLE %s DROP CONSTRAINT %s' ,
520- partition ::TEXT ,
526+ partition_relid ::TEXT ,
521527 v_check_name);
522528
523529EXECUTE 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
748754CREATEOR REPLACE FUNCTION @extschema@.attach_range_partition(
749755parent_relidREGCLASS,
750- partition REGCLASS,
756+ partition_relid REGCLASS,
751757start_valueANYELEMENT,
752758end_valueANYELEMENT)
753759RETURNSTEXT AS
@@ -759,29 +765,29 @@ DECLARE
759765
760766BEGIN
761767PERFORM @extschema@.validate_relname(parent_relid);
762- PERFORM @extschema@.validate_relname(partition );
768+ PERFORM @extschema@.validate_relname(partition_relid );
763769
764770/* Acquire lock on parent*/
765771PERFORM @extschema@.lock_partitioned_relation(parent_relid);
766772
767773/* Ignore temporary tables*/
768774SELECT relpersistenceFROM pg_catalog .pg_class
769- WHERE oid = partition INTO rel_persistence;
775+ WHERE oid = partition_relid INTO rel_persistence;
770776
771777IF rel_persistence= ' t' ::CHAR THEN
772778RAISE EXCEPTION' temporary table "%" cannot be used as a partition' ,
773- partition ::TEXT ;
779+ partition_relid ::TEXT ;
774780END IF;
775781
776782/* check range overlap*/
777783PERFORM @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
780786RAISE EXCEPTION' partition must have the exact same structure as parent' ;
781787END 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
786792v_attname := attnameFROM @extschema@.pathman_configWHERE partrel= parent_relid;
787793
@@ -791,9 +797,9 @@ BEGIN
791797
792798/* Set check constraint*/
793799EXECUTE 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
807813INTO v_init_callback;
808814
809815PERFORM @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*/
816822PERFORM @extschema@.on_update_partitions(parent_relid);
817823
818- RETURNpartition ;
824+ RETURNpartition_relid ;
819825END
820826$$
821827LANGUAGE plpgsql;
822828
823829
824830CREATEOR REPLACE FUNCTION @extschema@.detach_range_partition(
825- partition REGCLASS)
831+ partition_relid REGCLASS)
826832RETURNSTEXT AS
827833$$
828834DECLARE
829835v_attnameTEXT ;
830836parent_relidREGCLASS;
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*/
836842PERFORM @extschema@.prevent_relation_modification(parent_relid);
@@ -845,23 +851,87 @@ BEGIN
845851
846852/* Remove inheritance*/
847853EXECUTE format(' ALTER TABLE %s NO INHERIT %s' ,
848- partition ::TEXT ,
854+ partition_relid ::TEXT ,
849855 parent_relid::TEXT );
850856
851857/* Remove check constraint*/
852858EXECUTE 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*/
857863PERFORM @extschema@.on_update_partitions(parent_relid);
858864
859- RETURNpartition ;
865+ RETURNpartition_relid ;
860866END
861867$$
862868LANGUAGE plpgsql;
863869
864870
871+ CREATEOR REPLACE FUNCTION @extschema@.drop_range_partition(
872+ partition_relidREGCLASS,
873+ delete_dataBOOLEAN DEFAULT TRUE)
874+ RETURNSTEXT AS
875+ $$
876+ DECLARE
877+ parent_relidREGCLASS;
878+ part_nameTEXT ;
879+ v_relkindCHAR ;
880+ v_rowsBIGINT ;
881+ v_part_typeINTEGER ;
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 relkindFROM 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+
865935CREATEOR REPLACE FUNCTION @extschema@.drop_range_partition_expand_next(
866936partitionREGCLASS)
867937RETURNS VOIDAS ' pg_pathman' ,' drop_range_partition_expand_next'
@@ -875,10 +945,3 @@ CREATE OR REPLACE FUNCTION @extschema@.build_range_condition(
875945end_valueANYELEMENT)
876946RETURNSTEXT AS ' pg_pathman' ,' build_range_condition'
877947LANGUAGE C;
878-
879-
880- CREATEOR REPLACE FUNCTION @extschema@.get_part_range(
881- partitionREGCLASS,
882- dummyANYELEMENT)
883- RETURNS ANYARRAYAS ' pg_pathman' ,' get_part_range_by_oid'
884- LANGUAGE C;