diff --git a/internal/statements/delete.go b/internal/statements/delete.go index ee3770e0..a77cf862 100644 --- a/internal/statements/delete.go +++ b/internal/statements/delete.go @@ -14,7 +14,7 @@ import ( "xorm.io/xorm/schemas" ) -func (statement *Statement) writeDeleteOrder(w builder.Writer) error { +func (statement *Statement) writeDeleteOrder(w *builder.BytesWriter) error { if err := statement.writeOrderBys(w); err != nil { return err } diff --git a/internal/statements/order_by.go b/internal/statements/order_by.go index 8441baa3..595c0430 100644 --- a/internal/statements/order_by.go +++ b/internal/statements/order_by.go @@ -10,6 +10,12 @@ import ( "xorm.io/builder" ) +type orderBy struct { + orderStr interface{} + orderArgs []interface{} + direction string // ASC, DESC or "", "" means raw orderStr +} + func (statement *Statement) HasOrderBy() bool { return len(statement.orderBy) > 0 } @@ -19,27 +25,34 @@ func (statement *Statement) ResetOrderBy() { statement.orderBy = []orderBy{} } -func (statement *Statement) writeOrderBy(w builder.Writer, orderBy orderBy) error { +func (statement *Statement) writeOrderBy(w *builder.BytesWriter, orderBy orderBy) error { switch t := orderBy.orderStr.(type) { case (*builder.Expression): - if _, err := fmt.Fprint(w, statement.ReplaceQuote(t.Content())); err != nil { + if _, err := fmt.Fprint(w.Builder, statement.dialect.Quoter().Replace(t.Content())); err != nil { return err } w.Append(t.Args()...) return nil case string: - if _, err := fmt.Fprint(w, statement.dialect.Quoter().Quote(t)); err != nil { + if orderBy.direction == "" { + if _, err := fmt.Fprint(w.Builder, statement.dialect.Quoter().Replace(t)); err != nil { + return err + } + w.Append(orderBy.orderArgs...) + return nil + } + if err := statement.dialect.Quoter().QuoteTo(w.Builder, t); err != nil { return err } - w.Append(orderBy.orderArgs...) - return nil + _, err := fmt.Fprint(w, " ", orderBy.direction) + return err default: return ErrUnSupportedSQLType } } // WriteOrderBy write order by to writer -func (statement *Statement) writeOrderBys(w builder.Writer) error { +func (statement *Statement) writeOrderBys(w *builder.BytesWriter) error { if len(statement.orderBy) == 0 { return nil } @@ -62,14 +75,14 @@ func (statement *Statement) writeOrderBys(w builder.Writer) error { // OrderBy generate "Order By order" statement func (statement *Statement) OrderBy(order interface{}, args ...interface{}) *Statement { - statement.orderBy = append(statement.orderBy, orderBy{order, args}) + statement.orderBy = append(statement.orderBy, orderBy{order, args, ""}) return statement } // Desc generate `ORDER BY xx DESC` func (statement *Statement) Desc(colNames ...string) *Statement { for _, colName := range colNames { - statement.orderBy = append(statement.orderBy, orderBy{colName + " DESC", nil}) + statement.orderBy = append(statement.orderBy, orderBy{colName, nil, "DESC"}) } return statement } @@ -77,7 +90,7 @@ func (statement *Statement) Desc(colNames ...string) *Statement { // Asc provide asc order by query condition, the input parameters are columns. func (statement *Statement) Asc(colNames ...string) *Statement { for _, colName := range colNames { - statement.orderBy = append(statement.orderBy, orderBy{colName + " ASC", nil}) + statement.orderBy = append(statement.orderBy, orderBy{colName, nil, "ASC"}) } return statement } diff --git a/internal/statements/statement.go b/internal/statements/statement.go index 2ca78182..017f40a5 100644 --- a/internal/statements/statement.go +++ b/internal/statements/statement.go @@ -41,11 +41,6 @@ type join struct { args []interface{} } -type orderBy struct { - orderStr interface{} - orderArgs []interface{} -} - // Statement save all the sql info for executing SQL type Statement struct { RefTable *schemas.Table