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:
74 #if 0 /* Not used any more, search calls bdb_dn2idl directly */
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 for ( f = flist; f != NULL; f = f->f_next ) {
235 /* Ignore undefined filters */
236 if ( f->f_choice == SLAPD_FILTER_COMPUTED &&
237 f->f_result == SLAPD_COMPARE_UNDEFINED ) {
240 rc = bdb_filter_candidates( op, f, save, tmp,
241 save+BDB_IDL_UM_SIZE );
244 if ( ftype == LDAP_FILTER_AND ) {
252 if ( ftype == LDAP_FILTER_AND ) {
254 BDB_IDL_CPY( ids, save );
256 bdb_idl_intersection( ids, save );
258 if( BDB_IDL_IS_ZERO( ids ) )
262 BDB_IDL_CPY( ids, save );
264 bdb_idl_union( ids, save );
269 if( rc == LDAP_SUCCESS ) {
271 LDAP_LOG ( INDEX, RESULTS,
272 "<= bdb_list_candidates: id=%ld first=%ld last=%ld\n",
273 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
274 (long) BDB_IDL_LAST( ids ) );
276 Debug( LDAP_DEBUG_FILTER,
277 "<= bdb_list_candidates: id=%ld first=%ld last=%ld\n",
279 (long) BDB_IDL_FIRST(ids),
280 (long) BDB_IDL_LAST(ids) );
285 LDAP_LOG ( INDEX, ARGS, "<= bdb_list_candidates: rc=%d\n", rc, 0, 0 );
287 Debug( LDAP_DEBUG_FILTER,
288 "<= bdb_list_candidates: undefined rc=%d\n",
299 AttributeDescription *desc,
302 struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
306 struct berval prefix = {0, NULL};
309 LDAP_LOG ( INDEX, ENTRY, "=> bdb_presence_candidates (%s)\n",
310 desc->ad_cname.bv_val, 0, 0 );
312 Debug( LDAP_DEBUG_TRACE, "=> bdb_presence_candidates (%s)\n",
313 desc->ad_cname.bv_val, 0, 0 );
316 if( desc == slap_schema.si_ad_objectClass ) {
317 BDB_IDL_ALL( bdb, ids );
321 rc = bdb_index_param( op->o_bd, desc, LDAP_FILTER_PRESENT,
322 &db, &mask, &prefix );
324 if( rc != LDAP_SUCCESS ) {
326 LDAP_LOG ( INDEX, RESULTS,
327 "<= bdb_presence_candidates: (%s) index_param "
329 desc->ad_cname.bv_val, rc, 0 );
331 Debug( LDAP_DEBUG_TRACE,
332 "<= bdb_presence_candidates: (%s) index_param "
334 desc->ad_cname.bv_val, rc, 0 );
342 LDAP_LOG(INDEX, RESULTS,
343 "<= bdb_presence_candidates: (%s) not indexed\n",
344 desc->ad_cname.bv_val, 0, 0 );
346 Debug( LDAP_DEBUG_TRACE,
347 "<= bdb_presence_candidates: (%s) not indexed\n",
348 desc->ad_cname.bv_val, 0, 0 );
353 if( prefix.bv_val == NULL ) {
355 LDAP_LOG(INDEX, RESULTS,
356 "<= bdb_presence_candidates: (%s) no prefix\n",
357 desc->ad_cname.bv_val, 0, 0 );
359 Debug( LDAP_DEBUG_TRACE,
360 "<= bdb_presence_candidates: (%s) no prefix\n",
361 desc->ad_cname.bv_val, 0, 0 );
366 rc = bdb_key_read( op->o_bd, db, NULL, &prefix, ids );
368 if( rc == DB_NOTFOUND ) {
371 } else if( rc != LDAP_SUCCESS ) {
373 LDAP_LOG ( INDEX, RESULTS,
374 "<= bdb_presence_candidates: (%s) "
375 "key read failed (%d)\n",
376 desc->ad_cname.bv_val, rc, 0 );
378 Debug( LDAP_DEBUG_TRACE,
379 "<= bdb_presense_candidates: (%s) "
380 "key read failed (%d)\n",
381 desc->ad_cname.bv_val, rc, 0 );
387 LDAP_LOG ( INDEX, RESULTS,
388 "<= bdb_presence_candidates: id=%ld first=%ld last=%ld\n",
389 (long)ids[0], (long)BDB_IDL_FIRST( ids ), (long)BDB_IDL_LAST( ids ) );
391 Debug(LDAP_DEBUG_TRACE,
392 "<= bdb_presence_candidates: id=%ld first=%ld last=%ld\n",
394 (long) BDB_IDL_FIRST(ids),
395 (long) BDB_IDL_LAST(ids) );
405 AttributeAssertion *ava,
413 struct berval prefix = {0, NULL};
414 struct berval *keys = NULL;
418 LDAP_LOG ( INDEX, ENTRY, "=> bdb_equality_candidates (%s)\n",
419 ava->aa_desc->ad_cname.bv_val, 0, 0 );
421 Debug( LDAP_DEBUG_TRACE, "=> bdb_equality_candidates (%s)\n",
422 ava->aa_desc->ad_cname.bv_val, 0, 0 );
425 rc = bdb_index_param( op->o_bd, ava->aa_desc, LDAP_FILTER_EQUALITY,
426 &db, &mask, &prefix );
428 if( rc != LDAP_SUCCESS ) {
430 LDAP_LOG ( INDEX, RESULTS,
431 "<= bdb_equality_candidates: (%s) "
432 "index_param failed (%d)\n",
433 ava->aa_desc->ad_cname.bv_val, rc, 0);
435 Debug( LDAP_DEBUG_ANY,
436 "<= bdb_equality_candidates: (%s) "
437 "index_param failed (%d)\n",
438 ava->aa_desc->ad_cname.bv_val, rc, 0 );
445 LDAP_LOG(INDEX, RESULTS,
446 "<= bdb_equality_candidates: (%s) not indexed\n",
447 ava->aa_desc->ad_cname.bv_val, 0, 0 );
449 Debug( LDAP_DEBUG_ANY,
450 "<= bdb_equality_candidates: (%s) not indexed\n",
451 ava->aa_desc->ad_cname.bv_val, 0, 0 );
456 mr = ava->aa_desc->ad_type->sat_equality;
461 if( !mr->smr_filter ) {
465 rc = (mr->smr_filter)(
466 LDAP_FILTER_EQUALITY,
468 ava->aa_desc->ad_type->sat_syntax,
472 &keys, op->o_tmpmemctx );
474 if( rc != LDAP_SUCCESS ) {
476 LDAP_LOG ( INDEX, RESULTS,
477 "<= bdb_equality_candidates: (%s, %s) "
478 "MR filter failed (%d)\n",
479 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
481 Debug( LDAP_DEBUG_TRACE,
482 "<= bdb_equality_candidates: (%s, %s) "
483 "MR filter failed (%d)\n",
484 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
491 LDAP_LOG ( INDEX, RESULTS,
492 "<= bdb_equality_candidates: (%s) no keys\n",
493 ava->aa_desc->ad_cname.bv_val, 0, 0 );
495 Debug( LDAP_DEBUG_TRACE,
496 "<= bdb_equality_candidates: (%s) no keys\n",
497 ava->aa_desc->ad_cname.bv_val, 0, 0 );
502 for ( i= 0; keys[i].bv_val != NULL; i++ ) {
503 rc = bdb_key_read( op->o_bd, db, NULL, &keys[i], tmp );
505 if( rc == DB_NOTFOUND ) {
509 } else if( rc != LDAP_SUCCESS ) {
511 LDAP_LOG ( INDEX, RESULTS,
512 "<= bdb_equality_candidates: (%s) "
513 "key read failed (%d)\n",
514 ava->aa_desc->ad_cname.bv_val, rc, 0 );
516 Debug( LDAP_DEBUG_TRACE,
517 "<= bdb_equality_candidates: (%s) "
518 "key read failed (%d)\n",
519 ava->aa_desc->ad_cname.bv_val, rc, 0 );
524 if( BDB_IDL_IS_ZERO( tmp ) ) {
526 LDAP_LOG ( INDEX, RESULTS,
527 "<= bdb_equality_candidates: (%s) NULL\n",
528 ava->aa_desc->ad_cname.bv_val, 0, 0);
530 Debug( LDAP_DEBUG_TRACE,
531 "<= bdb_equality_candidates: (%s) NULL\n",
532 ava->aa_desc->ad_cname.bv_val, 0, 0 );
539 BDB_IDL_CPY( ids, tmp );
541 bdb_idl_intersection( ids, tmp );
544 if( BDB_IDL_IS_ZERO( ids ) )
548 ber_bvarray_free_x( keys, op->o_tmpmemctx );
551 LDAP_LOG ( INDEX, RESULTS,
552 "<= bdb_equality_candidates: id=%ld first=%ld last=%ld\n",
553 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
554 (long) BDB_IDL_LAST( ids ) );
556 Debug( LDAP_DEBUG_TRACE,
557 "<= bdb_equality_candidates: id=%ld, first=%ld, last=%ld\n",
559 (long) BDB_IDL_FIRST(ids),
560 (long) BDB_IDL_LAST(ids) );
569 AttributeAssertion *ava,
577 struct berval prefix = {0, NULL};
578 struct berval *keys = NULL;
582 LDAP_LOG ( INDEX, ENTRY, "=> bdb_approx_candidates (%s)\n",
583 ava->aa_desc->ad_cname.bv_val, 0, 0 );
585 Debug( LDAP_DEBUG_TRACE, "=> bdb_approx_candidates (%s)\n",
586 ava->aa_desc->ad_cname.bv_val, 0, 0 );
589 rc = bdb_index_param( op->o_bd, ava->aa_desc, LDAP_FILTER_APPROX,
590 &db, &mask, &prefix );
592 if( rc != LDAP_SUCCESS ) {
594 LDAP_LOG ( INDEX, RESULTS,
595 "<= bdb_approx_candidates: (%s) "
596 "index_param failed (%d)\n",
597 ava->aa_desc->ad_cname.bv_val, rc, 0 );
599 Debug( LDAP_DEBUG_ANY,
600 "<= bdb_approx_candidates: (%s) "
601 "index_param failed (%d)\n",
602 ava->aa_desc->ad_cname.bv_val, rc, 0 );
609 LDAP_LOG(INDEX, RESULTS,
610 "<= bdb_approx_candidates: (%s) not indexed\n",
611 ava->aa_desc->ad_cname.bv_val, 0, 0 );
613 Debug( LDAP_DEBUG_ANY,
614 "<= bdb_approx_candidates: (%s) not indexed\n",
615 ava->aa_desc->ad_cname.bv_val, 0, 0 );
620 mr = ava->aa_desc->ad_type->sat_approx;
622 /* no approx matching rule, try equality matching rule */
623 mr = ava->aa_desc->ad_type->sat_equality;
630 if( !mr->smr_filter ) {
634 rc = (mr->smr_filter)(
637 ava->aa_desc->ad_type->sat_syntax,
641 &keys, op->o_tmpmemctx );
643 if( rc != LDAP_SUCCESS ) {
645 LDAP_LOG ( INDEX, RESULTS,
646 "<= bdb_approx_candidates: (%s, %s) "
647 "MR filter failed (%d)\n",
648 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
650 Debug( LDAP_DEBUG_TRACE,
651 "<= bdb_approx_candidates: (%s, %s) "
652 "MR filter failed (%d)\n",
653 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
660 LDAP_LOG ( INDEX, RESULTS,
661 "<= bdb_approx_candidates: (%s) no keys (%s)\n",
662 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, 0 );
664 Debug( LDAP_DEBUG_TRACE,
665 "<= bdb_approx_candidates: (%s) no keys (%s)\n",
666 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, 0 );
671 for ( i= 0; keys[i].bv_val != NULL; i++ ) {
672 rc = bdb_key_read( op->o_bd, db, NULL, &keys[i], tmp );
674 if( rc == DB_NOTFOUND ) {
678 } else if( rc != LDAP_SUCCESS ) {
680 LDAP_LOG ( INDEX, RESULTS,
681 "<= bdb_approx_candidates: (%s) "
682 "key read failed (%d)\n",
683 ava->aa_desc->ad_cname.bv_val, rc, 0);
685 Debug( LDAP_DEBUG_TRACE,
686 "<= bdb_approx_candidates: (%s) "
687 "key read failed (%d)\n",
688 ava->aa_desc->ad_cname.bv_val, rc, 0 );
693 if( BDB_IDL_IS_ZERO( tmp ) ) {
695 LDAP_LOG ( INDEX, RESULTS,
696 "<= bdb_approx_candidates: (%s) NULL\n",
697 ava->aa_desc->ad_cname.bv_val, 0, 0 );
699 Debug( LDAP_DEBUG_TRACE,
700 "<= bdb_approx_candidates: (%s) NULL\n",
701 ava->aa_desc->ad_cname.bv_val, 0, 0 );
708 BDB_IDL_CPY( ids, tmp );
710 bdb_idl_intersection( ids, tmp );
713 if( BDB_IDL_IS_ZERO( ids ) )
717 ber_bvarray_free_x( keys, op->o_tmpmemctx );
720 LDAP_LOG ( INDEX, RESULTS,
721 "<= bdb_approx_candidates: id=%ld first=%ld last=%ld\n",
722 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
723 (long) BDB_IDL_LAST( ids ) );
725 Debug( LDAP_DEBUG_TRACE, "<= bdb_approx_candidates %ld, first=%ld, last=%ld\n",
727 (long) BDB_IDL_FIRST(ids),
728 (long) BDB_IDL_LAST(ids) );
734 substring_candidates(
736 SubstringsAssertion *sub,
744 struct berval prefix = {0, NULL};
745 struct berval *keys = NULL;
749 LDAP_LOG ( INDEX, ENTRY, "=> bdb_substring_candidates (%s)\n",
750 sub->sa_desc->ad_cname.bv_val, 0, 0 );
752 Debug( LDAP_DEBUG_TRACE, "=> bdb_substring_candidates (%s)\n",
753 sub->sa_desc->ad_cname.bv_val, 0, 0 );
756 rc = bdb_index_param( op->o_bd, sub->sa_desc, LDAP_FILTER_SUBSTRINGS,
757 &db, &mask, &prefix );
759 if( rc != LDAP_SUCCESS ) {
761 LDAP_LOG ( INDEX, RESULTS,
762 "<= bdb_substring_candidates: (%s) "
763 "index_param failed (%d)\n",
764 sub->sa_desc->ad_cname.bv_val, rc, 0);
766 Debug( LDAP_DEBUG_ANY,
767 "<= bdb_substring_candidates: (%s) "
768 "index_param failed (%d)\n",
769 sub->sa_desc->ad_cname.bv_val, rc, 0 );
776 LDAP_LOG ( INDEX, RESULTS,
777 "<= bdb_substring_candidates: (%s) not indexed\n",
778 sub->sa_desc->ad_cname.bv_val, 0, 0 );
780 Debug( LDAP_DEBUG_ANY,
781 "<= bdb_substring_candidates: (%s) not indexed\n",
782 sub->sa_desc->ad_cname.bv_val, 0, 0 );
787 mr = sub->sa_desc->ad_type->sat_substr;
793 if( !mr->smr_filter ) {
797 rc = (mr->smr_filter)(
798 LDAP_FILTER_SUBSTRINGS,
800 sub->sa_desc->ad_type->sat_syntax,
804 &keys, op->o_tmpmemctx );
806 if( rc != LDAP_SUCCESS ) {
808 LDAP_LOG ( INDEX, RESULTS,
809 "<= bdb_substring_candidates: (%s) "
810 "MR filter failed (%d)\n",
811 sub->sa_desc->ad_cname.bv_val, rc, 0 );
813 Debug( LDAP_DEBUG_TRACE,
814 "<= bdb_substring_candidates: (%s) "
815 "MR filter failed (%d)\n",
816 sub->sa_desc->ad_cname.bv_val, rc, 0 );
823 LDAP_LOG ( INDEX, RESULTS,
824 "<= bdb_substring_candidates: (0x%04lx) no keys (%s)\n",
825 mask, sub->sa_desc->ad_cname.bv_val, 0 );
827 Debug( LDAP_DEBUG_TRACE,
828 "<= bdb_substring_candidates: (0x%04lx) no keys (%s)\n",
829 mask, sub->sa_desc->ad_cname.bv_val, 0 );
834 for ( i= 0; keys[i].bv_val != NULL; i++ ) {
835 rc = bdb_key_read( op->o_bd, db, NULL, &keys[i], tmp );
837 if( rc == DB_NOTFOUND ) {
841 } else if( rc != LDAP_SUCCESS ) {
843 LDAP_LOG ( INDEX, RESULTS,
844 "<= bdb_substring_candidates: (%s) "
845 "key read failed (%d)\n",
846 sub->sa_desc->ad_cname.bv_val, rc, 0 );
848 Debug( LDAP_DEBUG_TRACE,
849 "<= bdb_substring_candidates: (%s) "
850 "key read failed (%d)\n",
851 sub->sa_desc->ad_cname.bv_val, rc, 0 );
856 if( BDB_IDL_IS_ZERO( tmp ) ) {
858 LDAP_LOG ( INDEX, RESULTS,
859 "<= bdb_substring_candidates: (%s) NULL\n",
860 sub->sa_desc->ad_cname.bv_val, 0, 0 );
862 Debug( LDAP_DEBUG_TRACE,
863 "<= bdb_substring_candidates: (%s) NULL\n",
864 sub->sa_desc->ad_cname.bv_val, 0, 0 );
871 BDB_IDL_CPY( ids, tmp );
873 bdb_idl_intersection( ids, tmp );
876 if( BDB_IDL_IS_ZERO( ids ) )
880 ber_bvarray_free_x( keys, op->o_tmpmemctx );
883 LDAP_LOG ( INDEX, RESULTS,
884 "<= bdb_substring_candidates: id=%ld first=%ld last=%ld\n",
885 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
886 (long) BDB_IDL_LAST( ids ) );
888 Debug( LDAP_DEBUG_TRACE, "<= bdb_substring_candidates: %ld, first=%ld, last=%ld\n",
890 (long) BDB_IDL_FIRST(ids),
891 (long) BDB_IDL_LAST(ids) );