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:
64 case SLAPD_FILTER_DN_ONE:
66 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tDN ONE\n", 0, 0, 0 );
68 Debug( LDAP_DEBUG_FILTER, "\tDN ONE\n", 0, 0, 0 );
70 rc = bdb_dn2idl( op->o_bd, f->f_dn, DN_ONE_PREFIX, ids );
71 if( rc == DB_NOTFOUND ) {
77 case SLAPD_FILTER_DN_SUBTREE:
79 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tDN SUBTREE\n", 0, 0, 0 );
81 Debug( LDAP_DEBUG_FILTER, "\tDN SUBTREE\n", 0, 0, 0 );
83 rc = bdb_dn2idl( op->o_bd, f->f_dn, DN_SUBTREE_PREFIX, ids );
86 case LDAP_FILTER_PRESENT:
88 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tPRESENT\n", 0, 0, 0 );
90 Debug( LDAP_DEBUG_FILTER, "\tPRESENT\n", 0, 0, 0 );
92 rc = presence_candidates( op, f->f_desc, ids );
95 case LDAP_FILTER_EQUALITY:
97 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tEQUALITY\n", 0, 0, 0 );
99 Debug( LDAP_DEBUG_FILTER, "\tEQUALITY\n", 0, 0, 0 );
101 rc = equality_candidates( op, f->f_ava, ids, tmp );
104 case LDAP_FILTER_APPROX:
106 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tAPPROX\n", 0, 0, 0 );
108 Debug( LDAP_DEBUG_FILTER, "\tAPPROX\n", 0, 0, 0 );
110 rc = approx_candidates( op, f->f_ava, ids, tmp );
113 case LDAP_FILTER_SUBSTRINGS:
115 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tSUBSTRINGS\n", 0, 0, 0 );
117 Debug( LDAP_DEBUG_FILTER, "\tSUBSTRINGS\n", 0, 0, 0 );
119 rc = substring_candidates( op, f->f_sub, ids, tmp );
123 /* no GE index, use pres */
125 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tGE\n", 0, 0, 0 );
127 Debug( LDAP_DEBUG_FILTER, "\tGE\n", 0, 0, 0 );
129 rc = presence_candidates( op, f->f_ava->aa_desc, ids );
133 /* no LE index, use pres */
135 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tLE\n", 0, 0, 0 );
137 Debug( LDAP_DEBUG_FILTER, "\tLE\n", 0, 0, 0 );
139 rc = presence_candidates( op, f->f_ava->aa_desc, ids );
142 case LDAP_FILTER_NOT:
143 /* no indexing to support NOT filters */
145 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tNOT\n",0, 0, 0 );
147 Debug( LDAP_DEBUG_FILTER, "\tNOT\n", 0, 0, 0 );
149 { struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
150 BDB_IDL_ALL( bdb, ids );
154 case LDAP_FILTER_AND:
156 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tAND\n", 0, 0, 0 );
158 Debug( LDAP_DEBUG_FILTER, "\tAND\n", 0, 0, 0 );
160 rc = list_candidates( op,
161 f->f_and, LDAP_FILTER_AND, ids, tmp, stack );
166 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tOR\n", 0, 0, 0 );
168 Debug( LDAP_DEBUG_FILTER, "\tOR\n", 0, 0, 0 );
170 rc = list_candidates( op,
171 f->f_or, LDAP_FILTER_OR, ids, tmp, stack );
176 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tUNKNOWN\n", 0, 0, 0 );
178 Debug( LDAP_DEBUG_FILTER, "\tUNKNOWN %lu\n",
179 (unsigned long) f->f_choice, 0, 0 );
181 /* Must not return NULL, otherwise extended filters break */
182 { struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
183 BDB_IDL_ALL( bdb, ids );
188 LDAP_LOG ( INDEX, RESULTS,
189 "<= bdb_filter_candidates: id=%ld first=%ld last=%ld\n",
190 (long)ids[0], (long)BDB_IDL_FIRST( ids ), (long) BDB_IDL_LAST( ids ));
192 Debug( LDAP_DEBUG_FILTER,
193 "<= bdb_filter_candidates: id=%ld first=%ld last=%ld\n",
195 (long) BDB_IDL_FIRST( ids ),
196 (long) BDB_IDL_LAST( ids ) );
211 struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
216 LDAP_LOG ( INDEX, ARGS, "=> bdb_list_candidates: 0x%x\n", ftype, 0 , 0 );
218 Debug( LDAP_DEBUG_FILTER, "=> bdb_list_candidates 0x%x\n", ftype, 0, 0 );
221 /* Copy so we can propagate pre-computed IDLs */
222 BDB_IDL_CPY( save, ids );
224 for ( f = flist; f != NULL; f = f->f_next ) {
225 rc = bdb_filter_candidates( op, f, save, tmp,
226 save+BDB_IDL_UM_SIZE );
229 if ( ftype == LDAP_FILTER_AND ) {
237 if ( ftype == LDAP_FILTER_AND ) {
239 BDB_IDL_CPY( ids, save );
241 bdb_idl_intersection( ids, save );
243 if( BDB_IDL_IS_ZERO( ids ) )
247 BDB_IDL_CPY( ids, save );
249 bdb_idl_union( ids, save );
254 if( rc == LDAP_SUCCESS ) {
256 LDAP_LOG ( INDEX, RESULTS,
257 "<= bdb_list_candidates: id=%ld first=%ld last=%ld\n",
258 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
259 (long) BDB_IDL_LAST( ids ) );
261 Debug( LDAP_DEBUG_FILTER,
262 "<= bdb_list_candidates: id=%ld first=%ld last=%ld\n",
264 (long) BDB_IDL_FIRST(ids),
265 (long) BDB_IDL_LAST(ids) );
270 LDAP_LOG ( INDEX, ARGS, "<= bdb_list_candidates: rc=%d\n", rc, 0, 0 );
272 Debug( LDAP_DEBUG_FILTER,
273 "<= bdb_list_candidates: undefined rc=%d\n",
284 AttributeDescription *desc,
287 struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
291 struct berval prefix = {0, NULL};
294 LDAP_LOG ( INDEX, ENTRY, "=> bdb_presence_candidates (%s)\n",
295 desc->ad_cname.bv_val, 0, 0 );
297 Debug( LDAP_DEBUG_TRACE, "=> bdb_presence_candidates (%s)\n",
298 desc->ad_cname.bv_val, 0, 0 );
301 if( desc == slap_schema.si_ad_objectClass ) {
302 BDB_IDL_ALL( bdb, ids );
306 rc = bdb_index_param( op->o_bd, desc, LDAP_FILTER_PRESENT,
307 &db, &mask, &prefix );
309 if( rc != LDAP_SUCCESS ) {
311 LDAP_LOG ( INDEX, RESULTS,
312 "<= bdb_presence_candidates: (%s) index_param "
314 desc->ad_cname.bv_val, rc, 0 );
316 Debug( LDAP_DEBUG_TRACE,
317 "<= bdb_presence_candidates: (%s) index_param "
319 desc->ad_cname.bv_val, rc, 0 );
327 LDAP_LOG(INDEX, RESULTS,
328 "<= bdb_presence_candidates: (%s) not indexed\n",
329 desc->ad_cname.bv_val, 0, 0 );
331 Debug( LDAP_DEBUG_TRACE,
332 "<= bdb_presence_candidates: (%s) not indexed\n",
333 desc->ad_cname.bv_val, 0, 0 );
338 if( prefix.bv_val == NULL ) {
340 LDAP_LOG(INDEX, RESULTS,
341 "<= bdb_presence_candidates: (%s) no prefix\n",
342 desc->ad_cname.bv_val, 0, 0 );
344 Debug( LDAP_DEBUG_TRACE,
345 "<= bdb_presence_candidates: (%s) no prefix\n",
346 desc->ad_cname.bv_val, 0, 0 );
351 rc = bdb_key_read( op->o_bd, db, NULL, &prefix, ids );
353 if( rc == DB_NOTFOUND ) {
356 } else if( rc != LDAP_SUCCESS ) {
358 LDAP_LOG ( INDEX, RESULTS,
359 "<= bdb_presence_candidates: (%s) "
360 "key read failed (%d)\n",
361 desc->ad_cname.bv_val, rc, 0 );
363 Debug( LDAP_DEBUG_TRACE,
364 "<= bdb_presense_candidates: (%s) "
365 "key read failed (%d)\n",
366 desc->ad_cname.bv_val, rc, 0 );
372 LDAP_LOG ( INDEX, RESULTS,
373 "<= bdb_presence_candidates: id=%ld first=%ld last=%ld\n",
374 (long)ids[0], (long)BDB_IDL_FIRST( ids ), (long)BDB_IDL_LAST( ids ) );
376 Debug(LDAP_DEBUG_TRACE,
377 "<= bdb_presence_candidates: id=%ld first=%ld last=%ld\n",
379 (long) BDB_IDL_FIRST(ids),
380 (long) BDB_IDL_LAST(ids) );
390 AttributeAssertion *ava,
398 struct berval prefix = {0, NULL};
399 struct berval *keys = NULL;
403 LDAP_LOG ( INDEX, ENTRY, "=> bdb_equality_candidates (%s)\n",
404 ava->aa_desc->ad_cname.bv_val, 0, 0 );
406 Debug( LDAP_DEBUG_TRACE, "=> bdb_equality_candidates (%s)\n",
407 ava->aa_desc->ad_cname.bv_val, 0, 0 );
410 rc = bdb_index_param( op->o_bd, ava->aa_desc, LDAP_FILTER_EQUALITY,
411 &db, &mask, &prefix );
413 if( rc != LDAP_SUCCESS ) {
415 LDAP_LOG ( INDEX, RESULTS,
416 "<= bdb_equality_candidates: (%s) "
417 "index_param failed (%d)\n",
418 ava->aa_desc->ad_cname.bv_val, rc, 0);
420 Debug( LDAP_DEBUG_ANY,
421 "<= bdb_equality_candidates: (%s) "
422 "index_param failed (%d)\n",
423 ava->aa_desc->ad_cname.bv_val, rc, 0 );
430 LDAP_LOG(INDEX, RESULTS,
431 "<= bdb_equality_candidates: (%s) not indexed\n",
432 ava->aa_desc->ad_cname.bv_val, 0, 0 );
434 Debug( LDAP_DEBUG_ANY,
435 "<= bdb_equality_candidates: (%s) not indexed\n",
436 ava->aa_desc->ad_cname.bv_val, 0, 0 );
441 mr = ava->aa_desc->ad_type->sat_equality;
446 if( !mr->smr_filter ) {
450 rc = (mr->smr_filter)(
451 LDAP_FILTER_EQUALITY,
453 ava->aa_desc->ad_type->sat_syntax,
457 &keys, op->o_tmpmemctx );
459 if( rc != LDAP_SUCCESS ) {
461 LDAP_LOG ( INDEX, RESULTS,
462 "<= bdb_equality_candidates: (%s, %s) "
463 "MR filter failed (%d)\n",
464 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
466 Debug( LDAP_DEBUG_TRACE,
467 "<= bdb_equality_candidates: (%s, %s) "
468 "MR filter failed (%d)\n",
469 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
476 LDAP_LOG ( INDEX, RESULTS,
477 "<= bdb_equality_candidates: (%s) no keys\n",
478 ava->aa_desc->ad_cname.bv_val, 0, 0 );
480 Debug( LDAP_DEBUG_TRACE,
481 "<= bdb_equality_candidates: (%s) no keys\n",
482 ava->aa_desc->ad_cname.bv_val, 0, 0 );
487 for ( i= 0; keys[i].bv_val != NULL; i++ ) {
488 rc = bdb_key_read( op->o_bd, db, NULL, &keys[i], tmp );
490 if( rc == DB_NOTFOUND ) {
493 } else if( rc != LDAP_SUCCESS ) {
495 LDAP_LOG ( INDEX, RESULTS,
496 "<= bdb_equality_candidates: (%s) "
497 "key read failed (%d)\n",
498 ava->aa_desc->ad_cname.bv_val, rc, 0 );
500 Debug( LDAP_DEBUG_TRACE,
501 "<= bdb_equality_candidates: (%s) "
502 "key read failed (%d)\n",
503 ava->aa_desc->ad_cname.bv_val, rc, 0 );
508 if( BDB_IDL_IS_ZERO( tmp ) ) {
510 LDAP_LOG ( INDEX, RESULTS,
511 "<= bdb_equality_candidates: (%s) NULL\n",
512 ava->aa_desc->ad_cname.bv_val, 0, 0);
514 Debug( LDAP_DEBUG_TRACE,
515 "<= bdb_equality_candidates: (%s) NULL\n",
516 ava->aa_desc->ad_cname.bv_val, 0, 0 );
523 BDB_IDL_CPY( ids, tmp );
525 bdb_idl_intersection( ids, tmp );
528 if( BDB_IDL_IS_ZERO( ids ) )
532 ber_bvarray_free_x( keys, op->o_tmpmemctx );
535 LDAP_LOG ( INDEX, RESULTS,
536 "<= bdb_equality_candidates: id=%ld first=%ld last=%ld\n",
537 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
538 (long) BDB_IDL_LAST( ids ) );
540 Debug( LDAP_DEBUG_TRACE,
541 "<= bdb_equality_candidates: id=%ld, first=%ld, last=%ld\n",
543 (long) BDB_IDL_FIRST(ids),
544 (long) BDB_IDL_LAST(ids) );
553 AttributeAssertion *ava,
561 struct berval prefix = {0, NULL};
562 struct berval *keys = NULL;
566 LDAP_LOG ( INDEX, ENTRY, "=> bdb_approx_candidates (%s)\n",
567 ava->aa_desc->ad_cname.bv_val, 0, 0 );
569 Debug( LDAP_DEBUG_TRACE, "=> bdb_approx_candidates (%s)\n",
570 ava->aa_desc->ad_cname.bv_val, 0, 0 );
573 rc = bdb_index_param( op->o_bd, ava->aa_desc, LDAP_FILTER_APPROX,
574 &db, &mask, &prefix );
576 if( rc != LDAP_SUCCESS ) {
578 LDAP_LOG ( INDEX, RESULTS,
579 "<= bdb_approx_candidates: (%s) "
580 "index_param failed (%d)\n",
581 ava->aa_desc->ad_cname.bv_val, rc, 0 );
583 Debug( LDAP_DEBUG_ANY,
584 "<= bdb_approx_candidates: (%s) "
585 "index_param failed (%d)\n",
586 ava->aa_desc->ad_cname.bv_val, rc, 0 );
593 LDAP_LOG(INDEX, RESULTS,
594 "<= bdb_approx_candidates: (%s) not indexed\n",
595 ava->aa_desc->ad_cname.bv_val, 0, 0 );
597 Debug( LDAP_DEBUG_ANY,
598 "<= bdb_approx_candidates: (%s) not indexed\n",
599 ava->aa_desc->ad_cname.bv_val, 0, 0 );
604 mr = ava->aa_desc->ad_type->sat_approx;
606 /* no approx matching rule, try equality matching rule */
607 mr = ava->aa_desc->ad_type->sat_equality;
614 if( !mr->smr_filter ) {
618 rc = (mr->smr_filter)(
621 ava->aa_desc->ad_type->sat_syntax,
625 &keys, op->o_tmpmemctx );
627 if( rc != LDAP_SUCCESS ) {
629 LDAP_LOG ( INDEX, RESULTS,
630 "<= bdb_approx_candidates: (%s, %s) "
631 "MR filter failed (%d)\n",
632 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
634 Debug( LDAP_DEBUG_TRACE,
635 "<= bdb_approx_candidates: (%s, %s) "
636 "MR filter failed (%d)\n",
637 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
644 LDAP_LOG ( INDEX, RESULTS,
645 "<= bdb_approx_candidates: (%s) no keys (%s)\n",
646 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, 0 );
648 Debug( LDAP_DEBUG_TRACE,
649 "<= bdb_approx_candidates: (%s) no keys (%s)\n",
650 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, 0 );
655 for ( i= 0; keys[i].bv_val != NULL; i++ ) {
656 rc = bdb_key_read( op->o_bd, db, NULL, &keys[i], tmp );
658 if( rc == DB_NOTFOUND ) {
662 } else if( rc != LDAP_SUCCESS ) {
664 LDAP_LOG ( INDEX, RESULTS,
665 "<= bdb_approx_candidates: (%s) "
666 "key read failed (%d)\n",
667 ava->aa_desc->ad_cname.bv_val, rc, 0);
669 Debug( LDAP_DEBUG_TRACE,
670 "<= bdb_approx_candidates: (%s) "
671 "key read failed (%d)\n",
672 ava->aa_desc->ad_cname.bv_val, rc, 0 );
677 if( BDB_IDL_IS_ZERO( tmp ) ) {
679 LDAP_LOG ( INDEX, RESULTS,
680 "<= bdb_approx_candidates: (%s) NULL\n",
681 ava->aa_desc->ad_cname.bv_val, 0, 0 );
683 Debug( LDAP_DEBUG_TRACE,
684 "<= bdb_approx_candidates: (%s) NULL\n",
685 ava->aa_desc->ad_cname.bv_val, 0, 0 );
692 BDB_IDL_CPY( ids, tmp );
694 bdb_idl_intersection( ids, tmp );
697 if( BDB_IDL_IS_ZERO( ids ) )
701 ber_bvarray_free_x( keys, op->o_tmpmemctx );
704 LDAP_LOG ( INDEX, RESULTS,
705 "<= bdb_approx_candidates: id=%ld first=%ld last=%ld\n",
706 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
707 (long) BDB_IDL_LAST( ids ) );
709 Debug( LDAP_DEBUG_TRACE, "<= bdb_approx_candidates %ld, first=%ld, last=%ld\n",
711 (long) BDB_IDL_FIRST(ids),
712 (long) BDB_IDL_LAST(ids) );
718 substring_candidates(
720 SubstringsAssertion *sub,
728 struct berval prefix = {0, NULL};
729 struct berval *keys = NULL;
733 LDAP_LOG ( INDEX, ENTRY, "=> bdb_substring_candidates (%s)\n",
734 sub->sa_desc->ad_cname.bv_val, 0, 0 );
736 Debug( LDAP_DEBUG_TRACE, "=> bdb_substring_candidates (%s)\n",
737 sub->sa_desc->ad_cname.bv_val, 0, 0 );
740 rc = bdb_index_param( op->o_bd, sub->sa_desc, LDAP_FILTER_SUBSTRINGS,
741 &db, &mask, &prefix );
743 if( rc != LDAP_SUCCESS ) {
745 LDAP_LOG ( INDEX, RESULTS,
746 "<= bdb_substring_candidates: (%s) "
747 "index_param failed (%d)\n",
748 sub->sa_desc->ad_cname.bv_val, rc, 0);
750 Debug( LDAP_DEBUG_ANY,
751 "<= bdb_substring_candidates: (%s) "
752 "index_param failed (%d)\n",
753 sub->sa_desc->ad_cname.bv_val, rc, 0 );
760 LDAP_LOG ( INDEX, RESULTS,
761 "<= bdb_substring_candidates: (%s) not indexed\n",
762 sub->sa_desc->ad_cname.bv_val, 0, 0 );
764 Debug( LDAP_DEBUG_ANY,
765 "<= bdb_substring_candidates: (%s) not indexed\n",
766 sub->sa_desc->ad_cname.bv_val, 0, 0 );
771 mr = sub->sa_desc->ad_type->sat_substr;
777 if( !mr->smr_filter ) {
781 rc = (mr->smr_filter)(
782 LDAP_FILTER_SUBSTRINGS,
784 sub->sa_desc->ad_type->sat_syntax,
788 &keys, op->o_tmpmemctx );
790 if( rc != LDAP_SUCCESS ) {
792 LDAP_LOG ( INDEX, RESULTS,
793 "<= bdb_substring_candidates: (%s) "
794 "MR filter failed (%d)\n",
795 sub->sa_desc->ad_cname.bv_val, rc, 0 );
797 Debug( LDAP_DEBUG_TRACE,
798 "<= bdb_substring_candidates: (%s) "
799 "MR filter failed (%d)\n",
800 sub->sa_desc->ad_cname.bv_val, rc, 0 );
807 LDAP_LOG ( INDEX, RESULTS,
808 "<= bdb_substring_candidates: (0x%04lx) no keys (%s)\n",
809 mask, sub->sa_desc->ad_cname.bv_val, 0 );
811 Debug( LDAP_DEBUG_TRACE,
812 "<= bdb_substring_candidates: (0x%04lx) no keys (%s)\n",
813 mask, sub->sa_desc->ad_cname.bv_val, 0 );
818 for ( i= 0; keys[i].bv_val != NULL; i++ ) {
819 rc = bdb_key_read( op->o_bd, db, NULL, &keys[i], tmp );
821 if( rc == DB_NOTFOUND ) {
825 } else if( rc != LDAP_SUCCESS ) {
827 LDAP_LOG ( INDEX, RESULTS,
828 "<= bdb_substring_candidates: (%s) "
829 "key read failed (%d)\n",
830 sub->sa_desc->ad_cname.bv_val, rc, 0 );
832 Debug( LDAP_DEBUG_TRACE,
833 "<= bdb_substring_candidates: (%s) "
834 "key read failed (%d)\n",
835 sub->sa_desc->ad_cname.bv_val, rc, 0 );
840 if( BDB_IDL_IS_ZERO( tmp ) ) {
842 LDAP_LOG ( INDEX, RESULTS,
843 "<= bdb_substring_candidates: (%s) NULL\n",
844 sub->sa_desc->ad_cname.bv_val, 0, 0 );
846 Debug( LDAP_DEBUG_TRACE,
847 "<= bdb_substring_candidates: (%s) NULL\n",
848 sub->sa_desc->ad_cname.bv_val, 0, 0 );
855 BDB_IDL_CPY( ids, tmp );
857 bdb_idl_intersection( ids, tmp );
860 if( BDB_IDL_IS_ZERO( ids ) )
864 ber_bvarray_free_x( keys, op->o_tmpmemctx );
867 LDAP_LOG ( INDEX, RESULTS,
868 "<= bdb_substring_candidates: id=%ld first=%ld last=%ld\n",
869 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
870 (long) BDB_IDL_LAST( ids ) );
872 Debug( LDAP_DEBUG_TRACE, "<= bdb_substring_candidates: %ld, first=%ld, last=%ld\n",
874 (long) BDB_IDL_FIRST(ids),
875 (long) BDB_IDL_LAST(ids) );