@@ -43,6 +43,7 @@ static void recreate_range_constraint(Oid partition,
43
43
Oid atttype ,
44
44
const Bound * lower ,
45
45
const Bound * upper );
46
+ static char * get_qualified_rel_name (Oid relid );
46
47
47
48
/* Function declarations */
48
49
@@ -508,6 +509,7 @@ merge_range_partitions_internal(Oid parent, Oid *partitions, uint32 npart)
508
509
List * plist = NIL ;
509
510
RangeEntry * first ,* last ;
510
511
const PartRelationInfo * prel ;
512
+ FmgrInfo finfo ;
511
513
512
514
prel = get_pathman_relation_info (parent );
513
515
shout_if_prel_is_invalid (parent ,prel ,PT_RANGE );
@@ -536,10 +538,21 @@ merge_range_partitions_internal(Oid parent, Oid *partitions, uint32 npart)
536
538
537
539
check_adjacence (prel -> cmp_proc ,plist );
538
540
539
- /* Create a newone */
541
+ /* Create a newconstraint. To do this first determine the bounds */
540
542
first = (RangeEntry * )linitial (plist );
541
543
last = (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 ],
543
556
get_relid_attribute_name (prel -> key ,prel -> attnum ),
544
557
prel -> attnum ,
545
558
prel -> atttype ,
@@ -557,8 +570,8 @@ merge_range_partitions_internal(Oid parent, Oid *partitions, uint32 npart)
557
570
{
558
571
char * query = psprintf ("WITH part_data AS (DELETE FROM %s RETURNING *) "
559
572
"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 ]));
562
575
563
576
SPI_exec (query ,0 );
564
577
}
@@ -571,7 +584,7 @@ merge_range_partitions_internal(Oid parent, Oid *partitions, uint32 npart)
571
584
for (i = 1 ;i < npart ;i ++ )
572
585
{
573
586
char * query = psprintf ("DROP TABLE %s" ,
574
- get_rel_name (partitions [i ]));
587
+ get_qualified_rel_name (partitions [i ]));
575
588
576
589
SPI_exec (query ,0 );
577
590
}
@@ -603,10 +616,10 @@ check_adjacence(Oid cmp_proc, List *ranges)
603
616
}
604
617
605
618
/*
606
- * Compare upper bound of previous range entry and lower bound
607
- * of current
619
+ * Check that last and current partitions are adjacent
608
620
*/
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 ))
610
623
elog (ERROR ,
611
624
"Partitions '%s' and '%s' aren't adjacent" ,
612
625
get_rel_name (last -> child_oid ),get_rel_name (cur -> child_oid ));
@@ -650,3 +663,16 @@ recreate_range_constraint(Oid partition,
650
663
651
664
pfree (attname_nonconst );
652
665
}
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
+ }