// EncodeTableValue encodes `val` into `appendTo` using DatumEncoding_VALUE and // returns the new buffer. func EncodeTableValue(appendTo []byte, colID ColumnID, val parser.Datum) ([]byte, error) { if val == parser.DNull { return encoding.EncodeNullValue(appendTo, uint32(colID)), nil } switch t := val.(type) { case *parser.DBool: return encoding.EncodeBoolValue(appendTo, uint32(colID), bool(*t)), nil case *parser.DInt: return encoding.EncodeIntValue(appendTo, uint32(colID), int64(*t)), nil case *parser.DFloat: return encoding.EncodeFloatValue(appendTo, uint32(colID), float64(*t)), nil case *parser.DDecimal: return encoding.EncodeDecimalValue(appendTo, uint32(colID), &t.Dec), nil case *parser.DString: return encoding.EncodeBytesValue(appendTo, uint32(colID), []byte(*t)), nil case *parser.DBytes: return encoding.EncodeBytesValue(appendTo, uint32(colID), []byte(*t)), nil case *parser.DDate: return encoding.EncodeIntValue(appendTo, uint32(colID), int64(*t)), nil case *parser.DTimestamp: return encoding.EncodeTimeValue(appendTo, uint32(colID), t.Time), nil case *parser.DTimestampTZ: return encoding.EncodeTimeValue(appendTo, uint32(colID), t.Time), nil case *parser.DInterval: return encoding.EncodeDurationValue(appendTo, uint32(colID), t.Duration), nil } return nil, errors.Errorf("unable to encode table value: %T", val) }
func TestValuePrettyPrint(t *testing.T) { var boolValue Value boolValue.SetBool(true) var intValue Value intValue.SetInt(7) var floatValue Value floatValue.SetFloat(6.28) var timeValue Value timeValue.SetTime(time.Date(2016, 6, 29, 16, 2, 50, 5, time.UTC)) var decimalValue Value _ = decimalValue.SetDecimal(inf.NewDec(628, 2)) var durationValue Value _ = durationValue.SetDuration(duration.Duration{Months: 1, Days: 2, Nanos: 3}) var tupleValue Value tupleBytes := encoding.EncodeBytesValue(encoding.EncodeIntValue(nil, 1, 8), 2, []byte("foo")) tupleValue.SetTuple(tupleBytes) var errValue Value errValue.SetInt(7) errValue.setTag(ValueType_FLOAT) var errTagValue Value errTagValue.SetInt(7) errTagValue.setTag(ValueType(99)) tests := []struct { v Value expected string }{ {boolValue, "/INT/1"}, {intValue, "/INT/7"}, {floatValue, "/FLOAT/6.28"}, {timeValue, "/TIME/2016-06-29T16:02:50.000000005Z"}, {decimalValue, "/DECIMAL/6.28"}, {durationValue, "/DURATION/1m2d3ns"}, {MakeValueFromBytes([]byte{0x1, 0x2, 0xF, 0xFF}), "/BYTES/01020fff"}, {MakeValueFromString("foo"), "/BYTES/foo"}, {tupleValue, "/TUPLE/1:1:Int/8/2:3:Bytes/foo"}, {errValue, "/<err: float64 value should be exactly 8 bytes: 1>"}, {errTagValue, "/<err: unknown tag: 99>"}, } for i, test := range tests { if str := test.v.PrettyPrint(); str != test.expected { t.Errorf("%d: got %q expected %q", i, str, test.expected) } } }