@@ -664,15 +664,18 @@ handle_binary_opexpr(const PartRelationInfo *prel, WrapperNode *result,
664664cmp_min = FunctionCall2 (cmp_func ,value ,ranges [0 ].min ),
665665cmp_max = FunctionCall2 (cmp_func ,value ,ranges [rangerel -> ranges .length - 1 ].max );
666666
667- if ((cmp_min < 0 && strategy == BTLessEqualStrategyNumber )||
667+ if ((cmp_min < 0 &&
668+ (strategy == BTLessEqualStrategyNumber ||
669+ strategy == BTEqualStrategyNumber ))||
668670(cmp_min <=0 && strategy == BTLessStrategyNumber ))
669671{
670672result -> rangeset = NIL ;
671673return ;
672674}
673675
674676if (cmp_max >=0 && (strategy == BTGreaterEqualStrategyNumber ||
675- strategy == BTGreaterStrategyNumber ))
677+ strategy == BTGreaterStrategyNumber ||
678+ strategy == BTEqualStrategyNumber ))
676679{
677680result -> rangeset = NIL ;
678681return ;
@@ -800,12 +803,21 @@ range_binary_search(const RangeRelation *rangerel, FmgrInfo *cmp_func, Datum val
800803RangeEntry * re ;
801804int cmp_min ,
802805cmp_max ,
803- i ,
806+ i = 0 ,
804807startidx = 0 ,
805808endidx = rangerel -> ranges .length - 1 ,
806809counter = 0 ;
807810
808811* foundPtr = false;
812+
813+ /* Check boundaries */
814+ cmp_min = FunctionCall2 (cmp_func ,value ,ranges [0 ].min ),
815+ cmp_max = FunctionCall2 (cmp_func ,value ,ranges [rangerel -> ranges .length - 1 ].max );
816+ if (cmp_min < 0 || cmp_max > 0 )
817+ {
818+ return i ;
819+ }
820+
809821while (true)
810822{
811823i = startidx + (endidx - startidx ) /2 ;