summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibSQL
diff options
context:
space:
mode:
authormnlrsn <mortennorby@gmail.com>2022-01-22 15:43:30 +0100
committerAli Mohammad Pur <Ali.mpfard@gmail.com>2022-01-23 22:34:53 +0330
commit66216d3af682328ca0a019d93ec988b3b6e40ab7 (patch)
tree57c8f4122e2b566a2e8c145d9cc94a70a1df9a55 /Userland/Libraries/LibSQL
parentace36681ffa50ef994244fed13dcae859e96f076 (diff)
downloadserenity-66216d3af682328ca0a019d93ec988b3b6e40ab7.zip
LibSQL: Add simple REGEXP match
The implementation of LIKE uses regexes under the hood, and this implementation of REGEXP takes the same approach. It employs PosixExtended from LibRegex with case insensitive and Unicode flags set. The implementation of LIKE is based on SQLlite specs, but SQLlite does not offer directions for a built-in regex functionality, so this one uses LibRegex.
Diffstat (limited to 'Userland/Libraries/LibSQL')
-rw-r--r--Userland/Libraries/LibSQL/AST/Expression.cpp19
1 files changed, 18 insertions, 1 deletions
diff --git a/Userland/Libraries/LibSQL/AST/Expression.cpp b/Userland/Libraries/LibSQL/AST/Expression.cpp
index ad189c5eb6..5fe0fc670e 100644
--- a/Userland/Libraries/LibSQL/AST/Expression.cpp
+++ b/Userland/Libraries/LibSQL/AST/Expression.cpp
@@ -242,9 +242,26 @@ Value MatchExpression::evaluate(ExecutionContext& context) const
auto result = regex.match(lhs_value.to_string(), PosixFlags::Insensitive | PosixFlags::Unicode);
return Value(invert_expression() ? !result.success : result.success);
}
+ case MatchOperator::Regexp: {
+ Value lhs_value = lhs()->evaluate(context);
+ Value rhs_value = rhs()->evaluate(context);
+
+ auto regex = Regex<PosixExtended>(rhs_value.to_string());
+ auto err = regex.parser_result.error;
+ if (err != regex::Error::NoError) {
+ StringBuilder builder;
+ builder.append("Regular expression: ");
+ builder.append(get_error_string(err));
+
+ context.result->set_error(SQLErrorCode::SyntaxError, builder.build());
+ return Value(false);
+ }
+
+ auto result = regex.match(lhs_value.to_string(), PosixFlags::Insensitive | PosixFlags::Unicode);
+ return Value(invert_expression() ? !result.success : result.success);
+ }
case MatchOperator::Glob:
case MatchOperator::Match:
- case MatchOperator::Regexp:
default:
VERIFY_NOT_REACHED();
}