diff --git a/src/t_stream.c b/src/t_stream.c index 40cd360e379..f2db168e26b 100644 --- a/src/t_stream.c +++ b/src/t_stream.c @@ -719,6 +719,15 @@ int64_t streamTrim(stream *s, streamAddTrimArgs *args) { if (trim_strategy == TRIM_STRATEGY_NONE) return 0; if (trim_strategy == TRIM_STRATEGY_MAXLEN && s->length <= maxlen) return 0; + if (trim_strategy == TRIM_STRATEGY_MAXLEN && maxlen == 0 && !approx && limit == 0) { + int64_t deleted = s->length; + raxFreeWithCallback(s->rax, lpFreeVoid); + s->rax = raxNew(); + s->length = 0; + s->first_id.ms = 0; + s->first_id.seq = 0; + return deleted; + } raxIterator ri; raxStart(&ri, s->rax); diff --git a/tests/unit/type/stream.tcl b/tests/unit/type/stream.tcl index edce1838006..81fe26d4e01 100644 --- a/tests/unit/type/stream.tcl +++ b/tests/unit/type/stream.tcl @@ -719,6 +719,18 @@ start_server { assert {[r XLEN mystream] == 400} } + test {XTRIM with MAXLEN 0 keeps an empty stream key} { + r DEL mystream + r XADD mystream 1-0 f v + r XADD mystream 2-0 f v + assert_equal 2 [r XTRIM mystream MAXLEN = 0] + assert_equal 1 [r EXISTS mystream] + set reply [r XINFO STREAM mystream] + assert_equal 0 [dict get $reply length] + assert_equal "2-0" [dict get $reply last-generated-id] + assert_equal "0-0" [dict get $reply recorded-first-entry-id] + } + test {XADD with LIMIT consecutive calls} { r del mystream r config set stream-node-max-entries 10