未验证 提交 4f8f083a 编写于 作者: M Minglei Jin 提交者: GitHub

Merge pull request #9149 from taosdata/fix/TS-821-dev

[TS-821]<fix>: fixed bug that 'like' worked imporperly in Windows
......@@ -183,7 +183,7 @@ bool likeOperator(SColumnFilterElem *pFilter, const char *minval, const char *ma
return patternMatch((char *)pFilter->filterInfo.pz, varDataVal(minval), varDataLen(minval), &info) == TSDB_PATTERN_MATCH;
} else if (type == TSDB_DATA_TYPE_NCHAR) {
SPatternCompareInfo info = PATTERN_COMPARE_INFO_INITIALIZER;
return WCSPatternMatch((wchar_t*)pFilter->filterInfo.pz, varDataVal(minval), varDataLen(minval)/TSDB_NCHAR_SIZE, &info) == TSDB_PATTERN_MATCH;
return WCSPatternMatch((uint32_t *) pFilter->filterInfo.pz, (uint32_t *) varDataVal(minval), varDataLen(minval)/TSDB_NCHAR_SIZE, &info) == TSDB_PATTERN_MATCH;
} else {
return false;
}
......
......@@ -44,7 +44,7 @@ typedef struct SPatternCompareInfo {
int patternMatch(const char *pattern, const char *str, size_t size, const SPatternCompareInfo *pInfo);
int WCSPatternMatch(const wchar_t *pattern, const wchar_t *str, size_t size, const SPatternCompareInfo *pInfo);
int WCSPatternMatch(const uint32_t *pattern, const uint32_t *str, size_t size, const SPatternCompareInfo *pInfo);
int32_t doCompare(const char* a, const char* b, int32_t type, size_t size);
......
......@@ -321,29 +321,94 @@ int patternMatch(const char *patterStr, const char *str, size_t size, const SPat
return (str[j] == 0 || j >= size) ? TSDB_PATTERN_MATCH : TSDB_PATTERN_NOMATCH;
}
int WCSPatternMatch(const wchar_t *patterStr, const wchar_t *str, size_t size, const SPatternCompareInfo *pInfo) {
wchar_t c, c1;
wchar_t matchOne = L'_'; // "_"
wchar_t matchAll = L'%'; // "%"
static uint32_t *
taosWcschr (const uint32_t *wcs, const uint32_t wc)
{
const uint32_t *wcs2 = wcs + 1;
if (*wcs == wc)
return (uint32_t *) wcs;
if (*wcs == L'\0')
return NULL;
do
{
wcs += 2;
if (*wcs2 == wc)
return (uint32_t *) wcs2;
if (*wcs2 == L'\0')
return NULL;
wcs2 += 2;
if (*wcs == wc)
return (uint32_t *) wcs;
if (*wcs == L'\0')
return NULL;
wcs += 2;
if (*wcs2 == wc)
return (uint32_t *) wcs2;
if (*wcs2 == L'\0')
return NULL;
wcs2 += 2;
if (*wcs == wc)
return (uint32_t *) wcs;
if (*wcs == L'\0')
return NULL;
wcs += 2;
if (*wcs2 == wc)
return (uint32_t *) wcs2;
if (*wcs2 == L'\0')
return NULL;
wcs2 += 2;
if (*wcs == wc)
return (uint32_t *) wcs;
if (*wcs == L'\0')
return NULL;
wcs += 2;
if (*wcs2 == wc)
return (uint32_t *) wcs2;
if (*wcs2 == L'\0')
return NULL;
wcs2 += 2;
if (*wcs == wc)
return (uint32_t *) wcs;
}
while (*wcs != L'\0');
return NULL;
}
static size_t
taosWcscspn (const uint32_t *wcs, const uint32_t *reject)
{
size_t count = 0;
while (*wcs != L'\0')
if (taosWcschr (reject, *wcs++) == NULL)
++count;
else
return count;
return count;
}
int WCSPatternMatch(const uint32_t *patterStr, const uint32_t *str, size_t size, const SPatternCompareInfo *pInfo) {
uint32_t c, c1;
uint32_t matchOne = (uint32_t) L'_'; // "_"
uint32_t matchAll = (uint32_t) 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;
}
}
if (c == 0) {
return TSDB_PATTERN_MATCH;
}
wchar_t accept[3] = {towupper(c), towlower(c), 0};
uint32_t accept[3] = {towupper(c), towlower(c), 0};
while (1) {
size_t n = wcscspn(str, accept);
size_t n = taosWcscspn(str, accept);
str += n;
if (str[0] == 0 || (n >= size)) {
......@@ -465,7 +530,7 @@ int32_t compareWStrPatternComp(const void* pLeft, const void* pRight) {
memcpy(pattern, varDataVal(pRight), varDataLen(pRight));
memcpy(str, varDataVal(pLeft), size * sizeof(wchar_t));
int32_t ret = WCSPatternMatch(pattern, str, size, &pInfo);
int32_t ret = WCSPatternMatch((uint32_t *)pattern, (uint32_t *)str, size, &pInfo);
free(pattern);
free(str);
......
......@@ -161,6 +161,17 @@ class TDTestCase:
tdSql.query("select * from st where tagg like 'tag\_\__\_';")
tdSql.checkData(0,0, "tag__a_")
tdSql.execute("create table stb(ts timestamp, c0 int) tags(t0 nchar(64))")
tdSql.execute("insert into tb1 using stb tags('测试ABCabc') values(now, 1)")
tdSql.query("select * from tb1 where t0 like '%试AB%'")
tdSql.checkRows(1)
tdSql.query("select * from tb1 where t0 like '测试AB%'")
tdSql.checkRows(1)
tdSql.query("select * from tb1 where t0 like '%ABCabc'")
tdSql.checkRows(1)
os.system("rm -rf ./*.py.sql")
def stop(self):
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册