github.com/cockroachdb/cockroach@v20.2.0-alpha.1+incompatible/pkg/col/coldataext/datum_vec_test.go (about)

     1  // Copyright 2020 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 coldataext
    12  
    13  import (
    14  	"testing"
    15  
    16  	"github.com/cockroachdb/cockroach/pkg/col/coldata"
    17  	"github.com/cockroachdb/cockroach/pkg/sql/sem/tree"
    18  	"github.com/cockroachdb/cockroach/pkg/sql/types"
    19  	"github.com/cockroachdb/cockroach/pkg/util/json"
    20  	"github.com/cockroachdb/cockroach/pkg/util/leaktest"
    21  	"github.com/stretchr/testify/require"
    22  )
    23  
    24  func TestDatum(t *testing.T) {
    25  	defer leaktest.AfterTest(t)()
    26  
    27  	dv := &datumVec{evalCtx: &tree.EvalContext{}}
    28  	var d1 *Datum
    29  	var d2 tree.Datum
    30  	d1 = &Datum{Datum: &tree.DJSON{JSON: json.FromString("string")}}
    31  	d2 = &tree.DJSON{JSON: json.FromString("string")}
    32  
    33  	// Datum can be compared with regular datum.
    34  	require.True(t, d1.CompareDatum(dv, d2) == 0)
    35  
    36  	d2 = &Datum{Datum: d2}
    37  
    38  	// Datum can be compared with another Datum.
    39  	require.True(t, d1.CompareDatum(dv, d2) == 0)
    40  
    41  	// Datum implicitly views nil as tree.DNull.
    42  	require.True(t, d1.CompareDatum(dv, tree.DNull) == d1.CompareDatum(dv, nil /* other */))
    43  
    44  	// Datum panics if compared with incompatible type.
    45  	d2 = tree.NewDString("s")
    46  	require.Panics(t,
    47  		func() { d1.CompareDatum(dv, d2) },
    48  		"different datum type should have caused panic when compared",
    49  	)
    50  
    51  	d2 = &Datum{Datum: d2}
    52  	require.Panics(t,
    53  		func() { d1.CompareDatum(dv, d2) },
    54  		"different datum type should have caused panic when compared",
    55  	)
    56  }
    57  
    58  func TestDatumVec(t *testing.T) {
    59  	defer leaktest.AfterTest(t)()
    60  
    61  	evalCtx := &tree.EvalContext{}
    62  
    63  	dv1 := newDatumVec(types.Jsonb, 0 /* n */, evalCtx)
    64  
    65  	var expected coldata.Datum
    66  	expected = tree.NewDJSON(json.FromString("str1"))
    67  	dv1.AppendVal(expected)
    68  	require.True(t, dv1.Get(0).(tree.Datum).Compare(evalCtx, expected.(tree.Datum)) == 0)
    69  
    70  	expected = tree.NewDJSON(json.FromString("str2"))
    71  	dv1.AppendVal(expected)
    72  	require.True(t, dv1.Get(1).(tree.Datum).Compare(evalCtx, expected.(tree.Datum)) == 0)
    73  	require.Equal(t, 2, dv1.Len())
    74  
    75  	invalidDatum, _ := tree.ParseDInt("10")
    76  	require.Panics(
    77  		t,
    78  		func() { dv1.Set(0 /* i */, invalidDatum) },
    79  		"should not be able to set a datum of a different type",
    80  	)
    81  
    82  	dv1 = newDatumVec(types.Jsonb, 0 /* n */, evalCtx)
    83  	dv2 := newDatumVec(types.Jsonb, 0 /* n */, evalCtx)
    84  
    85  	dv1.AppendVal(tree.NewDJSON(json.FromString("str1")))
    86  	dv1.AppendVal(tree.NewDJSON(json.FromString("str2")))
    87  
    88  	// Truncating dv1.
    89  	require.Equal(t, 2 /* expected */, dv1.Len())
    90  	dv1.AppendSlice(dv2, 0 /* destIdx */, 0 /* srcStartIdx */, 0 /* srcEndIdx */)
    91  	require.Equal(t, 0 /* expected */, dv1.Len())
    92  
    93  	dv1.AppendVal(tree.NewDJSON(json.FromString("dv1 str")))
    94  	dv2.AppendVal(tree.NewDJSON(json.FromString("dv2 str")))
    95  	// Try appending dv2 to dv1 3 times. The first time will overwrite the
    96  	// current present value in dv1.
    97  	for i := 0; i < 3; i++ {
    98  		dv1.AppendSlice(dv2, i, 0 /* srcStartIdx */, dv2.Len())
    99  		require.Equal(t, i+1, dv1.Len())
   100  		for j := 0; j <= i; j++ {
   101  			require.True(t, dv1.Get(j).(tree.Datum).Compare(evalCtx, tree.NewDJSON(json.FromString("dv2 str"))) == 0)
   102  		}
   103  	}
   104  
   105  	dv2 = newDatumVec(types.Jsonb, 0 /* n */, evalCtx)
   106  	dv2.AppendVal(tree.NewDJSON(json.FromString("dv2 str1")))
   107  	dv2.AppendVal(tree.NewDJSON(json.FromString("dv2 str2")))
   108  	dv2.AppendVal(nil /* v */)
   109  	dv2.AppendVal(tree.NewDJSON(json.FromString("dv2 str3")))
   110  
   111  	dv1.AppendSlice(dv2, 1 /* destIdx */, 1 /* srcStartIdx */, 3 /* srcEndIdx */)
   112  	require.Equal(t, 3 /* expected */, dv1.Len())
   113  	require.True(t, dv1.Get(0).(tree.Datum).Compare(evalCtx, tree.NewDJSON(json.FromString("dv2 str"))) == 0)
   114  	require.True(t, dv1.Get(1).(tree.Datum).Compare(evalCtx, tree.NewDJSON(json.FromString("dv2 str2"))) == 0)
   115  	require.True(t, dv1.Get(2).(tree.Datum).Compare(evalCtx, tree.DNull) == 0)
   116  
   117  	dv2 = newDatumVec(types.Jsonb, 0 /* n */, evalCtx)
   118  	dv2.AppendVal(tree.NewDJSON(json.FromString("string0")))
   119  	dv2.AppendVal(nil /* v */)
   120  	dv2.AppendVal(tree.NewDJSON(json.FromString("string2")))
   121  
   122  	dv1.CopySlice(dv2, 0 /* destIdx */, 0 /* srcStartIdx */, 3 /* srcEndIdx */)
   123  	require.Equal(t, 3 /* expected */, dv1.Len())
   124  	require.True(t, dv1.Get(0).(tree.Datum).Compare(evalCtx, tree.NewDJSON(json.FromString("string0"))) == 0)
   125  	require.True(t, dv1.Get(1).(tree.Datum).Compare(evalCtx, tree.DNull) == 0)
   126  	require.True(t, dv1.Get(2).(tree.Datum).Compare(evalCtx, tree.NewDJSON(json.FromString("string2"))) == 0)
   127  }