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  }