From b5659cb0a6c25d26d5dad0675a99e20bade986ed Mon Sep 17 00:00:00 2001 From: antirez Date: Sat, 12 Apr 2014 11:02:14 +0200 Subject: [PATCH] Increment pointer while iterating sparse HLL object. --- src/hyperloglog.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/hyperloglog.c b/src/hyperloglog.c index 5157cd8ef..969a86599 100644 --- a/src/hyperloglog.c +++ b/src/hyperloglog.c @@ -581,9 +581,11 @@ sds hllSparseToDense(sds sparse) { if (HLL_SPARSE_IS_ZERO(p)) { runlen = HLL_SPARSE_ZERO_LEN(p); idx += runlen; + p++; } else if (HLL_SPARSE_IS_XZERO(p)) { runlen = HLL_SPARSE_XZERO_LEN(p); idx += runlen; + p += 2; } else { runlen = HLL_SPARSE_VAL_LEN(p); regval = HLL_SPARSE_VAL_VALUE(p); @@ -591,6 +593,7 @@ sds hllSparseToDense(sds sparse) { HLL_DENSE_SET_REGISTER(hdr->registers,idx,regval); idx++; } + p++; } } @@ -821,16 +824,19 @@ double hllSparseSum(uint8_t *sparse, int sparselen, double *PE, int *ezp) { idx += runlen; ez += runlen; E += 1; /* 2^(-reg[j]) is 1 when m is 0. */ + p++; } else if (HLL_SPARSE_IS_XZERO(p)) { runlen = HLL_SPARSE_XZERO_LEN(p); idx += runlen; ez += runlen; E += 1; /* 2^(-reg[j]) is 1 when m is 0. */ + p += 2; } else { runlen = HLL_SPARSE_VAL_LEN(p); regval = HLL_SPARSE_VAL_VALUE(p); idx += runlen; E += PE[regval]*runlen; + p++; } } redisAssert(idx == HLL_REGISTERS);