func (c *Conn) sortSelectResult(r *mysql.Resultset, stmt *sqlparser.Select) error { if stmt.OrderBy == nil { return nil } sk := make([]mysql.SortKey, len(stmt.OrderBy)) for i, o := range stmt.OrderBy { sk[i].Name = nstring(o.Expr, c.alloc) sk[i].Direction = o.Direction } return r.Sort(sk) }
func (c *Conn) limitSelectResult(r *mysql.Resultset, stmt *sqlparser.Select) error { if stmt.Limit == nil { return nil } var offset, count int64 var err error if stmt.Limit.Offset == nil { offset = 0 } else { if o, ok := stmt.Limit.Offset.(sqlparser.NumVal); !ok { return errors.Errorf("invalid select limit %s", nstring(stmt.Limit, c.alloc)) } else { if offset, err = strconv.ParseInt(hack.String([]byte(o)), 10, 64); err != nil { return errors.Trace(err) } } } if o, ok := stmt.Limit.Rowcount.(sqlparser.NumVal); !ok { return errors.Errorf("invalid limit %s", nstring(stmt.Limit, c.alloc)) } else { if count, err = strconv.ParseInt(hack.String([]byte(o)), 10, 64); err != nil { return errors.Trace(err) } else if count < 0 { return errors.Errorf("invalid limit %s", nstring(stmt.Limit, c.alloc)) } } if offset+count > int64(len(r.Values)) { count = int64(len(r.Values)) - offset } r.Values = r.Values[offset : offset+count] r.RowDatas = r.RowDatas[offset : offset+count] return nil }