From 8af2609917970d3b1e35d36820fbcf31170b03b1 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Wed, 5 Feb 2025 14:52:45 +0800 Subject: [PATCH] fix: order by fields must be in group by (compatible for Dameng) --- querydefs.go | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/querydefs.go b/querydefs.go index 2251ad7..f739985 100644 --- a/querydefs.go +++ b/querydefs.go @@ -195,11 +195,30 @@ func queryString(tq *SQuery, tmpFields ...IQueryField) string { } if tq.groupBy != nil && len(tq.groupBy) > 0 { buf.WriteString(" GROUP BY ") - for i, f := range tq.groupBy { + groupByFields := make(map[string]IQueryField) + for i := range tq.groupBy { + f := tq.groupBy[i] + if _, ok := groupByFields[f.Reference()]; ok { + continue + } if i > 0 { buf.WriteString(", ") } buf.WriteString(f.Reference()) + groupByFields[f.Reference()] = f + } + // DAMENG SQL Compatibility, all order by fields should be in group by + for i := range tq.orderBy { + f := tq.orderBy[i] + if _, ok := groupByFields[f.field.Reference()]; ok { + continue + } + if ff, ok := f.field.(IFunctionQueryField); ok && ff.IsAggregate() { + continue + } + buf.WriteString(", ") + buf.WriteString(f.field.Reference()) + groupByFields[f.field.Reference()] = f.field } } /*if tq.having != nil { @@ -208,7 +227,8 @@ func queryString(tq *SQuery, tmpFields ...IQueryField) string { }*/ if tq.orderBy != nil && len(tq.orderBy) > 0 { buf.WriteString(" ORDER BY ") - for i, f := range tq.orderBy { + for i := range tq.orderBy { + f := tq.orderBy[i] if i > 0 { buf.WriteString(", ") }