diff --git a/expression/expr_to_pb_test.go b/expression/expr_to_pb_test.go index 6b1e7c11d05da..5b5a90ed966be 100644 --- a/expression/expr_to_pb_test.go +++ b/expression/expr_to_pb_test.go @@ -1078,6 +1078,11 @@ func TestExprPushDownToFlash(t *testing.T) { require.NoError(t, err) exprs = append(exprs, function) + // regexp_instr: supported + function, err = NewFunction(mock.NewContext(), ast.RegexpInStr, types.NewFieldType(mysql.TypeLonglong), stringColumn, stringColumn, intColumn, 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 765d121997040..c7e50764910f9 100644 --- a/expression/expression.go +++ b/expression/expression.go @@ -1165,7 +1165,7 @@ func scalarExprSupportedByFlash(function *ScalarFunction) bool { return false } return true - case ast.Regexp, ast.RegexpLike: + case ast.Regexp, ast.RegexpLike, ast.RegexpInStr: 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 ba56a9ff02e07..c5e91a6a2eda1 100644 --- a/planner/core/integration_test.go +++ b/planner/core/integration_test.go @@ -7417,6 +7417,39 @@ func TestEltPushDownToTiFlash(t *testing.T) { tk.MustQuery("explain select elt(a, b) from t;").CheckAt([]int{0, 2, 4}, rows) } +func TestRegexpInstrPushDownToTiFlash(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), pos int, occur int, ret_op int, match_type varchar(30));") + tk.MustExec("insert into test.t values ('123', '12.', 1, 1, 0, ''), ('aBb', 'bb', 1, 1, 0, 'i'), ('ab\nabc', '^abc$', 1, 1, 0, '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_instr(test.t.expr, test.t.pattern, 1, 1, 0, test.t.match_type)->Column#8"}, + {" └─TableFullScan_7", "mpp[tiflash]", "keep order:false, stats:pseudo"}, + } + tk.MustQuery("explain select regexp_instr(expr, pattern, 1, 1, 0, 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)