[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: ordered indexing for integers



Hallvard B Furuseth wrote:
I wrote:
It makes more sense to check for ridiculous-sized numbers before
parsing them and just output a min/max value depending on sign.  (Or
right-truncate e.g. n*12 digits and add n*5 to the length.)

Committed. Chopping n*7 digits and adding n*3 to the binary-integer length instead. More wasteful of the exponent bits, but leaves fewer digits to parse.

This code is wrong:

    /* Chop least significant digits, increase length instead */
    if ( val.bv_len > k ) {
        chop = (val.bv_len - k + 2) / 7;    /* 2 fewer digits */
        val.bv_len -= chop * INDEX_INTLEN_CHOP; /* #digits chopped */
        chop *= 3;  /* >#key bytes chopped: 256**3 > 10**7 */
        if ( chop > 0x7fffffff ) {
            memset( key->bv_val, neg ^ 0xff, index_intlen );
            return 0;
        }
    }

On most 32 bit machines the "if( chop ...)" comparison must always fail, since ber_slen_t is only 32bits. You should do the test before multiplying chop by 3.

--
  -- Howard Chu
  Chief Architect, Symas Corp.  http://www.symas.com
  Director, Highland Sun        http://highlandsun.com/hyc/
  Chief Architect, OpenLDAP     http://www.openldap.org/project/