return 0;
        }
 
-       backsql_strfcat( &bsi->bsi_flt_where, "c", '(' /* ) */  );
+       backsql_strfcat_x( &bsi->bsi_flt_where,
+                       bsi->bsi_op->o_tmpmemctx, "c", '(' /* ) */  );
 
        while ( 1 ) {
                res = backsql_process_filter( bsi, f );
 
                switch ( op ) {
                case LDAP_FILTER_AND:
-                       backsql_strfcat( &bsi->bsi_flt_where, "l",
+                       backsql_strfcat_x( &bsi->bsi_flt_where,
+                                       bsi->bsi_op->o_tmpmemctx, "l",
                                        (ber_len_t)STRLENOF( " AND " ), 
                                                " AND " );
                        break;
 
                case LDAP_FILTER_OR:
-                       backsql_strfcat( &bsi->bsi_flt_where, "l",
+                       backsql_strfcat_x( &bsi->bsi_flt_where,
+                                       bsi->bsi_op->o_tmpmemctx, "l",
                                        (ber_len_t)STRLENOF( " OR " ),
                                                " OR " );
                        break;
                }
        }
 
-       backsql_strfcat( &bsi->bsi_flt_where, "c", /* ( */ ')' );
+       backsql_strfcat_x( &bsi->bsi_flt_where,
+                       bsi->bsi_op->o_tmpmemctx, "c", /* ( */ ')' );
 
        return 1;
 }
         * SQL filters are more liberal.
         */
 
-       backsql_strfcat( &bsi->bsi_flt_where, "c", '(' /* ) */  );
+       backsql_strfcat_x( &bsi->bsi_flt_where,
+                       bsi->bsi_op->o_tmpmemctx, "c", '(' /* ) */  );
 
        /* TimesTen */
        Debug( LDAP_DEBUG_TRACE, "backsql_process_sub_filter(%s):\n",
                 * If a pre-upper-cased version of the column 
                 * or a precompiled upper function exists, use it
                 */
-               backsql_strfcat( &bsi->bsi_flt_where, 
+               backsql_strfcat_x( &bsi->bsi_flt_where, 
+                               bsi->bsi_op->o_tmpmemctx,
                                "bl",
                                &at->bam_sel_expr_u,
                                (ber_len_t)STRLENOF( " LIKE '" ),
                                        " LIKE '" );
 
        } else {
-               backsql_strfcat( &bsi->bsi_flt_where, "bl",
+               backsql_strfcat_x( &bsi->bsi_flt_where,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "bl",
                                &at->bam_sel_expr,
                                (ber_len_t)STRLENOF( " LIKE '" ), " LIKE '" );
        }
 #endif /* BACKSQL_TRACE */
 
                start = bsi->bsi_flt_where.bb_val.bv_len;
-               backsql_strfcat( &bsi->bsi_flt_where, "b",
+               backsql_strfcat_x( &bsi->bsi_flt_where,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "b",
                                &f->f_sub_initial );
                if ( casefold && BACKSQL_AT_CANUPPERCASE( at ) ) {
                        ldap_pvt_str2upper( &bsi->bsi_flt_where.bb_val.bv_val[ start ] );
                }
        }
 
-       backsql_strfcat( &bsi->bsi_flt_where, "c", '%' );
+       backsql_strfcat_x( &bsi->bsi_flt_where,
+                       bsi->bsi_op->o_tmpmemctx,
+                       "c", '%' );
 
        if ( f->f_sub_any != NULL ) {
                for ( i = 0; !BER_BVISNULL( &f->f_sub_any[ i ] ); i++ ) {
 #endif /* BACKSQL_TRACE */
 
                        start = bsi->bsi_flt_where.bb_val.bv_len;
-                       backsql_strfcat( &bsi->bsi_flt_where,
+                       backsql_strfcat_x( &bsi->bsi_flt_where,
+                                       bsi->bsi_op->o_tmpmemctx,
                                        "bc",
                                        &f->f_sub_any[ i ],
                                        '%' );
 #endif /* BACKSQL_TRACE */
 
                start = bsi->bsi_flt_where.bb_val.bv_len;
-               backsql_strfcat( &bsi->bsi_flt_where, "b",
+               backsql_strfcat_x( &bsi->bsi_flt_where,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "b",
                                &f->f_sub_final );
                if ( casefold && BACKSQL_AT_CANUPPERCASE( at ) ) {
                        ldap_pvt_str2upper( &bsi->bsi_flt_where.bb_val.bv_val[ start ] );
                }
        }
 
-       backsql_strfcat( &bsi->bsi_flt_where, "l", 
+       backsql_strfcat_x( &bsi->bsi_flt_where,
+                       bsi->bsi_op->o_tmpmemctx,
+                       "l", 
                        (ber_len_t)STRLENOF( /* (' */ "')" ), /* (' */ "')" );
  
        return 1;
        }
 
        if ( !BER_BVISNULL( &bsi->bsi_from.bb_val ) ) {
-               char    *start, *end, *tmp;
+               char            *start, *end;
+               struct berval   tmp;
 
-               tmp = ch_strdup( from_tbls->bv_val );
+               ber_dupbv_x( &tmp, from_tbls, bsi->bsi_op->o_tmpmemctx );
 
-               for ( start = tmp, end = strchr( start, ',' ); start; ) {
+               for ( start = tmp.bv_val, end = strchr( start, ',' ); start; ) {
                        if ( end ) {
                                end[0] = '\0';
                        }
 
                        if ( strstr( bsi->bsi_from.bb_val.bv_val, start) == NULL )
                        {
-                               backsql_strfcat( &bsi->bsi_from, "cs", ',', start );
+                               backsql_strfcat_x( &bsi->bsi_from,
+                                               bsi->bsi_op->o_tmpmemctx,
+                                               "cs", ',', start );
                        }
 
                        if ( end ) {
                        }
                }
 
-               ch_free( tmp );
+               bsi->bsi_op->o_tmpfree( tmp.bv_val, bsi->bsi_op->o_tmpmemctx );
 
        } else {
-               backsql_strfcat( &bsi->bsi_from, "b", from_tbls );
+               backsql_strfcat_x( &bsi->bsi_from,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "b", from_tbls );
        }
 
        return LDAP_SUCCESS;
                break;
 
        case LDAP_FILTER_NOT:
-               backsql_strfcat( &bsi->bsi_flt_where, "l",
+               backsql_strfcat_x( &bsi->bsi_flt_where,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "l",
                                (ber_len_t)STRLENOF( "NOT (" /* ) */ ),
                                        "NOT (" /* ) */ );
                rc = backsql_process_filter( bsi, f->f_not );
-               backsql_strfcat( &bsi->bsi_flt_where, "c", /* ( */ ')' );
+               backsql_strfcat_x( &bsi->bsi_flt_where,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "c", /* ( */ ')' );
                done = 1;
                break;
 
                         * ldap_entries AS attributeName WHERE attributeName.dn
                         * like '%attributeName=value%'"
                         */
-                       backsql_strfcat( &bsi->bsi_flt_where, "l",
+                       backsql_strfcat_x( &bsi->bsi_flt_where,
+                                       bsi->bsi_op->o_tmpmemctx,
+                                       "l",
                                        (ber_len_t)STRLENOF( "1=1" ), "1=1" );
                        bsi->bsi_status = LDAP_SUCCESS;
                        rc = 1;
 
                                backsql_merge_from_tbls( bsi, &ldap_entry_objclasses );
 
-                               backsql_strfcat( &bsi->bsi_flt_where, "lbl",
+                               backsql_strfcat_x( &bsi->bsi_flt_where,
+                                               bsi->bsi_op->o_tmpmemctx,
+                                               "lbl",
                                                (ber_len_t)STRLENOF( "(2=2 OR (ldap_entries.id=ldap_entry_objclasses.entry_id AND ldap_entry_objclasses.oc_name='" /* ')) */ ),
                                                        "(2=2 OR (ldap_entries.id=ldap_entry_objclasses.entry_id AND ldap_entry_objclasses.oc_name='" /* ')) */,
                                                &bsi->bsi_oc->bom_oc->soc_cname,
                }
 
                case LDAP_FILTER_PRESENT:
-                       backsql_strfcat( &bsi->bsi_flt_where, "l",
+                       backsql_strfcat_x( &bsi->bsi_flt_where,
+                                       bsi->bsi_op->o_tmpmemctx,
+                                       "l",
                                        (ber_len_t)STRLENOF( "3=3" ), "3=3" );
                        bsi->bsi_status = LDAP_SUCCESS;
                        rc = 1;
                        }
 
 #ifdef BACKSQL_ARBITRARY_KEY
-                       backsql_strfcat( &bsi->bsi_flt_where, "bcblbc",
+                       backsql_strfcat_x( &bsi->bsi_flt_where,
+                                       bsi->bsi_op->o_tmpmemctx,
+                                       "bcblbc",
                                        &bsi->bsi_oc->bom_keytbl, '.',
                                        &bsi->bsi_oc->bom_keycol,
                                        STRLENOF( " LIKE '" ), " LIKE '",
                                        &keyval, '\'' );
 #else /* ! BACKSQL_ARBITRARY_KEY */
                        snprintf( keyvalbuf, sizeof( keyvalbuf ), "%lu", keyval );
-                       backsql_strfcat( &bsi->bsi_flt_where, "bcbcs",
+                       backsql_strfcat_x( &bsi->bsi_flt_where,
+                                       bsi->bsi_op->o_tmpmemctx,
+                                       "bcbcs",
                                        &bsi->bsi_oc->bom_keytbl, '.',
                                        &bsi->bsi_oc->bom_keycol, '=', keyvalbuf );
 #endif /* ! BACKSQL_ARBITRARY_KEY */
                        break;
 
                case LDAP_FILTER_PRESENT:
-                       backsql_strfcat( &bsi->bsi_flt_where, "l",
+                       backsql_strfcat_x( &bsi->bsi_flt_where,
+                                       bsi->bsi_op->o_tmpmemctx,
+                                       "l",
                                        (ber_len_t)STRLENOF( "4=4" ), "4=4" );
                        break;
 
                /*
                 * support for syncrepl as producer...
                 */
+#if 0
                if ( !bsi->bsi_op->o_sync ) {
                        /* unsupported at present... */
                        bsi->bsi_status = LDAP_OTHER;
                        rc = -1;
                        goto done;
                }
+#endif
 
                bsi->bsi_flags |= ( BSQL_SF_FILTER_ENTRYCSN | BSQL_SF_RETURN_ENTRYUUID);
 
                /* if doing a syncrepl, try to return as much as possible,
                 * and always match the filter */
-               backsql_strfcat( &bsi->bsi_flt_where, "l",
+               backsql_strfcat_x( &bsi->bsi_flt_where,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "l",
                                (ber_len_t)STRLENOF( "5=5" ), "5=5" );
 
                /* save for later use in operational attributes */
                 * selecting if there are descendants of the
                 * candidate.
                 */
-               backsql_strfcat( &bsi->bsi_flt_where, "l",
+               backsql_strfcat_x( &bsi->bsi_flt_where,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "l",
                                (ber_len_t)STRLENOF( "6=6" ), "6=6" );
                if ( ad == slap_schema.si_ad_hasSubordinates ) {
                        /*
        if ( vat == NULL ) {
                /* search anyway; other parts of the filter
                 * may succeeed */
-               backsql_strfcat( &bsi->bsi_flt_where, "l",
+               backsql_strfcat_x( &bsi->bsi_flt_where,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "l",
                                (ber_len_t)STRLENOF( "7=7" ), "7=7" );
                bsi->bsi_status = LDAP_SUCCESS;
                rc = 1;
        /* if required, open extra level of parens */
        done = 0;
        if ( vat[0]->bam_next || vat[1] ) {
-               backsql_strfcat( &bsi->bsi_flt_where, "c", '(' );
+               backsql_strfcat_x( &bsi->bsi_flt_where,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "c", '(' );
                done = 1;
        }
 
 
        /* if more definitions of the same attr, apply */
        if ( vat[i]->bam_next ) {
-               backsql_strfcat( &bsi->bsi_flt_where, "l",
+               backsql_strfcat_x( &bsi->bsi_flt_where,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "l",
                        STRLENOF( " OR " ), " OR " );
                vat[i] = vat[i]->bam_next;
                goto next;
        /* if more descendants of the same attr, apply */
        i++;
        if ( vat[i] ) {
-               backsql_strfcat( &bsi->bsi_flt_where, "l",
+               backsql_strfcat_x( &bsi->bsi_flt_where,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "l",
                        STRLENOF( " OR " ), " OR " );
                goto next;
        }
 
        /* if needed, close extra level of parens */
        if ( done ) {
-               backsql_strfcat( &bsi->bsi_flt_where, "c", ')' );
+               backsql_strfcat_x( &bsi->bsi_flt_where,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "c", ')' );
        }
 
        rc = 1;
        if ( casefold && BACKSQL_AT_CANUPPERCASE( at ) ) {
                ber_len_t       start;
 
-               backsql_strfcat( &bsi->bsi_flt_where, "cbl",
+               backsql_strfcat_x( &bsi->bsi_flt_where,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "cbl",
                                '(', /* ) */
                                &at->bam_sel_expr_u, 
                                (ber_len_t)STRLENOF( "='" ),
 
                start = bsi->bsi_flt_where.bb_val.bv_len;
 
-               backsql_strfcat( &bsi->bsi_flt_where, "bl",
+               backsql_strfcat_x( &bsi->bsi_flt_where,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "bl",
                                filter_value, 
                                (ber_len_t)STRLENOF( /* (' */ "')" ),
                                        /* (' */ "')" );
                ldap_pvt_str2upper( &bsi->bsi_flt_where.bb_val.bv_val[ start ] );
 
        } else {
-               backsql_strfcat( &bsi->bsi_flt_where, "cblbl",
+               backsql_strfcat_x( &bsi->bsi_flt_where,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "cblbl",
                                '(', /* ) */
                                &at->bam_sel_expr,
                                (ber_len_t)STRLENOF( "='" ), "='",
        if ( casefold && BACKSQL_AT_CANUPPERCASE( at ) ) {
                ber_len_t       start;
 
-               backsql_strfcat( &bsi->bsi_flt_where, "cbl",
+               backsql_strfcat_x( &bsi->bsi_flt_where,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "cbl",
                                '(', /* ) */
                                &at->bam_sel_expr_u, 
                                (ber_len_t)STRLENOF( " LIKE '%" ),
 
                start = bsi->bsi_flt_where.bb_val.bv_len;
 
-               backsql_strfcat( &bsi->bsi_flt_where, "bl",
+               backsql_strfcat_x( &bsi->bsi_flt_where,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "bl",
                                filter_value, 
                                (ber_len_t)STRLENOF( /* (' */ "%')" ),
                                        /* (' */ "%')" );
                ldap_pvt_str2upper( &bsi->bsi_flt_where.bb_val.bv_val[ start ] );
 
        } else {
-               backsql_strfcat( &bsi->bsi_flt_where, "cblbl",
+               backsql_strfcat_x( &bsi->bsi_flt_where,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "cblbl",
                                '(', /* ) */
                                &at->bam_sel_expr,
                                (ber_len_t)STRLENOF( " LIKE '%" ),
                        && strstr( bsi->bsi_join_where.bb_val.bv_val,
                                at->bam_join_where.bv_val ) == NULL )
        {
-               backsql_strfcat( &bsi->bsi_join_where, "lb",
+               backsql_strfcat_x( &bsi->bsi_join_where,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "lb",
                                (ber_len_t)STRLENOF( " AND " ), " AND ",
                                &at->bam_join_where );
        }
                if ( at->bam_ad == slap_schema.si_ad_objectClass
                                || at->bam_ad == slap_schema.si_ad_structuralObjectClass )
                {
-                       backsql_strfcat( &bsi->bsi_flt_where, "lbl",
+                       backsql_strfcat_x( &bsi->bsi_flt_where,
+                                       bsi->bsi_op->o_tmpmemctx,
+                                       "lbl",
                                        (ber_len_t)STRLENOF( "(ldap_entries.id=ldap_entry_objclasses.entry_id AND ldap_entry_objclasses.oc_name='" /* ') */ ),
                                                "(ldap_entries.id=ldap_entry_objclasses.entry_id AND ldap_entry_objclasses.oc_name='" /* ') */,
                                        filter_value,
                if ( casefold && BACKSQL_AT_CANUPPERCASE( at ) ) {
                        ber_len_t       start;
 
-                       backsql_strfcat( &bsi->bsi_flt_where, "cbbc",
+                       backsql_strfcat_x( &bsi->bsi_flt_where,
+                                       bsi->bsi_op->o_tmpmemctx,
+                                       "cbbc",
                                        '(', /* ) */
                                        &at->bam_sel_expr_u, 
                                        &ordering,
 
                        start = bsi->bsi_flt_where.bb_val.bv_len;
 
-                       backsql_strfcat( &bsi->bsi_flt_where, "bl",
+                       backsql_strfcat_x( &bsi->bsi_flt_where,
+                                       bsi->bsi_op->o_tmpmemctx,
+                                       "bl",
                                        filter_value, 
                                        (ber_len_t)STRLENOF( /* (' */ "')" ),
                                                /* (' */ "')" );
                        ldap_pvt_str2upper( &bsi->bsi_flt_where.bb_val.bv_val[ start ] );
                
                } else {
-                       backsql_strfcat( &bsi->bsi_flt_where, "cbbcbl",
+                       backsql_strfcat_x( &bsi->bsi_flt_where,
+                                       bsi->bsi_op->o_tmpmemctx,
+                                       "cbbcbl",
                                        '(' /* ) */ ,
                                        &at->bam_sel_expr,
                                        &ordering,
                break;
 
        case LDAP_FILTER_PRESENT:
-               backsql_strfcat( &bsi->bsi_flt_where, "lbl",
+               backsql_strfcat_x( &bsi->bsi_flt_where,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "lbl",
                                (ber_len_t)STRLENOF( "NOT (" /* ) */),
                                        "NOT (", /* ) */
                                &at->bam_sel_expr, 
        default:
                /* unhandled filter type; should not happen */
                assert( 0 );
-               backsql_strfcat( &bsi->bsi_flt_where, "l",
+               backsql_strfcat_x( &bsi->bsi_flt_where,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "l",
                                (ber_len_t)STRLENOF( "8=8" ), "8=8" );
                break;
 
        BER_BVZERO( &bsi->bsi_flt_where.bb_val );
        bsi->bsi_flt_where.bb_len = 0;
 
-       backsql_strfcat( &bsi->bsi_sel, "lbcbc",
+       backsql_strfcat_x( &bsi->bsi_sel,
+                       bsi->bsi_op->o_tmpmemctx,
+                       "lbcbc",
                        (ber_len_t)STRLENOF( "SELECT DISTINCT ldap_entries.id," ),
                                "SELECT DISTINCT ldap_entries.id,", 
                        &bsi->bsi_oc->bom_keytbl, 
                        ',' );
 
        if ( !BER_BVISNULL( &bi->sql_strcast_func ) ) {
-               backsql_strfcat( &bsi->bsi_sel, "blbl",
+               backsql_strfcat_x( &bsi->bsi_sel,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "blbl",
                                &bi->sql_strcast_func, 
                                (ber_len_t)STRLENOF( "('" /* ') */ ),
                                        "('" /* ') */ ,
                                (ber_len_t)STRLENOF( /* (' */ "')" ),
                                        /* (' */ "')" );
        } else {
-               backsql_strfcat( &bsi->bsi_sel, "cbc",
+               backsql_strfcat_x( &bsi->bsi_sel,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "cbc",
                                '\'',
                                &bsi->bsi_oc->bom_oc->soc_cname,
                                '\'' );
        }
 
-       backsql_strfcat( &bsi->bsi_sel, "b", &bi->sql_dn_oc_aliasing );
-       backsql_strfcat( &bsi->bsi_from, "lb",
+       backsql_strfcat_x( &bsi->bsi_sel,
+                       bsi->bsi_op->o_tmpmemctx,
+                       "b",
+                       &bi->sql_dn_oc_aliasing );
+       backsql_strfcat_x( &bsi->bsi_from,
+                       bsi->bsi_op->o_tmpmemctx,
+                       "lb",
                        (ber_len_t)STRLENOF( " FROM ldap_entries," ),
                                " FROM ldap_entries,",
                        &bsi->bsi_oc->bom_keytbl );
 
-       backsql_strfcat( &bsi->bsi_join_where, "lbcbl",
+       backsql_strfcat_x( &bsi->bsi_join_where,
+                       bsi->bsi_op->o_tmpmemctx,
+                       "lbcbl",
                        (ber_len_t)STRLENOF( " WHERE " ), " WHERE ",
                        &bsi->bsi_oc->bom_keytbl,
                        '.',
        switch ( bsi->bsi_scope ) {
        case LDAP_SCOPE_BASE:
                if ( BACKSQL_CANUPPERCASE( bi ) ) {
-                       backsql_strfcat( &bsi->bsi_join_where, "bl",
+                       backsql_strfcat_x( &bsi->bsi_join_where,
+                                       bsi->bsi_op->o_tmpmemctx, 
+                                       "bl",
                                        &bi->sql_upper_func,
                                        (ber_len_t)STRLENOF( "(ldap_entries.dn)=?" ),
                                                "(ldap_entries.dn)=?" );
                } else {
-                       backsql_strfcat( &bsi->bsi_join_where, "l",
+                       backsql_strfcat_x( &bsi->bsi_join_where,
+                                       bsi->bsi_op->o_tmpmemctx,
+                                       "l",
                                        (ber_len_t)STRLENOF( "ldap_entries.dn=?" ),
                                                "ldap_entries.dn=?" );
                }
                
        case BACKSQL_SCOPE_BASE_LIKE:
                if ( BACKSQL_CANUPPERCASE( bi ) ) {
-                       backsql_strfcat( &bsi->bsi_join_where, "bl",
+                       backsql_strfcat_x( &bsi->bsi_join_where,
+                                       bsi->bsi_op->o_tmpmemctx,
+                                       "bl",
                                        &bi->sql_upper_func,
                                        (ber_len_t)STRLENOF( "(ldap_entries.dn) LIKE ?" ),
                                                "(ldap_entries.dn) LIKE ?" );
                } else {
-                       backsql_strfcat( &bsi->bsi_join_where, "l",
+                       backsql_strfcat_x( &bsi->bsi_join_where,
+                                       bsi->bsi_op->o_tmpmemctx,
+                                       "l",
                                        (ber_len_t)STRLENOF( "ldap_entries.dn LIKE ?" ),
                                                "ldap_entries.dn LIKE ?" );
                }
                break;
                
        case LDAP_SCOPE_ONELEVEL:
-               backsql_strfcat( &bsi->bsi_join_where, "l",
+               backsql_strfcat_x( &bsi->bsi_join_where,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "l",
                                (ber_len_t)STRLENOF( "ldap_entries.parent=?" ),
                                        "ldap_entries.parent=?" );
                break;
 
                if ( bsi->bsi_use_subtree_shortcut ) {
                        /* Skip the base DN filter, as every entry will match it */
-                       backsql_strfcat( &bsi->bsi_join_where, "l",
+                       backsql_strfcat_x( &bsi->bsi_join_where,
+                                       bsi->bsi_op->o_tmpmemctx,
+                                       "l",
                                        (ber_len_t)STRLENOF( "9=9"), "9=9");
 
                } else if ( !BER_BVISNULL( &bi->sql_subtree_cond ) ) {
-                       backsql_strfcat( &bsi->bsi_join_where, "b", &bi->sql_subtree_cond );
+                       backsql_strfcat_x( &bsi->bsi_join_where,
+                                       bsi->bsi_op->o_tmpmemctx,
+                                       "b",
+                                       &bi->sql_subtree_cond );
 
                } else if ( BACKSQL_CANUPPERCASE( bi ) ) {
-                       backsql_strfcat( &bsi->bsi_join_where, "bl",
+                       backsql_strfcat_x( &bsi->bsi_join_where,
+                                       bsi->bsi_op->o_tmpmemctx,
+                                       "bl",
                                        &bi->sql_upper_func,
                                        (ber_len_t)STRLENOF( "(ldap_entries.dn) LIKE ?" ),
                                                "(ldap_entries.dn) LIKE ?"  );
 
                } else {
-                       backsql_strfcat( &bsi->bsi_join_where, "l",
+                       backsql_strfcat_x( &bsi->bsi_join_where,
+                                       bsi->bsi_op->o_tmpmemctx,
+                                       "l",
                                        (ber_len_t)STRLENOF( "ldap_entries.dn LIKE ?" ),
                                                "ldap_entries.dn LIKE ?" );
                }
        if ( rc > 0 ) {
                struct berbuf   bb = BB_NULL;
 
-               backsql_strfcat( &bb, "bbblb",
+               backsql_strfcat_x( &bb,
+                               bsi->bsi_op->o_tmpmemctx,
+                               "bbblb",
                                &bsi->bsi_sel.bb_val,
                                &bsi->bsi_from.bb_val, 
                                &bsi->bsi_join_where.bb_val,
 
 char backsql_check_dn_ru_query[] = "SELECT dn_ru FROM ldap_entries";
 
 struct berbuf *
-backsql_strcat( struct berbuf *dest, ... )
+backsql_strcat_x( struct berbuf *dest, void *memctx, ... )
 {
        va_list         strs;
        ber_len_t       cdlen, cslen, grow;
        Debug( LDAP_DEBUG_TRACE, "==>backsql_strcat()\n", 0, 0, 0 );
 #endif /* BACKSQL_TRACE */
 
-       va_start( strs, dest );
+       va_start( strs, memctx );
        if ( dest->bb_val.bv_val == NULL || dest->bb_len == 0 ) {
-               dest->bb_val.bv_val = (char *)ch_calloc( BACKSQL_STR_GROW, 
-                               sizeof( char ) );
+               dest->bb_val.bv_val = (char *)ber_memalloc_x( BACKSQL_STR_GROW * sizeof( char ), memctx );
                dest->bb_val.bv_len = 0;
                dest->bb_len = BACKSQL_STR_GROW;
        }
                                dest->bb_len, cdlen + 1, cslen );
 #endif /* BACKSQL_TRACE */
 
-                       tmp_dest = (char *)ch_realloc( dest->bb_val.bv_val,
-                                       ( dest->bb_len ) + grow * sizeof( char ) );
+                       tmp_dest = (char *)ber_memrealloc_x( dest->bb_val.bv_val,
+                                       dest->bb_len + grow * sizeof( char ), memctx );
                        if ( tmp_dest == NULL ) {
                                Debug( LDAP_DEBUG_ANY, "backsql_strcat(): "
                                        "could not reallocate string buffer.\n",
 } 
 
 struct berbuf *
-backsql_strfcat( struct berbuf *dest, const char *fmt, ... )
+backsql_strfcat_x( struct berbuf *dest, void *memctx, const char *fmt, ... )
 {
        va_list         strs;
        ber_len_t       cdlen;
 
        va_start( strs, fmt );
        if ( dest->bb_val.bv_val == NULL || dest->bb_len == 0 ) {
-               dest->bb_val.bv_val = (char *)ch_calloc( BACKSQL_STR_GROW, 
-                               sizeof( char ) );
+               dest->bb_val.bv_val = (char *)ber_memalloc_x( BACKSQL_STR_GROW * sizeof( char ), memctx );
                dest->bb_val.bv_len = 0;
                dest->bb_len = BACKSQL_STR_GROW;
        }
                                dest->bb_len, cdlen + 1, cslen );
 #endif /* BACKSQL_TRACE */
 
-                       tmp_dest = (char *)ch_realloc( dest->bb_val.bv_val,
-                                       ( dest->bb_len ) + grow * sizeof( char ) );
+                       tmp_dest = (char *)ber_memrealloc_x( dest->bb_val.bv_val,
+                                       ( dest->bb_len ) + grow * sizeof( char ), memctx );
                        if ( tmp_dest == NULL ) {
                                Debug( LDAP_DEBUG_ANY, "backsql_strfcat(): "
                                        "could not reallocate string buffer.\n",
 
        BACKSQL_NEXT_WORD;
        /* table name */
-       backsql_strcat( &res, s, NULL );
+       backsql_strcat_x( &res, NULL, s, NULL );
        s = q;
 
        BACKSQL_NEXT_WORD;
        }
 
        /* oracle doesn't understand "AS" :( and other RDBMSes don't need it */
-       backsql_strfcat( &res, "lbbsb",
+       backsql_strfcat_x( &res, NULL, "lbbsb",
                        STRLENOF( " " ), " ",
                        &bi->sql_aliasing,
                        &bi->sql_aliasing_quote,
                        "p=\"%s\" s=\"%s\"\n", p, s, 0 );
 #endif /* BACKSQL_TRACE */
 
-               if ( res.bb_val.bv_val == NULL ) {
-                       backsql_strcat( &res, s, NULL );
+               if ( BER_BVISNULL( &res.bb_val ) ) {
+                       backsql_strcat_x( &res, NULL, s, NULL );
 
                } else {
                        pos = strstr( res.bb_val.bv_val, s );
                        if ( pos == NULL || ( ( e = pos[ strlen( s ) ] ) != '\0' && e != ',' ) ) {
-                               backsql_strfcat( &res, "cs", ',', s );
+                               backsql_strfcat_x( &res, NULL, "cs", ',', s );
                        }
                }
                
                        ch_free( bb.bb_val.bv_val );
                        return -1;
                }
-               backsql_strfcat( &bb, "b", &split_pattern[ i ] );
-               backsql_strfcat( &bb, "b", &values[ i ] );
+               backsql_strfcat_x( &bb, NULL, "b", &split_pattern[ i ] );
+               backsql_strfcat_x( &bb, NULL, "b", &values[ i ] );
        }
 
        if ( split_pattern[ i ].bv_val == NULL ) {
                return -1;
        }
 
-       backsql_strfcat( &bb, "b", &split_pattern[ i ] );
+       backsql_strfcat_x( &bb, NULL, "b", &split_pattern[ i ] );
 
        *res = bb.bb_val;