From 8c69c1f834a672e69bbf0b8dddbdccb3f945838d Mon Sep 17 00:00:00 2001 From: James Cor Date: Fri, 27 Feb 2026 11:24:40 -0800 Subject: [PATCH 1/5] notes --- sql/sql_mode.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sql/sql_mode.go b/sql/sql_mode.go index a95673a09c..f42a3b89cf 100644 --- a/sql/sql_mode.go +++ b/sql/sql_mode.go @@ -165,12 +165,11 @@ func LoadSqlMode(ctx *Context) *SqlMode { // NewSqlModeFromString returns a new SqlMode instance, constructed from the specified |sqlModeString| that // has a comma-delimited list of SQL modes (e.g. "ONLY_FULLY_GROUP_BY,ANSI_QUOTES"). func NewSqlModeFromString(sqlModeString string) *SqlMode { - if sqlModeString == DefaultSqlMode { + if sqlModeString == DefaultSqlMode { // TODO: why? wouldn't it just parse to this anyway?? faster? return defaultMode } sqlModeString = strings.ToLower(sqlModeString) - elements := strings.Split(sqlModeString, ",") - sort.Strings(elements) + elements := strings.Split(sqlModeString, ",") // TODO: write our own unsafe split? modes := map[string]struct{}{} for _, element := range elements { modes[element] = struct{}{} From 5cc86e9cec9dba33c4fbbbf43bc4a3870d470ee6 Mon Sep 17 00:00:00 2001 From: James Cor Date: Fri, 27 Feb 2026 11:42:13 -0800 Subject: [PATCH 2/5] lazily create sqlMode string --- sql/sql_mode.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/sql/sql_mode.go b/sql/sql_mode.go index f42a3b89cf..eedaf79fc9 100644 --- a/sql/sql_mode.go +++ b/sql/sql_mode.go @@ -165,19 +165,19 @@ func LoadSqlMode(ctx *Context) *SqlMode { // NewSqlModeFromString returns a new SqlMode instance, constructed from the specified |sqlModeString| that // has a comma-delimited list of SQL modes (e.g. "ONLY_FULLY_GROUP_BY,ANSI_QUOTES"). func NewSqlModeFromString(sqlModeString string) *SqlMode { - if sqlModeString == DefaultSqlMode { // TODO: why? wouldn't it just parse to this anyway?? faster? + if sqlModeString == DefaultSqlMode { return defaultMode } sqlModeString = strings.ToLower(sqlModeString) elements := strings.Split(sqlModeString, ",") // TODO: write our own unsafe split? + sort.Strings(elements) modes := map[string]struct{}{} for _, element := range elements { modes[element] = struct{}{} } return &SqlMode{ - modes: modes, - modeString: strings.ToUpper(strings.Join(elements, ",")), + modes: modes, } } @@ -239,6 +239,14 @@ func (s *SqlMode) ParserOptions() sqlparser.ParserOptions { // String returns the SQL_MODE string representing this SqlMode instance. func (s *SqlMode) String() string { + if len(s.modeString) == 0 && len(s.modes) > 0 { + modes := make([]string, 0, len(s.modes)) + for mode := range s.modes { + modes = append(modes, mode) + } + sort.Strings(modes) + s.modeString = strings.ToUpper(strings.Join(modes, ",")) + } return s.modeString } From e6c40072964cc99434a2e244b5692a8501b236d2 Mon Sep 17 00:00:00 2001 From: James Cor Date: Fri, 27 Feb 2026 11:43:17 -0800 Subject: [PATCH 3/5] ok now lazy sqlMode --- sql/sql_mode.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sql/sql_mode.go b/sql/sql_mode.go index eedaf79fc9..c7cdf9d239 100644 --- a/sql/sql_mode.go +++ b/sql/sql_mode.go @@ -169,13 +169,11 @@ func NewSqlModeFromString(sqlModeString string) *SqlMode { return defaultMode } sqlModeString = strings.ToLower(sqlModeString) - elements := strings.Split(sqlModeString, ",") // TODO: write our own unsafe split? - sort.Strings(elements) + elements := strings.Split(sqlModeString, ",") modes := map[string]struct{}{} for _, element := range elements { modes[element] = struct{}{} } - return &SqlMode{ modes: modes, } From 4dde37570b6a35e6063083bcdbb5ee7d2736113f Mon Sep 17 00:00:00 2001 From: James Cor Date: Fri, 27 Feb 2026 14:58:19 -0800 Subject: [PATCH 4/5] custom comma parser --- sql/sql_mode.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/sql/sql_mode.go b/sql/sql_mode.go index c7cdf9d239..d7f0276c5b 100644 --- a/sql/sql_mode.go +++ b/sql/sql_mode.go @@ -169,11 +169,18 @@ func NewSqlModeFromString(sqlModeString string) *SqlMode { return defaultMode } sqlModeString = strings.ToLower(sqlModeString) - elements := strings.Split(sqlModeString, ",") + modes := map[string]struct{}{} - for _, element := range elements { - modes[element] = struct{}{} + start, end := 0, 0 + for ; end < len(sqlModeString); end++ { + if sqlModeString[end] != ',' { + continue + } + modes[sqlModeString[start:end]] = struct{}{} + start = end + 1 } + modes[sqlModeString[start:end]] = struct{}{} + return &SqlMode{ modes: modes, } From dd52b0eaaf535f6a8e25e220e847bd05698dbf2d Mon Sep 17 00:00:00 2001 From: James Cor Date: Fri, 27 Feb 2026 15:02:55 -0800 Subject: [PATCH 5/5] add a benchmark --- sql/sql_mode_test.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sql/sql_mode_test.go b/sql/sql_mode_test.go index 3851a850ae..d723199231 100644 --- a/sql/sql_mode_test.go +++ b/sql/sql_mode_test.go @@ -138,3 +138,10 @@ func TestConvertSqlModeBitmask(t *testing.T) { }) } } + +func BenchmarkNewSqlModeFromString(b *testing.B) { + sqlStr := "abc,def,hij,1234567890" + for i := 0; i < b.N; i++ { + _ = NewSqlModeFromString(sqlStr) + } +}