Skip to content

Commit 42115e6

Browse files
authoredApr 11, 2024··
[BugFix] Fix the concurrency bug of str_to_map (StarRocks#43901)
Signed-off-by: trueeyu <[email protected]>
1 parent e79cbdd commit 42115e6

File tree

5 files changed

+29
-3
lines changed

5 files changed

+29
-3
lines changed
 

‎be/src/exprs/str_to_map.cpp

+8-2
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,20 @@ StatusOr<ColumnPtr> StringFunctions::str_to_map(FunctionContext* context, const
3636

3737
// split first
3838
Columns split_columns{columns[0], columns[1]};
39-
RETURN_IF_ERROR(StringFunctions::split_prepare(context, FunctionContext::FRAGMENT_LOCAL));
4039
ASSIGN_OR_RETURN(auto splited, StringFunctions::split(context, split_columns));
41-
RETURN_IF_ERROR(StringFunctions::split_close(context, FunctionContext::FRAGMENT_LOCAL));
4240

4341
Columns splited_columns{splited, columns[2]};
4442
return str_to_map_v1(context, splited_columns);
4543
}
4644

45+
Status StringFunctions::str_to_map_prepare(FunctionContext* context, FunctionContext::FunctionStateScope scope) {
46+
return StringFunctions::split_prepare(context, FunctionContext::FRAGMENT_LOCAL);
47+
}
48+
49+
Status StringFunctions::str_to_map_close(FunctionContext* context, FunctionContext::FunctionStateScope scope) {
50+
return StringFunctions::split_close(context, FunctionContext::FRAGMENT_LOCAL);
51+
}
52+
4753
/**
4854
* @param: [array_string, delimiter]
4955
* @paramType: [ArrayBinaryColumn, BinaryColumn]

‎be/src/exprs/string_functions.h

+2
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,8 @@ class StringFunctions {
356356
* @return: MapColumn map<string,string>
357357
*/
358358
DEFINE_VECTORIZED_FN(str_to_map);
359+
static Status str_to_map_prepare(FunctionContext* context, FunctionContext::FunctionStateScope scope);
360+
static Status str_to_map_close(FunctionContext* context, FunctionContext::FunctionStateScope scope);
359361

360362
/**
361363
* @param: [string_value, delimiter, field]

‎gensrc/script/functions.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@
328328
[30316, 'str_to_map', True, False, 'MAP_VARCHAR_VARCHAR', ['ARRAY_VARCHAR', 'VARCHAR'],
329329
'StringFunctions::str_to_map_v1'],
330330
[30317, 'str_to_map', True, False, 'MAP_VARCHAR_VARCHAR', ['VARCHAR', 'VARCHAR', 'VARCHAR'],
331-
'StringFunctions::str_to_map'],
331+
'StringFunctions::str_to_map', 'StringFunctions::str_to_map_prepare', 'StringFunctions::str_to_map_close'],
332332

333333
[30320, 'regexp_extract', True, False, 'VARCHAR', ['VARCHAR', 'VARCHAR', 'BIGINT'],
334334
'StringFunctions::regexp_extract',
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
-- name: test_str_to_map
2+
CREATE TABLE t1(c1 INT, c2 STRING) DUPLICATE KEY(c1) DISTRIBUTED BY HASH(c1) BUCKETS 20;
3+
-- result:
4+
-- !result
5+
insert into t1 select generate_series, generate_series from TABLE(generate_series(1, 10000));
6+
-- result:
7+
-- !result
8+
select sum(cardinality(str_to_map(c2, ",", ":"))) from t1;
9+
-- result:
10+
10000
11+
-- !result
+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
-- name: test_str_to_map
2+
3+
CREATE TABLE t1(c1 INT, c2 STRING) DUPLICATE KEY(c1) DISTRIBUTED BY HASH(c1) BUCKETS 20;
4+
5+
insert into t1 select generate_series, generate_series from TABLE(generate_series(1, 10000));
6+
7+
select sum(cardinality(str_to_map(c2, ",", ":"))) from t1;

0 commit comments

Comments
 (0)
Please sign in to comment.