From 02234b9c0f32939d65a128ff26ca6349e53a852d Mon Sep 17 00:00:00 2001 From: Nick Tobey Date: Thu, 1 May 2025 16:18:48 -0700 Subject: [PATCH 1/4] Unwrap inputs to REGEXP_LIKE, REPLACE, and RPAD/LPAD functions. --- enginetest/engine_only_test.go | 3 ++- enginetest/enginetests.go | 2 +- enginetest/queries/queries.go | 8 ++++++ enginetest/queries/regex_queries.go | 12 +++++++++ enginetest/scriptgen/setup/scripts/tabletest | 2 +- enginetest/scriptgen/setup/setup_data.sg.go | 2 +- sql/expression/function/regexp_like.go | 19 +++++++++++--- .../function/reverse_repeat_replace.go | 25 ++++++++++++++++--- sql/expression/function/rpad_lpad.go | 14 ++++++++++- 9 files changed, 74 insertions(+), 13 deletions(-) diff --git a/enginetest/engine_only_test.go b/enginetest/engine_only_test.go index 9996e63088..7bf7f0e433 100644 --- a/enginetest/engine_only_test.go +++ b/enginetest/engine_only_test.go @@ -717,7 +717,8 @@ func TestCollationCoercion(t *testing.T) { func TestRegex(t *testing.T) { harness := enginetest.NewDefaultMemoryHarness() - harness.Setup(setup.SimpleSetup...) + setupsScripts := append(setup.SimpleSetup, queries.RegexSetup) + harness.Setup(setupsScripts...) engine, err := harness.NewEngine(t) require.NoError(t, err) defer engine.Close() diff --git a/enginetest/enginetests.go b/enginetest/enginetests.go index 46c0fea456..e1a4ff9c6b 100644 --- a/enginetest/enginetests.go +++ b/enginetest/enginetests.go @@ -3046,7 +3046,7 @@ func TestRenameColumn(t *testing.T, harness Harness) { TestQueryWithContext(t, ctx, e, harness, "ALTER TABLE mydb.tabletest RENAME COLUMN s TO i1", []sql.Row{{types.NewOkResult(0)}}, nil, nil, nil) TestQueryWithContext(t, ctx, e, harness, "SHOW FULL COLUMNS FROM mydb.tabletest", []sql.Row{ {"i", "int", nil, "NO", "PRI", nil, "", "", ""}, - {"i1", "varchar(20)", "utf8mb4_0900_bin", "NO", "", nil, "", "", ""}, + {"i1", "text", "utf8mb4_0900_bin", "NO", "", nil, "", "", ""}, }, nil, nil, nil) }) } diff --git a/enginetest/queries/queries.go b/enginetest/queries/queries.go index 468e0402ad..a8f7aa0f7d 100644 --- a/enginetest/queries/queries.go +++ b/enginetest/queries/queries.go @@ -6772,6 +6772,10 @@ SELECT * FROM cte WHERE d = 2;`, Query: "select replace(s, 'row', '') from mytable order by i", Expected: []sql.Row{{"first "}, {"second "}, {"third "}}, }, + { + Query: "select replace(s, 'row', '') from tabletest order by i", + Expected: []sql.Row{{"first "}, {"second "}, {"third "}}, + }, { Query: "select rpad(s, 13, ' ') from mytable order by i", Expected: []sql.Row{{"first row "}, {"second row "}, {"third row "}}, @@ -6780,6 +6784,10 @@ SELECT * FROM cte WHERE d = 2;`, Query: "select lpad(s, 13, ' ') from mytable order by i", Expected: []sql.Row{{" first row"}, {" second row"}, {" third row"}}, }, + { + Query: "select lpad(s, 13, ' ') from tabletest order by i", + Expected: []sql.Row{{" first row"}, {" second row"}, {" third row"}}, + }, { Query: "select sqrt(i) from mytable order by i", Expected: []sql.Row{{1.0}, {1.4142135623730951}, {1.7320508075688772}}, diff --git a/enginetest/queries/regex_queries.go b/enginetest/queries/regex_queries.go index 830ba6fd3f..66053bb758 100644 --- a/enginetest/queries/regex_queries.go +++ b/enginetest/queries/regex_queries.go @@ -21,6 +21,7 @@ package queries import ( + "github.com/dolthub/go-mysql-server/enginetest/scriptgen/setup" "gopkg.in/src-d/go-errors.v1" regex "github.com/dolthub/go-icu-regex" @@ -34,6 +35,13 @@ type RegexTest struct { ExpectedErr *errors.Kind } +var RegexSetup = []setup.SetupScript{ + { + "CREATE TABLE tests(pk int primary key, str text, pattern text, flags text);", + "INSERT INTO tests VALUES (1, 'testing', 'TESTING', 'ci');", + }, +} + var RegexTests = []RegexTest{ { Query: "SELECT REGEXP_LIKE('testing', 'TESTING');", @@ -55,6 +63,10 @@ var RegexTests = []RegexTest{ Query: "SELECT REGEXP_LIKE('testing', 'TESTING', 'ic');", Expected: []sql.Row{{0}}, }, + { + Query: "SELECT REGEXP_LIKE(str, pattern, flags) from tests;", + Expected: []sql.Row{{1}}, + }, { Query: "SELECT REGEXP_LIKE('testing', 'TESTING' COLLATE utf8mb4_0900_ai_ci);", Expected: []sql.Row{{1}}, diff --git a/enginetest/scriptgen/setup/scripts/tabletest b/enginetest/scriptgen/setup/scripts/tabletest index 3a368d2a5d..0c270f7931 100644 --- a/enginetest/scriptgen/setup/scripts/tabletest +++ b/enginetest/scriptgen/setup/scripts/tabletest @@ -1,7 +1,7 @@ exec create table tabletest ( i int primary key, - s varchar(20) not null + s text not null ) ---- diff --git a/enginetest/scriptgen/setup/setup_data.sg.go b/enginetest/scriptgen/setup/setup_data.sg.go index b7d8c8dab9..2173f99a5b 100755 --- a/enginetest/scriptgen/setup/setup_data.sg.go +++ b/enginetest/scriptgen/setup/setup_data.sg.go @@ -3251,7 +3251,7 @@ var SysbenchData = []SetupScript{{ var TabletestData = []SetupScript{{ `create table tabletest ( i int primary key, - s varchar(20) not null + s text not null )`, `insert into tabletest values (1, 'first row'), diff --git a/sql/expression/function/regexp_like.go b/sql/expression/function/regexp_like.go index 9bc59a8b57..43a83eeeb9 100644 --- a/sql/expression/function/regexp_like.go +++ b/sql/expression/function/regexp_like.go @@ -179,8 +179,12 @@ func (r *RegexpLike) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { if err != nil { return nil, err } + textStr, _, err := sql.Unwrap[string](ctx, text) + if err != nil { + return nil, err + } - err = r.re.SetMatchString(ctx, text.(string)) + err = r.re.SetMatchString(ctx, textStr) if err != nil { return nil, err } @@ -220,9 +224,13 @@ func compileRegex(ctx *sql.Context, pattern, text, flags sql.Expression, funcNam if err != nil { return nil, err } + patternValStr, _, err := sql.Unwrap[string](ctx, patternVal) + if err != nil { + return nil, err + } // Empty regex, throw illegal argument - if len(patternVal.(string)) == 0 { + if len(patternValStr) == 0 { return nil, errors.NewKind("Illegal argument to regular expression.").New() } @@ -250,7 +258,10 @@ func compileRegex(ctx *sql.Context, pattern, text, flags sql.Expression, funcNam return nil, err } - flagsStr = f.(string) + flagsStr, _, err = sql.Unwrap[string](ctx, f) + if err != nil { + return nil, err + } flagsStr, err = consolidateRegexpFlags(flagsStr, funcName) if err != nil { return nil, err @@ -279,7 +290,7 @@ func compileRegex(ctx *sql.Context, pattern, text, flags sql.Expression, funcNam ctx.Warn(1193, `System variable for regular expressions "regexp_buffer_size" is missing`) } re := regex.CreateRegex(bufferSize) - if err = re.SetRegexString(ctx, patternVal.(string), regexFlags); err != nil { + if err = re.SetRegexString(ctx, patternValStr, regexFlags); err != nil { _ = re.Close() return nil, err } diff --git a/sql/expression/function/reverse_repeat_replace.go b/sql/expression/function/reverse_repeat_replace.go index 1e7b28258b..9a6a6d156a 100644 --- a/sql/expression/function/reverse_repeat_replace.go +++ b/sql/expression/function/reverse_repeat_replace.go @@ -280,9 +280,26 @@ func (r *Replace) Eval( return nil, err } - if fromStr.(string) == "" { - return str, nil + { + str, _, err := sql.Unwrap[string](ctx, str) + if err != nil { + return nil, err + } + + fromStr, _, err := sql.Unwrap[string](ctx, fromStr) + if err != nil { + return nil, err + } + + toStr, _, err := sql.Unwrap[string](ctx, toStr) + if err != nil { + return nil, err + } + + if fromStr == "" { + return str, nil + } + + return strings.Replace(str, fromStr, toStr, -1), nil } - - return strings.Replace(str.(string), fromStr.(string), toStr.(string), -1), nil } diff --git a/sql/expression/function/rpad_lpad.go b/sql/expression/function/rpad_lpad.go index d4c9333f6e..ae5684585a 100644 --- a/sql/expression/function/rpad_lpad.go +++ b/sql/expression/function/rpad_lpad.go @@ -169,7 +169,19 @@ func (p *Pad) Eval( return nil, err } - return padString(str.(string), length.(int64), padStr.(string), p.padType) + { + str, _, err := sql.Unwrap[string](ctx, str) + if err != nil { + return nil, err + } + + padStr, _, err := sql.Unwrap[string](ctx, padStr) + if err != nil { + return nil, err + } + + return padString(str, length.(int64), padStr, p.padType) + } } func padString(str string, length int64, padStr string, padType padType) (string, error) { From acbdefde3b92620bec73bed90e205987cc7832b5 Mon Sep 17 00:00:00 2001 From: nicktobey Date: Thu, 1 May 2025 23:26:27 +0000 Subject: [PATCH 2/4] [ga-format-pr] Run ./format_repo.sh to fix formatting --- enginetest/queries/regex_queries.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/enginetest/queries/regex_queries.go b/enginetest/queries/regex_queries.go index 66053bb758..fe15f3392a 100644 --- a/enginetest/queries/regex_queries.go +++ b/enginetest/queries/regex_queries.go @@ -21,11 +21,10 @@ package queries import ( - "github.com/dolthub/go-mysql-server/enginetest/scriptgen/setup" - "gopkg.in/src-d/go-errors.v1" - regex "github.com/dolthub/go-icu-regex" + "gopkg.in/src-d/go-errors.v1" + "github.com/dolthub/go-mysql-server/enginetest/scriptgen/setup" "github.com/dolthub/go-mysql-server/sql" ) From 49ee42efe67ce2b24440d23e4fd9c5ed020808ca Mon Sep 17 00:00:00 2001 From: Nick Tobey Date: Thu, 1 May 2025 16:48:50 -0700 Subject: [PATCH 3/4] Move regex setup scripts into TestRegex --- enginetest/engine_only_test.go | 8 +++++++- enginetest/queries/regex_queries.go | 7 ------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/enginetest/engine_only_test.go b/enginetest/engine_only_test.go index 7bf7f0e433..55fd61f699 100644 --- a/enginetest/engine_only_test.go +++ b/enginetest/engine_only_test.go @@ -717,7 +717,13 @@ func TestCollationCoercion(t *testing.T) { func TestRegex(t *testing.T) { harness := enginetest.NewDefaultMemoryHarness() - setupsScripts := append(setup.SimpleSetup, queries.RegexSetup) + regexSetup := []setup.SetupScript{ + { + "CREATE TABLE tests(pk int primary key, str text, pattern text, flags text);", + "INSERT INTO tests VALUES (1, 'testing', 'TESTING', 'ci');", + }, + } + setupsScripts := append(setup.SimpleSetup, regexSetup) harness.Setup(setupsScripts...) engine, err := harness.NewEngine(t) require.NoError(t, err) diff --git a/enginetest/queries/regex_queries.go b/enginetest/queries/regex_queries.go index fe15f3392a..92bacda4fc 100644 --- a/enginetest/queries/regex_queries.go +++ b/enginetest/queries/regex_queries.go @@ -34,13 +34,6 @@ type RegexTest struct { ExpectedErr *errors.Kind } -var RegexSetup = []setup.SetupScript{ - { - "CREATE TABLE tests(pk int primary key, str text, pattern text, flags text);", - "INSERT INTO tests VALUES (1, 'testing', 'TESTING', 'ci');", - }, -} - var RegexTests = []RegexTest{ { Query: "SELECT REGEXP_LIKE('testing', 'TESTING');", From 10677591069eefdd6b90d471523fd03376585bfa Mon Sep 17 00:00:00 2001 From: nicktobey Date: Thu, 1 May 2025 23:50:40 +0000 Subject: [PATCH 4/4] [ga-format-pr] Run ./format_repo.sh to fix formatting --- enginetest/queries/regex_queries.go | 1 - 1 file changed, 1 deletion(-) diff --git a/enginetest/queries/regex_queries.go b/enginetest/queries/regex_queries.go index 92bacda4fc..8aa988d81d 100644 --- a/enginetest/queries/regex_queries.go +++ b/enginetest/queries/regex_queries.go @@ -24,7 +24,6 @@ import ( regex "github.com/dolthub/go-icu-regex" "gopkg.in/src-d/go-errors.v1" - "github.com/dolthub/go-mysql-server/enginetest/scriptgen/setup" "github.com/dolthub/go-mysql-server/sql" )