diff --git a/src/t_hash.c b/src/t_hash.c index 7aec270aa5..63447a4c1f 100644 --- a/src/t_hash.c +++ b/src/t_hash.c @@ -227,31 +227,27 @@ int hashTypeSet(robj *o, sds field, sds value, int flags) { if (hashTypeLength(o) > server.hash_max_listpack_entries) hashTypeConvert(o, OBJ_ENCODING_HT); } else if (o->encoding == OBJ_ENCODING_HT) { - dictEntry *de = dictFind(o->ptr,field); - if (de) { - sdsfree(dictGetVal(de)); - if (flags & HASH_SET_TAKE_VALUE) { - dictGetVal(de) = value; - value = NULL; - } else { - dictGetVal(de) = sdsdup(value); - } - update = 1; + dict *ht = o->ptr; + dictEntry *de, *existing; + sds v; + if (flags & HASH_SET_TAKE_VALUE) { + v = value; + value = NULL; } else { - sds f,v; + v = sdsdup(value); + } + de = dictAddRaw(ht, field, &existing); + if (de) { + dictSetVal(ht, de, v); if (flags & HASH_SET_TAKE_FIELD) { - f = field; field = NULL; } else { - f = sdsdup(field); + dictSetKey(ht, de, sdsdup(field)); } - if (flags & HASH_SET_TAKE_VALUE) { - v = value; - value = NULL; - } else { - v = sdsdup(value); - } - dictAdd(o->ptr,f,v); + } else { + sdsfree(dictGetVal(existing)); + dictSetVal(ht, existing, v); + update = 1; } } else { serverPanic("Unknown hash encoding");