From: Kurt Zeilenga Date: Wed, 24 Oct 2001 21:26:32 +0000 (+0000) Subject: Use allids instead of candidiate negation for !. (ITS#1405) X-Git-Tag: LDBM_PRE_GIANT_RWLOCK~927 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=a6acc0ff8c95c279552fec9b2ed52ba2cb0b7bd1;p=openldap Use allids instead of candidiate negation for !. (ITS#1405) Use presence indices in support of >= and <=. (Note presence indices could be used to support = and substr in like fashion where eq and substr indices are not maintained, but I'll save that for another day.) --- diff --git a/servers/slapd/back-ldbm/filterindex.c b/servers/slapd/back-ldbm/filterindex.c index 8732599d74..0c39ff454a 100644 --- a/servers/slapd/back-ldbm/filterindex.c +++ b/servers/slapd/back-ldbm/filterindex.c @@ -135,7 +135,7 @@ filter_candidates( Debug( LDAP_DEBUG_FILTER, "\tGE\n", 0, 0, 0 ); #endif - result = idl_allids( be ); + result = presence_candidates( be, f->f_desc ); break; case LDAP_FILTER_LE: @@ -146,7 +146,7 @@ filter_candidates( Debug( LDAP_DEBUG_FILTER, "\tLE\n", 0, 0, 0 ); #endif - result = idl_allids( be ); + result = presence_candidates( be, f->f_desc ); break; case LDAP_FILTER_AND: @@ -179,11 +179,13 @@ filter_candidates( Debug( LDAP_DEBUG_FILTER, "\tNOT\n", 0, 0, 0 ); #endif - tmp1 = idl_allids( be ); - tmp2 = filter_candidates( be, f->f_not ); - result = idl_notin( be, tmp1, tmp2 ); - idl_free( tmp2 ); - idl_free( tmp1 ); + /* + * As candidates lists may contain entries which do + * not match the assertion, negation of the inner candidate + * list could result in matching entries be excluded from + * the returned candidate list. + */ + result = idl_allids( be ); break; }