提交 f970dd24 编写于 作者: H Haojun Liao

fix(query): fix the invalid access.

上级 0e471afc
...@@ -29,12 +29,16 @@ extern "C" { ...@@ -29,12 +29,16 @@ extern "C" {
int32_t strdequote(char *src); int32_t strdequote(char *src);
size_t strtrim(char *src); size_t strtrim(char *src);
char *strnchr(const char *haystack, char needle, int32_t len, bool skipquote); char *strnchr(const char *haystack, char needle, int32_t len, bool skipquote);
TdUcs4* wcsnchr(const TdUcs4* haystack, TdUcs4 needle, size_t len);
char **strsplit(char *src, const char *delim, int32_t *num); char **strsplit(char *src, const char *delim, int32_t *num);
char *strtolower(char *dst, const char *src); char *strtolower(char *dst, const char *src);
char *strntolower(char *dst, const char *src, int32_t n); char *strntolower(char *dst, const char *src, int32_t n);
char *strntolower_s(char *dst, const char *src, int32_t n); char *strntolower_s(char *dst, const char *src, int32_t n);
int64_t strnatoi(char *num, int32_t len); int64_t strnatoi(char *num, int32_t len);
size_t tstrncspn(const char *str, size_t ssize, const char *reject, size_t rsize); size_t tstrncspn(const char *str, size_t ssize, const char *reject, size_t rsize);
size_t twcsncspn(const TdUcs4 *wcs, size_t size, const TdUcs4 *reject, size_t rsize);
char *strbetween(char *string, char *begin, char *end); char *strbetween(char *string, char *begin, char *end);
char *paGetToken(char *src, char **token, int32_t *tokenLen); char *paGetToken(char *src, char **token, int32_t *tokenLen);
......
...@@ -998,6 +998,7 @@ int32_t compareUint64Uint32(const void *pLeft, const void *pRight) { ...@@ -998,6 +998,7 @@ int32_t compareUint64Uint32(const void *pLeft, const void *pRight) {
} }
int32_t compareJsonValDesc(const void *pLeft, const void *pRight) { return compareJsonVal(pRight, pLeft); } int32_t compareJsonValDesc(const void *pLeft, const void *pRight) { return compareJsonVal(pRight, pLeft); }
/* /*
* Compare two strings * Compare two strings
* TSDB_MATCH: Match * TSDB_MATCH: Match
...@@ -1055,10 +1056,10 @@ int32_t patternMatch(const char *pattern, size_t psize, const char *str, size_t ...@@ -1055,10 +1056,10 @@ int32_t patternMatch(const char *pattern, size_t psize, const char *str, size_t
return TSDB_PATTERN_NOWILDCARDMATCH; return TSDB_PATTERN_NOWILDCARDMATCH;
} }
c1 = str[j++]; if (j < ssize) {
++nMatchChar; c1 = str[j++];
++nMatchChar;
if (j <= ssize) {
if (c == '\\' && pattern[i] == '_' && c1 == '_') { if (c == '\\' && pattern[i] == '_' && c1 == '_') {
i++; i++;
continue; continue;
...@@ -1099,12 +1100,12 @@ int32_t wcsPatternMatch(const TdUcs4 *pattern, size_t psize, const TdUcs4 *str, ...@@ -1099,12 +1100,12 @@ int32_t wcsPatternMatch(const TdUcs4 *pattern, size_t psize, const TdUcs4 *str,
return TSDB_PATTERN_MATCH; return TSDB_PATTERN_MATCH;
} }
TdUcs4 acceptArray[3] = {towupper(c), towlower(c), 0}; TdUcs4 rejectList[2] = {towupper(c), towlower(c)};
str += nMatchChar; str += nMatchChar;
int32_t remain = ssize - nMatchChar; int32_t remain = ssize - nMatchChar;
while (1) { while (1) {
size_t n = wcscspn(str, acceptArray); size_t n = twcsncspn(str, remain, rejectList, 2);
str += n; str += n;
remain -= n; remain -= n;
...@@ -1122,10 +1123,10 @@ int32_t wcsPatternMatch(const TdUcs4 *pattern, size_t psize, const TdUcs4 *str, ...@@ -1122,10 +1123,10 @@ int32_t wcsPatternMatch(const TdUcs4 *pattern, size_t psize, const TdUcs4 *str,
return TSDB_PATTERN_NOWILDCARDMATCH; return TSDB_PATTERN_NOWILDCARDMATCH;
} }
c1 = str[j++]; if (j < ssize) {
nMatchChar++; c1 = str[j++];
nMatchChar++;
if (j <= ssize) {
if (c == L'\\' && pattern[i] == L'_' && c1 == L'_') { if (c == L'\\' && pattern[i] == L'_' && c1 == L'_') {
i++; i++;
continue; continue;
......
...@@ -144,6 +144,16 @@ char *strnchr(const char *haystack, char needle, int32_t len, bool skipquote) { ...@@ -144,6 +144,16 @@ char *strnchr(const char *haystack, char needle, int32_t len, bool skipquote) {
return NULL; return NULL;
} }
TdUcs4* wcsnchr(const TdUcs4* haystack, TdUcs4 needle, size_t len) {
for(int32_t i = 0; i < len; ++i) {
if (haystack[i] == needle) {
return (TdUcs4*) &haystack[i];
}
}
return NULL;
}
char *strtolower(char *dst, const char *src) { char *strtolower(char *dst, const char *src) {
int32_t esc = 0; int32_t esc = 0;
char quote = 0, *p = dst, c; char quote = 0, *p = dst, c;
...@@ -432,3 +442,17 @@ size_t tstrncspn(const char *str, size_t size, const char *reject, size_t rsize) ...@@ -432,3 +442,17 @@ size_t tstrncspn(const char *str, size_t size, const char *reject, size_t rsize)
return size; return size;
} }
size_t twcsncspn(const TdUcs4 *wcs, size_t size, const TdUcs4 *reject, size_t rsize) {
if (rsize == 0 || rsize == 1) {
TdUcs4* p = wcsnchr(wcs, reject[0], size);
return (p == NULL)? size:(p-wcs);
}
size_t index = 0;
while ((index < size) && (wcsnchr(reject, wcs[index], rsize) == NULL)) {
++index;
}
return index;
}
...@@ -61,6 +61,21 @@ TEST(utilTest, wchar_pattern_match_test) { ...@@ -61,6 +61,21 @@ TEST(utilTest, wchar_pattern_match_test) {
const TdWchar* str9 = L"6_66"; const TdWchar* str9 = L"6_66";
ret = wcsPatternMatch(reinterpret_cast<const TdUcs4*>(pattern9), 6, reinterpret_cast<const TdUcs4*>(str9), wcslen(str9), &pInfo); ret = wcsPatternMatch(reinterpret_cast<const TdUcs4*>(pattern9), 6, reinterpret_cast<const TdUcs4*>(str9), wcslen(str9), &pInfo);
ASSERT_EQ(ret, TSDB_PATTERN_MATCH); ASSERT_EQ(ret, TSDB_PATTERN_MATCH);
const TdWchar* pattern10 = L"%";
const TdWchar* str10 = L"";
ret = wcsPatternMatch(reinterpret_cast<const TdUcs4*>(pattern10), 1, reinterpret_cast<const TdUcs4*>(str10), 0, &pInfo);
ASSERT_EQ(ret, TSDB_PATTERN_MATCH);
const TdWchar* pattern11 = L"china%";
const TdWchar* str11 = L"CHI ";
ret = wcsPatternMatch(reinterpret_cast<const TdUcs4*>(pattern11), 6, reinterpret_cast<const TdUcs4*>(str11), 3, &pInfo);
ASSERT_EQ(ret, TSDB_PATTERN_NOMATCH);
const TdWchar* pattern12 = L"abc%";
const TdWchar* str12 = L"";
ret = wcsPatternMatch(reinterpret_cast<const TdUcs4*>(pattern12), 4, reinterpret_cast<const TdUcs4*>(str12), 0, &pInfo);
ASSERT_EQ(ret, TSDB_PATTERN_NOMATCH);
} }
TEST(utilTest, wchar_pattern_match_no_terminated) { TEST(utilTest, wchar_pattern_match_no_terminated) {
...@@ -174,6 +189,21 @@ TEST(utilTest, char_pattern_match_test) { ...@@ -174,6 +189,21 @@ TEST(utilTest, char_pattern_match_test) {
const char* str9 = "6_6"; const char* str9 = "6_6";
ret = patternMatch(pattern9, 5, str9, strlen(str9), &pInfo); ret = patternMatch(pattern9, 5, str9, strlen(str9), &pInfo);
ASSERT_EQ(ret, TSDB_PATTERN_MATCH); ASSERT_EQ(ret, TSDB_PATTERN_MATCH);
const char* pattern10 = "%";
const char* str10 = " ";
ret = patternMatch(pattern10, 1, str10, 0, &pInfo);
ASSERT_EQ(ret, TSDB_PATTERN_MATCH);
const char* pattern11 = "china%";
const char* str11 = "abc ";
ret = patternMatch(pattern11, 6, str11, 3, &pInfo);
ASSERT_EQ(ret, TSDB_PATTERN_NOMATCH);
const char* pattern12 = "abc%";
const char* str12 = NULL;
ret = patternMatch(pattern12, 4, str12, 0, &pInfo);
ASSERT_EQ(ret, TSDB_PATTERN_NOMATCH);
} }
TEST(utilTest, char_pattern_match_no_terminated) { TEST(utilTest, char_pattern_match_no_terminated) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册