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 }