1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-18 19:05:06 +00:00

LibSQL: Properly parse ESCAPE expressions

The evaluation order of method parameters is unspecified in C++, and
so we couldn't rely on parse_statement() being called before
parse_escape() when building a MatchExpression.

With this patch, we explicitly parse what we need in the right order,
before building the MatchExpression object.
This commit is contained in:
Guilherme Gonçalves 2021-12-29 11:48:09 -03:00 committed by Ali Mohammad Pur
parent d1e3470438
commit e957c078d5
2 changed files with 32 additions and 12 deletions

View file

@ -463,7 +463,7 @@ TEST_CASE(match_expression)
EXPECT(parse(builder.build()).is_error());
}
auto validate = [](StringView sql, SQL::AST::MatchOperator expected_operator, bool expected_invert_expression) {
auto validate = [](StringView sql, SQL::AST::MatchOperator expected_operator, bool expected_invert_expression, bool expect_escape) {
auto result = parse(sql);
EXPECT(!result.is_error());
@ -475,6 +475,7 @@ TEST_CASE(match_expression)
EXPECT(!is<SQL::AST::ErrorExpression>(*match.rhs()));
EXPECT_EQ(match.type(), expected_operator);
EXPECT_EQ(match.invert_expression(), expected_invert_expression);
EXPECT(match.escape() || !expect_escape);
};
for (auto op : operators) {
@ -482,13 +483,19 @@ TEST_CASE(match_expression)
builder.append("1 ");
builder.append(op.key);
builder.append(" 1");
validate(builder.build(), op.value, false);
validate(builder.build(), op.value, false, false);
builder.clear();
builder.append("1 NOT ");
builder.append(op.key);
builder.append(" 1");
validate(builder.build(), op.value, true);
validate(builder.build(), op.value, true, false);
builder.clear();
builder.append("1 NOT ");
builder.append(op.key);
builder.append(" 1 ESCAPE '+'");
validate(builder.build(), op.value, true, true);
}
}