fix issue in unnacessary quoting of fields in select statement of gdb.Model

This commit is contained in:
John 2020-04-27 16:30:53 +08:00
parent fa66bf5d9d
commit 5db10add4a
5 changed files with 41 additions and 12 deletions

View File

@ -42,10 +42,12 @@ func (m *Model) All(where ...interface{}) (Result, error) {
} }
conditionWhere += softDeletingCondition conditionWhere += softDeletingCondition
} }
// DO NOT quote the m.fields where, in case of fields like:
// DISTINCT t.user_id uid
return m.doGetAll( return m.doGetAll(
fmt.Sprintf( fmt.Sprintf(
"SELECT %s FROM %s%s", "SELECT %s FROM %s%s",
m.db.QuoteString(m.fields), m.fields,
m.tables, m.tables,
conditionWhere+conditionExtra, conditionWhere+conditionExtra,
), ),
@ -249,7 +251,9 @@ func (m *Model) Count(where ...interface{}) (int, error) {
} }
countFields := "COUNT(1)" countFields := "COUNT(1)"
if m.fields != "" && m.fields != "*" { if m.fields != "" && m.fields != "*" {
countFields = fmt.Sprintf(`COUNT(%s)`, m.db.QuoteString(m.fields)) // DO NOT quote the m.fields here, in case of fields like:
// DISTINCT t.user_id uid
countFields = fmt.Sprintf(`COUNT(%s)`, m.fields)
} }
var ( var (
softDeletingCondition = m.getConditionForSoftDeleting() softDeletingCondition = m.getConditionForSoftDeleting()

View File

@ -2297,3 +2297,30 @@ func Test_Model_Having(t *testing.T) {
t.Assert(len(all), 1) t.Assert(len(all), 1)
}) })
} }
func Test_Model_Distinct(t *testing.T) {
table := createInitTable()
defer dropTable(table)
gtest.C(t, func(t *gtest.T) {
all, err := db.Table(table, "t").Fields("distinct t.id").Where("id > 1").Having("id > 8").All()
t.Assert(err, nil)
t.Assert(len(all), 2)
})
}
func Test_Model_Min_Max(t *testing.T) {
table := createInitTable()
defer dropTable(table)
gtest.C(t, func(t *gtest.T) {
value, err := db.Table(table, "t").Fields("min(t.id)").Where("id > 1").Value()
t.Assert(err, nil)
t.Assert(value.Int(), 2)
})
gtest.C(t, func(t *gtest.T) {
value, err := db.Table(table, "t").Fields("max(t.id)").Where("id > 1").Value()
t.Assert(err, nil)
t.Assert(value.Int(), 10)
})
}

View File

@ -11,15 +11,17 @@ import (
"fmt" "fmt"
) )
// ApiStack is the interface for Stack feature.
type ApiStack interface { type ApiStack interface {
Stack() string Stack() string
} }
// ApiCause is the interface for Cause feature.
type ApiCause interface { type ApiCause interface {
Cause() error Cause() error
} }
// New returns an error that formats as the given text. // New creates and returns an error which is formatted from given text.
func New(text string) error { func New(text string) error {
if text == "" { if text == "" {
return nil return nil
@ -30,7 +32,7 @@ func New(text string) error {
} }
} }
// Newf returns an error that formats as the given text. // Newf returns an error that formats as the given format and args.
func Newf(format string, args ...interface{}) error { func Newf(format string, args ...interface{}) error {
if format == "" { if format == "" {
return nil return nil
@ -56,7 +58,7 @@ func Wrap(err error, text string) error {
// Wrapf returns an error annotating err with a stack trace // Wrapf returns an error annotating err with a stack trace
// at the point Wrapf is called, and the format specifier. // at the point Wrapf is called, and the format specifier.
// It returns nil if given err is nil. // It returns nil if given <err> is nil.
func Wrapf(err error, format string, args ...interface{}) error { func Wrapf(err error, format string, args ...interface{}) error {
if err == nil { if err == nil {
return nil return nil
@ -68,7 +70,7 @@ func Wrapf(err error, format string, args ...interface{}) error {
} }
} }
// Cause returns the root cause error. // Cause returns the root cause error of <err>.
func Cause(err error) error { func Cause(err error) error {
if err != nil { if err != nil {
if e, ok := err.(ApiCause); ok { if e, ok := err.(ApiCause); ok {
@ -79,7 +81,7 @@ func Cause(err error) error {
} }
// Stack returns the stack callers as string. // Stack returns the stack callers as string.
// It returns an empty string id the <err> does not support stacks. // It returns an empty string if the <err> does not support stacks.
func Stack(err error) string { func Stack(err error) string {
if err == nil { if err == nil {
return "" return ""

View File

@ -94,7 +94,7 @@ func (err *Error) Format(s fmt.State, verb rune) {
} }
// Stack returns the stack callers as string. // Stack returns the stack callers as string.
// It returns an empty string id the <err> does not support stacks. // It returns an empty string if the <err> does not support stacks.
func (err *Error) Stack() string { func (err *Error) Stack() string {
if err == nil { if err == nil {
return "" return ""

View File

@ -15,10 +15,6 @@ import (
"github.com/gogf/gf/test/gtest" "github.com/gogf/gf/test/gtest"
) )
func interfaceNil() interface{} {
return nil
}
func nilError() error { func nilError() error {
return nil return nil
} }