@@ -43,6 +43,7 @@ static void recreate_range_constraint(Oid partition,
4343Oid atttype ,
4444const Bound * lower ,
4545const Bound * upper );
46+ static char * get_qualified_rel_name (Oid relid );
4647
4748/* Function declarations */
4849
@@ -508,6 +509,7 @@ merge_range_partitions_internal(Oid parent, Oid *partitions, uint32 npart)
508509List * plist = NIL ;
509510RangeEntry * first ,* last ;
510511const PartRelationInfo * prel ;
512+ FmgrInfo finfo ;
511513
512514prel = get_pathman_relation_info (parent );
513515shout_if_prel_is_invalid (parent ,prel ,PT_RANGE );
@@ -536,10 +538,21 @@ merge_range_partitions_internal(Oid parent, Oid *partitions, uint32 npart)
536538
537539check_adjacence (prel -> cmp_proc ,plist );
538540
539- /* Create a newone */
541+ /* Create a newconstraint. To do this first determine the bounds */
540542first = (RangeEntry * )linitial (plist );
541543last = (RangeEntry * )llast (plist );
542- recreate_range_constraint (first -> child_oid ,
544+
545+ /* If last range is less than first one then swap them */
546+ fmgr_info (prel -> cmp_proc ,& finfo );
547+ if (cmp_bounds (& finfo ,& last -> min ,& first -> min )< 0 )
548+ {
549+ RangeEntry * tmp = last ;
550+ last = first ;
551+ first = tmp ;
552+ }
553+
554+ /* Drop old constraint and create a new one */
555+ recreate_range_constraint (partitions [0 ],
543556get_relid_attribute_name (prel -> key ,prel -> attnum ),
544557prel -> attnum ,
545558prel -> atttype ,
@@ -557,8 +570,8 @@ merge_range_partitions_internal(Oid parent, Oid *partitions, uint32 npart)
557570{
558571char * query = psprintf ("WITH part_data AS (DELETE FROM %s RETURNING *) "
559572"INSERT INTO %s SELECT * FROM part_data" ,
560- get_rel_name (partitions [i ]),
561- get_rel_name (partitions [0 ]));
573+ get_qualified_rel_name (partitions [i ]),
574+ get_qualified_rel_name (partitions [0 ]));
562575
563576SPI_exec (query ,0 );
564577}
@@ -571,7 +584,7 @@ merge_range_partitions_internal(Oid parent, Oid *partitions, uint32 npart)
571584for (i = 1 ;i < npart ;i ++ )
572585{
573586char * query = psprintf ("DROP TABLE %s" ,
574- get_rel_name (partitions [i ]));
587+ get_qualified_rel_name (partitions [i ]));
575588
576589SPI_exec (query ,0 );
577590}
@@ -603,10 +616,10 @@ check_adjacence(Oid cmp_proc, List *ranges)
603616}
604617
605618/*
606- * Compare upper bound of previous range entry and lower bound
607- * of current
619+ * Check that last and current partitions are adjacent
608620 */
609- if (cmp_bounds (& finfo ,& last -> max ,& cur -> min )!= 0 )
621+ if ((cmp_bounds (& finfo ,& last -> max ,& cur -> min )!= 0 )
622+ && (cmp_bounds (& finfo ,& cur -> max ,& last -> min )!= 0 ))
610623elog (ERROR ,
611624"Partitions '%s' and '%s' aren't adjacent" ,
612625get_rel_name (last -> child_oid ),get_rel_name (cur -> child_oid ));
@@ -650,3 +663,16 @@ recreate_range_constraint(Oid partition,
650663
651664pfree (attname_nonconst );
652665}
666+
667+ /*
668+ * Return palloced fully qualified relation name as a cstring
669+ */
670+ static char *
671+ get_qualified_rel_name (Oid relid )
672+ {
673+ Oid namespace = get_rel_namespace (relid );
674+
675+ return psprintf ("%s.%s" ,
676+ quote_identifier (get_namespace_name (namespace )),
677+ quote_identifier (get_rel_name (relid )));
678+ }