// BindVariablesToProto3 converts internal type to proto3 BindVariable array func BindVariablesToProto3(bindVars map[string]interface{}) (map[string]*pb.BindVariable, error) { if len(bindVars) == 0 { return nil, nil } result := make(map[string]*pb.BindVariable) for k, v := range bindVars { bv := new(pb.BindVariable) switch v := v.(type) { case []interface{}: // This is how the list variables will normally appear. if len(v) == 0 { return nil, fmt.Errorf("empty list not allowed: %s", k) } bv.Type = sqltypes.Tuple bv.Values = make([]*pb.Value, len(v)) values := make([]pb.Value, len(v)) for i, lv := range v { val, err := BindVariableToValue(lv) if err != nil { return nil, fmt.Errorf("key: %s: %v", k, err) } if val.Type != sqltypes.Null { values[i] = val bv.Values[i] = &values[i] } } case []string: if len(v) == 0 { return nil, fmt.Errorf("empty list not allowed: %s", k) } bv.Type = sqltypes.Tuple bv.Values = make([]*pb.Value, len(v)) values := make([]pb.Value, len(v)) for i, lv := range v { values[i].Type = sqltypes.VarChar values[i].Value = []byte(lv) bv.Values[i] = &values[i] } case [][]byte: if len(v) == 0 { return nil, fmt.Errorf("empty list not allowed: %s", k) } bv.Type = sqltypes.Tuple bv.Values = make([]*pb.Value, len(v)) values := make([]pb.Value, len(v)) for i, lv := range v { values[i].Type = sqltypes.VarBinary values[i].Value = lv bv.Values[i] = &values[i] } case []int: if len(v) == 0 { return nil, fmt.Errorf("empty list not allowed: %s", k) } bv.Type = sqltypes.Tuple bv.Values = make([]*pb.Value, len(v)) values := make([]pb.Value, len(v)) for i, lv := range v { values[i].Type = sqltypes.Int64 values[i].Value = strconv.AppendInt(nil, int64(lv), 10) bv.Values[i] = &values[i] } case []int64: if len(v) == 0 { return nil, fmt.Errorf("empty list not allowed: %s", k) } bv.Type = sqltypes.Tuple bv.Values = make([]*pb.Value, len(v)) values := make([]pb.Value, len(v)) for i, lv := range v { values[i].Type = sqltypes.Int64 values[i].Value = strconv.AppendInt(nil, lv, 10) bv.Values[i] = &values[i] } case []uint64: if len(v) == 0 { return nil, fmt.Errorf("empty list not allowed: %s", k) } bv.Type = sqltypes.Tuple bv.Values = make([]*pb.Value, len(v)) values := make([]pb.Value, len(v)) for i, lv := range v { values[i].Type = sqltypes.Uint64 values[i].Value = strconv.AppendUint(nil, lv, 10) bv.Values[i] = &values[i] } default: val, err := BindVariableToValue(v) if err != nil { return nil, fmt.Errorf("key: %s: %v", k, err) } bv.Type = val.Type bv.Value = val.Value } result[k] = bv } return result, nil }