in velox/functions/lib/Re2Functions.cpp [128:183]
std::string likePatternToRe2(
StringView pattern,
std::optional<char> escapeChar,
bool& validPattern) {
std::string regex;
validPattern = true;
regex.reserve(pattern.size() * 2);
regex.append("^");
bool escaped = false;
for (const char c : pattern) {
if (escaped && !(c == '%' || c == '_' || c == escapeChar)) {
validPattern = false;
}
if (!escaped && c == escapeChar) {
escaped = true;
} else {
switch (c) {
case '%':
regex.append(escaped ? "%" : ".*");
escaped = false;
break;
case '_':
regex.append(escaped ? "_" : ".");
escaped = false;
break;
// Escape all the meta characters in re2
case '\\':
case '|':
case '^':
case '$':
case '.':
case '*':
case '+':
case '?':
case '(':
case ')':
case '[':
case ']':
case '{':
case '}':
regex.append("\\");
// Append the meta character after the escape. Note: The fallthrough is
// intentional.
default:
regex.append(1, c);
escaped = false;
}
}
}
if (escaped) {
validPattern = false;
}
regex.append("$");
return regex;
}