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 ) {
494 } else if( rc != LDAP_SUCCESS ) {
496 LDAP_LOG ( INDEX, RESULTS,
497 "<= bdb_equality_candidates: (%s) "
498 "key read failed (%d)\n",
499 ava->aa_desc->ad_cname.bv_val, rc, 0 );
501 Debug( LDAP_DEBUG_TRACE,
502 "<= bdb_equality_candidates: (%s) "
503 "key read failed (%d)\n",
504 ava->aa_desc->ad_cname.bv_val, rc, 0 );
509 if( BDB_IDL_IS_ZERO( tmp ) ) {
511 LDAP_LOG ( INDEX, RESULTS,
512 "<= bdb_equality_candidates: (%s) NULL\n",
513 ava->aa_desc->ad_cname.bv_val, 0, 0);
515 Debug( LDAP_DEBUG_TRACE,
516 "<= bdb_equality_candidates: (%s) NULL\n",
517 ava->aa_desc->ad_cname.bv_val, 0, 0 );
524 BDB_IDL_CPY( ids, tmp );
526 bdb_idl_intersection( ids, tmp );
529 if( BDB_IDL_IS_ZERO( ids ) )
533 ber_bvarray_free_x( keys, op->o_tmpmemctx );
536 LDAP_LOG ( INDEX, RESULTS,
537 "<= bdb_equality_candidates: id=%ld first=%ld last=%ld\n",
538 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
539 (long) BDB_IDL_LAST( ids ) );
541 Debug( LDAP_DEBUG_TRACE,
542 "<= bdb_equality_candidates: id=%ld, first=%ld, last=%ld\n",
544 (long) BDB_IDL_FIRST(ids),
545 (long) BDB_IDL_LAST(ids) );
554 AttributeAssertion *ava,
562 struct berval prefix = {0, NULL};
563 struct berval *keys = NULL;
567 LDAP_LOG ( INDEX, ENTRY, "=> bdb_approx_candidates (%s)\n",
568 ava->aa_desc->ad_cname.bv_val, 0, 0 );
570 Debug( LDAP_DEBUG_TRACE, "=> bdb_approx_candidates (%s)\n",
571 ava->aa_desc->ad_cname.bv_val, 0, 0 );
574 rc = bdb_index_param( op->o_bd, ava->aa_desc, LDAP_FILTER_APPROX,
575 &db, &mask, &prefix );
577 if( rc != LDAP_SUCCESS ) {
579 LDAP_LOG ( INDEX, RESULTS,
580 "<= bdb_approx_candidates: (%s) "
581 "index_param failed (%d)\n",
582 ava->aa_desc->ad_cname.bv_val, rc, 0 );
584 Debug( LDAP_DEBUG_ANY,
585 "<= bdb_approx_candidates: (%s) "
586 "index_param failed (%d)\n",
587 ava->aa_desc->ad_cname.bv_val, rc, 0 );
594 LDAP_LOG(INDEX, RESULTS,
595 "<= bdb_approx_candidates: (%s) not indexed\n",
596 ava->aa_desc->ad_cname.bv_val, 0, 0 );
598 Debug( LDAP_DEBUG_ANY,
599 "<= bdb_approx_candidates: (%s) not indexed\n",
600 ava->aa_desc->ad_cname.bv_val, 0, 0 );
605 mr = ava->aa_desc->ad_type->sat_approx;
607 /* no approx matching rule, try equality matching rule */
608 mr = ava->aa_desc->ad_type->sat_equality;
615 if( !mr->smr_filter ) {
619 rc = (mr->smr_filter)(
622 ava->aa_desc->ad_type->sat_syntax,
626 &keys, op->o_tmpmemctx );
628 if( rc != LDAP_SUCCESS ) {
630 LDAP_LOG ( INDEX, RESULTS,
631 "<= bdb_approx_candidates: (%s, %s) "
632 "MR filter failed (%d)\n",
633 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
635 Debug( LDAP_DEBUG_TRACE,
636 "<= bdb_approx_candidates: (%s, %s) "
637 "MR filter failed (%d)\n",
638 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
645 LDAP_LOG ( INDEX, RESULTS,
646 "<= bdb_approx_candidates: (%s) no keys (%s)\n",
647 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, 0 );
649 Debug( LDAP_DEBUG_TRACE,
650 "<= bdb_approx_candidates: (%s) no keys (%s)\n",
651 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, 0 );
656 for ( i= 0; keys[i].bv_val != NULL; i++ ) {
657 rc = bdb_key_read( op->o_bd, db, NULL, &keys[i], tmp );
659 if( rc == DB_NOTFOUND ) {
663 } else if( rc != LDAP_SUCCESS ) {
665 LDAP_LOG ( INDEX, RESULTS,
666 "<= bdb_approx_candidates: (%s) "
667 "key read failed (%d)\n",
668 ava->aa_desc->ad_cname.bv_val, rc, 0);
670 Debug( LDAP_DEBUG_TRACE,
671 "<= bdb_approx_candidates: (%s) "
672 "key read failed (%d)\n",
673 ava->aa_desc->ad_cname.bv_val, rc, 0 );
678 if( BDB_IDL_IS_ZERO( tmp ) ) {
680 LDAP_LOG ( INDEX, RESULTS,
681 "<= bdb_approx_candidates: (%s) NULL\n",
682 ava->aa_desc->ad_cname.bv_val, 0, 0 );
684 Debug( LDAP_DEBUG_TRACE,
685 "<= bdb_approx_candidates: (%s) NULL\n",
686 ava->aa_desc->ad_cname.bv_val, 0, 0 );
693 BDB_IDL_CPY( ids, tmp );
695 bdb_idl_intersection( ids, tmp );
698 if( BDB_IDL_IS_ZERO( ids ) )
702 ber_bvarray_free_x( keys, op->o_tmpmemctx );
705 LDAP_LOG ( INDEX, RESULTS,
706 "<= bdb_approx_candidates: id=%ld first=%ld last=%ld\n",
707 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
708 (long) BDB_IDL_LAST( ids ) );
710 Debug( LDAP_DEBUG_TRACE, "<= bdb_approx_candidates %ld, first=%ld, last=%ld\n",
712 (long) BDB_IDL_FIRST(ids),
713 (long) BDB_IDL_LAST(ids) );
719 substring_candidates(
721 SubstringsAssertion *sub,
729 struct berval prefix = {0, NULL};
730 struct berval *keys = NULL;
734 LDAP_LOG ( INDEX, ENTRY, "=> bdb_substring_candidates (%s)\n",
735 sub->sa_desc->ad_cname.bv_val, 0, 0 );
737 Debug( LDAP_DEBUG_TRACE, "=> bdb_substring_candidates (%s)\n",
738 sub->sa_desc->ad_cname.bv_val, 0, 0 );
741 rc = bdb_index_param( op->o_bd, sub->sa_desc, LDAP_FILTER_SUBSTRINGS,
742 &db, &mask, &prefix );
744 if( rc != LDAP_SUCCESS ) {
746 LDAP_LOG ( INDEX, RESULTS,
747 "<= bdb_substring_candidates: (%s) "
748 "index_param failed (%d)\n",
749 sub->sa_desc->ad_cname.bv_val, rc, 0);
751 Debug( LDAP_DEBUG_ANY,
752 "<= bdb_substring_candidates: (%s) "
753 "index_param failed (%d)\n",
754 sub->sa_desc->ad_cname.bv_val, rc, 0 );
761 LDAP_LOG ( INDEX, RESULTS,
762 "<= bdb_substring_candidates: (%s) not indexed\n",
763 sub->sa_desc->ad_cname.bv_val, 0, 0 );
765 Debug( LDAP_DEBUG_ANY,
766 "<= bdb_substring_candidates: (%s) not indexed\n",
767 sub->sa_desc->ad_cname.bv_val, 0, 0 );
772 mr = sub->sa_desc->ad_type->sat_substr;
778 if( !mr->smr_filter ) {
782 rc = (mr->smr_filter)(
783 LDAP_FILTER_SUBSTRINGS,
785 sub->sa_desc->ad_type->sat_syntax,
789 &keys, op->o_tmpmemctx );
791 if( rc != LDAP_SUCCESS ) {
793 LDAP_LOG ( INDEX, RESULTS,
794 "<= bdb_substring_candidates: (%s) "
795 "MR filter failed (%d)\n",
796 sub->sa_desc->ad_cname.bv_val, rc, 0 );
798 Debug( LDAP_DEBUG_TRACE,
799 "<= bdb_substring_candidates: (%s) "
800 "MR filter failed (%d)\n",
801 sub->sa_desc->ad_cname.bv_val, rc, 0 );
808 LDAP_LOG ( INDEX, RESULTS,
809 "<= bdb_substring_candidates: (0x%04lx) no keys (%s)\n",
810 mask, sub->sa_desc->ad_cname.bv_val, 0 );
812 Debug( LDAP_DEBUG_TRACE,
813 "<= bdb_substring_candidates: (0x%04lx) no keys (%s)\n",
814 mask, sub->sa_desc->ad_cname.bv_val, 0 );
819 for ( i= 0; keys[i].bv_val != NULL; i++ ) {
820 rc = bdb_key_read( op->o_bd, db, NULL, &keys[i], tmp );
822 if( rc == DB_NOTFOUND ) {
826 } else if( rc != LDAP_SUCCESS ) {
828 LDAP_LOG ( INDEX, RESULTS,
829 "<= bdb_substring_candidates: (%s) "
830 "key read failed (%d)\n",
831 sub->sa_desc->ad_cname.bv_val, rc, 0 );
833 Debug( LDAP_DEBUG_TRACE,
834 "<= bdb_substring_candidates: (%s) "
835 "key read failed (%d)\n",
836 sub->sa_desc->ad_cname.bv_val, rc, 0 );
841 if( BDB_IDL_IS_ZERO( tmp ) ) {
843 LDAP_LOG ( INDEX, RESULTS,
844 "<= bdb_substring_candidates: (%s) NULL\n",
845 sub->sa_desc->ad_cname.bv_val, 0, 0 );
847 Debug( LDAP_DEBUG_TRACE,
848 "<= bdb_substring_candidates: (%s) NULL\n",
849 sub->sa_desc->ad_cname.bv_val, 0, 0 );
856 BDB_IDL_CPY( ids, tmp );
858 bdb_idl_intersection( ids, tmp );
861 if( BDB_IDL_IS_ZERO( ids ) )
865 ber_bvarray_free_x( keys, op->o_tmpmemctx );
868 LDAP_LOG ( INDEX, RESULTS,
869 "<= bdb_substring_candidates: id=%ld first=%ld last=%ld\n",
870 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
871 (long) BDB_IDL_LAST( ids ) );
873 Debug( LDAP_DEBUG_TRACE, "<= bdb_substring_candidates: %ld, first=%ld, last=%ld\n",
875 (long) BDB_IDL_FIRST(ids),
876 (long) BDB_IDL_LAST(ids) );