1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-08-07 03:22:57 +03:00

MCOL-4417 Non-equality comparison operators do not work well with NOPAD collations

This commit is contained in:
Alexander Barkov
2020-12-01 13:22:26 +04:00
parent 03eac56d55
commit 4f6b6a8871

View File

@@ -58,22 +58,22 @@ inline bool PrimitiveProcessor::compare(int cmp, uint8_t COP, int len1, int len2
return false; return false;
case COMPARE_LT: case COMPARE_LT:
return (cmp < 0 || (cmp == 0 && len1 < len2)); return cmp < 0;
case COMPARE_EQ: case COMPARE_EQ:
return (cmp == 0 && len1 == len2 ? true : false); return cmp == 0;
case COMPARE_LE: case COMPARE_LE:
return (cmp < 0 || (cmp == 0 && len1 <= len2)); return cmp <= 0;
case COMPARE_GT: case COMPARE_GT:
return (cmp > 0 || (cmp == 0 && len1 > len2)); return cmp > 0;
case COMPARE_NE: case COMPARE_NE:
return (cmp != 0 || len1 != len2 ? true : false); return cmp != 0;
case COMPARE_GE: case COMPARE_GE:
return (cmp > 0 || (cmp == 0 && len1 >= len2)); return cmp >= 0;
case COMPARE_LIKE: case COMPARE_LIKE:
return cmp; // is done elsewhere; shouldn't get here. Exception? return cmp; // is done elsewhere; shouldn't get here. Exception?
@@ -213,7 +213,7 @@ void PrimitiveProcessor::p_TokenByScan(const TokenByScanRequestHeader* h,
} }
else else
{ {
tmp = cs->strnncoll(sig, siglen, args->data, args->len); tmp = cs->strnncollsp(sig, siglen, args->data, args->len);
cmpResult = compare(tmp, h->COP1, siglen, args->len); cmpResult = compare(tmp, h->COP1, siglen, args->len);
} }
@@ -254,7 +254,7 @@ void PrimitiveProcessor::p_TokenByScan(const TokenByScanRequestHeader* h,
else else
{ {
tmp = cs->strnncoll(sig, siglen, args->data, args->len); tmp = cs->strnncollsp(sig, siglen, args->data, args->len);
cmpResult = compare(tmp, h->COP2, siglen, args->len); cmpResult = compare(tmp, h->COP2, siglen, args->len);
} }
@@ -282,7 +282,7 @@ void PrimitiveProcessor::p_TokenByScan(const TokenByScanRequestHeader* h,
else else
{ {
tmp = cs->strnncoll(sig, siglen, args->data, args->len); tmp = cs->strnncollsp(sig, siglen, args->data, args->len);
cmpResult = compare(tmp, h->COP2, siglen, args->len); cmpResult = compare(tmp, h->COP2, siglen, args->len);
} }
@@ -704,7 +704,7 @@ void PrimitiveProcessor::p_Dictionary(const DictInput* in,
// len == 0 indicates this is the first pass // len == 0 indicates this is the first pass
if (max.len != 0) if (max.len != 0)
{ {
tmp = cs->strnncoll(sigptr.data, sigptr.len, max.data, max.len); tmp = cs->strnncollsp(sigptr.data, sigptr.len, max.data, max.len);
if (tmp > 0) if (tmp > 0)
max = sigptr; max = sigptr;
@@ -714,7 +714,7 @@ void PrimitiveProcessor::p_Dictionary(const DictInput* in,
if (min.len != 0) if (min.len != 0)
{ {
tmp = cs->strnncoll(sigptr.data, sigptr.len, min.data, min.len); tmp = cs->strnncollsp(sigptr.data, sigptr.len, min.data, min.len);
if (tmp < 0) if (tmp < 0)
min = sigptr; min = sigptr;
@@ -757,7 +757,7 @@ void PrimitiveProcessor::p_Dictionary(const DictInput* in,
} }
else else
{ {
tmp = cs->strnncoll(sigptr.data, sigptr.len, filter->data, filter->len); tmp = cs->strnncollsp(sigptr.data, sigptr.len, filter->data, filter->len);
cmpResult = compare(tmp, filter->COP, sigptr.len, filter->len); cmpResult = compare(tmp, filter->COP, sigptr.len, filter->len);
} }