[fix](olap) deletion statement with space conditions did not take effect (#20349)

Deletion statement like this:

delete from tb where k1 = '  ';
The rows whose k1's value is ' ' will not be deleted.
This commit is contained in:
Jerry Hu
2023-06-02 13:52:57 +08:00
committed by GitHub
parent a869056567
commit 8ff8705b3f
4 changed files with 146 additions and 8 deletions

View File

@ -110,7 +110,7 @@ std::string DeleteHandler::construct_sub_predicates(const TCondition& condition)
} else if (op == "!*=") {
op = "!=";
}
condition_str = condition.column_name + op + condition.condition_values[0];
condition_str = condition.column_name + op + "'" + condition.condition_values[0] + "'";
}
return condition_str;
}
@ -218,7 +218,7 @@ bool DeleteHandler::_parse_condition(const std::string& condition_str, TConditio
// group2: ((?:=)|(?:!=)|(?:>>)|(?:<<)|(?:>=)|(?:<=)|(?:\*=)|(?:IS)) matches "="
// group3: ((?:[\s\S]+)?) matches "1597751948193618247 and length(source)<1;\n;\n"
const char* const CONDITION_STR_PATTERN =
R"((\w+)\s*((?:=)|(?:!=)|(?:>>)|(?:<<)|(?:>=)|(?:<=)|(?:\*=)|(?:IS))\s*((?:[\s\S]+)?))";
R"((\w+)\s*((?:=)|(?:!=)|(?:>>)|(?:<<)|(?:>=)|(?:<=)|(?:\*=)|(?:IS))\s*('((?:[\s\S]+)?)'|(?:[\s\S]+)?))";
regex ex(CONDITION_STR_PATTERN);
if (regex_match(condition_str, what, ex)) {
if (condition_str.size() != what[0].str().size()) {
@ -238,7 +238,11 @@ bool DeleteHandler::_parse_condition(const std::string& condition_str, TConditio
}
condition->column_name = what[1].str();
condition->condition_op = what[2].str();
condition->condition_values.push_back(what[3].str());
if (what[4].matched) { // match string with single quotes, eg. a = 'b'
condition->condition_values.push_back(what[4].str());
} else { // match string without quote, compat with old conditions, eg. a = b
condition->condition_values.push_back(what[3].str());
}
return true;
}

View File

@ -366,12 +366,12 @@ TEST_F(TestDeleteConditionHandler, StoreCondSucceed) {
// 验证存储在header中的过滤条件正确
EXPECT_EQ(size_t(6), del_pred.sub_predicates_size());
EXPECT_STREQ("k1=1", del_pred.sub_predicates(0).c_str());
EXPECT_STREQ("k2>>3", del_pred.sub_predicates(1).c_str());
EXPECT_STREQ("k3<=5", del_pred.sub_predicates(2).c_str());
EXPECT_STREQ("k1='1'", del_pred.sub_predicates(0).c_str());
EXPECT_STREQ("k2>>'3'", del_pred.sub_predicates(1).c_str());
EXPECT_STREQ("k3<='5'", del_pred.sub_predicates(2).c_str());
EXPECT_STREQ("k4 IS NULL", del_pred.sub_predicates(3).c_str());
EXPECT_STREQ("k5=7", del_pred.sub_predicates(4).c_str());
EXPECT_STREQ("k12!=9", del_pred.sub_predicates(5).c_str());
EXPECT_STREQ("k5='7'", del_pred.sub_predicates(4).c_str());
EXPECT_STREQ("k12!='9'", del_pred.sub_predicates(5).c_str());
EXPECT_EQ(size_t(1), del_pred.in_predicates_size());
EXPECT_FALSE(del_pred.in_predicates(0).is_not_in());
@ -899,6 +899,36 @@ protected:
std::string _json_rowset_meta;
};
TEST_F(TestDeleteHandler, ValueWithQuote) {
DeletePredicatePB del_predicate;
del_predicate.add_sub_predicates("k1='b'");
del_predicate.add_sub_predicates("k1='b");
del_predicate.add_sub_predicates("k1=b'");
del_predicate.add_sub_predicates("k1=''b'");
del_predicate.add_sub_predicates("k1='b''");
del_predicate.add_sub_predicates("k1=''b''");
del_predicate.set_version(2);
add_delete_predicate(del_predicate, 2);
auto res = _delete_handler.init(tablet->tablet_schema(), tablet->delete_predicates(), 5);
EXPECT_EQ(Status::OK(), res);
_delete_handler.finalize();
}
TEST_F(TestDeleteHandler, ValueWithoutQuote) {
DeletePredicatePB del_predicate;
del_predicate.add_sub_predicates("k1=b");
del_predicate.add_sub_predicates("k2=123");
del_predicate.set_version(2);
add_delete_predicate(del_predicate, 2);
auto res = _delete_handler.init(tablet->tablet_schema(), tablet->delete_predicates(), 5);
EXPECT_EQ(Status::OK(), res);
_delete_handler.finalize();
}
TEST_F(TestDeleteHandler, InitSuccess) {
Status res;
std::vector<TCondition> conditions;

View File

@ -45,3 +45,48 @@ abcdef 2022-08-12 2022-08-16T12:11:11 2022-08-16T12:11:11.111 2022-08-12 2022-08
-- !sql10 --
-- !check_data --
1
2
3
4
abc 5
'd 6
'e' 7
f' 8
-- !check_data2 --
1
3
4
abc 5
'd 6
'e' 7
f' 8
-- !check_data3 --
1
3
abc 5
'd 6
'e' 7
f' 8
-- !check_data4 --
1
3
abc 5
'e' 7
f' 8
-- !check_data5 --
1
3
abc 5
f' 8
-- !check_data6 --
1
3
abc 5

View File

@ -118,4 +118,63 @@ suite("test_delete") {
qt_sql9 """select * from tb_test1;"""
sql """ delete from tb_test1 where DT = '20221001'; """
qt_sql10 """select * from tb_test1;"""
sql """ DROP TABLE IF EXISTS delete_test_tb """
sql """
CREATE TABLE `delete_test_tb` (
`k1` varchar(30) NULL,
`v1` varchar(30) NULL
)
UNIQUE KEY(`k1`)
DISTRIBUTED BY HASH(`k1`) BUCKETS 4
PROPERTIES
(
"replication_num" = "1"
);
"""
sql """
insert into delete_test_tb values
(' ', '1'), (' ', '2'), (' ', '3'), (' ', '4'),
('abc', '5'), ("'d", '6'), ("'e'", '7'), ("f'", '8');
"""
qt_check_data """
select k1, v1 from delete_test_tb order by v1;
"""
sql """
delete from delete_test_tb where k1 = ' ';
"""
qt_check_data2 """
select k1, v1 from delete_test_tb order by v1;
"""
sql """
delete from delete_test_tb where k1 = ' ';
"""
qt_check_data3 """
select k1, v1 from delete_test_tb order by v1;
"""
sql """
delete from delete_test_tb where k1 = "'d";
"""
qt_check_data4 """
select k1, v1 from delete_test_tb order by v1;
"""
sql """
delete from delete_test_tb where k1 = "'e'";
"""
qt_check_data5 """
select k1, v1 from delete_test_tb order by v1;
"""
sql """
delete from delete_test_tb where k1 = "f'";
"""
qt_check_data6 """
select k1, v1 from delete_test_tb order by v1;
"""
}