You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by yi...@apache.org on 2023/06/02 05:53:03 UTC
[doris] branch master updated: [fix](olap) deletion statement with space conditions did not take effect (#20349)
This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 8ff8705b3f [fix](olap) deletion statement with space conditions did not take effect (#20349)
8ff8705b3f is described below
commit 8ff8705b3fe068878428184074f846db4d17c8f2
Author: Jerry Hu <mr...@gmail.com>
AuthorDate: Fri Jun 2 13:52:57 2023 +0800
[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.
---
be/src/olap/delete_handler.cpp | 10 ++--
be/test/olap/delete_handler_test.cpp | 40 +++++++++++++--
regression-test/data/delete_p0/test_delete.out | 45 +++++++++++++++++
.../suites/delete_p0/test_delete.groovy | 59 ++++++++++++++++++++++
4 files changed, 146 insertions(+), 8 deletions(-)
diff --git a/be/src/olap/delete_handler.cpp b/be/src/olap/delete_handler.cpp
index 9beafe634f..7356512315 100644
--- a/be/src/olap/delete_handler.cpp
+++ b/be/src/olap/delete_handler.cpp
@@ -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;
}
diff --git a/be/test/olap/delete_handler_test.cpp b/be/test/olap/delete_handler_test.cpp
index 588884cc46..9f51e2976e 100644
--- a/be/test/olap/delete_handler_test.cpp
+++ b/be/test/olap/delete_handler_test.cpp
@@ -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;
diff --git a/regression-test/data/delete_p0/test_delete.out b/regression-test/data/delete_p0/test_delete.out
index 30765c79b8..a58fbf8a09 100644
--- a/regression-test/data/delete_p0/test_delete.out
+++ b/regression-test/data/delete_p0/test_delete.out
@@ -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
+
diff --git a/regression-test/suites/delete_p0/test_delete.groovy b/regression-test/suites/delete_p0/test_delete.groovy
index ff3c9b0fbe..c0eda6e787 100644
--- a/regression-test/suites/delete_p0/test_delete.groovy
+++ b/regression-test/suites/delete_p0/test_delete.groovy
@@ -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;
+ """
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org