@@ -166,6 +166,24 @@ get_cmp_func(Oid type1, Oid type2)
166166return cmp_func ;
167167}
168168
169+ // Datums
170+ // get_range_min(range, size_t idx, bool byVal)
171+ // {
172+ // if (byVal)
173+ // return (Datum)range[idx].min;
174+ // else
175+ // return PointerGetDatum(&range[idx].min);
176+ // }
177+
178+ // Datum
179+ // get_range_max(range, size_t idx, bool byVal)
180+ // {
181+ // if (byVal)
182+ // return (Datum)range[idx].max;
183+ // else
184+ // return PointerGetDatum(&range[idx].max);
185+ // }
186+
169187/*
170188 * Planner hook. It disables inheritance for tables that have been partitioned
171189 * by pathman to prevent standart PostgreSQL partitioning mechanism from
@@ -702,6 +720,7 @@ handle_binary_opexpr(const PartRelationInfo *prel, WrapperNode *result,
702720cmp_max ,
703721endidx = rangerel -> ranges .length - 1 ;
704722RangeEntry * ranges = dsm_array_get_pointer (& rangerel -> ranges );
723+ bool byVal = rangerel -> by_val ;
705724
706725/* Check boundaries */
707726if (rangerel -> ranges .length == 0 )
@@ -712,8 +731,12 @@ handle_binary_opexpr(const PartRelationInfo *prel, WrapperNode *result,
712731else
713732{
714733/* Corner cases */
715- cmp_min = FunctionCall2 (& cmp_func ,value ,ranges [0 ].min ),
716- cmp_max = FunctionCall2 (& cmp_func ,value ,ranges [rangerel -> ranges .length - 1 ].max );
734+ // cmp_min = FunctionCall2(&cmp_func, value, ranges[0].min),
735+ // cmp_max = FunctionCall2(&cmp_func, value, ranges[rangerel->ranges.length - 1].max);
736+ cmp_min = FunctionCall2 (& cmp_func ,value ,
737+ PATHMAN_GET_DATUM (ranges [0 ].min ,byVal )),
738+ cmp_max = FunctionCall2 (& cmp_func ,value ,
739+ PATHMAN_GET_DATUM (ranges [rangerel -> ranges .length - 1 ].max ,byVal ));
717740
718741if ((cmp_min < 0 &&
719742 (strategy == BTLessEqualStrategyNumber ||
@@ -753,8 +776,11 @@ handle_binary_opexpr(const PartRelationInfo *prel, WrapperNode *result,
753776i = startidx + (endidx - startidx ) /2 ;
754777Assert (i >=0 && i < rangerel -> ranges .length );
755778re = & ranges [i ];
756- cmp_min = FunctionCall2 (& cmp_func ,value ,re -> min );
757- cmp_max = FunctionCall2 (& cmp_func ,value ,re -> max );
779+ // cmp_min = FunctionCall2(&cmp_func, value, re->min);
780+ // cmp_max = FunctionCall2(&cmp_func, value, re->max);
781+ cmp_min = FunctionCall2 (& cmp_func ,value ,PATHMAN_GET_DATUM (re -> min ,byVal ));
782+ cmp_max = FunctionCall2 (& cmp_func ,value ,PATHMAN_GET_DATUM (re -> max ,byVal ));
783+
758784is_less = (cmp_min < 0 || (cmp_min == 0 && strategy == BTLessStrategyNumber ));
759785is_greater = (cmp_max > 0 || (cmp_max >=0 && strategy != BTLessStrategyNumber ));
760786
@@ -854,6 +880,7 @@ range_binary_search(const RangeRelation *rangerel, FmgrInfo *cmp_func, Datum val
854880{
855881RangeEntry * ranges = dsm_array_get_pointer (& rangerel -> ranges );
856882RangeEntry * re ;
883+ bool byVal = rangerel -> by_val ;
857884int cmp_min ,
858885cmp_max ,
859886i = 0 ,
@@ -866,8 +893,11 @@ range_binary_search(const RangeRelation *rangerel, FmgrInfo *cmp_func, Datum val
866893* foundPtr = false;
867894
868895/* Check boundaries */
869- cmp_min = FunctionCall2 (cmp_func ,value ,ranges [0 ].min ),
870- cmp_max = FunctionCall2 (cmp_func ,value ,ranges [rangerel -> ranges .length - 1 ].max );
896+ // cmp_min = FunctionCall2(cmp_func, value, ranges[0].min),
897+ // cmp_max = FunctionCall2(cmp_func, value, ranges[rangerel->ranges.length - 1].max);
898+ cmp_min = FunctionCall2 (cmp_func ,value ,PATHMAN_GET_DATUM (ranges [0 ].min ,byVal )),
899+ cmp_max = FunctionCall2 (cmp_func ,value ,PATHMAN_GET_DATUM (ranges [rangerel -> ranges .length - 1 ].max ,byVal ));
900+
871901if (cmp_min < 0 || cmp_max > 0 )
872902{
873903return i ;
@@ -878,8 +908,10 @@ range_binary_search(const RangeRelation *rangerel, FmgrInfo *cmp_func, Datum val
878908i = startidx + (endidx - startidx ) /2 ;
879909Assert (i >=0 && i < rangerel -> ranges .length );
880910re = & ranges [i ];
881- cmp_min = FunctionCall2 (cmp_func ,value ,re -> min );
882- cmp_max = FunctionCall2 (cmp_func ,value ,re -> max );
911+ // cmp_min = FunctionCall2(cmp_func, value, re->min);
912+ // cmp_max = FunctionCall2(cmp_func, value, re->max);
913+ cmp_min = FunctionCall2 (cmp_func ,value ,PATHMAN_GET_DATUM (re -> min ,byVal ));
914+ cmp_max = FunctionCall2 (cmp_func ,value ,PATHMAN_GET_DATUM (re -> max ,byVal ));
883915
884916if (cmp_min >=0 && cmp_max < 0 )
885917{