github.com/cockroachdb/cockroach@v20.2.0-alpha.1+incompatible/pkg/sql/colexec/rowstovec_test.go (about) 1 // Copyright 2018 The Cockroach Authors. 2 // 3 // Use of this software is governed by the Business Source License 4 // included in the file licenses/BSL.txt. 5 // 6 // As of the Change Date specified in that file, in accordance with 7 // the Business Source License, use of this software will be governed 8 // by the Apache License, Version 2.0, included in the file 9 // licenses/APL.txt. 10 11 package colexec 12 13 import ( 14 "reflect" 15 "testing" 16 17 "github.com/cockroachdb/cockroach/pkg/sql/sem/tree" 18 "github.com/cockroachdb/cockroach/pkg/sql/sqlbase" 19 "github.com/cockroachdb/cockroach/pkg/sql/types" 20 "github.com/cockroachdb/cockroach/pkg/util/leaktest" 21 ) 22 23 var alloc = sqlbase.DatumAlloc{} 24 25 func TestEncDatumRowsToColVecBool(t *testing.T) { 26 defer leaktest.AfterTest(t)() 27 // Test input: [[false, true], [true, false]] 28 rows := sqlbase.EncDatumRows{ 29 sqlbase.EncDatumRow{ 30 sqlbase.EncDatum{Datum: tree.DBoolFalse}, 31 sqlbase.EncDatum{Datum: tree.DBoolTrue}, 32 }, 33 sqlbase.EncDatumRow{ 34 sqlbase.EncDatum{Datum: tree.DBoolTrue}, 35 sqlbase.EncDatum{Datum: tree.DBoolFalse}, 36 }, 37 } 38 vec := testAllocator.NewMemColumn(types.Bool, 2) 39 ct := types.Bool 40 41 // Test converting column 0. 42 if err := EncDatumRowsToColVec(testAllocator, rows, vec, 0 /* columnIdx */, ct, &alloc); err != nil { 43 t.Fatal(err) 44 } 45 expected := testAllocator.NewMemColumn(types.Bool, 2) 46 expected.Bool()[0] = false 47 expected.Bool()[1] = true 48 if !reflect.DeepEqual(vec, expected) { 49 t.Errorf("expected vector %+v, got %+v", expected, vec) 50 } 51 52 // Test converting column 1. 53 if err := EncDatumRowsToColVec(testAllocator, rows, vec, 1 /* columnIdx */, ct, &alloc); err != nil { 54 t.Fatal(err) 55 } 56 expected.Bool()[0] = true 57 expected.Bool()[1] = false 58 if !reflect.DeepEqual(vec, expected) { 59 t.Errorf("expected vector %+v, got %+v", expected, vec) 60 } 61 } 62 63 func TestEncDatumRowsToColVecInt16(t *testing.T) { 64 defer leaktest.AfterTest(t)() 65 rows := sqlbase.EncDatumRows{ 66 sqlbase.EncDatumRow{sqlbase.EncDatum{Datum: tree.NewDInt(17)}}, 67 sqlbase.EncDatumRow{sqlbase.EncDatum{Datum: tree.NewDInt(42)}}, 68 } 69 vec := testAllocator.NewMemColumn(types.Int2, 2) 70 if err := EncDatumRowsToColVec(testAllocator, rows, vec, 0 /* columnIdx */, types.Int2, &alloc); err != nil { 71 t.Fatal(err) 72 } 73 expected := testAllocator.NewMemColumn(types.Int2, 2) 74 expected.Int16()[0] = 17 75 expected.Int16()[1] = 42 76 if !reflect.DeepEqual(vec, expected) { 77 t.Errorf("expected vector %+v, got %+v", expected, vec) 78 } 79 } 80 81 func TestEncDatumRowsToColVecString(t *testing.T) { 82 defer leaktest.AfterTest(t)() 83 rows := sqlbase.EncDatumRows{ 84 sqlbase.EncDatumRow{sqlbase.EncDatum{Datum: tree.NewDString("foo")}}, 85 sqlbase.EncDatumRow{sqlbase.EncDatum{Datum: tree.NewDString("bar")}}, 86 } 87 vec := testAllocator.NewMemColumn(types.Bytes, 2) 88 for _, width := range []int32{0, 25} { 89 ct := types.MakeString(width) 90 vec.Bytes().Reset() 91 if err := EncDatumRowsToColVec(testAllocator, rows, vec, 0 /* columnIdx */, ct, &alloc); err != nil { 92 t.Fatal(err) 93 } 94 expected := testAllocator.NewMemColumn(types.Bytes, 2) 95 expected.Bytes().Set(0, []byte("foo")) 96 expected.Bytes().Set(1, []byte("bar")) 97 if !reflect.DeepEqual(vec, expected) { 98 t.Errorf("expected vector %+v, got %+v", expected, vec) 99 } 100 } 101 } 102 103 func TestEncDatumRowsToColVecDecimal(t *testing.T) { 104 defer leaktest.AfterTest(t)() 105 nRows := 3 106 rows := make(sqlbase.EncDatumRows, nRows) 107 expected := testAllocator.NewMemColumn(types.Decimal, 3) 108 for i, s := range []string{"1.0000", "-3.12", "NaN"} { 109 var err error 110 dec, err := tree.ParseDDecimal(s) 111 if err != nil { 112 t.Fatal(err) 113 } 114 rows[i] = sqlbase.EncDatumRow{sqlbase.EncDatum{Datum: dec}} 115 expected.Decimal()[i] = dec.Decimal 116 } 117 vec := testAllocator.NewMemColumn(types.Decimal, 3) 118 ct := types.Decimal 119 if err := EncDatumRowsToColVec(testAllocator, rows, vec, 0 /* columnIdx */, ct, &alloc); err != nil { 120 t.Fatal(err) 121 } 122 if !reflect.DeepEqual(vec, expected) { 123 t.Errorf("expected vector %+v, got %+v", expected, vec) 124 } 125 }