func (c *ClientConn) newEmptyResultset(stmt *sqlparser.Select) *mysql.Resultset { r := new(mysql.Resultset) r.Fields = make([]*mysql.Field, len(stmt.SelectExprs)) for i, expr := range stmt.SelectExprs { r.Fields[i] = &mysql.Field{} switch e := expr.(type) { case *sqlparser.StarExpr: r.Fields[i].Name = []byte("*") case *sqlparser.NonStarExpr: if e.As != nil { r.Fields[i].Name = e.As r.Fields[i].OrgName = hack.Slice(nstring(e.Expr)) } else { r.Fields[i].Name = hack.Slice(nstring(e.Expr)) } default: r.Fields[i].Name = hack.Slice(nstring(e)) } } r.Values = make([][]interface{}, 0) r.RowDatas = make([]mysql.RowData, 0) return r }
func (c *ClientConn) 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 fmt.Errorf("invalid select limit %s", nstring(stmt.Limit)) } else { if offset, err = strconv.ParseInt(hack.String([]byte(o)), 10, 64); err != nil { return err } } } if o, ok := stmt.Limit.Rowcount.(sqlparser.NumVal); !ok { return fmt.Errorf("invalid limit %s", nstring(stmt.Limit)) } else { if count, err = strconv.ParseInt(hack.String([]byte(o)), 10, 64); err != nil { return err } else if count < 0 { return fmt.Errorf("invalid limit %s", nstring(stmt.Limit)) } } 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 }