@@ -204,13 +204,19 @@ static z_result_t _z_trigger_queryables_inner(_z_session_rc_t *zsrc, _z_msg_quer
204204 uint32_t qid ) {
205205 _z_session_t * zn = _Z_RC_IN_VAL (zsrc );
206206 _z_queryable_cache_data_t qle_infos = _z_queryable_cache_data_null ();
207- qle_infos .ke_in = _z_keyexpr_alias (q_key );
207+ qle_infos .ke_in = _z_keyexpr_steal (q_key );
208208 // Retrieve sub infos
209- _Z_RETURN_IF_ERR (_z_session_queryable_get_infos (zn , & qle_infos ));
209+ _Z_CLEAN_RETURN_IF_ERR (_z_session_queryable_get_infos (zn , & qle_infos ), _z_keyexpr_clear (& qle_infos .ke_in );
210+ _z_value_clear (& msgq -> _ext_value ); _z_bytes_drop (& msgq -> _ext_attachment );
211+ _z_slice_clear (& msgq -> _parameters ););
210212 // Check if there are queryables
211213 _Z_DEBUG ("Triggering %ju queryables for key %d - %.*s" , (uintmax_t )qle_infos .qle_nb , qle_infos .ke_out ._id ,
212214 (int )_z_string_len (& qle_infos .ke_out ._suffix ), _z_string_data (& qle_infos .ke_out ._suffix ));
213215 if (qle_infos .qle_nb == 0 ) {
216+ _z_keyexpr_clear (& qle_infos .ke_in );
217+ _z_value_clear (& msgq -> _ext_value );
218+ _z_bytes_drop (& msgq -> _ext_attachment );
219+ _z_slice_clear (& msgq -> _parameters );
214220 _z_keyexpr_clear (& qle_infos .ke_out );
215221#if Z_FEATURE_RX_CACHE == 0
216222 _z_queryable_infos_svec_release (& qle_infos .infos ); // Otherwise it's released with cache
@@ -238,34 +244,30 @@ static z_result_t _z_trigger_queryables_inner(_z_session_rc_t *zsrc, _z_msg_quer
238244
239245 z_result_t ret = _Z_RES_OK ;
240246 // Parse session_queryable svec
241- for (size_t i = 1 ; i < qle_infos .qle_nb ; i ++ ) {
242- _z_query_rc_t query_copy ;
243- ret = _z_query_rc_copy (& query_copy , & query );
244- if (ret != _Z_RES_OK ) {
245- break ;
246- }
247+ for (size_t i = 0 ; i < qle_infos .qle_nb ; i ++ ) {
247248 _z_queryable_infos_t * qle_info = _z_queryable_infos_svec_get (& qle_infos .infos , i );
248- qle_info -> callback (& query_copy , qle_info -> arg );
249- _z_query_rc_drop (& query_copy );
249+ if (i + 1 == qle_infos .qle_nb ) {
250+ qle_info -> callback (& query , qle_info -> arg );
251+ } else {
252+ _z_query_rc_t query_copy ;
253+ ret = _z_query_rc_copy (& query_copy , & query );
254+ if (ret != _Z_RES_OK ) {
255+ break ;
256+ }
257+ qle_info -> callback (& query_copy , qle_info -> arg );
258+ _z_query_rc_drop (& query_copy );
259+ }
250260 }
251-
252- _z_queryable_infos_t * qle_info = _z_queryable_infos_svec_get (& qle_infos .infos , 0 );
253- qle_info -> callback (& query , qle_info -> arg );
254261 _z_query_rc_drop (& query );
255262#if Z_FEATURE_RX_CACHE == 0
256263 _z_queryable_infos_svec_release (& qle_infos .infos ); // Otherwise it's released with cache
257264#endif
265+ _z_keyexpr_clear (& qle_infos .ke_in );
258266 return ret ;
259267}
260268
261269z_result_t _z_trigger_queryables (_z_session_rc_t * zsrc , _z_msg_query_t * msgq , _z_keyexpr_t * q_key , uint32_t qid ) {
262- z_result_t ret = _z_trigger_queryables_inner (zsrc , msgq , q_key , qid );
263- // Clean up
264- _z_keyexpr_clear (q_key );
265- _z_value_clear (& msgq -> _ext_value );
266- _z_bytes_drop (& msgq -> _ext_attachment );
267- _z_slice_clear (& msgq -> _parameters );
268- return ret ;
270+ return _z_trigger_queryables_inner (zsrc , msgq , q_key , qid );
269271}
270272
271273void _z_unregister_session_queryable (_z_session_t * zn , _z_session_queryable_rc_t * qle ) {
0 commit comments