diff --git a/servers/slapd/back-bdb/modify.c b/servers/slapd/back-bdb/modify.c index 3cab8770eea34e91ac93e0f023e875bf4a458f4c..a2d7ec03b10180cf630029b191ca1d49aceaa167 100644 --- a/servers/slapd/back-bdb/modify.c +++ b/servers/slapd/back-bdb/modify.c @@ -389,6 +389,7 @@ int bdb_modify_internal( ap->a_nvals, e->e_id, SLAP_INDEX_ADD_OP ); } else { + int found = 0; /* if this was only an add, we only need to index * the added values. */ @@ -396,6 +397,7 @@ int bdb_modify_internal( struct berval *vals; if ( ml->sml_desc != ap->a_desc || !ml->sml_numvals ) continue; + found = 1; switch( ml->sml_op ) { case LDAP_MOD_ADD: case LDAP_MOD_REPLACE: @@ -415,6 +417,15 @@ int bdb_modify_internal( if ( rc ) break; } + /* This attr was affected by a modify of a subtype, so + * there was no direct match in the modlist. Just readd + * all of its values. + */ + if ( !found ) { + rc = bdb_index_values( op, tid, ap->a_desc, + ap->a_nvals, + e->e_id, SLAP_INDEX_ADD_OP ); + } } if ( rc != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_ANY, diff --git a/servers/slapd/back-mdb/modify.c b/servers/slapd/back-mdb/modify.c index 44805b6e4e25f21856c48a5a57d375489ab13b12..529be7194c44ce8ea06f2f3eba569c417c81ce3b 100644 --- a/servers/slapd/back-mdb/modify.c +++ b/servers/slapd/back-mdb/modify.c @@ -389,6 +389,7 @@ int mdb_modify_internal( ap->a_nvals, e->e_id, SLAP_INDEX_ADD_OP ); } else { + int found = 0; /* if this was only an add, we only need to index * the added values. */ @@ -396,6 +397,7 @@ int mdb_modify_internal( struct berval *vals; if ( ml->sml_desc != ap->a_desc || !ml->sml_numvals ) continue; + found = 1; switch( ml->sml_op ) { case LDAP_MOD_ADD: case LDAP_MOD_REPLACE: @@ -415,6 +417,15 @@ int mdb_modify_internal( if ( rc ) break; } + /* This attr was affected by a modify of a subtype, so + * there was no direct match in the modlist. Just readd + * all of its values. + */ + if ( !found ) { + rc = mdb_index_values( op, tid, ap->a_desc, + ap->a_nvals, + e->e_id, SLAP_INDEX_ADD_OP ); + } } if ( rc != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_ANY,