mirror of
https://gitee.com/johng/gf.git
synced 2024-12-02 04:07:47 +08:00
fix issue in unnacessary quoting of fields in select statement of gdb.Model
This commit is contained in:
parent
fa66bf5d9d
commit
5db10add4a
@ -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()
|
||||||
|
@ -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)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
@ -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 ""
|
||||||
|
@ -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 ""
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user