37 if (
'A' <= c && c <=
'Z') {
38 return 'a' + (c -
'A');
44 const int32_t str_len,
46 const int32_t pat_len) {
48 int search_len = str_len - pat_len + 1;
49 for (i = 0; i < search_len; ++
i) {
50 for (j = 0; j < pat_len && pattern[
j] == str[j +
i]; ++
j) {
60 const int32_t str_len,
62 const int32_t pat_len) {
64 int search_len = str_len - pat_len + 1;
65 for (i = 0; i < search_len; ++
i) {
66 for (j = 0; j < pat_len && pattern[
j] ==
lowercase(str[j + i]); ++
j) {
75 #define STR_LIKE_SIMPLE_NULLABLE(base_func) \
76 extern "C" DEVICE int8_t base_func##_nullable(const char* lhs, \
77 const int32_t lhs_len, \
79 const int32_t rhs_len, \
80 const int8_t bool_null) { \
84 return base_func(lhs, lhs_len, rhs, rhs_len) ? 1 : 0; \
90 #undef STR_LIKE_SIMPLE_NULLABLE
95 const int32_t str_len,
97 const int32_t pat_len,
98 const char escape_char,
99 const bool is_ilike) {
102 const char* p = pattern;
105 while (slen > 0 && plen > 0) {
106 if (*p == escape_char) {
113 if ((!is_ilike && *s != *p) || (is_ilike &&
lowercase(*s) != *p)) {
116 }
else if (*p ==
'%') {
124 }
else if (*p ==
'_') {
139 if (*p == escape_char) {
150 if (firstpat ==
'[' && *p != escape_char) {
151 const char* pp = p + 1;
152 int pplen = plen - 1;
153 while (pplen > 0 && *pp !=
']') {
154 if ((!is_ilike && *s == *pp) || (is_ilike &&
lowercase(*s) == *pp)) {
164 }
else if ((!is_ilike && *s == firstpat) ||
165 (is_ilike &&
lowercase(*s) == firstpat)) {
178 }
else if (*p ==
'_') {
184 }
else if (*p ==
'[') {
185 const char* pp = p + 1;
186 int pplen = plen - 1;
188 while (pplen > 0 && *pp !=
']') {
189 if ((!is_ilike && *s == *pp) || (is_ilike &&
lowercase(*s) == *pp)) {
201 for (x = pp + 1; *x !=
']' && pplen > 0; x++, pplen--) {
213 }
else if ((!is_ilike && *s != *p) || (is_ilike &&
lowercase(*s) != *p)) {
224 while (plen > 0 && *p ==
'%') {
247 const int32_t str_len,
249 const int32_t pat_len,
250 const char escape_char) {
258 const int32_t str_len,
260 const int32_t pat_len,
261 const char escape_char) {
269 const int32_t s1_len,
271 const int32_t s2_len) {
272 const char* s1_ = s1;
273 const char* s2_ = s2;
275 while (s1_ < s1 + s1_len && s2_ < s2 + s2_len && *s1_ == *s2_) {
280 unsigned char c1 = (s1_ < s1 + s1_len) ? (*(
unsigned char*)s1_) : 0;
281 unsigned char c2 = (s2_ < s2 + s2_len) ? (*(
unsigned char*)s2_) : 0;
286 #define STR_LIKE_NULLABLE(base_func) \
287 extern "C" DEVICE int8_t base_func##_nullable(const char* lhs, \
288 const int32_t lhs_len, \
290 const int32_t rhs_len, \
291 const char escape_char, \
292 const int8_t bool_null) { \
293 if (!lhs || !rhs) { \
296 return base_func(lhs, lhs_len, rhs, rhs_len, escape_char) ? 1 : 0; \
302 #undef STR_LIKE_NULLABLE
305 const int32_t lhs_len,
307 const int32_t rhs_len) {
312 const int32_t lhs_len,
314 const int32_t rhs_len) {
319 const int32_t lhs_len,
321 const int32_t rhs_len) {
326 const int32_t lhs_len,
328 const int32_t rhs_len) {
333 const int32_t lhs_len,
335 const int32_t rhs_len) {
340 const int32_t lhs_len,
342 const int32_t rhs_len) {
346 #define STR_CMP_NULLABLE(base_func) \
347 extern "C" DEVICE int8_t base_func##_nullable(const char* lhs, \
348 const int32_t lhs_len, \
350 const int32_t rhs_len, \
351 const int8_t bool_null) { \
352 if (!lhs || !rhs) { \
355 return base_func(lhs, lhs_len, rhs, rhs_len) ? 1 : 0; \
365 #undef STR_CMP_NULLABLE
DEVICE bool string_ge(const char *lhs, const int32_t lhs_len, const char *rhs, const int32_t rhs_len)
DEVICE bool string_gt(const char *lhs, const int32_t lhs_len, const char *rhs, const int32_t rhs_len)
DEVICE bool string_eq(const char *lhs, const int32_t lhs_len, const char *rhs, const int32_t rhs_len)
DEVICE bool string_le(const char *lhs, const int32_t lhs_len, const char *rhs, const int32_t rhs_len)
DEVICE bool string_lt(const char *lhs, const int32_t lhs_len, const char *rhs, const int32_t rhs_len)
#define STR_LIKE_NULLABLE(base_func)
#define STR_LIKE_SIMPLE_NULLABLE(base_func)
DEVICE bool string_ilike(const char *str, const int32_t str_len, const char *pattern, const int32_t pat_len, const char escape_char)
static DEVICE LikeStatus string_like_match(const char *str, const int32_t str_len, const char *pattern, const int32_t pat_len, const char escape_char, const bool is_ilike)
static DEVICE int lowercase(char c)
DEVICE bool string_like(const char *str, const int32_t str_len, const char *pattern, const int32_t pat_len, const char escape_char)
DEVICE bool string_ilike_simple(const char *str, const int32_t str_len, const char *pattern, const int32_t pat_len)
Functions to support the LIKE and ILIKE operator in SQL. Only single-byte character set is supported ...
DEVICE int32_t StringCompare(const char *s1, const int32_t s1_len, const char *s2, const int32_t s2_len)
#define STR_CMP_NULLABLE(base_func)
DEVICE bool string_like_simple(const char *str, const int32_t str_len, const char *pattern, const int32_t pat_len)
DEVICE bool string_ne(const char *lhs, const int32_t lhs_len, const char *rhs, const int32_t rhs_len)