From aadb36117d4ac1bf218ecdf8bfb13843bc9cd184 Mon Sep 17 00:00:00 2001 From: xzhangxian1008 Date: Tue, 3 Jan 2023 10:31:12 +0800 Subject: [PATCH] init --- expression/expr_to_pb_test.go | 5 +++++ expression/expression.go | 2 +- planner/core/integration_test.go | 33 ++++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/expression/expr_to_pb_test.go b/expression/expr_to_pb_test.go index 341c03b552804..5e78459408701 100644 --- a/expression/expr_to_pb_test.go +++ b/expression/expr_to_pb_test.go @@ -1110,6 +1110,11 @@ func TestExprPushDownToFlash(t *testing.T) { require.NoError(t, err) exprs = append(exprs, function) + // regexp_replace: supported + function, err = NewFunction(mock.NewContext(), ast.RegexpReplace, types.NewFieldType(mysql.TypeString), stringColumn, stringColumn, stringColumn, intColumn, intColumn, stringColumn) + require.NoError(t, err) + exprs = append(exprs, function) + // greatest function, err = NewFunction(mock.NewContext(), ast.Greatest, types.NewFieldType(mysql.TypeLonglong), int32Column, intColumn) require.NoError(t, err) diff --git a/expression/expression.go b/expression/expression.go index 00697c2df68ea..cc34409c92d6a 100644 --- a/expression/expression.go +++ b/expression/expression.go @@ -1171,7 +1171,7 @@ func scalarExprSupportedByFlash(function *ScalarFunction) bool { return false } return true - case ast.Regexp, ast.RegexpLike, ast.RegexpInStr, ast.RegexpSubstr: + case ast.Regexp, ast.RegexpLike, ast.RegexpInStr, ast.RegexpSubstr, ast.RegexpReplace: funcCharset, funcCollation := function.Function.CharsetAndCollation() if funcCharset == charset.CharsetBin && funcCollation == charset.CollationBin { return false diff --git a/planner/core/integration_test.go b/planner/core/integration_test.go index 307971e2d77e1..864127022f9a7 100644 --- a/planner/core/integration_test.go +++ b/planner/core/integration_test.go @@ -7483,6 +7483,39 @@ func TestRegexpSubstrPushDownToTiFlash(t *testing.T) { tk.MustQuery("explain select regexp_substr(expr, pattern, 1, 1, match_type) as res from test.t;").CheckAt([]int{0, 2, 4}, rows) } +func TestRegexpReplacePushDownToTiFlash(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists test.t;") + tk.MustExec("create table test.t (expr varchar(30), pattern varchar(30), repl varchar(30), pos int, occur int, match_type varchar(30));") + tk.MustExec("insert into test.t values ('123', '12.', '233', 1, 1, ''), ('aBb', 'bb', 'bc', 1, 1, 'i'), ('ab\nabc', '^abc$', 'd', 1, 1, 'm');") + tk.MustExec("set @@tidb_allow_mpp=1; set @@tidb_enforce_mpp=1") + tk.MustExec("set @@tidb_isolation_read_engines = 'tiflash'") + + // Create virtual tiflash replica info. + is := dom.InfoSchema() + db, exists := is.SchemaByName(model.NewCIStr("test")) + require.True(t, exists) + for _, tblInfo := range db.Tables { + if tblInfo.Name.L == "t" { + tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ + Count: 1, + Available: true, + } + } + } + + rows := [][]interface{}{ + {"TableReader_9", "root", "data:ExchangeSender_8"}, + {"└─ExchangeSender_8", "mpp[tiflash]", "ExchangeType: PassThrough"}, + {" └─Projection_4", "mpp[tiflash]", "regexp_replace(test.t.expr, test.t.pattern, test.t.repl, 1, 1, test.t.match_type)->Column#8"}, + {" └─TableFullScan_7", "mpp[tiflash]", "keep order:false, stats:pseudo"}, + } + tk.MustQuery("explain select regexp_replace(expr, pattern, repl, 1, 1, match_type) as res from test.t;").CheckAt([]int{0, 2, 4}, rows) +} + func TestCastTimeAsDurationToTiFlash(t *testing.T) { store, dom := testkit.CreateMockStoreAndDomain(t) tk := testkit.NewTestKit(t, store)