1 /* filterindex.c - generate the list of candidate entries from a filter */
4 * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
5 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
11 #include <ac/string.h>
16 static int presence_candidates(
18 AttributeDescription *desc,
21 static int equality_candidates(
23 AttributeAssertion *ava,
26 static int approx_candidates(
28 AttributeAssertion *ava,
31 static int substring_candidates(
33 SubstringsAssertion *sub,
37 static int list_candidates(
46 bdb_filter_candidates(
55 LDAP_LOG ( INDEX, ENTRY, "=> bdb_filter_candidates\n", 0, 0, 0 );
57 Debug( LDAP_DEBUG_FILTER, "=> bdb_filter_candidates\n", 0, 0, 0 );
60 switch ( f->f_choice ) {
61 case SLAPD_FILTER_COMPUTED:
62 switch( f->f_result ) {
63 case LDAP_COMPARE_FALSE:
66 case LDAP_COMPARE_TRUE: {
67 struct bdb_info *bdb = (struct bdb_info *)op->o_bd->be_private;
68 BDB_IDL_ALL( bdb, ids );
70 case SLAPD_COMPARE_UNDEFINED:
75 case SLAPD_FILTER_DN_ONE:
77 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tDN ONE\n", 0, 0, 0 );
79 Debug( LDAP_DEBUG_FILTER, "\tDN ONE\n", 0, 0, 0 );
81 rc = bdb_dn2idl( op->o_bd, f->f_dn, DN_ONE_PREFIX, ids,
82 stack, op->o_tmpmemctx );
83 if( rc == DB_NOTFOUND ) {
89 case SLAPD_FILTER_DN_SUBTREE:
91 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tDN SUBTREE\n", 0, 0, 0 );
93 Debug( LDAP_DEBUG_FILTER, "\tDN SUBTREE\n", 0, 0, 0 );
95 rc = bdb_dn2idl( op->o_bd, f->f_dn, DN_SUBTREE_PREFIX, ids,
96 stack, op->o_tmpmemctx );
99 case LDAP_FILTER_PRESENT:
101 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tPRESENT\n", 0, 0, 0 );
103 Debug( LDAP_DEBUG_FILTER, "\tPRESENT\n", 0, 0, 0 );
105 rc = presence_candidates( op, f->f_desc, ids );
108 case LDAP_FILTER_EQUALITY:
110 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tEQUALITY\n", 0, 0, 0 );
112 Debug( LDAP_DEBUG_FILTER, "\tEQUALITY\n", 0, 0, 0 );
114 rc = equality_candidates( op, f->f_ava, ids, tmp );
117 case LDAP_FILTER_APPROX:
119 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tAPPROX\n", 0, 0, 0 );
121 Debug( LDAP_DEBUG_FILTER, "\tAPPROX\n", 0, 0, 0 );
123 rc = approx_candidates( op, f->f_ava, ids, tmp );
126 case LDAP_FILTER_SUBSTRINGS:
128 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tSUBSTRINGS\n", 0, 0, 0 );
130 Debug( LDAP_DEBUG_FILTER, "\tSUBSTRINGS\n", 0, 0, 0 );
132 rc = substring_candidates( op, f->f_sub, ids, tmp );
136 /* no GE index, use pres */
138 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tGE\n", 0, 0, 0 );
140 Debug( LDAP_DEBUG_FILTER, "\tGE\n", 0, 0, 0 );
142 rc = presence_candidates( op, f->f_ava->aa_desc, ids );
146 /* no LE index, use pres */
148 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tLE\n", 0, 0, 0 );
150 Debug( LDAP_DEBUG_FILTER, "\tLE\n", 0, 0, 0 );
152 rc = presence_candidates( op, f->f_ava->aa_desc, ids );
155 case LDAP_FILTER_NOT:
156 /* no indexing to support NOT filters */
158 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tNOT\n",0, 0, 0 );
160 Debug( LDAP_DEBUG_FILTER, "\tNOT\n", 0, 0, 0 );
162 { struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
163 BDB_IDL_ALL( bdb, ids );
167 case LDAP_FILTER_AND:
169 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tAND\n", 0, 0, 0 );
171 Debug( LDAP_DEBUG_FILTER, "\tAND\n", 0, 0, 0 );
173 rc = list_candidates( op,
174 f->f_and, LDAP_FILTER_AND, ids, tmp, stack );
179 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tOR\n", 0, 0, 0 );
181 Debug( LDAP_DEBUG_FILTER, "\tOR\n", 0, 0, 0 );
183 rc = list_candidates( op,
184 f->f_or, LDAP_FILTER_OR, ids, tmp, stack );
189 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tUNKNOWN\n", 0, 0, 0 );
191 Debug( LDAP_DEBUG_FILTER, "\tUNKNOWN %lu\n",
192 (unsigned long) f->f_choice, 0, 0 );
194 /* Must not return NULL, otherwise extended filters break */
195 { struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
196 BDB_IDL_ALL( bdb, ids );
201 LDAP_LOG ( INDEX, RESULTS,
202 "<= bdb_filter_candidates: id=%ld first=%ld last=%ld\n",
203 (long)ids[0], (long)BDB_IDL_FIRST( ids ), (long) BDB_IDL_LAST( ids ));
205 Debug( LDAP_DEBUG_FILTER,
206 "<= bdb_filter_candidates: id=%ld first=%ld last=%ld\n",
208 (long) BDB_IDL_FIRST( ids ),
209 (long) BDB_IDL_LAST( ids ) );
224 struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
229 LDAP_LOG ( INDEX, ARGS, "=> bdb_list_candidates: 0x%x\n", ftype, 0 , 0 );
231 Debug( LDAP_DEBUG_FILTER, "=> bdb_list_candidates 0x%x\n", ftype, 0, 0 );
234 /* Copy so we can propagate pre-computed IDLs */
235 BDB_IDL_CPY( save, ids );
237 for ( f = flist; f != NULL; f = f->f_next ) {
238 rc = bdb_filter_candidates( op, f, save, tmp,
239 save+BDB_IDL_UM_SIZE );
242 if ( ftype == LDAP_FILTER_AND ) {
250 if ( ftype == LDAP_FILTER_AND ) {
252 BDB_IDL_CPY( ids, save );
254 bdb_idl_intersection( ids, save );
256 if( BDB_IDL_IS_ZERO( ids ) )
260 BDB_IDL_CPY( ids, save );
262 bdb_idl_union( ids, save );
267 if( rc == LDAP_SUCCESS ) {
269 LDAP_LOG ( INDEX, RESULTS,
270 "<= bdb_list_candidates: id=%ld first=%ld last=%ld\n",
271 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
272 (long) BDB_IDL_LAST( ids ) );
274 Debug( LDAP_DEBUG_FILTER,
275 "<= bdb_list_candidates: id=%ld first=%ld last=%ld\n",
277 (long) BDB_IDL_FIRST(ids),
278 (long) BDB_IDL_LAST(ids) );
283 LDAP_LOG ( INDEX, ARGS, "<= bdb_list_candidates: rc=%d\n", rc, 0, 0 );
285 Debug( LDAP_DEBUG_FILTER,
286 "<= bdb_list_candidates: undefined rc=%d\n",
297 AttributeDescription *desc,
300 struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
304 struct berval prefix = {0, NULL};
307 LDAP_LOG ( INDEX, ENTRY, "=> bdb_presence_candidates (%s)\n",
308 desc->ad_cname.bv_val, 0, 0 );
310 Debug( LDAP_DEBUG_TRACE, "=> bdb_presence_candidates (%s)\n",
311 desc->ad_cname.bv_val, 0, 0 );
314 if( desc == slap_schema.si_ad_objectClass ) {
315 BDB_IDL_ALL( bdb, ids );
319 rc = bdb_index_param( op->o_bd, desc, LDAP_FILTER_PRESENT,
320 &db, &mask, &prefix );
322 if( rc != LDAP_SUCCESS ) {
324 LDAP_LOG ( INDEX, RESULTS,
325 "<= bdb_presence_candidates: (%s) index_param "
327 desc->ad_cname.bv_val, rc, 0 );
329 Debug( LDAP_DEBUG_TRACE,
330 "<= bdb_presence_candidates: (%s) index_param "
332 desc->ad_cname.bv_val, rc, 0 );
340 LDAP_LOG(INDEX, RESULTS,
341 "<= bdb_presence_candidates: (%s) not indexed\n",
342 desc->ad_cname.bv_val, 0, 0 );
344 Debug( LDAP_DEBUG_TRACE,
345 "<= bdb_presence_candidates: (%s) not indexed\n",
346 desc->ad_cname.bv_val, 0, 0 );
351 if( prefix.bv_val == NULL ) {
353 LDAP_LOG(INDEX, RESULTS,
354 "<= bdb_presence_candidates: (%s) no prefix\n",
355 desc->ad_cname.bv_val, 0, 0 );
357 Debug( LDAP_DEBUG_TRACE,
358 "<= bdb_presence_candidates: (%s) no prefix\n",
359 desc->ad_cname.bv_val, 0, 0 );
364 rc = bdb_key_read( op->o_bd, db, NULL, &prefix, ids );
366 if( rc == DB_NOTFOUND ) {
369 } else if( rc != LDAP_SUCCESS ) {
371 LDAP_LOG ( INDEX, RESULTS,
372 "<= bdb_presence_candidates: (%s) "
373 "key read failed (%d)\n",
374 desc->ad_cname.bv_val, rc, 0 );
376 Debug( LDAP_DEBUG_TRACE,
377 "<= bdb_presense_candidates: (%s) "
378 "key read failed (%d)\n",
379 desc->ad_cname.bv_val, rc, 0 );
385 LDAP_LOG ( INDEX, RESULTS,
386 "<= bdb_presence_candidates: id=%ld first=%ld last=%ld\n",
387 (long)ids[0], (long)BDB_IDL_FIRST( ids ), (long)BDB_IDL_LAST( ids ) );
389 Debug(LDAP_DEBUG_TRACE,
390 "<= bdb_presence_candidates: id=%ld first=%ld last=%ld\n",
392 (long) BDB_IDL_FIRST(ids),
393 (long) BDB_IDL_LAST(ids) );
403 AttributeAssertion *ava,
411 struct berval prefix = {0, NULL};
412 struct berval *keys = NULL;
416 LDAP_LOG ( INDEX, ENTRY, "=> bdb_equality_candidates (%s)\n",
417 ava->aa_desc->ad_cname.bv_val, 0, 0 );
419 Debug( LDAP_DEBUG_TRACE, "=> bdb_equality_candidates (%s)\n",
420 ava->aa_desc->ad_cname.bv_val, 0, 0 );
423 rc = bdb_index_param( op->o_bd, ava->aa_desc, LDAP_FILTER_EQUALITY,
424 &db, &mask, &prefix );
426 if( rc != LDAP_SUCCESS ) {
428 LDAP_LOG ( INDEX, RESULTS,
429 "<= bdb_equality_candidates: (%s) "
430 "index_param failed (%d)\n",
431 ava->aa_desc->ad_cname.bv_val, rc, 0);
433 Debug( LDAP_DEBUG_ANY,
434 "<= bdb_equality_candidates: (%s) "
435 "index_param failed (%d)\n",
436 ava->aa_desc->ad_cname.bv_val, rc, 0 );
443 LDAP_LOG(INDEX, RESULTS,
444 "<= bdb_equality_candidates: (%s) not indexed\n",
445 ava->aa_desc->ad_cname.bv_val, 0, 0 );
447 Debug( LDAP_DEBUG_ANY,
448 "<= bdb_equality_candidates: (%s) not indexed\n",
449 ava->aa_desc->ad_cname.bv_val, 0, 0 );
454 mr = ava->aa_desc->ad_type->sat_equality;
459 if( !mr->smr_filter ) {
463 rc = (mr->smr_filter)(
464 LDAP_FILTER_EQUALITY,
466 ava->aa_desc->ad_type->sat_syntax,
470 &keys, op->o_tmpmemctx );
472 if( rc != LDAP_SUCCESS ) {
474 LDAP_LOG ( INDEX, RESULTS,
475 "<= bdb_equality_candidates: (%s, %s) "
476 "MR filter failed (%d)\n",
477 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
479 Debug( LDAP_DEBUG_TRACE,
480 "<= bdb_equality_candidates: (%s, %s) "
481 "MR filter failed (%d)\n",
482 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
489 LDAP_LOG ( INDEX, RESULTS,
490 "<= bdb_equality_candidates: (%s) no keys\n",
491 ava->aa_desc->ad_cname.bv_val, 0, 0 );
493 Debug( LDAP_DEBUG_TRACE,
494 "<= bdb_equality_candidates: (%s) no keys\n",
495 ava->aa_desc->ad_cname.bv_val, 0, 0 );
500 for ( i= 0; keys[i].bv_val != NULL; i++ ) {
501 rc = bdb_key_read( op->o_bd, db, NULL, &keys[i], tmp );
503 if( rc == DB_NOTFOUND ) {
507 } else if( rc != LDAP_SUCCESS ) {
509 LDAP_LOG ( INDEX, RESULTS,
510 "<= bdb_equality_candidates: (%s) "
511 "key read failed (%d)\n",
512 ava->aa_desc->ad_cname.bv_val, rc, 0 );
514 Debug( LDAP_DEBUG_TRACE,
515 "<= bdb_equality_candidates: (%s) "
516 "key read failed (%d)\n",
517 ava->aa_desc->ad_cname.bv_val, rc, 0 );
522 if( BDB_IDL_IS_ZERO( tmp ) ) {
524 LDAP_LOG ( INDEX, RESULTS,
525 "<= bdb_equality_candidates: (%s) NULL\n",
526 ava->aa_desc->ad_cname.bv_val, 0, 0);
528 Debug( LDAP_DEBUG_TRACE,
529 "<= bdb_equality_candidates: (%s) NULL\n",
530 ava->aa_desc->ad_cname.bv_val, 0, 0 );
537 BDB_IDL_CPY( ids, tmp );
539 bdb_idl_intersection( ids, tmp );
542 if( BDB_IDL_IS_ZERO( ids ) )
546 ber_bvarray_free_x( keys, op->o_tmpmemctx );
549 LDAP_LOG ( INDEX, RESULTS,
550 "<= bdb_equality_candidates: id=%ld first=%ld last=%ld\n",
551 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
552 (long) BDB_IDL_LAST( ids ) );
554 Debug( LDAP_DEBUG_TRACE,
555 "<= bdb_equality_candidates: id=%ld, first=%ld, last=%ld\n",
557 (long) BDB_IDL_FIRST(ids),
558 (long) BDB_IDL_LAST(ids) );
567 AttributeAssertion *ava,
575 struct berval prefix = {0, NULL};
576 struct berval *keys = NULL;
580 LDAP_LOG ( INDEX, ENTRY, "=> bdb_approx_candidates (%s)\n",
581 ava->aa_desc->ad_cname.bv_val, 0, 0 );
583 Debug( LDAP_DEBUG_TRACE, "=> bdb_approx_candidates (%s)\n",
584 ava->aa_desc->ad_cname.bv_val, 0, 0 );
587 rc = bdb_index_param( op->o_bd, ava->aa_desc, LDAP_FILTER_APPROX,
588 &db, &mask, &prefix );
590 if( rc != LDAP_SUCCESS ) {
592 LDAP_LOG ( INDEX, RESULTS,
593 "<= bdb_approx_candidates: (%s) "
594 "index_param failed (%d)\n",
595 ava->aa_desc->ad_cname.bv_val, rc, 0 );
597 Debug( LDAP_DEBUG_ANY,
598 "<= bdb_approx_candidates: (%s) "
599 "index_param failed (%d)\n",
600 ava->aa_desc->ad_cname.bv_val, rc, 0 );
607 LDAP_LOG(INDEX, RESULTS,
608 "<= bdb_approx_candidates: (%s) not indexed\n",
609 ava->aa_desc->ad_cname.bv_val, 0, 0 );
611 Debug( LDAP_DEBUG_ANY,
612 "<= bdb_approx_candidates: (%s) not indexed\n",
613 ava->aa_desc->ad_cname.bv_val, 0, 0 );
618 mr = ava->aa_desc->ad_type->sat_approx;
620 /* no approx matching rule, try equality matching rule */
621 mr = ava->aa_desc->ad_type->sat_equality;
628 if( !mr->smr_filter ) {
632 rc = (mr->smr_filter)(
635 ava->aa_desc->ad_type->sat_syntax,
639 &keys, op->o_tmpmemctx );
641 if( rc != LDAP_SUCCESS ) {
643 LDAP_LOG ( INDEX, RESULTS,
644 "<= bdb_approx_candidates: (%s, %s) "
645 "MR filter failed (%d)\n",
646 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
648 Debug( LDAP_DEBUG_TRACE,
649 "<= bdb_approx_candidates: (%s, %s) "
650 "MR filter failed (%d)\n",
651 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
658 LDAP_LOG ( INDEX, RESULTS,
659 "<= bdb_approx_candidates: (%s) no keys (%s)\n",
660 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, 0 );
662 Debug( LDAP_DEBUG_TRACE,
663 "<= bdb_approx_candidates: (%s) no keys (%s)\n",
664 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, 0 );
669 for ( i= 0; keys[i].bv_val != NULL; i++ ) {
670 rc = bdb_key_read( op->o_bd, db, NULL, &keys[i], tmp );
672 if( rc == DB_NOTFOUND ) {
676 } else if( rc != LDAP_SUCCESS ) {
678 LDAP_LOG ( INDEX, RESULTS,
679 "<= bdb_approx_candidates: (%s) "
680 "key read failed (%d)\n",
681 ava->aa_desc->ad_cname.bv_val, rc, 0);
683 Debug( LDAP_DEBUG_TRACE,
684 "<= bdb_approx_candidates: (%s) "
685 "key read failed (%d)\n",
686 ava->aa_desc->ad_cname.bv_val, rc, 0 );
691 if( BDB_IDL_IS_ZERO( tmp ) ) {
693 LDAP_LOG ( INDEX, RESULTS,
694 "<= bdb_approx_candidates: (%s) NULL\n",
695 ava->aa_desc->ad_cname.bv_val, 0, 0 );
697 Debug( LDAP_DEBUG_TRACE,
698 "<= bdb_approx_candidates: (%s) NULL\n",
699 ava->aa_desc->ad_cname.bv_val, 0, 0 );
706 BDB_IDL_CPY( ids, tmp );
708 bdb_idl_intersection( ids, tmp );
711 if( BDB_IDL_IS_ZERO( ids ) )
715 ber_bvarray_free_x( keys, op->o_tmpmemctx );
718 LDAP_LOG ( INDEX, RESULTS,
719 "<= bdb_approx_candidates: id=%ld first=%ld last=%ld\n",
720 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
721 (long) BDB_IDL_LAST( ids ) );
723 Debug( LDAP_DEBUG_TRACE, "<= bdb_approx_candidates %ld, first=%ld, last=%ld\n",
725 (long) BDB_IDL_FIRST(ids),
726 (long) BDB_IDL_LAST(ids) );
732 substring_candidates(
734 SubstringsAssertion *sub,
742 struct berval prefix = {0, NULL};
743 struct berval *keys = NULL;
747 LDAP_LOG ( INDEX, ENTRY, "=> bdb_substring_candidates (%s)\n",
748 sub->sa_desc->ad_cname.bv_val, 0, 0 );
750 Debug( LDAP_DEBUG_TRACE, "=> bdb_substring_candidates (%s)\n",
751 sub->sa_desc->ad_cname.bv_val, 0, 0 );
754 rc = bdb_index_param( op->o_bd, sub->sa_desc, LDAP_FILTER_SUBSTRINGS,
755 &db, &mask, &prefix );
757 if( rc != LDAP_SUCCESS ) {
759 LDAP_LOG ( INDEX, RESULTS,
760 "<= bdb_substring_candidates: (%s) "
761 "index_param failed (%d)\n",
762 sub->sa_desc->ad_cname.bv_val, rc, 0);
764 Debug( LDAP_DEBUG_ANY,
765 "<= bdb_substring_candidates: (%s) "
766 "index_param failed (%d)\n",
767 sub->sa_desc->ad_cname.bv_val, rc, 0 );
774 LDAP_LOG ( INDEX, RESULTS,
775 "<= bdb_substring_candidates: (%s) not indexed\n",
776 sub->sa_desc->ad_cname.bv_val, 0, 0 );
778 Debug( LDAP_DEBUG_ANY,
779 "<= bdb_substring_candidates: (%s) not indexed\n",
780 sub->sa_desc->ad_cname.bv_val, 0, 0 );
785 mr = sub->sa_desc->ad_type->sat_substr;
791 if( !mr->smr_filter ) {
795 rc = (mr->smr_filter)(
796 LDAP_FILTER_SUBSTRINGS,
798 sub->sa_desc->ad_type->sat_syntax,
802 &keys, op->o_tmpmemctx );
804 if( rc != LDAP_SUCCESS ) {
806 LDAP_LOG ( INDEX, RESULTS,
807 "<= bdb_substring_candidates: (%s) "
808 "MR filter failed (%d)\n",
809 sub->sa_desc->ad_cname.bv_val, rc, 0 );
811 Debug( LDAP_DEBUG_TRACE,
812 "<= bdb_substring_candidates: (%s) "
813 "MR filter failed (%d)\n",
814 sub->sa_desc->ad_cname.bv_val, rc, 0 );
821 LDAP_LOG ( INDEX, RESULTS,
822 "<= bdb_substring_candidates: (0x%04lx) no keys (%s)\n",
823 mask, sub->sa_desc->ad_cname.bv_val, 0 );
825 Debug( LDAP_DEBUG_TRACE,
826 "<= bdb_substring_candidates: (0x%04lx) no keys (%s)\n",
827 mask, sub->sa_desc->ad_cname.bv_val, 0 );
832 for ( i= 0; keys[i].bv_val != NULL; i++ ) {
833 rc = bdb_key_read( op->o_bd, db, NULL, &keys[i], tmp );
835 if( rc == DB_NOTFOUND ) {
839 } else if( rc != LDAP_SUCCESS ) {
841 LDAP_LOG ( INDEX, RESULTS,
842 "<= bdb_substring_candidates: (%s) "
843 "key read failed (%d)\n",
844 sub->sa_desc->ad_cname.bv_val, rc, 0 );
846 Debug( LDAP_DEBUG_TRACE,
847 "<= bdb_substring_candidates: (%s) "
848 "key read failed (%d)\n",
849 sub->sa_desc->ad_cname.bv_val, rc, 0 );
854 if( BDB_IDL_IS_ZERO( tmp ) ) {
856 LDAP_LOG ( INDEX, RESULTS,
857 "<= bdb_substring_candidates: (%s) NULL\n",
858 sub->sa_desc->ad_cname.bv_val, 0, 0 );
860 Debug( LDAP_DEBUG_TRACE,
861 "<= bdb_substring_candidates: (%s) NULL\n",
862 sub->sa_desc->ad_cname.bv_val, 0, 0 );
869 BDB_IDL_CPY( ids, tmp );
871 bdb_idl_intersection( ids, tmp );
874 if( BDB_IDL_IS_ZERO( ids ) )
878 ber_bvarray_free_x( keys, op->o_tmpmemctx );
881 LDAP_LOG ( INDEX, RESULTS,
882 "<= bdb_substring_candidates: id=%ld first=%ld last=%ld\n",
883 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
884 (long) BDB_IDL_LAST( ids ) );
886 Debug( LDAP_DEBUG_TRACE, "<= bdb_substring_candidates: %ld, first=%ld, last=%ld\n",
888 (long) BDB_IDL_FIRST(ids),
889 (long) BDB_IDL_LAST(ids) );