From ed36ef030f789fb664e8d22d63bc03eceb45343d Mon Sep 17 00:00:00 2001 From: Qishuai Liu Date: Mon, 6 Jan 2025 14:09:25 +0900 Subject: [PATCH] Revert "reduce memory usage of building insert values" This reverts commit 0363d4a4595ca81890836c0b7286e185941deba9. --- common.go | 18 +++++------------- insert.go | 27 ++++++++++----------------- 2 files changed, 15 insertions(+), 30 deletions(-) diff --git a/common.go b/common.go index dad10b7..6dc593e 100644 --- a/common.go +++ b/common.go @@ -94,25 +94,17 @@ func commaTables(scope scope, tables []Table) string { return sqlBuilder.String() } -func commaValuesBuilder(scope scope, builder *strings.Builder, values []interface{}) error { - builder.Grow(16 * (len(values) + 2)) // hopefully reduce copying +func commaValues(scope scope, values []interface{}) (string, error) { + var sqlBuilder strings.Builder for i, item := range values { if i > 0 { - builder.WriteString(", ") + sqlBuilder.WriteString(", ") } itemSql, _, err := getSQL(scope, item) if err != nil { - return err + return "", err } - builder.WriteString(itemSql) - } - return nil -} - -func commaValues(scope scope, values []interface{}) (string, error) { - var sqlBuilder strings.Builder - if err := commaValuesBuilder(scope, &sqlBuilder, values); err != nil { - return "", err + sqlBuilder.WriteString(itemSql) } return sqlBuilder.String(), nil } diff --git a/insert.go b/insert.go index c2248e0..cde773d 100644 --- a/insert.go +++ b/insert.go @@ -6,7 +6,6 @@ import ( "errors" "fmt" "reflect" - "strings" ) type insertStatus struct { @@ -139,7 +138,7 @@ func (s insertStatus) OnDuplicateKeyIgnore() toInsertFinal { func (s insertStatus) GetSQL() (string, error) { var fields []Field - var valuesBuilder strings.Builder + var values []interface{} if len(s.models) > 0 { models := make([]Model, 0, len(s.models)) for _, model := range s.models { @@ -150,19 +149,11 @@ func (s insertStatus) GetSQL() (string, error) { if len(models) > 0 { fields = models[0].GetTable().GetFields() - valuesBuilder.Grow(64 * len(models)) - for i, model := range models { + for _, model := range models { if model.GetTable().GetName() != s.scope.Tables[0].GetName() { return "", errors.New("invalid table from model") } - if i > 0 { - valuesBuilder.WriteString(", ") - } - valuesBuilder.WriteString("(") - if err := commaValuesBuilder(s.scope, &valuesBuilder, model.GetValues()); err != nil { - return "", err - } - valuesBuilder.WriteString(")") + values = append(values, model.GetValues()) } } } else { @@ -171,12 +162,10 @@ func (s insertStatus) GetSQL() (string, error) { } else { fields = s.fields } - if err := commaValuesBuilder(s.scope, &valuesBuilder, s.values); err != nil { - return "", err - } + values = s.values } - if valuesBuilder.Len() == 0 { + if len(values) == 0 { return "/* INSERT without VALUES */ DO 0", nil } @@ -185,8 +174,12 @@ func (s insertStatus) GetSQL() (string, error) { if err != nil { return "", err } + valuesSql, err := commaValues(s.scope, values) + if err != nil { + return "", err + } - sqlString := s.method + " INTO " + tableSql + " (" + fieldsSql + ") VALUES " + valuesBuilder.String() + sqlString := s.method + " INTO " + tableSql + " (" + fieldsSql + ") VALUES " + valuesSql if len(s.onDuplicateKeyUpdateAssignments) > 0 { assignmentsSql, err := commaAssignments(s.scope, s.onDuplicateKeyUpdateAssignments) if err != nil {