|
|
|
@ -16,28 +16,22 @@
|
|
|
|
|
#include "os.h"
|
|
|
|
|
#include "ttype.h"
|
|
|
|
|
#include "tcompare.h"
|
|
|
|
|
#include "tarray.h"
|
|
|
|
|
#include "hash.h"
|
|
|
|
|
|
|
|
|
|
int32_t compareInt32Val(const void *pLeft, const void *pRight) {
|
|
|
|
|
int32_t left = GET_INT32_VAL(pLeft), right = GET_INT32_VAL(pRight);
|
|
|
|
|
if (left > right) return 1;
|
|
|
|
|
if (left < right) return -1;
|
|
|
|
|
return 0;
|
|
|
|
|
int32_t setCompareBytes1(const void *pLeft, const void *pRight) {
|
|
|
|
|
return NULL != taosHashGet((SHashObj *)pRight, pLeft, 1) ? 1 : 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareInt64Val(const void *pLeft, const void *pRight) {
|
|
|
|
|
int64_t left = GET_INT64_VAL(pLeft), right = GET_INT64_VAL(pRight);
|
|
|
|
|
if (left > right) return 1;
|
|
|
|
|
if (left < right) return -1;
|
|
|
|
|
return 0;
|
|
|
|
|
int32_t setCompareBytes2(const void *pLeft, const void *pRight) {
|
|
|
|
|
return NULL != taosHashGet((SHashObj *)pRight, pLeft, 2) ? 1 : 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareInt16Val(const void *pLeft, const void *pRight) {
|
|
|
|
|
int16_t left = GET_INT16_VAL(pLeft), right = GET_INT16_VAL(pRight);
|
|
|
|
|
if (left > right) return 1;
|
|
|
|
|
if (left < right) return -1;
|
|
|
|
|
return 0;
|
|
|
|
|
int32_t setCompareBytes4(const void *pLeft, const void *pRight) {
|
|
|
|
|
return NULL != taosHashGet((SHashObj *)pRight, pLeft, 4) ? 1 : 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t setCompareBytes8(const void *pLeft, const void *pRight) {
|
|
|
|
|
return NULL != taosHashGet((SHashObj *)pRight, pLeft, 8) ? 1 : 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareInt8Val(const void *pLeft, const void *pRight) {
|
|
|
|
@ -47,27 +41,76 @@ int32_t compareInt8Val(const void *pLeft, const void *pRight) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareUint32Val(const void *pLeft, const void *pRight) {
|
|
|
|
|
int32_t left = GET_UINT32_VAL(pLeft), right = GET_UINT32_VAL(pRight);
|
|
|
|
|
int32_t compareInt8ValDesc(const void *pLeft, const void *pRight) {
|
|
|
|
|
return compareInt8Val(pRight, pLeft);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareInt16Val(const void *pLeft, const void *pRight) {
|
|
|
|
|
int16_t left = GET_INT16_VAL(pLeft), right = GET_INT16_VAL(pRight);
|
|
|
|
|
if (left > right) return 1;
|
|
|
|
|
if (left < right) return -1;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareInt16ValDesc(const void* pLeft, const void* pRight) {
|
|
|
|
|
return compareInt16Val(pRight, pLeft);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareInt32Val(const void *pLeft, const void *pRight) {
|
|
|
|
|
int32_t left = GET_INT32_VAL(pLeft), right = GET_INT32_VAL(pRight);
|
|
|
|
|
if (left > right) return 1;
|
|
|
|
|
if (left < right) return -1;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareInt32ValDesc(const void* pLeft, const void* pRight) {
|
|
|
|
|
return compareInt32Val(pRight, pLeft);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareInt64Val(const void *pLeft, const void *pRight) {
|
|
|
|
|
int64_t left = GET_INT64_VAL(pLeft), right = GET_INT64_VAL(pRight);
|
|
|
|
|
if (left > right) return 1;
|
|
|
|
|
if (left < right) return -1;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareInt64ValDesc(const void* pLeft, const void* pRight) {
|
|
|
|
|
return compareInt64Val(pRight, pLeft);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareUint32Val(const void *pLeft, const void *pRight) {
|
|
|
|
|
uint32_t left = GET_UINT32_VAL(pLeft), right = GET_UINT32_VAL(pRight);
|
|
|
|
|
if (left > right) return 1;
|
|
|
|
|
if (left < right) return -1;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareUint32ValDesc(const void* pLeft, const void* pRight) {
|
|
|
|
|
return compareUint32Val(pRight, pLeft);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareUint64Val(const void *pLeft, const void *pRight) {
|
|
|
|
|
int64_t left = GET_UINT64_VAL(pLeft), right = GET_UINT64_VAL(pRight);
|
|
|
|
|
uint64_t left = GET_UINT64_VAL(pLeft), right = GET_UINT64_VAL(pRight);
|
|
|
|
|
if (left > right) return 1;
|
|
|
|
|
if (left < right) return -1;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareUint64ValDesc(const void* pLeft, const void* pRight) {
|
|
|
|
|
return compareUint64Val(pRight, pLeft);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareUint16Val(const void *pLeft, const void *pRight) {
|
|
|
|
|
int16_t left = GET_UINT16_VAL(pLeft), right = GET_UINT16_VAL(pRight);
|
|
|
|
|
uint16_t left = GET_UINT16_VAL(pLeft), right = GET_UINT16_VAL(pRight);
|
|
|
|
|
if (left > right) return 1;
|
|
|
|
|
if (left < right) return -1;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareUint16ValDesc(const void* pLeft, const void* pRight) {
|
|
|
|
|
return compareUint16Val(pRight, pLeft);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareUint8Val(const void* pLeft, const void* pRight) {
|
|
|
|
|
uint8_t left = GET_UINT8_VAL(pLeft), right = GET_UINT8_VAL(pRight);
|
|
|
|
|
if (left > right) return 1;
|
|
|
|
@ -75,6 +118,10 @@ int32_t compareUint8Val(const void* pLeft, const void* pRight) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareUint8ValDesc(const void* pLeft, const void* pRight) {
|
|
|
|
|
return compareUint8Val(pRight, pLeft);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareFloatVal(const void *pLeft, const void *pRight) {
|
|
|
|
|
float p1 = GET_FLOAT_VAL(pLeft);
|
|
|
|
|
float p2 = GET_FLOAT_VAL(pRight);
|
|
|
|
@ -92,8 +139,12 @@ int32_t compareFloatVal(const void *pLeft, const void *pRight) {
|
|
|
|
|
}
|
|
|
|
|
if (FLT_EQUAL(p1, p2)) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
return FLT_GREATER(p1, p2) ? 1: -1;
|
|
|
|
|
}
|
|
|
|
|
return FLT_GREATER(p1, p2) ? 1: -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareFloatValDesc(const void* pLeft, const void* pRight) {
|
|
|
|
|
return compareFloatVal(pRight, pLeft);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareDoubleVal(const void *pLeft, const void *pRight) {
|
|
|
|
@ -113,14 +164,18 @@ int32_t compareDoubleVal(const void *pLeft, const void *pRight) {
|
|
|
|
|
}
|
|
|
|
|
if (FLT_EQUAL(p1, p2)) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
return FLT_GREATER(p1, p2) ? 1: -1;
|
|
|
|
|
}
|
|
|
|
|
return FLT_GREATER(p1, p2) ? 1: -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareDoubleValDesc(const void* pLeft, const void* pRight) {
|
|
|
|
|
return compareDoubleVal(pRight, pLeft);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareLenPrefixedStr(const void *pLeft, const void *pRight) {
|
|
|
|
|
int32_t len1 = varDataLen(pLeft);
|
|
|
|
|
int32_t len2 = varDataLen(pRight);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (len1 != len2) {
|
|
|
|
|
return len1 > len2? 1:-1;
|
|
|
|
|
} else {
|
|
|
|
@ -133,10 +188,14 @@ int32_t compareLenPrefixedStr(const void *pLeft, const void *pRight) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareLenPrefixedStrDesc(const void* pLeft, const void* pRight) {
|
|
|
|
|
return compareLenPrefixedStr(pRight, pLeft);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareLenPrefixedWStr(const void *pLeft, const void *pRight) {
|
|
|
|
|
int32_t len1 = varDataLen(pLeft);
|
|
|
|
|
int32_t len2 = varDataLen(pRight);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (len1 != len2) {
|
|
|
|
|
return len1 > len2? 1:-1;
|
|
|
|
|
} else {
|
|
|
|
@ -149,6 +208,10 @@ int32_t compareLenPrefixedWStr(const void *pLeft, const void *pRight) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int32_t compareLenPrefixedWStrDesc(const void* pLeft, const void* pRight) {
|
|
|
|
|
return compareLenPrefixedWStr(pRight, pLeft);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Compare two strings
|
|
|
|
|
* TSDB_MATCH: Match
|
|
|
|
@ -161,33 +224,33 @@ int32_t compareLenPrefixedWStr(const void *pLeft, const void *pRight) {
|
|
|
|
|
*/
|
|
|
|
|
int patternMatch(const char *patterStr, const char *str, size_t size, const SPatternCompareInfo *pInfo) {
|
|
|
|
|
char c, c1;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int32_t i = 0;
|
|
|
|
|
int32_t j = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while ((c = patterStr[i++]) != 0) {
|
|
|
|
|
if (c == pInfo->matchAll) { /* Match "*" */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while ((c = patterStr[i++]) == pInfo->matchAll || c == pInfo->matchOne) {
|
|
|
|
|
if (c == pInfo->matchOne && (j > size || str[j++] == 0)) {
|
|
|
|
|
// empty string, return not match
|
|
|
|
|
return TSDB_PATTERN_NOWILDCARDMATCH;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (c == 0) {
|
|
|
|
|
return TSDB_PATTERN_MATCH; /* "*" at the end of the pattern matches */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
char next[3] = {toupper(c), tolower(c), 0};
|
|
|
|
|
while (1) {
|
|
|
|
|
size_t n = strcspn(str, next);
|
|
|
|
|
str += n;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (str[0] == 0 || (n >= size)) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int32_t ret = patternMatch(&patterStr[i], ++str, size - n - 1, pInfo);
|
|
|
|
|
if (ret != TSDB_PATTERN_NOMATCH) {
|
|
|
|
|
return ret;
|
|
|
|
@ -195,18 +258,18 @@ int patternMatch(const char *patterStr, const char *str, size_t size, const SPat
|
|
|
|
|
}
|
|
|
|
|
return TSDB_PATTERN_NOWILDCARDMATCH;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
c1 = str[j++];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (j <= size) {
|
|
|
|
|
if (c == c1 || tolower(c) == tolower(c1) || (c == pInfo->matchOne && c1 != 0)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return TSDB_PATTERN_NOMATCH;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return (str[j] == 0 || j >= size) ? TSDB_PATTERN_MATCH : TSDB_PATTERN_NOMATCH;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -214,13 +277,13 @@ int WCSPatternMatch(const wchar_t *patterStr, const wchar_t *str, size_t size, c
|
|
|
|
|
wchar_t c, c1;
|
|
|
|
|
wchar_t matchOne = L'_'; // "_"
|
|
|
|
|
wchar_t matchAll = L'%'; // "%"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int32_t i = 0;
|
|
|
|
|
int32_t j = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while ((c = patterStr[i++]) != 0) {
|
|
|
|
|
if (c == matchAll) { /* Match "%" */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while ((c = patterStr[i++]) == matchAll || c == matchOne) {
|
|
|
|
|
if (c == matchOne && (j > size || str[j++] == 0)) {
|
|
|
|
|
return TSDB_PATTERN_NOWILDCARDMATCH;
|
|
|
|
@ -229,40 +292,40 @@ int WCSPatternMatch(const wchar_t *patterStr, const wchar_t *str, size_t size, c
|
|
|
|
|
if (c == 0) {
|
|
|
|
|
return TSDB_PATTERN_MATCH;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
wchar_t accept[3] = {towupper(c), towlower(c), 0};
|
|
|
|
|
while (1) {
|
|
|
|
|
size_t n = wcscspn(str, accept);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
str += n;
|
|
|
|
|
if (str[0] == 0 || (n >= size)) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int32_t ret = WCSPatternMatch(&patterStr[i], ++str, size - n - 1, pInfo);
|
|
|
|
|
if (ret != TSDB_PATTERN_NOMATCH) {
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return TSDB_PATTERN_NOWILDCARDMATCH;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
c1 = str[j++];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (j <= size) {
|
|
|
|
|
if (c == c1 || towlower(c) == towlower(c1) || (c == matchOne && c1 != 0)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return TSDB_PATTERN_NOMATCH;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (str[j] == 0 || j >= size) ? TSDB_PATTERN_MATCH : TSDB_PATTERN_NOMATCH;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int32_t compareStrPatternComp(const void* pLeft, const void* pRight) {
|
|
|
|
|
int32_t compareStrPatternComp(const void* pLeft, const void* pRight) {
|
|
|
|
|
SPatternCompareInfo pInfo = {'%', '_'};
|
|
|
|
|
|
|
|
|
|
char pattern[128] = {0};
|
|
|
|
@ -270,8 +333,8 @@ static int32_t compareStrPatternComp(const void* pLeft, const void* pRight) {
|
|
|
|
|
assert(varDataLen(pRight) < 128);
|
|
|
|
|
|
|
|
|
|
size_t sz = varDataLen(pLeft);
|
|
|
|
|
char *buf = malloc(sz + 1);
|
|
|
|
|
memcpy(buf, varDataVal(pLeft), sz);
|
|
|
|
|
char *buf = malloc(sz + 1);
|
|
|
|
|
memcpy(buf, varDataVal(pLeft), sz);
|
|
|
|
|
buf[sz] = 0;
|
|
|
|
|
|
|
|
|
|
int32_t ret = patternMatch(pattern, buf, sz, &pInfo);
|
|
|
|
@ -282,19 +345,15 @@ static int32_t compareStrPatternComp(const void* pLeft, const void* pRight) {
|
|
|
|
|
int32_t taosArrayCompareString(const void* a, const void* b) {
|
|
|
|
|
const char* x = *(const char**)a;
|
|
|
|
|
const char* y = *(const char**)b;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return compareLenPrefixedStr(x, y);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//static int32_t compareFindStrInArray(const void* pLeft, const void* pRight) {
|
|
|
|
|
// const SArray* arr = (const SArray*) pRight;
|
|
|
|
|
// return taosArraySearchString(arr, pLeft, taosArrayCompareString, TD_EQ) == NULL ? 0 : 1;
|
|
|
|
|
//}
|
|
|
|
|
static int32_t compareFindItemInSet(const void *pLeft, const void* pRight) {
|
|
|
|
|
return NULL != taosHashGet((SHashObj *)pRight, varDataVal(pLeft), varDataLen(pLeft)) ? 1 : 0;
|
|
|
|
|
int32_t compareFindItemInSet(const void *pLeft, const void* pRight) {
|
|
|
|
|
return NULL != taosHashGet((SHashObj *)pRight, varDataVal(pLeft), varDataLen(pLeft)) ? 1 : 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int32_t compareWStrPatternComp(const void* pLeft, const void* pRight) {
|
|
|
|
|
int32_t compareWStrPatternComp(const void* pLeft, const void* pRight) {
|
|
|
|
|
SPatternCompareInfo pInfo = {'%', '_'};
|
|
|
|
|
|
|
|
|
|
wchar_t pattern[128] = {0};
|
|
|
|
@ -302,14 +361,37 @@ static int32_t compareWStrPatternComp(const void* pLeft, const void* pRight) {
|
|
|
|
|
|
|
|
|
|
memcpy(pattern, varDataVal(pRight), varDataLen(pRight));
|
|
|
|
|
assert(varDataLen(pRight) < 128);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int32_t ret = WCSPatternMatch(pattern, varDataVal(pLeft), varDataLen(pLeft)/TSDB_NCHAR_SIZE, &pInfo);
|
|
|
|
|
return (ret == TSDB_PATTERN_MATCH) ? 0 : 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
__compar_fn_t getComparFunc(int32_t type, int32_t optr) {
|
|
|
|
|
__compar_fn_t comparFn = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (optr == TSDB_RELATION_IN && (type != TSDB_DATA_TYPE_BINARY && type != TSDB_DATA_TYPE_NCHAR)) {
|
|
|
|
|
switch (type) {
|
|
|
|
|
case TSDB_DATA_TYPE_BOOL:
|
|
|
|
|
case TSDB_DATA_TYPE_TINYINT:
|
|
|
|
|
case TSDB_DATA_TYPE_UTINYINT:
|
|
|
|
|
return setCompareBytes1;
|
|
|
|
|
case TSDB_DATA_TYPE_SMALLINT:
|
|
|
|
|
case TSDB_DATA_TYPE_USMALLINT:
|
|
|
|
|
return setCompareBytes2;
|
|
|
|
|
case TSDB_DATA_TYPE_INT:
|
|
|
|
|
case TSDB_DATA_TYPE_UINT:
|
|
|
|
|
case TSDB_DATA_TYPE_FLOAT:
|
|
|
|
|
return setCompareBytes4;
|
|
|
|
|
case TSDB_DATA_TYPE_BIGINT:
|
|
|
|
|
case TSDB_DATA_TYPE_UBIGINT:
|
|
|
|
|
case TSDB_DATA_TYPE_DOUBLE:
|
|
|
|
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
|
|
|
|
return setCompareBytes8;
|
|
|
|
|
default:
|
|
|
|
|
assert(0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
|
case TSDB_DATA_TYPE_BOOL:
|
|
|
|
|
case TSDB_DATA_TYPE_TINYINT: comparFn = compareInt8Val; break;
|
|
|
|
@ -327,13 +409,15 @@ __compar_fn_t getComparFunc(int32_t type, int32_t optr) {
|
|
|
|
|
} else { /* normal relational comparFn */
|
|
|
|
|
comparFn = compareLenPrefixedStr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case TSDB_DATA_TYPE_NCHAR: {
|
|
|
|
|
if (optr == TSDB_RELATION_LIKE) {
|
|
|
|
|
comparFn = compareWStrPatternComp;
|
|
|
|
|
} else if (optr == TSDB_RELATION_IN) {
|
|
|
|
|
comparFn = compareFindItemInSet;
|
|
|
|
|
} else {
|
|
|
|
|
comparFn = compareLenPrefixedWStr;
|
|
|
|
|
}
|
|
|
|
@ -349,57 +433,57 @@ __compar_fn_t getComparFunc(int32_t type, int32_t optr) {
|
|
|
|
|
comparFn = compareInt32Val;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return comparFn;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
__compar_fn_t getKeyComparFunc(int32_t keyType) {
|
|
|
|
|
__compar_fn_t getKeyComparFunc(int32_t keyType, int32_t order) {
|
|
|
|
|
__compar_fn_t comparFn = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
switch (keyType) {
|
|
|
|
|
case TSDB_DATA_TYPE_TINYINT:
|
|
|
|
|
case TSDB_DATA_TYPE_BOOL:
|
|
|
|
|
comparFn = compareInt8Val;
|
|
|
|
|
comparFn = (order == TSDB_ORDER_ASC)? compareInt8Val:compareInt8ValDesc;
|
|
|
|
|
break;
|
|
|
|
|
case TSDB_DATA_TYPE_SMALLINT:
|
|
|
|
|
comparFn = compareInt16Val;
|
|
|
|
|
comparFn = (order == TSDB_ORDER_ASC)? compareInt16Val:compareInt16ValDesc;
|
|
|
|
|
break;
|
|
|
|
|
case TSDB_DATA_TYPE_INT:
|
|
|
|
|
comparFn = compareInt32Val;
|
|
|
|
|
comparFn = (order == TSDB_ORDER_ASC)? compareInt32Val:compareInt32ValDesc;
|
|
|
|
|
break;
|
|
|
|
|
case TSDB_DATA_TYPE_BIGINT:
|
|
|
|
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
|
|
|
|
comparFn = compareInt64Val;
|
|
|
|
|
comparFn = (order == TSDB_ORDER_ASC)? compareInt64Val:compareInt64ValDesc;
|
|
|
|
|
break;
|
|
|
|
|
case TSDB_DATA_TYPE_FLOAT:
|
|
|
|
|
comparFn = compareFloatVal;
|
|
|
|
|
comparFn = (order == TSDB_ORDER_ASC)? compareFloatVal:compareFloatValDesc;
|
|
|
|
|
break;
|
|
|
|
|
case TSDB_DATA_TYPE_DOUBLE:
|
|
|
|
|
comparFn = compareDoubleVal;
|
|
|
|
|
comparFn = (order == TSDB_ORDER_ASC)? compareDoubleVal:compareDoubleValDesc;
|
|
|
|
|
break;
|
|
|
|
|
case TSDB_DATA_TYPE_UTINYINT:
|
|
|
|
|
comparFn = compareUint8Val;
|
|
|
|
|
comparFn = (order == TSDB_ORDER_ASC)? compareUint8Val:compareUint8ValDesc;
|
|
|
|
|
break;
|
|
|
|
|
case TSDB_DATA_TYPE_USMALLINT:
|
|
|
|
|
comparFn = compareUint16Val;
|
|
|
|
|
comparFn = (order == TSDB_ORDER_ASC)? compareUint16Val:compareUint16ValDesc;
|
|
|
|
|
break;
|
|
|
|
|
case TSDB_DATA_TYPE_UINT:
|
|
|
|
|
comparFn = compareUint32Val;
|
|
|
|
|
comparFn = (order == TSDB_ORDER_ASC)? compareUint32Val:compareUint32ValDesc;
|
|
|
|
|
break;
|
|
|
|
|
case TSDB_DATA_TYPE_UBIGINT:
|
|
|
|
|
comparFn = compareUint64Val;
|
|
|
|
|
comparFn = (order == TSDB_ORDER_ASC)? compareUint64Val:compareUint64ValDesc;
|
|
|
|
|
break;
|
|
|
|
|
case TSDB_DATA_TYPE_BINARY:
|
|
|
|
|
comparFn = compareLenPrefixedStr;
|
|
|
|
|
comparFn = (order == TSDB_ORDER_ASC)? compareLenPrefixedStr:compareLenPrefixedStrDesc;
|
|
|
|
|
break;
|
|
|
|
|
case TSDB_DATA_TYPE_NCHAR:
|
|
|
|
|
comparFn = compareLenPrefixedWStr;
|
|
|
|
|
comparFn = (order == TSDB_ORDER_ASC)? compareLenPrefixedWStr:compareLenPrefixedWStrDesc;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
comparFn = compareInt32Val;
|
|
|
|
|
comparFn = (order == TSDB_ORDER_ASC)? compareInt32Val:compareInt32ValDesc;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return comparFn;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -433,7 +517,7 @@ int32_t doCompare(const char* f1, const char* f2, int32_t type, size_t size) {
|
|
|
|
|
default: { // todo refactor
|
|
|
|
|
tstr* t1 = (tstr*) f1;
|
|
|
|
|
tstr* t2 = (tstr*) f2;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (t1->len != t2->len) {
|
|
|
|
|
return t1->len > t2->len? 1:-1;
|
|
|
|
|
} else {
|
|
|
|
|