Commit 7ff432c9 authored by Bruce Momjian's avatar Bruce Momjian

1. Implemented binary search in array

Oleg Bartunov
parent 720ca220
...@@ -12,6 +12,8 @@ for additional information. ...@@ -12,6 +12,8 @@ for additional information.
CHANGES: CHANGES:
October 1, 2001
1. Change search method in array to binary
September 28, 2001 September 28, 2001
1. gist__int_ops now is without lossy 1. gist__int_ops now is without lossy
2. add sort entry in picksplit 2. add sort entry in picksplit
......
...@@ -1741,33 +1741,29 @@ makepol(WORKSTATE *state) { ...@@ -1741,33 +1741,29 @@ makepol(WORKSTATE *state) {
typedef struct { typedef struct {
int4 *arrb; int4 *arrb;
int4 *arre; int4 *arre;
int4 *ptr;
} CHKVAL; } CHKVAL;
/* /*
* is there value 'val' in array or not ? * is there value 'val' in array or not ?
*/ */
static bool static bool
checkcondition_arr( void *checkval, int4 val ) { checkcondition_arr( void *checkval, int4 val ) {
#ifdef BS_DEBUG int4 *StopLow = ((CHKVAL*)checkval)->arrb;
elog(NOTICE,"OPERAND %d", val); int4 *StopHigh = ((CHKVAL*)checkval)->arre;
#endif int4 *StopMiddle;
if ( val > *(((CHKVAL*)checkval)->ptr) ) {
while ( ((CHKVAL*)checkval)->ptr < ((CHKVAL*)checkval)->arre ) { /* Loop invariant: StopLow <= val < StopHigh */
((CHKVAL*)checkval)->ptr++;
if ( *(((CHKVAL*)checkval)->ptr) == val ) return true; while (StopLow < StopHigh) {
if ( val < *(((CHKVAL*)checkval)->ptr) ) return false; StopMiddle = StopLow + (StopHigh - StopLow) / 2;
} if (*StopMiddle == val)
} else if ( val < *(((CHKVAL*)checkval)->ptr) ) { return (true);
while ( ((CHKVAL*)checkval)->ptr > ((CHKVAL*)checkval)->arrb ) { else if (*StopMiddle < val )
((CHKVAL*)checkval)->ptr--; StopLow = StopMiddle + 1;
if ( *(((CHKVAL*)checkval)->ptr) == val ) return true; else
if ( val > *(((CHKVAL*)checkval)->ptr) ) return false; StopHigh = StopMiddle;
}
} else {
return true;
} }
return false; return false;
} }
static bool static bool
...@@ -1818,8 +1814,7 @@ execconsistent( QUERYTYPE *query, ArrayType *array, bool calcnot ) { ...@@ -1818,8 +1814,7 @@ execconsistent( QUERYTYPE *query, ArrayType *array, bool calcnot ) {
CHKVAL chkval; CHKVAL chkval;
chkval.arrb = ARRPTR(array); chkval.arrb = ARRPTR(array);
chkval.arre = chkval.arrb + ARRNELEMS(array) - 1; chkval.arre = chkval.arrb + ARRNELEMS(array);
chkval.ptr = chkval.arrb + ARRNELEMS(array)/2;
return execute( return execute(
GETQUERY(query) + query->size-1 , GETQUERY(query) + query->size-1 ,
(void*)&chkval, calcnot, (void*)&chkval, calcnot,
...@@ -1854,8 +1849,7 @@ boolop(PG_FUNCTION_ARGS) { ...@@ -1854,8 +1849,7 @@ boolop(PG_FUNCTION_ARGS) {
PREPAREARR(val); PREPAREARR(val);
chkval.arrb = ARRPTR(val); chkval.arrb = ARRPTR(val);
chkval.arre = chkval.arrb + ARRNELEMS(val) - 1; chkval.arre = chkval.arrb + ARRNELEMS(val);
chkval.ptr = chkval.arrb + ARRNELEMS(val)/2;
result = execute( result = execute(
GETQUERY(query) + query->size-1 , GETQUERY(query) + query->size-1 ,
&chkval, true, &chkval, true,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment