From 5a3ce3c46363ef4a779b1bf85381983c3401ed02 Mon Sep 17 00:00:00 2001 From: James Cor Date: Mon, 9 Jun 2025 10:26:22 -0700 Subject: [PATCH 1/2] fix text storage for left and instr function --- enginetest/memory_engine_test.go | 2 +- enginetest/queries/script_queries.go | 29 +++++++++++++++++++++ sql/expression/function/substring.go | 38 +++++++++++++++++++++++++++- 3 files changed, 67 insertions(+), 2 deletions(-) diff --git a/enginetest/memory_engine_test.go b/enginetest/memory_engine_test.go index cb5455eed8..ae8994fb7a 100644 --- a/enginetest/memory_engine_test.go +++ b/enginetest/memory_engine_test.go @@ -226,7 +226,7 @@ func TestSingleScript(t *testing.T) { for _, test := range scripts { harness := enginetest.NewMemoryHarness("", 1, testNumPartitions, true, nil) - harness.UseServer() + //harness.UseServer() engine, err := harness.NewEngine(t) if err != nil { panic(err) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index 1123a5b546..ed83e94002 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -8684,6 +8684,35 @@ where }, }, }, + { + // This is a script test here because every table in the harness setup data is in all lowercase + Name: "substring function tests with wrappers", + Dialect: "mysql", + SetUpScript: []string{ + "create table tbl (t text);", + "insert into tbl values ('abcdef');", + }, + Assertions: []ScriptTestAssertion{ + { + Query: "select left(t, 3) from tbl;", + Expected: []sql.Row{ + {"abc"}, + }, + }, + { + Query: "select right(t, 3) from tbl;", + Expected: []sql.Row{ + {"def"}, + }, + }, + { + Query: "select instr(t, 'bcd') from tbl;", + Expected: []sql.Row{ + {2}, + }, + }, + }, + }, } var SpatialScriptTests = []ScriptTest{ diff --git a/sql/expression/function/substring.go b/sql/expression/function/substring.go index 36189e10c8..19a51a46f0 100644 --- a/sql/expression/function/substring.go +++ b/sql/expression/function/substring.go @@ -349,8 +349,20 @@ func (l Left) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { switch str := str.(type) { case string: text = []rune(str) + case sql.StringWrapper: + s, err := str.Unwrap(ctx) + if err != nil { + return nil, err + } + text = []rune(s) case []byte: text = []rune(string(str)) + case sql.BytesWrapper: + b, err := str.Unwrap(ctx) + if err != nil { + return nil, err + } + text = []rune(string(b)) case nil: return nil, nil default: @@ -583,8 +595,20 @@ func (i Instr) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { switch str := str.(type) { case string: text = []rune(str) + case sql.StringWrapper: + s, err := str.Unwrap(ctx) + if err != nil { + return nil, err + } + text = []rune(s) case []byte: text = []rune(string(str)) + case sql.BytesWrapper: + s, err := str.Unwrap(ctx) + if err != nil { + return nil, err + } + text = []rune(string(s)) case nil: return nil, nil default: @@ -600,8 +624,20 @@ func (i Instr) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { switch substr := substr.(type) { case string: subtext = []rune(substr) + case sql.StringWrapper: + s, err := substr.Unwrap(ctx) + if err != nil { + return nil, err + } + text = []rune(s) case []byte: - subtext = []rune(string(subtext)) + subtext = []rune(string(substr)) + case sql.BytesWrapper: + s, err := substr.Unwrap(ctx) + if err != nil { + return nil, err + } + subtext = []rune(string(s)) case nil: return nil, nil default: From 63d72382372c0efe25b340840f498c2ae1a8091b Mon Sep 17 00:00:00 2001 From: James Cor Date: Mon, 9 Jun 2025 10:51:48 -0700 Subject: [PATCH 2/2] remove comment --- enginetest/queries/script_queries.go | 1 - 1 file changed, 1 deletion(-) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index ed83e94002..3f06760c67 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -8685,7 +8685,6 @@ where }, }, { - // This is a script test here because every table in the harness setup data is in all lowercase Name: "substring function tests with wrappers", Dialect: "mysql", SetUpScript: []string{