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 SLAPD_COMPARE_UNDEFINED:
64 /* This technically is not the same as FALSE, but it
65 * certainly will produce no matches.
68 case LDAP_COMPARE_FALSE:
71 case LDAP_COMPARE_TRUE: {
72 struct bdb_info *bdb = (struct bdb_info *) be->be_private;
73 BDB_IDL_ALL( bdb, ids );
78 case SLAPD_FILTER_DN_ONE:
80 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tDN ONE\n", 0, 0, 0 );
82 Debug( LDAP_DEBUG_FILTER, "\tDN ONE\n", 0, 0, 0 );
84 rc = bdb_dn2idl( be, f->f_dn, DN_ONE_PREFIX, ids );
85 if( rc == DB_NOTFOUND ) {
91 case SLAPD_FILTER_DN_SUBTREE:
93 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tDN SUBTREE\n", 0, 0, 0 );
95 Debug( LDAP_DEBUG_FILTER, "\tDN SUBTREE\n", 0, 0, 0 );
97 rc = bdb_dn2idl( be, f->f_dn, DN_SUBTREE_PREFIX, ids );
100 case LDAP_FILTER_PRESENT:
102 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tPRESENT\n", 0, 0, 0 );
104 Debug( LDAP_DEBUG_FILTER, "\tPRESENT\n", 0, 0, 0 );
106 rc = presence_candidates( be, f->f_desc, ids );
109 case LDAP_FILTER_EQUALITY:
111 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tEQUALITY\n", 0, 0, 0 );
113 Debug( LDAP_DEBUG_FILTER, "\tEQUALITY\n", 0, 0, 0 );
115 rc = equality_candidates( be, f->f_ava, ids, tmp );
118 case LDAP_FILTER_APPROX:
120 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tAPPROX\n", 0, 0, 0 );
122 Debug( LDAP_DEBUG_FILTER, "\tAPPROX\n", 0, 0, 0 );
124 rc = approx_candidates( be, f->f_ava, ids, tmp );
127 case LDAP_FILTER_SUBSTRINGS:
129 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tSUBSTRINGS\n", 0, 0, 0 );
131 Debug( LDAP_DEBUG_FILTER, "\tSUBSTRINGS\n", 0, 0, 0 );
133 rc = substring_candidates( be, f->f_sub, ids, tmp );
137 /* no GE index, use pres */
139 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tGE\n", 0, 0, 0 );
141 Debug( LDAP_DEBUG_FILTER, "\tGE\n", 0, 0, 0 );
143 rc = presence_candidates( be, f->f_ava->aa_desc, ids );
147 /* no LE index, use pres */
149 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tLE\n", 0, 0, 0 );
151 Debug( LDAP_DEBUG_FILTER, "\tLE\n", 0, 0, 0 );
153 rc = presence_candidates( be, f->f_ava->aa_desc, ids );
156 case LDAP_FILTER_NOT:
157 /* no indexing to support NOT filters */
159 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tNOT\n",0, 0, 0 );
161 Debug( LDAP_DEBUG_FILTER, "\tNOT\n", 0, 0, 0 );
163 { struct bdb_info *bdb = (struct bdb_info *) be->be_private;
164 BDB_IDL_ALL( bdb, ids );
168 case LDAP_FILTER_AND:
170 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tAND\n", 0, 0, 0 );
172 Debug( LDAP_DEBUG_FILTER, "\tAND\n", 0, 0, 0 );
174 rc = list_candidates( be,
175 f->f_and, LDAP_FILTER_AND, ids, tmp, stack );
180 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tOR\n", 0, 0, 0 );
182 Debug( LDAP_DEBUG_FILTER, "\tOR\n", 0, 0, 0 );
184 rc = list_candidates( be,
185 f->f_or, LDAP_FILTER_OR, ids, tmp, stack );
190 LDAP_LOG ( INDEX, ARGS, "=> bdb_filter_candidates: \tUNKNOWN\n", 0, 0, 0 );
192 Debug( LDAP_DEBUG_FILTER, "\tUNKNOWN %lu\n",
193 (unsigned long) f->f_choice, 0, 0 );
195 /* Must not return NULL, otherwise extended filters break */
196 { struct bdb_info *bdb = (struct bdb_info *) be->be_private;
197 BDB_IDL_ALL( bdb, ids );
202 LDAP_LOG ( INDEX, RESULTS,
203 "<= bdb_filter_candidates: id=%ld first=%ld last=%ld\n",
204 (long)ids[0], (long)BDB_IDL_FIRST( ids ), (long) BDB_IDL_LAST( ids ));
206 Debug( LDAP_DEBUG_FILTER,
207 "<= bdb_filter_candidates: id=%ld first=%ld last=%ld\n",
209 (long) BDB_IDL_FIRST( ids ),
210 (long) BDB_IDL_LAST( ids ) );
225 struct bdb_info *bdb = (struct bdb_info *) be->be_private;
230 LDAP_LOG ( INDEX, ARGS, "=> bdb_list_candidates: 0x%x\n", ftype, 0 , 0 );
232 Debug( LDAP_DEBUG_FILTER, "=> bdb_list_candidates 0x%x\n", ftype, 0, 0 );
234 for ( f = flist; f != NULL; f = f->f_next ) {
235 rc = bdb_filter_candidates( be, f, save, tmp,
236 save+BDB_IDL_UM_SIZE );
239 if ( ftype == LDAP_FILTER_AND ) {
246 if ( ftype == LDAP_FILTER_AND ) {
248 BDB_IDL_CPY( ids, save );
250 bdb_idl_intersection( ids, save );
252 if( BDB_IDL_IS_ZERO( ids ) )
256 BDB_IDL_CPY( ids, save );
258 bdb_idl_union( ids, save );
263 if( rc == LDAP_SUCCESS ) {
265 LDAP_LOG ( INDEX, RESULTS,
266 "<= bdb_list_candidates: id=%ld first=%ld last=%ld\n",
267 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
268 (long) BDB_IDL_LAST( ids ) );
270 Debug( LDAP_DEBUG_FILTER,
271 "<= bdb_list_candidates: id=%ld first=%ld last=%ld\n",
273 (long) BDB_IDL_FIRST(ids),
274 (long) BDB_IDL_LAST(ids) );
279 LDAP_LOG ( INDEX, ARGS, "<= bdb_list_candidates: rc=%d\n", rc, 0, 0 );
281 Debug( LDAP_DEBUG_FILTER,
282 "<= bdb_list_candidates: undefined rc=%d\n",
293 AttributeDescription *desc,
296 struct bdb_info *bdb = (struct bdb_info *) be->be_private;
300 struct berval prefix = {0, NULL};
303 LDAP_LOG ( INDEX, ENTRY, "=> bdb_presence_candidates (%s)\n",
304 desc->ad_cname.bv_val, 0, 0 );
306 Debug( LDAP_DEBUG_TRACE, "=> bdb_presence_candidates (%s)\n",
307 desc->ad_cname.bv_val, 0, 0 );
310 BDB_IDL_ALL( bdb, ids );
312 if( desc == slap_schema.si_ad_objectClass ) {
316 rc = bdb_index_param( be, desc, LDAP_FILTER_PRESENT,
317 &db, &mask, &prefix );
319 if( rc != LDAP_SUCCESS ) {
321 LDAP_LOG ( INDEX, RESULTS,
322 "<= bdb_presence_candidates: (%s) index_param "
324 desc->ad_cname.bv_val, rc, 0 );
326 Debug( LDAP_DEBUG_TRACE,
327 "<= bdb_presence_candidates: (%s) index_param "
329 desc->ad_cname.bv_val, rc, 0 );
337 LDAP_LOG(INDEX, RESULTS,
338 "<= bdb_presence_candidates: (%s) not indexed\n",
339 desc->ad_cname.bv_val, 0, 0 );
341 Debug( LDAP_DEBUG_TRACE,
342 "<= bdb_presence_candidates: (%s) not indexed\n",
343 desc->ad_cname.bv_val, 0, 0 );
348 if( prefix.bv_val == NULL ) {
350 LDAP_LOG(INDEX, RESULTS,
351 "<= bdb_presence_candidates: (%s) no prefix\n",
352 desc->ad_cname.bv_val, 0, 0 );
354 Debug( LDAP_DEBUG_TRACE,
355 "<= bdb_presence_candidates: (%s) no prefix\n",
356 desc->ad_cname.bv_val, 0, 0 );
361 rc = bdb_key_read( be, db, NULL, &prefix, ids );
363 if( rc == DB_NOTFOUND ) {
366 } else if( rc != LDAP_SUCCESS ) {
368 LDAP_LOG ( INDEX, RESULTS,
369 "<= bdb_presence_candidates: (%s) "
370 "key read failed (%d)\n",
371 desc->ad_cname.bv_val, rc, 0 );
373 Debug( LDAP_DEBUG_TRACE,
374 "<= bdb_presense_candidates: (%s) "
375 "key read failed (%d)\n",
376 desc->ad_cname.bv_val, rc, 0 );
382 LDAP_LOG ( INDEX, RESULTS,
383 "<= bdb_presence_candidates: id=%ld first=%ld last=%ld\n",
384 (long)ids[0], (long)BDB_IDL_FIRST( ids ), (long)BDB_IDL_LAST( ids ) );
386 Debug(LDAP_DEBUG_TRACE,
387 "<= bdb_presence_candidates: id=%ld first=%ld last=%ld\n",
389 (long) BDB_IDL_FIRST(ids),
390 (long) BDB_IDL_LAST(ids) );
400 AttributeAssertion *ava,
404 struct bdb_info *bdb = (struct bdb_info *) be->be_private;
409 struct berval prefix = {0, NULL};
410 struct berval *keys = NULL;
414 LDAP_LOG ( INDEX, ENTRY, "=> bdb_equality_candidates (%s)\n",
415 ava->aa_desc->ad_cname.bv_val, 0, 0 );
417 Debug( LDAP_DEBUG_TRACE, "=> bdb_equality_candidates (%s)\n",
418 ava->aa_desc->ad_cname.bv_val, 0, 0 );
421 BDB_IDL_ALL( bdb, ids );
423 rc = bdb_index_param( be, 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,
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( be, 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( keys );
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,
571 struct bdb_info *bdb = (struct bdb_info *) be->be_private;
576 struct berval prefix = {0, NULL};
577 struct berval *keys = NULL;
581 LDAP_LOG ( INDEX, ENTRY, "=> bdb_approx_candidates (%s)\n",
582 ava->aa_desc->ad_cname.bv_val, 0, 0 );
584 Debug( LDAP_DEBUG_TRACE, "=> bdb_approx_candidates (%s)\n",
585 ava->aa_desc->ad_cname.bv_val, 0, 0 );
588 BDB_IDL_ALL( bdb, ids );
590 rc = bdb_index_param( be, ava->aa_desc, LDAP_FILTER_APPROX,
591 &db, &mask, &prefix );
593 if( rc != LDAP_SUCCESS ) {
595 LDAP_LOG ( INDEX, RESULTS,
596 "<= bdb_approx_candidates: (%s) "
597 "index_param failed (%d)\n",
598 ava->aa_desc->ad_cname.bv_val, rc, 0 );
600 Debug( LDAP_DEBUG_ANY,
601 "<= bdb_approx_candidates: (%s) "
602 "index_param failed (%d)\n",
603 ava->aa_desc->ad_cname.bv_val, rc, 0 );
610 LDAP_LOG(INDEX, RESULTS,
611 "<= bdb_approx_candidates: (%s) not indexed\n",
612 ava->aa_desc->ad_cname.bv_val, 0, 0 );
614 Debug( LDAP_DEBUG_ANY,
615 "<= bdb_approx_candidates: (%s) not indexed\n",
616 ava->aa_desc->ad_cname.bv_val, 0, 0 );
621 mr = ava->aa_desc->ad_type->sat_approx;
623 /* no approx matching rule, try equality matching rule */
624 mr = ava->aa_desc->ad_type->sat_equality;
631 if( !mr->smr_filter ) {
635 rc = (mr->smr_filter)(
638 ava->aa_desc->ad_type->sat_syntax,
644 if( rc != LDAP_SUCCESS ) {
646 LDAP_LOG ( INDEX, RESULTS,
647 "<= bdb_approx_candidates: (%s, %s) "
648 "MR filter failed (%d)\n",
649 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
651 Debug( LDAP_DEBUG_TRACE,
652 "<= bdb_approx_candidates: (%s, %s) "
653 "MR filter failed (%d)\n",
654 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, rc );
661 LDAP_LOG ( INDEX, RESULTS,
662 "<= bdb_approx_candidates: (%s) no keys (%s)\n",
663 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, 0 );
665 Debug( LDAP_DEBUG_TRACE,
666 "<= bdb_approx_candidates: (%s) no keys (%s)\n",
667 prefix.bv_val, ava->aa_desc->ad_cname.bv_val, 0 );
672 for ( i= 0; keys[i].bv_val != NULL; i++ ) {
673 rc = bdb_key_read( be, db, NULL, &keys[i], tmp );
675 if( rc == DB_NOTFOUND ) {
679 } else if( rc != LDAP_SUCCESS ) {
681 LDAP_LOG ( INDEX, RESULTS,
682 "<= bdb_approx_candidates: (%s) "
683 "key read failed (%d)\n",
684 ava->aa_desc->ad_cname.bv_val, rc, 0);
686 Debug( LDAP_DEBUG_TRACE,
687 "<= bdb_approx_candidates: (%s) "
688 "key read failed (%d)\n",
689 ava->aa_desc->ad_cname.bv_val, rc, 0 );
694 if( BDB_IDL_IS_ZERO( tmp ) ) {
696 LDAP_LOG ( INDEX, RESULTS,
697 "<= bdb_approx_candidates: (%s) NULL\n",
698 ava->aa_desc->ad_cname.bv_val, 0, 0 );
700 Debug( LDAP_DEBUG_TRACE,
701 "<= bdb_approx_candidates: (%s) NULL\n",
702 ava->aa_desc->ad_cname.bv_val, 0, 0 );
709 BDB_IDL_CPY( ids, tmp );
711 bdb_idl_intersection( ids, tmp );
714 if( BDB_IDL_IS_ZERO( ids ) )
718 ber_bvarray_free( keys );
721 LDAP_LOG ( INDEX, RESULTS,
722 "<= bdb_approx_candidates: id=%ld first=%ld last=%ld\n",
723 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
724 (long) BDB_IDL_LAST( ids ) );
726 Debug( LDAP_DEBUG_TRACE, "<= bdb_approx_candidates %ld, first=%ld, last=%ld\n",
728 (long) BDB_IDL_FIRST(ids),
729 (long) BDB_IDL_LAST(ids) );
735 substring_candidates(
737 SubstringsAssertion *sub,
741 struct bdb_info *bdb = (struct bdb_info *) be->be_private;
746 struct berval prefix = {0, NULL};
747 struct berval *keys = NULL;
751 LDAP_LOG ( INDEX, ENTRY, "=> bdb_substring_candidates (%s)\n",
752 sub->sa_desc->ad_cname.bv_val, 0, 0 );
754 Debug( LDAP_DEBUG_TRACE, "=> bdb_substring_candidates (%s)\n",
755 sub->sa_desc->ad_cname.bv_val, 0, 0 );
758 BDB_IDL_ALL( bdb, ids );
760 rc = bdb_index_param( be, sub->sa_desc, LDAP_FILTER_SUBSTRINGS,
761 &db, &mask, &prefix );
763 if( rc != LDAP_SUCCESS ) {
765 LDAP_LOG ( INDEX, RESULTS,
766 "<= bdb_substring_candidates: (%s) "
767 "index_param failed (%d)\n",
768 sub->sa_desc->ad_cname.bv_val, rc, 0);
770 Debug( LDAP_DEBUG_ANY,
771 "<= bdb_substring_candidates: (%s) "
772 "index_param failed (%d)\n",
773 sub->sa_desc->ad_cname.bv_val, rc, 0 );
780 LDAP_LOG ( INDEX, RESULTS,
781 "<= bdb_substring_candidates: (%s) not indexed\n",
782 sub->sa_desc->ad_cname.bv_val, 0, 0 );
784 Debug( LDAP_DEBUG_ANY,
785 "<= bdb_substring_candidates: (%s) not indexed\n",
786 sub->sa_desc->ad_cname.bv_val, 0, 0 );
791 mr = sub->sa_desc->ad_type->sat_substr;
797 if( !mr->smr_filter ) {
801 rc = (mr->smr_filter)(
802 LDAP_FILTER_SUBSTRINGS,
804 sub->sa_desc->ad_type->sat_syntax,
810 if( rc != LDAP_SUCCESS ) {
812 LDAP_LOG ( INDEX, RESULTS,
813 "<= bdb_substring_candidates: (%s) "
814 "MR filter failed (%d)\n",
815 sub->sa_desc->ad_cname.bv_val, rc, 0 );
817 Debug( LDAP_DEBUG_TRACE,
818 "<= bdb_substring_candidates: (%s) "
819 "MR filter failed (%d)\n",
820 sub->sa_desc->ad_cname.bv_val, rc, 0 );
827 LDAP_LOG ( INDEX, RESULTS,
828 "<= bdb_substring_candidates: (0x%04lx) no keys (%s)\n",
829 mask, sub->sa_desc->ad_cname.bv_val, 0 );
831 Debug( LDAP_DEBUG_TRACE,
832 "<= bdb_substring_candidates: (0x%04lx) no keys (%s)\n",
833 mask, sub->sa_desc->ad_cname.bv_val, 0 );
838 for ( i= 0; keys[i].bv_val != NULL; i++ ) {
839 rc = bdb_key_read( be, db, NULL, &keys[i], tmp );
841 if( rc == DB_NOTFOUND ) {
845 } else if( rc != LDAP_SUCCESS ) {
847 LDAP_LOG ( INDEX, RESULTS,
848 "<= bdb_substring_candidates: (%s) "
849 "key read failed (%d)\n",
850 sub->sa_desc->ad_cname.bv_val, rc, 0 );
852 Debug( LDAP_DEBUG_TRACE,
853 "<= bdb_substring_candidates: (%s) "
854 "key read failed (%d)\n",
855 sub->sa_desc->ad_cname.bv_val, rc, 0 );
860 if( BDB_IDL_IS_ZERO( tmp ) ) {
862 LDAP_LOG ( INDEX, RESULTS,
863 "<= bdb_substring_candidates: (%s) NULL\n",
864 sub->sa_desc->ad_cname.bv_val, 0, 0 );
866 Debug( LDAP_DEBUG_TRACE,
867 "<= bdb_substring_candidates: (%s) NULL\n",
868 sub->sa_desc->ad_cname.bv_val, 0, 0 );
875 BDB_IDL_CPY( ids, tmp );
877 bdb_idl_intersection( ids, tmp );
880 if( BDB_IDL_IS_ZERO( ids ) )
884 ber_bvarray_free( keys );
887 LDAP_LOG ( INDEX, RESULTS,
888 "<= bdb_substring_candidates: id=%ld first=%ld last=%ld\n",
889 (long) ids[0], (long) BDB_IDL_FIRST( ids ),
890 (long) BDB_IDL_LAST( ids ) );
892 Debug( LDAP_DEBUG_TRACE, "<= bdb_substring_candidates: %ld, first=%ld, last=%ld\n",
894 (long) BDB_IDL_FIRST(ids),
895 (long) BDB_IDL_LAST(ids) );