diff options
author | mnlrsn <mortennorby@gmail.com> | 2022-01-22 15:43:30 +0100 |
---|---|---|
committer | Ali Mohammad Pur <Ali.mpfard@gmail.com> | 2022-01-23 22:34:53 +0330 |
commit | 66216d3af682328ca0a019d93ec988b3b6e40ab7 (patch) | |
tree | 57c8f4122e2b566a2e8c145d9cc94a70a1df9a55 /Userland/Libraries/LibSQL | |
parent | ace36681ffa50ef994244fed13dcae859e96f076 (diff) | |
download | serenity-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.cpp | 19 |
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(); } |