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) buildResultset(fields []*mysql.Field, names []string, values [][]interface{}) (*mysql.Resultset, error) { var ExistFields bool r := new(mysql.Resultset) r.Fields = make([]*mysql.Field, len(names)) //use the field def that get from true database if len(fields) != 0 { if len(r.Fields) == len(fields) { ExistFields = true } else { return nil, errors.ErrInvalidArgument } } var b []byte var err error for i, vs := range values { if len(vs) != len(r.Fields) { return nil, fmt.Errorf("row %d has %d column not equal %d", i, len(vs), len(r.Fields)) } var row []byte for j, value := range vs { //列的定义 if i == 0 { if ExistFields { r.Fields[j] = fields[j] } else { field := &mysql.Field{} r.Fields[j] = field field.Name = hack.Slice(names[j]) if err = formatField(field, value); err != nil { return nil, err } } } b, err = formatValue(value) if err != nil { return nil, err } row = append(row, mysql.PutLengthEncodedString(b)...) } r.RowDatas = append(r.RowDatas, row) } return r, nil }