From a0b6b62ba05a0c3b6791e014db38a21bf1969267 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 14 Apr 2017 10:49:02 +0800 Subject: [PATCH] fix #570 --- session_sum_test.go | 28 ++++++++++++++++++++++++++++ statement.go | 8 ++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/session_sum_test.go b/session_sum_test.go index 59e0f3cd..31a65f98 100644 --- a/session_sum_test.go +++ b/session_sum_test.go @@ -71,3 +71,31 @@ func TestSum(t *testing.T) { assert.EqualValues(t, 1, len(sumsInt)) assert.EqualValues(t, i, int(sumsInt[0])) } + +func TestSumCustomColumn(t *testing.T) { + assert.NoError(t, prepareEngine()) + + type SumStruct struct { + Int int + Float float32 + } + + var ( + cases = []SumStruct{ + {1, 6.2}, + {2, 5.3}, + {92, -0.2}, + } + ) + + assert.NoError(t, testEngine.Sync2(new(SumStruct))) + + cnt, err := testEngine.Insert(cases) + assert.NoError(t, err) + assert.EqualValues(t, 3, cnt) + + sumInt, err := testEngine.Sum(new(SumStruct), + "CASE WHEN `int` <= 2 THEN `int` ELSE 0 END") + assert.NoError(t, err) + assert.EqualValues(t, 3, int(sumInt)) +} diff --git a/statement.go b/statement.go index d411f739..e3640b53 100644 --- a/statement.go +++ b/statement.go @@ -1188,12 +1188,16 @@ func (statement *Statement) genSumSQL(bean interface{}, columns ...string) (stri var sumStrs = make([]string, 0, len(columns)) for _, colName := range columns { - sumStrs = append(sumStrs, fmt.Sprintf("COALESCE(sum(%s),0)", statement.Engine.Quote(colName))) + if !strings.Contains(colName, " ") && strings.Contains(colName, "(") { + colName = statement.Engine.Quote(colName) + } + sumStrs = append(sumStrs, fmt.Sprintf("COALESCE(sum(%s),0)", colName)) } + sumSelect := strings.Join(sumStrs, ", ") condSQL, condArgs, _ := statement.genConds(bean) - return statement.genSelectSQL(strings.Join(sumStrs, ", "), condSQL), append(statement.joinArgs, condArgs...) + return statement.genSelectSQL(sumSelect, condSQL), append(statement.joinArgs, condArgs...) } func (statement *Statement) genSelectSQL(columnStr, condSQL string) (a string) {