From e8a637699b838c75e7cb8efac5c2290fc89a5c73 Mon Sep 17 00:00:00 2001 From: yihaoDeng Date: Sun, 15 May 2022 23:29:13 +0800 Subject: [PATCH] enh(index): fix tag query error --- source/libs/index/inc/indexComm.h | 6 ++ source/libs/index/src/indexCache.c | 5 +- source/libs/index/src/indexComm.c | 130 ++++++++++++++++++-------- source/libs/index/test/.utilUT.cc.swn | Bin 0 -> 20480 bytes source/libs/index/test/jsonUT.cc | 28 ++++++ source/libs/index/test/utilUT.cc | 18 ++++ 6 files changed, 148 insertions(+), 39 deletions(-) create mode 100644 source/libs/index/test/.utilUT.cc.swn diff --git a/source/libs/index/inc/indexComm.h b/source/libs/index/inc/indexComm.h index 043404f48f..9b23e4eb44 100644 --- a/source/libs/index/inc/indexComm.h +++ b/source/libs/index/inc/indexComm.h @@ -39,6 +39,12 @@ _cache_range_compare indexGetCompare(RangeType ty); int32_t indexConvertData(void* src, int8_t type, void** dst); +int32_t indexGetDataByteLen(int8_t type); + +int32_t indexMayFillNumbericData(void* number, int32_t tlen); + +int32_t indexMayUnfillNumbericData(void* number, int32_t tlen); + #ifdef __cplusplus } #endif diff --git a/source/libs/index/src/indexCache.c b/source/libs/index/src/indexCache.c index 6cd00f76e1..1d7a4a5419 100644 --- a/source/libs/index/src/indexCache.c +++ b/source/libs/index/src/indexCache.c @@ -282,8 +282,10 @@ static int32_t cacheSearchCompareFunc_JSON(void* cache, SIndexTerm* term, SIdxTe if (0 != strncmp(c->colVal, pCt->colVal, skip)) { break; } + char* p = taosMemoryCalloc(1, strlen(c->colVal) + 1); + memcpy(p, c->colVal, strlen(c->colVal)); - TExeCond cond = cmpFn(c->colVal + skip, term->colVal, dType); + TExeCond cond = cmpFn(p + skip, term->colVal, dType); if (cond == MATCH) { if (c->operaType == ADD_VALUE) { INDEX_MERGE_ADD_DEL(tr->deled, tr->added, c->uid) @@ -297,6 +299,7 @@ static int32_t cacheSearchCompareFunc_JSON(void* cache, SIndexTerm* term, SIdxTe } else if (cond == BREAK) { break; } + taosMemoryFree(p); } taosMemoryFree(pCt); diff --git a/source/libs/index/src/indexComm.c b/source/libs/index/src/indexComm.c index 3070659851..89f19a3b81 100644 --- a/source/libs/index/src/indexComm.c +++ b/source/libs/index/src/indexComm.c @@ -31,44 +31,34 @@ static __compar_fn_t indexGetCompar(int8_t type) { } static TExeCond tCompareLessThan(void* a, void* b, int8_t type) { __compar_fn_t func = indexGetCompar(type); + + int32_t tlen = indexGetDataByteLen(type); + indexMayUnfillNumbericData(a, tlen); + indexMayUnfillNumbericData(b, tlen); return tDoCommpare(func, QUERY_LESS_THAN, a, b); } static TExeCond tCompareLessEqual(void* a, void* b, int8_t type) { __compar_fn_t func = indexGetCompar(type); + + int32_t tlen = indexGetDataByteLen(type); + indexMayUnfillNumbericData(a, tlen); + indexMayUnfillNumbericData(b, tlen); return tDoCommpare(func, QUERY_LESS_EQUAL, a, b); } static TExeCond tCompareGreaterThan(void* a, void* b, int8_t type) { __compar_fn_t func = indexGetCompar(type); - if (type == TSDB_DATA_TYPE_INT) { - char* v1 = (char*)a; - char* v2 = (char*)b; - for (int i = 0; i < sizeof(int32_t); i++) { - if (v1[i] == '0') { - v1[i] = 0; - } - if (v2[i] == '0') { - v2[i] = 0; - } - } - return tDoCommpare(func, QUERY_GREATER_THAN, v1, v2); - } + + int32_t tlen = indexGetDataByteLen(type); + indexMayUnfillNumbericData(a, tlen); + indexMayUnfillNumbericData(b, tlen); return tDoCommpare(func, QUERY_GREATER_THAN, a, b); } static TExeCond tCompareGreaterEqual(void* a, void* b, int8_t type) { __compar_fn_t func = indexGetCompar(type); - if (type == TSDB_DATA_TYPE_INT) { - char* v1 = (char*)a; - char* v2 = (char*)b; - for (int i = 0; i < sizeof(int32_t); i++) { - if (v1[i] == '0') { - v1[i] = 0; - } - if (v2[i] == '0') { - v2[i] = 0; - } - } - return tDoCommpare(func, QUERY_GREATER_EQUAL, v1, v2); - } + + int32_t tlen = indexGetDataByteLen(type); + indexMayUnfillNumbericData(a, tlen); + indexMayUnfillNumbericData(b, tlen); return tDoCommpare(func, QUERY_GREATER_EQUAL, a, b); } @@ -200,9 +190,9 @@ int32_t indexConvertData(void* src, int8_t type, void** dst) { tlen = taosEncodeFixedU32(dst, *(uint32_t*)src); break; case TSDB_DATA_TYPE_BIGINT: - tlen = taosEncodeFixedI64(NULL, *(uint32_t*)src); + tlen = taosEncodeFixedI64(NULL, *(int64_t*)src); *dst = taosMemoryCalloc(1, tlen + 1); - tlen = taosEncodeFixedI64(dst, *(uint32_t*)src); + tlen = taosEncodeFixedI64(dst, *(int64_t*)src); break; case TSDB_DATA_TYPE_DOUBLE: tlen = taosEncodeBinary(NULL, src, sizeof(double)); @@ -210,9 +200,9 @@ int32_t indexConvertData(void* src, int8_t type, void** dst) { tlen = taosEncodeBinary(dst, src, sizeof(double)); break; case TSDB_DATA_TYPE_UBIGINT: - tlen = taosEncodeFixedU64(NULL, *(uint32_t*)src); + tlen = taosEncodeFixedU64(NULL, *(uint64_t*)src); *dst = taosMemoryCalloc(1, tlen + 1); - tlen = taosEncodeFixedU64(dst, *(uint32_t*)src); + tlen = taosEncodeFixedU64(dst, *(uint64_t*)src); break; case TSDB_DATA_TYPE_NCHAR: { tlen = taosEncodeBinary(NULL, varDataVal(src), varDataLen(src)); @@ -241,14 +231,78 @@ int32_t indexConvertData(void* src, int8_t type, void** dst) { break; } *dst = *dst - tlen; - if (type != TSDB_DATA_TYPE_BINARY && type != TSDB_DATA_TYPE_NCHAR && type != TSDB_DATA_TYPE_VARBINARY && - type != TSDB_DATA_TYPE_VARCHAR) { - uint8_t* p = *dst; - for (int i = 0; i < tlen; i++) { - if (p[i] == 0) { - p[i] = (uint8_t)'0'; - } - } + + indexMayFillNumbericData(*dst, tlen); + + // if (type != TSDB_DATA_TYPE_BINARY && type != TSDB_DATA_TYPE_NCHAR && type != TSDB_DATA_TYPE_VARBINARY && + // type != TSDB_DATA_TYPE_VARCHAR) { uint8_t* p = *dst; + // for (int i = 0; i < tlen; i++) { + // if (p[i] == 0) { + // p[i] = (uint8_t)'0'; + // } + // } + //} + return tlen; +} +int32_t indexGetDataByteLen(int8_t type) { + int32_t tlen = -1; + switch (type) { + case TSDB_DATA_TYPE_TIMESTAMP: + tlen = sizeof(int64_t); + break; + case TSDB_DATA_TYPE_BOOL: + case TSDB_DATA_TYPE_UTINYINT: + tlen = sizeof(uint8_t); + break; + case TSDB_DATA_TYPE_TINYINT: + tlen = sizeof(uint8_t); + break; + case TSDB_DATA_TYPE_SMALLINT: + tlen = sizeof(int16_t); + break; + case TSDB_DATA_TYPE_USMALLINT: + tlen = sizeof(uint16_t); + break; + case TSDB_DATA_TYPE_INT: + tlen = sizeof(int32_t); + break; + case TSDB_DATA_TYPE_UINT: + tlen = sizeof(uint32_t); + break; + case TSDB_DATA_TYPE_BIGINT: + tlen = sizeof(int64_t); + break; + case TSDB_DATA_TYPE_UBIGINT: + tlen = sizeof(uint64_t); + break; + case TSDB_DATA_TYPE_FLOAT: + tlen = sizeof(float); + break; + case TSDB_DATA_TYPE_DOUBLE: + tlen = sizeof(double); + break; + default: + break; } return tlen; } + +int32_t indexMayFillNumbericData(void* number, int32_t tlen) { + for (int i = 0; i < tlen; i++) { + int8_t* p = number; + if (p[i] == 0) { + p[i] = (uint8_t)'0'; + } + } + return 0; +} + +int32_t indexMayUnfillNumbericData(void* number, int32_t tlen) { + for (int i = 0; i < tlen; i++) { + int8_t* p = number; + if (p[i] == (uint8_t)'0') { + p[i] = 0; + } + } + return 0; +} diff --git a/source/libs/index/test/.utilUT.cc.swn b/source/libs/index/test/.utilUT.cc.swn new file mode 100644 index 0000000000000000000000000000000000000000..3023c72b42057ca24f48699b8e9353645b647d6c GIT binary patch literal 20480 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 #include "index.h" #include "indexCache.h" +#include "indexComm.h" #include "indexFst.h" #include "indexFstCountingWriter.h" #include "indexFstUtil.h" #include "indexInt.h" #include "indexTfile.h" #include "indexUtil.h" +#include "tcoding.h" #include "tglobal.h" #include "tskiplist.h" #include "tutil.h" @@ -305,3 +307,19 @@ TEST_F(UtilEnv, 01Except) { ASSERT_EQ(*(uint64_t *)taosArrayGet(total, 0), 1); ASSERT_EQ(*(uint64_t *)taosArrayGet(total, 1), 100); } +TEST_F(UtilEnv, testFill) { + for (int i = 0; i < 10000; i++) { + char buf[10] = {0}; + void *pBuf = (void *)buf; + int val = i; + int v; + taosEncodeFixedI32((void **)(&pBuf), val); + // memcpy(buf, &val, sizeof(int)); + indexMayFillNumbericData((void *)buf, sizeof(val)); + indexMayUnfillNumbericData((void *)buf, sizeof(val)); + + taosDecodeFixedI32(buf, &v); + ASSERT_EQ(val, v); + } + assert(0); +}