From 7d254fd29b39a72f15b762bc9eba72a98dc9670c Mon Sep 17 00:00:00 2001 From: chenmingsong <59043531+m-schen@users.noreply.github.com> Date: Wed, 8 Jun 2022 12:45:53 +0800 Subject: [PATCH] Add ut tools for plan2.Function (#2843) --- pkg/sql/plan/prune_test.go | 217 +++++------ .../plan2/function/operator/case_when_test.go | 219 ++++------- pkg/sql/plan2/function/operators.go | 18 - pkg/sql/testutil/make.go | 129 ------- pkg/sql/testutil/testutil.go | 340 ++++++++++++++++++ pkg/vectorize/like/like_test.go | 3 +- 6 files changed, 526 insertions(+), 400 deletions(-) delete mode 100644 pkg/sql/testutil/make.go diff --git a/pkg/sql/plan/prune_test.go b/pkg/sql/plan/prune_test.go index fe5e87b53..ca3a9bc73 100644 --- a/pkg/sql/plan/prune_test.go +++ b/pkg/sql/plan/prune_test.go @@ -21,6 +21,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/sql/testutil" "github.com/matrixorigin/matrixone/pkg/vm/engine" "reflect" + "strings" "testing" ) @@ -50,13 +51,13 @@ func Test_build_pruneExtend(t *testing.T) { e: &extend.UnaryExtend{ Op: overload.Not, E: &extend.ValueExtend{ - V: testutil.MakeInt64Vector([]int64{1}, 0), + V: testutil.MakeInt64Vector([]int64{1}, nil), }, }, isProjection: true, }, want: &extend.ValueExtend{ - V: testutil.MakeInt8Vector([]int8{0}, 0), + V: testutil.MakeInt8Vector([]int8{0}, nil), }, }, { @@ -66,13 +67,13 @@ func Test_build_pruneExtend(t *testing.T) { e: &extend.UnaryExtend{ Op: overload.Not, E: &extend.ValueExtend{ - V: testutil.MakeInt64Vector([]int64{1}, 0), + V: testutil.MakeInt64Vector([]int64{1}, nil), }, }, isProjection: false, }, want: &extend.ValueExtend{ - V: testutil.MakeInt64Vector([]int64{1}, 0), + V: testutil.MakeInt64Vector([]int64{1}, nil), }, }, { @@ -82,13 +83,13 @@ func Test_build_pruneExtend(t *testing.T) { e: &extend.UnaryExtend{ Op: overload.UnaryMinus, E: &extend.ValueExtend{ - V: testutil.MakeInt64Vector([]int64{1}, 0), + V: testutil.MakeInt64Vector([]int64{1}, nil), }, }, isProjection: false, }, want: &extend.ValueExtend{ - V: testutil.MakeInt64Vector([]int64{-1}, 0), + V: testutil.MakeInt64Vector([]int64{-1}, nil), }, }, { @@ -98,13 +99,13 @@ func Test_build_pruneExtend(t *testing.T) { e: &extend.UnaryExtend{ Op: overload.UnaryMinus, E: &extend.ValueExtend{ - V: testutil.MakeInt64Vector([]int64{-1}, 0), + V: testutil.MakeInt64Vector([]int64{-1}, nil), }, }, isProjection: false, }, want: &extend.ValueExtend{ - V: testutil.MakeInt64Vector([]int64{1}, 0), + V: testutil.MakeInt64Vector([]int64{1}, nil), }, }, // 2. parenExtend @@ -113,11 +114,11 @@ func Test_build_pruneExtend(t *testing.T) { fields: fields{}, args: args{ e: &extend.ParenExtend{E: &extend.ValueExtend{ - V: testutil.MakeInt8Vector([]int8{1}, 0), + V: testutil.MakeInt8Vector([]int8{1}, nil), }}, }, want: &extend.ParenExtend{E: &extend.ValueExtend{ - V: testutil.MakeInt8Vector([]int8{1}, 0), + V: testutil.MakeInt8Vector([]int8{1}, nil), }}, }, // 3. binaryExtend @@ -127,12 +128,12 @@ func Test_build_pruneExtend(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.Or, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, want: &extend.ValueExtend{ - V: testutil.MakeInt64Vector([]int64{1}, 0), + V: testutil.MakeInt64Vector([]int64{1}, nil), }, }, { @@ -142,10 +143,10 @@ func Test_build_pruneExtend(t *testing.T) { e: &extend.BinaryExtend{ Op: overload.Or, Left: &extend.Attribute{Name: "a", Type: 0}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, - want: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + want: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, { name: "binary_or_2", @@ -153,11 +154,11 @@ func Test_build_pruneExtend(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.Or, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, Right: &extend.Attribute{Name: "a", Type: 0}, }, }, - want: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + want: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, { name: "binary_or_3", @@ -165,7 +166,7 @@ func Test_build_pruneExtend(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.Or, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{0}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{0}, nil)}, Right: &extend.Attribute{Name: "a", Type: 0}, }, }, @@ -178,7 +179,7 @@ func Test_build_pruneExtend(t *testing.T) { e: &extend.BinaryExtend{ Op: overload.Or, Left: &extend.Attribute{Name: "a", Type: 0}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{0}, 0)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{0}, nil)}, }, }, want: &extend.Attribute{Name: "a", Type: 0}, @@ -190,12 +191,12 @@ func Test_build_pruneExtend(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.And, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, want: &extend.ValueExtend{ - V: testutil.MakeInt64Vector([]int64{1}, 0), + V: testutil.MakeInt64Vector([]int64{1}, nil), }, }, { @@ -205,7 +206,7 @@ func Test_build_pruneExtend(t *testing.T) { e: &extend.BinaryExtend{ Op: overload.And, Left: &extend.Attribute{Name: "a", Type: 0}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, want: &extend.Attribute{Name: "a", Type: 0}, @@ -217,10 +218,10 @@ func Test_build_pruneExtend(t *testing.T) { e: &extend.BinaryExtend{ Op: overload.And, Left: &extend.Attribute{Name: "a", Type: 0}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{0}, 0)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{0}, nil)}, }, }, - want: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{0}, 0)}, + want: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{0}, nil)}, }, { name: "binary_and_3", @@ -228,11 +229,11 @@ func Test_build_pruneExtend(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.And, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{0}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{0}, nil)}, Right: &extend.Attribute{Name: "a", Type: 0}, }, }, - want: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{0}, 0)}, + want: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{0}, nil)}, }, { name: "binary_and_4", @@ -240,7 +241,7 @@ func Test_build_pruneExtend(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.And, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, Right: &extend.Attribute{Name: "a", Type: 0}, }, }, @@ -252,7 +253,7 @@ func Test_build_pruneExtend(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.And, - Left: &extend.ValueExtend{V: testutil.MakeFloat64Vector([]float64{1}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeFloat64Vector([]float64{1}, nil)}, Right: &extend.Attribute{Name: "a", Type: 0}, }, }, @@ -265,7 +266,7 @@ func Test_build_pruneExtend(t *testing.T) { e: &extend.BinaryExtend{ Op: overload.And, Left: &extend.Attribute{Name: "a", Type: 0}, - Right: &extend.ValueExtend{V: testutil.MakeFloat64Vector([]float64{1}, 0)}, + Right: &extend.ValueExtend{V: testutil.MakeFloat64Vector([]float64{1}, nil)}, }, }, want: &extend.Attribute{Name: "a", Type: 0}, @@ -277,10 +278,10 @@ func Test_build_pruneExtend(t *testing.T) { e: &extend.BinaryExtend{ Op: overload.And, Left: &extend.Attribute{Name: "a", Type: 0}, - Right: &extend.ValueExtend{V: testutil.MakeFloat64Vector([]float64{0}, 0)}, + Right: &extend.ValueExtend{V: testutil.MakeFloat64Vector([]float64{0}, nil)}, }, }, - want: &extend.ValueExtend{V: testutil.MakeFloat64Vector([]float64{0}, 0)}, + want: &extend.ValueExtend{V: testutil.MakeFloat64Vector([]float64{0}, nil)}, }, { name: "binary_and_8", @@ -288,11 +289,11 @@ func Test_build_pruneExtend(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.And, - Left: &extend.ValueExtend{V: testutil.MakeFloat64Vector([]float64{0}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeFloat64Vector([]float64{0}, nil)}, Right: &extend.Attribute{Name: "a", Type: 0}, }, }, - want: &extend.ValueExtend{V: testutil.MakeFloat64Vector([]float64{0}, 0)}, + want: &extend.ValueExtend{V: testutil.MakeFloat64Vector([]float64{0}, nil)}, }, { @@ -301,12 +302,12 @@ func Test_build_pruneExtend(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.EQ, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, want: &extend.ValueExtend{ - V: testutil.MakeInt64Vector([]int64{1}, 1), + V: testutil.MakeInt64Vector([]int64{1}, nil), }, }, { @@ -316,13 +317,13 @@ func Test_build_pruneExtend(t *testing.T) { e: &extend.BinaryExtend{ Op: overload.EQ, Left: &extend.Attribute{Name: "a", Type: types.T_int8}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, want: &extend.BinaryExtend{ Op: overload.EQ, Left: &extend.Attribute{Name: "a", Type: types.T_int8}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 1)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, { @@ -332,13 +333,13 @@ func Test_build_pruneExtend(t *testing.T) { e: &extend.BinaryExtend{ Op: overload.EQ, Left: &extend.Attribute{Name: "a", Type: types.T_int16}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, want: &extend.BinaryExtend{ Op: overload.EQ, Left: &extend.Attribute{Name: "a", Type: types.T_int16}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 1)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, { @@ -348,13 +349,13 @@ func Test_build_pruneExtend(t *testing.T) { e: &extend.BinaryExtend{ Op: overload.EQ, Left: &extend.Attribute{Name: "a", Type: types.T_int32}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, want: &extend.BinaryExtend{ Op: overload.EQ, Left: &extend.Attribute{Name: "a", Type: types.T_int32}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 1)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, { @@ -364,13 +365,13 @@ func Test_build_pruneExtend(t *testing.T) { e: &extend.BinaryExtend{ Op: overload.EQ, Left: &extend.Attribute{Name: "a", Type: types.T_int64}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, want: &extend.BinaryExtend{ Op: overload.EQ, Left: &extend.Attribute{Name: "a", Type: types.T_int64}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 1)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, { @@ -380,13 +381,13 @@ func Test_build_pruneExtend(t *testing.T) { e: &extend.BinaryExtend{ Op: overload.EQ, Left: &extend.Attribute{Name: "a", Type: types.T_uint8}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, want: &extend.BinaryExtend{ Op: overload.EQ, Left: &extend.Attribute{Name: "a", Type: types.T_uint8}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 1)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, @@ -396,12 +397,12 @@ func Test_build_pruneExtend(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.LT, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, want: &extend.ValueExtend{ - V: testutil.MakeInt64Vector([]int64{0}, 1), + V: testutil.MakeInt64Vector([]int64{0}, nil), }, }, { @@ -410,12 +411,12 @@ func Test_build_pruneExtend(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.LE, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{2}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{2}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, want: &extend.ValueExtend{ - V: testutil.MakeInt64Vector([]int64{0}, 1), + V: testutil.MakeInt64Vector([]int64{0}, nil), }, }, { @@ -424,12 +425,12 @@ func Test_build_pruneExtend(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.GT, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{2}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{2}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, want: &extend.ValueExtend{ - V: testutil.MakeInt64Vector([]int64{1}, 1), + V: testutil.MakeInt64Vector([]int64{1}, nil), }, }, { @@ -438,12 +439,12 @@ func Test_build_pruneExtend(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.GE, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, want: &extend.ValueExtend{ - V: testutil.MakeInt64Vector([]int64{1}, 1), + V: testutil.MakeInt64Vector([]int64{1}, nil), }, }, { @@ -452,12 +453,12 @@ func Test_build_pruneExtend(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.NE, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, want: &extend.ValueExtend{ - V: testutil.MakeInt64Vector([]int64{0}, 1), + V: testutil.MakeInt64Vector([]int64{0}, nil), }, }, { @@ -466,12 +467,12 @@ func Test_build_pruneExtend(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.Div, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{4}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{2}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{4}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{2}, nil)}, }, }, want: &extend.ValueExtend{ - V: testutil.MakeFloat64Vector([]float64{2}, 1), + V: testutil.MakeFloat64Vector([]float64{2}, nil), }, }, { @@ -480,12 +481,12 @@ func Test_build_pruneExtend(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.Mod, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{5}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{3}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{5}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{3}, nil)}, }, }, want: &extend.ValueExtend{ - V: testutil.MakeInt64Vector([]int64{2}, 1), + V: testutil.MakeInt64Vector([]int64{2}, nil), }, }, { @@ -494,12 +495,12 @@ func Test_build_pruneExtend(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.Mult, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{2}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{2}, nil)}, }, }, want: &extend.ValueExtend{ - V: testutil.MakeInt64Vector([]int64{2}, 1), + V: testutil.MakeInt64Vector([]int64{2}, nil), }, }, { @@ -508,12 +509,12 @@ func Test_build_pruneExtend(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.Plus, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, want: &extend.ValueExtend{ - V: testutil.MakeInt64Vector([]int64{2}, 1), + V: testutil.MakeInt64Vector([]int64{2}, nil), }, }, { @@ -522,12 +523,12 @@ func Test_build_pruneExtend(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.Minus, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, want: &extend.ValueExtend{ - V: testutil.MakeInt64Vector([]int64{0}, 1), + V: testutil.MakeInt64Vector([]int64{0}, nil), }, }, { @@ -536,12 +537,12 @@ func Test_build_pruneExtend(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.Like, - Left: &extend.ValueExtend{V: testutil.MakeStringVector([]string{"123"}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeStringVector([]string{"123"}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeVarcharVector([]string{"123"}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeVarcharVector([]string{"123"}, nil)}, }, }, want: &extend.ValueExtend{ - V: testutil.MakeInt64Vector([]int64{1}, 1), + V: testutil.MakeInt64Vector([]int64{1}, nil), }, }, } @@ -561,7 +562,9 @@ func Test_build_pruneExtend(t *testing.T) { if err != nil && tt.wantErr { return } - if !reflect.DeepEqual(got, tt.want) { + s1 := strings.TrimSpace(tt.want.String()) + s2 := strings.TrimSpace(got.String()) + if s1 != s2 { t.Errorf("pruneExtend() got = %v, want %v", got, tt.want) } }) @@ -591,14 +594,14 @@ func Test_logicInverse(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.EQ, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, want: &extend.BinaryExtend{ Op: overload.NE, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, { @@ -606,14 +609,14 @@ func Test_logicInverse(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.NE, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, want: &extend.BinaryExtend{ Op: overload.EQ, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, { @@ -621,14 +624,14 @@ func Test_logicInverse(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.GE, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, want: &extend.BinaryExtend{ Op: overload.LT, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, { @@ -636,14 +639,14 @@ func Test_logicInverse(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.LT, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, want: &extend.BinaryExtend{ Op: overload.GE, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, { @@ -651,14 +654,14 @@ func Test_logicInverse(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.LE, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, want: &extend.BinaryExtend{ Op: overload.GT, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, { @@ -666,14 +669,14 @@ func Test_logicInverse(t *testing.T) { args: args{ e: &extend.BinaryExtend{ Op: overload.GT, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, want: &extend.BinaryExtend{ Op: overload.LE, - Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, - Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + Left: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, + Right: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, // 3. unaryExtend @@ -682,12 +685,12 @@ func Test_logicInverse(t *testing.T) { args: args{ e: &extend.UnaryExtend{ Op: overload.UnaryMinus, - E: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + E: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, want: &extend.UnaryExtend{ Op: overload.UnaryMinus, - E: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, 0)}, + E: &extend.ValueExtend{V: testutil.MakeInt64Vector([]int64{1}, nil)}, }, }, { diff --git a/pkg/sql/plan2/function/operator/case_when_test.go b/pkg/sql/plan2/function/operator/case_when_test.go index f7266c484..86e896d31 100644 --- a/pkg/sql/plan2/function/operator/case_when_test.go +++ b/pkg/sql/plan2/function/operator/case_when_test.go @@ -2,22 +2,14 @@ package operator import ( "fmt" - "github.com/matrixorigin/matrixone/pkg/container/nulls" "github.com/matrixorigin/matrixone/pkg/container/types" "github.com/matrixorigin/matrixone/pkg/container/vector" - "github.com/matrixorigin/matrixone/pkg/vm/mheap" - "github.com/matrixorigin/matrixone/pkg/vm/mmu/guest" - "github.com/matrixorigin/matrixone/pkg/vm/mmu/host" + "github.com/matrixorigin/matrixone/pkg/sql/testutil" "github.com/matrixorigin/matrixone/pkg/vm/process" "github.com/stretchr/testify/require" "testing" ) -var ( - bt = types.Type{Oid: types.T_bool} - i64 = types.Type{Oid: types.T_int64} -) - type arg struct { info string proc *process.Process @@ -27,194 +19,155 @@ type arg struct { expect *vector.Vector } -func newProc() *process.Process { - return process.New(mheap.New(guest.New(1<<10, host.New(1<<10)))) -} - -func makeBoolVector(values []bool) *vector.Vector { - vec := vector.New(bt) - vec.Col = values - return vec -} - -func makeScalarBool(v bool, length int) *vector.Vector { - vec := newProc().AllocScalarVector(bt) - vec.Length = length - vec.Col = []bool{v} - return vec -} - -func makeInt64Vector(is []int64, nsp []uint64) *vector.Vector { - vec := vector.New(i64) - vec.Col = is - for _, n := range nsp { - nulls.Add(vec.Nsp, n) - } - return vec -} - -func makeScalarInt64(i int64, length int) *vector.Vector { - vec := newProc().AllocScalarVector(i64) - vec.Length = length - vec.Col = []int64{i} - return vec -} - -func makeScalarNull(length int) *vector.Vector { - vec := newProc().AllocScalarNullVector(types.Type{Oid: types.T_any}) - vec.Length = length - return vec -} - func TestCwFn1(t *testing.T) { testCases := []arg{ { - info: "when a = 1 then 1, when a = 2 then 2, else 3", proc: newProc(), + info: "when a = 1 then 1, when a = 2 then 2, else 3", proc: testutil.NewProc(), vs: []*vector.Vector{ - makeBoolVector([]bool{true, true, false, false, false}), // a = 1 - makeScalarInt64(1, 5), // 1 - makeBoolVector([]bool{false, false, false, true, false}), // a = 2 - makeScalarInt64(2, 5), // 2 - makeScalarInt64(3, 5), // 3 + testutil.MakeBoolVector([]bool{true, true, false, false, false}), // a = 1 + testutil.MakeScalarInt64(1, 5), // 1 + testutil.MakeBoolVector([]bool{false, false, false, true, false}), // a = 2 + testutil.MakeScalarInt64(2, 5), // 2 + testutil.MakeScalarInt64(3, 5), // 3 }, match: true, err: false, - expect: makeInt64Vector([]int64{1, 1, 3, 2, 3}, nil), + expect: testutil.MakeInt64Vector([]int64{1, 1, 3, 2, 3}, nil), }, { - info: "when a = 1 then 1, when a = 2 then 2, else null", proc: newProc(), + info: "when a = 1 then 1, when a = 2 then 2, else null", proc: testutil.NewProc(), vs: []*vector.Vector{ - makeBoolVector([]bool{false, false, false, false}), // a = 1 - makeScalarInt64(1, 4), // 1 - makeBoolVector([]bool{true, false, false, false}), // a = 2 - makeScalarInt64(2, 4), // 2 - makeScalarNull(4), + testutil.MakeBoolVector([]bool{false, false, false, false}), // a = 1 + testutil.MakeScalarInt64(1, 4), // 1 + testutil.MakeBoolVector([]bool{true, false, false, false}), // a = 2 + testutil.MakeScalarInt64(2, 4), // 2 + testutil.MakeScalarNull(4), }, match: true, err: false, - expect: makeInt64Vector([]int64{2, 0, 0, 0}, []uint64{1, 2, 3}), + expect: testutil.MakeInt64Vector([]int64{2, 0, 0, 0}, []uint64{1, 2, 3}), }, { - info: "when a = 1 then 1, when a = 2 then 2", proc: newProc(), + info: "when a = 1 then 1, when a = 2 then 2", proc: testutil.NewProc(), vs: []*vector.Vector{ - makeBoolVector([]bool{false, false, false, false}), // a = 1 - makeScalarInt64(1, 4), // 1 - makeBoolVector([]bool{true, false, false, false}), // a = 2 - makeScalarInt64(2, 4), // 2 + testutil.MakeBoolVector([]bool{false, false, false, false}), // a = 1 + testutil.MakeScalarInt64(1, 4), // 1 + testutil.MakeBoolVector([]bool{true, false, false, false}), // a = 2 + testutil.MakeScalarInt64(2, 4), // 2 }, match: true, err: false, - expect: makeInt64Vector([]int64{2, 0, 0, 0}, []uint64{1, 2, 3}), + expect: testutil.MakeInt64Vector([]int64{2, 0, 0, 0}, []uint64{1, 2, 3}), }, { - info: "when a = 1 then c1, when a = 2 then c2", proc: newProc(), + info: "when a = 1 then c1, when a = 2 then c2", proc: testutil.NewProc(), vs: []*vector.Vector{ - makeBoolVector([]bool{true, true, false, false, false}), // a = 1 - makeInt64Vector([]int64{1, 0, 3, 4, 5}, []uint64{1}), // 1, null, 3, 4, 5 - makeBoolVector([]bool{false, false, true, true, false}), // a = 2 - makeInt64Vector([]int64{0, 0, 0, 0, 0}, []uint64{1, 2, 3}), // 0, null, null, null, 0 + testutil.MakeBoolVector([]bool{true, true, false, false, false}), // a = 1 + testutil.MakeInt64Vector([]int64{1, 0, 3, 4, 5}, []uint64{1}), // 1, null, 3, 4, 5 + testutil.MakeBoolVector([]bool{false, false, true, true, false}), // a = 2 + testutil.MakeInt64Vector([]int64{0, 0, 0, 0, 0}, []uint64{1, 2, 3}), // 0, null, null, null, 0 }, match: true, err: false, - expect: makeInt64Vector([]int64{1, 0, 0, 0, 0}, []uint64{1, 2, 3, 4}), // 1, null, null, null, null + expect: testutil.MakeInt64Vector([]int64{1, 0, 0, 0, 0}, []uint64{1, 2, 3, 4}), // 1, null, null, null, null }, { - info: "when a = 1 then c1, when a = 2 then c2", proc: newProc(), + info: "when a = 1 then c1, when a = 2 then c2", proc: testutil.NewProc(), vs: []*vector.Vector{ - makeBoolVector([]bool{true, true, false, false, false}), // a = 1 - makeInt64Vector([]int64{1, 0, 3, 4, 5}, []uint64{1}), // 1, null, 3, 4, 5 - makeBoolVector([]bool{false, false, true, true, false}), // a = 2 - makeInt64Vector([]int64{0, 0, 0, 0, 0}, []uint64{1, 2, 3}), // 0, null, null, null, 0 + testutil.MakeBoolVector([]bool{true, true, false, false, false}), // a = 1 + testutil.MakeInt64Vector([]int64{1, 0, 3, 4, 5}, []uint64{1}), // 1, null, 3, 4, 5 + testutil.MakeBoolVector([]bool{false, false, true, true, false}), // a = 2 + testutil.MakeInt64Vector([]int64{0, 0, 0, 0, 0}, []uint64{1, 2, 3}), // 0, null, null, null, 0 }, match: true, err: false, - expect: makeInt64Vector([]int64{1, 0, 0, 0, 0}, []uint64{1, 2, 3, 4}), // 1, null, null, null, null + expect: testutil.MakeInt64Vector([]int64{1, 0, 0, 0, 0}, []uint64{1, 2, 3, 4}), // 1, null, null, null, null }, { - info: "when a = 1 then c1, when a = 2 then c2, else null", proc: newProc(), + info: "when a = 1 then c1, when a = 2 then c2, else null", proc: testutil.NewProc(), vs: []*vector.Vector{ - makeBoolVector([]bool{true, true, false, false, false}), // a = 1 - makeInt64Vector([]int64{1, 0, 3, 4, 5}, []uint64{1}), // 1, null, 3, 4, 5 - makeBoolVector([]bool{false, false, true, true, false}), // a = 2 - makeInt64Vector([]int64{0, 0, 0, 0, 0}, []uint64{1, 2, 3}), // 0, null, null, null, 0 + testutil.MakeBoolVector([]bool{true, true, false, false, false}), // a = 1 + testutil.MakeInt64Vector([]int64{1, 0, 3, 4, 5}, []uint64{1}), // 1, null, 3, 4, 5 + testutil.MakeBoolVector([]bool{false, false, true, true, false}), // a = 2 + testutil.MakeInt64Vector([]int64{0, 0, 0, 0, 0}, []uint64{1, 2, 3}), // 0, null, null, null, 0 }, match: true, err: false, - expect: makeInt64Vector([]int64{1, 0, 0, 0, 0}, []uint64{1, 2, 3, 4}), // 1, null, null, null, null + expect: testutil.MakeInt64Vector([]int64{1, 0, 0, 0, 0}, []uint64{1, 2, 3, 4}), // 1, null, null, null, null }, { - info: "when a = 1 then c1, when a = 2 then c2, else c3", proc: newProc(), + info: "when a = 1 then c1, when a = 2 then c2, else c3", proc: testutil.NewProc(), vs: []*vector.Vector{ - makeBoolVector([]bool{true, true, false, false, false}), // a = 1 - makeInt64Vector([]int64{1, 0, 3, 4, 5}, []uint64{1}), // 1, null, 3, 4, 5 - makeBoolVector([]bool{false, false, true, true, false}), // a = 2 - makeInt64Vector([]int64{0, 0, 0, 0, 0}, []uint64{1, 2, 3}), // 0, null, null, null, 0 - makeInt64Vector([]int64{100, 200, 300, 0, 500}, []uint64{3}), // 100, 200, 300, null, 500 + testutil.MakeBoolVector([]bool{true, true, false, false, false}), // a = 1 + testutil.MakeInt64Vector([]int64{1, 0, 3, 4, 5}, []uint64{1}), // 1, null, 3, 4, 5 + testutil.MakeBoolVector([]bool{false, false, true, true, false}), // a = 2 + testutil.MakeInt64Vector([]int64{0, 0, 0, 0, 0}, []uint64{1, 2, 3}), // 0, null, null, null, 0 + testutil.MakeInt64Vector([]int64{100, 200, 300, 0, 500}, []uint64{3}), // 100, 200, 300, null, 500 }, match: true, err: false, - expect: makeInt64Vector([]int64{1, 0, 0, 0, 500}, []uint64{1, 2, 3}), // 1, null, null, null, 500 + expect: testutil.MakeInt64Vector([]int64{1, 0, 0, 0, 500}, []uint64{1, 2, 3}), // 1, null, null, null, 500 }, { - info: "when true then c1, when false then c2, else null", proc: newProc(), + info: "when true then c1, when false then c2, else null", proc: testutil.NewProc(), vs: []*vector.Vector{ - makeScalarBool(true, 4), - makeInt64Vector([]int64{1, 2, 3, 4}, nil), // 1, 2, 3, 4 - makeScalarBool(false, 4), - makeInt64Vector([]int64{4, 3, 2, 1}, nil), - makeScalarNull(4), + testutil.MakeScalarBool(true, 4), + testutil.MakeInt64Vector([]int64{1, 2, 3, 4}, nil), // 1, 2, 3, 4 + testutil.MakeScalarBool(false, 4), + testutil.MakeInt64Vector([]int64{4, 3, 2, 1}, nil), + testutil.MakeScalarNull(4), }, match: true, err: false, - expect: makeInt64Vector([]int64{1, 2, 3, 4}, nil), // 1, 2, 3, 4 + expect: testutil.MakeInt64Vector([]int64{1, 2, 3, 4}, nil), // 1, 2, 3, 4 }, { - info: "when true then 1, when false then 2, else null", proc: newProc(), + info: "when true then 1, when false then 2, else null", proc: testutil.NewProc(), vs: []*vector.Vector{ - makeScalarBool(true, 4), - makeScalarInt64(1, 4), - makeScalarBool(false, 4), - makeScalarInt64(2, 4), - makeScalarNull(4), + testutil.MakeScalarBool(true, 4), + testutil.MakeScalarInt64(1, 4), + testutil.MakeScalarBool(false, 4), + testutil.MakeScalarInt64(2, 4), + testutil.MakeScalarNull(4), }, match: true, err: false, - expect: makeScalarInt64(1, 4), + expect: testutil.MakeScalarInt64(1, 4), }, { - info: "when a = 1 then null, when a = 2 then null, else null", proc: newProc(), + info: "when a = 1 then null, when a = 2 then null, else null", proc: testutil.NewProc(), vs: []*vector.Vector{ - makeBoolVector([]bool{false, false, false, false}), - makeScalarNull(4), - makeBoolVector([]bool{false, false, false, false}), - makeScalarNull(4), - makeScalarNull(4), + testutil.MakeBoolVector([]bool{false, false, false, false}), + testutil.MakeScalarNull(4), + testutil.MakeBoolVector([]bool{false, false, false, false}), + testutil.MakeScalarNull(4), + testutil.MakeScalarNull(4), }, match: false, }, { // special case 1 - info: "when a = 1 then 1, when a = 1 then 2, else null", proc: newProc(), + info: "when a = 1 then 1, when a = 1 then 2, else null", proc: testutil.NewProc(), vs: []*vector.Vector{ - makeBoolVector([]bool{true, true, false, false}), - makeScalarInt64(1, 4), - makeBoolVector([]bool{false, true, true, false}), - makeScalarInt64(2, 4), - makeScalarNull(4), + testutil.MakeBoolVector([]bool{true, true, false, false}), + testutil.MakeScalarInt64(1, 4), + testutil.MakeBoolVector([]bool{false, true, true, false}), + testutil.MakeScalarInt64(2, 4), + testutil.MakeScalarNull(4), }, match: true, err: false, - expect: makeInt64Vector([]int64{1, 1, 2, 0}, []uint64{3}), + expect: testutil.MakeInt64Vector([]int64{1, 1, 2, 0}, []uint64{3}), }, } @@ -238,31 +191,7 @@ func TestCwFn1(t *testing.T) { require.Errorf(t, ergot, fmt.Sprintf("case '%d' expected error, but no error happens", i)) } else { require.NoError(t, ergot) - //println(fmt.Sprintf("e: %v", tc.expect.Col)) - //println(fmt.Sprintf("g: %v", got.Col)) - if tc.expect.IsScalar() { - require.True(t, got.IsScalar()) - if tc.expect.IsScalarNull() { - require.True(t, got.IsScalarNull()) - } else { - require.Equal(t, tc.expect.Col.([]int64)[0], got.Col.([]int64)[0]) - } - } else { - require.False(t, got.IsScalar()) - - expectL := vector.Length(tc.expect) - gotL := vector.Length(got) - require.Equal(t, expectL, gotL) - require.Equal(t, nulls.Any(tc.expect.Nsp), nulls.Any(got.Nsp)) - - for k := 0; k < gotL; k++ { - c := nulls.Contains(tc.expect.Nsp, uint64(k)) - require.Equal(t, c, nulls.Contains(got.Nsp, uint64(k))) - if !c { - require.Equal(t, tc.expect.Col.([]int64)[k], got.Col.([]int64)[k]) - } - } - } + require.True(t, testutil.CompareVectors(tc.expect, got), "got vector is different with expected") } }) } diff --git a/pkg/sql/plan2/function/operators.go b/pkg/sql/plan2/function/operators.go index 9a58bce36..e3f4214fe 100644 --- a/pkg/sql/plan2/function/operators.go +++ b/pkg/sql/plan2/function/operators.go @@ -2024,24 +2024,6 @@ var operators = map[int][]Function{ TypeCheckFn: strictTypeCheck, Fn: operator.ModFloat[float64], }, - { - Index: 10, - Flag: plan.Function_STRICT, - Layout: BINARY_ARITHMETIC_OPERATOR, - Args: []types.T{types.T_decimal64, types.T_decimal64}, - ReturnTyp: types.T_decimal64, - TypeCheckFn: strictTypeCheck, - Fn: nil, - }, - { - Index: 11, - Flag: plan.Function_STRICT, - Layout: BINARY_ARITHMETIC_OPERATOR, - Args: []types.T{types.T_decimal128, types.T_decimal128}, - ReturnTyp: types.T_decimal128, - TypeCheckFn: strictTypeCheck, - Fn: nil, - }, }, UNARY_PLUS: { { diff --git a/pkg/sql/testutil/make.go b/pkg/sql/testutil/make.go deleted file mode 100644 index a81717228..000000000 --- a/pkg/sql/testutil/make.go +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright 2021 Matrix Origin -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/* - Package testutil implements some function may be used while doing unit-test for - functions in compute-layer. - - Such as: - 1. init functions for common structure, likes vector, types.Bytes and so on. - 2. -*/ - -package testutil - -import ( - "github.com/matrixorigin/matrixone/pkg/container/types" - "github.com/matrixorigin/matrixone/pkg/container/vector" -) - -func MakeBytes(strs []string) *types.Bytes { - ret := &types.Bytes{} - next := uint32(0) - for _, s := range strs { - l := uint32(len(s)) - ret.Data = append(ret.Data, []byte(s)...) - ret.Lengths = append(ret.Lengths, l) - ret.Offsets = append(ret.Offsets, next) - next += l - } - return ret -} - -func MakeInt8Vector(vs []int8, ref uint64) *vector.Vector { - ret := vector.New(types.Type{Oid: types.T_int8, Size: 1}) - ret.Ref = ref - vector.SetCol(ret, vs) - // vector.SetLength(ret, len(vs)) - return ret -} - -func MakeInt16Vector(vs []int16, ref uint64) *vector.Vector { - ret := vector.New(types.Type{Oid: types.T_int16, Size: 2}) - ret.Ref = ref - vector.SetCol(ret, vs) - // vector.SetLength(ret, len(vs)) - return ret -} - -func MakeInt32Vector(vs []int32, ref uint64) *vector.Vector { - ret := vector.New(types.Type{Oid: types.T_int32, Size: 4}) - ret.Ref = ref - vector.SetCol(ret, vs) - // vector.SetLength(ret, len(vs)) - return ret -} - -func MakeInt64Vector(vs []int64, ref uint64) *vector.Vector { - ret := vector.New(types.Type{Oid: types.T_int64, Size: 8}) - ret.Ref = ref - vector.SetCol(ret, vs) - // vector.SetLength(ret, len(vs)) - return ret -} - -func MakeUint8Vector(vs []uint8, ref uint64) *vector.Vector { - ret := vector.New(types.Type{Oid: types.T_uint8, Size: 1}) - ret.Ref = ref - vector.SetCol(ret, vs) - // vector.SetLength(ret, len(vs)) - return ret -} - -func MakeUint16Vector(vs []uint16, ref uint64) *vector.Vector { - ret := vector.New(types.Type{Oid: types.T_uint16, Size: 2}) - ret.Ref = ref - vector.SetCol(ret, vs) - // vector.SetLength(ret, len(vs)) - return ret -} - -func MakeUint32Vector(vs []uint32, ref uint64) *vector.Vector { - ret := vector.New(types.Type{Oid: types.T_uint32, Size: 4}) - ret.Ref = ref - vector.SetCol(ret, vs) - // vector.SetLength(ret, len(vs)) - return ret -} - -func MakeUint64Vector(vs []uint64, ref uint64) *vector.Vector { - ret := vector.New(types.Type{Oid: types.T_uint64, Size: 8}) - ret.Ref = ref - vector.SetCol(ret, vs) - // vector.SetLength(ret, len(vs)) - return ret -} - -func MakeStringVector(vs []string, ref uint64) *vector.Vector { - ret := vector.New(types.Type{Oid: types.T_varchar, Size: 24}) - ret.Ref = ref - vector.SetCol(ret, MakeBytes(vs)) - return ret -} - -func MakeFloat32Vector(vs []float32, ref uint64) *vector.Vector { - ret := vector.New(types.Type{Oid: types.T_float32, Size: 4}) - ret.Ref = ref - vector.SetCol(ret, vs) - // vector.SetLength(ret, len(vs)) - return ret -} - -func MakeFloat64Vector(vs []float64, ref uint64) *vector.Vector { - ret := vector.New(types.Type{Oid: types.T_float64, Size: 8}) - ret.Ref = ref - vector.SetCol(ret, vs) - // vector.SetLength(ret, len(vs)) - return ret -} diff --git a/pkg/sql/testutil/testutil.go b/pkg/sql/testutil/testutil.go index f65316d14..66734726d 100644 --- a/pkg/sql/testutil/testutil.go +++ b/pkg/sql/testutil/testutil.go @@ -13,3 +13,343 @@ // limitations under the License. package testutil + +import ( + "github.com/matrixorigin/matrixone/pkg/container/nulls" + "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/container/vector" + "github.com/matrixorigin/matrixone/pkg/vm/mheap" + "github.com/matrixorigin/matrixone/pkg/vm/mmu/guest" + "github.com/matrixorigin/matrixone/pkg/vm/mmu/host" + "github.com/matrixorigin/matrixone/pkg/vm/process" + "golang.org/x/exp/constraints" + "reflect" + "unsafe" +) + +var ( + bt = types.T_bool.ToType() + i8 = types.T_int8.ToType() + i16 = types.T_int16.ToType() + i32 = types.T_int32.ToType() + i64 = types.T_int64.ToType() + u8 = types.T_uint8.ToType() + u16 = types.T_uint16.ToType() + u32 = types.T_uint32.ToType() + u64 = types.T_uint64.ToType() + f32 = types.T_float32.ToType() + f64 = types.T_float64.ToType() + ct = types.T_char.ToType() + vc = types.T_varchar.ToType() + d64 = types.T_decimal64.ToType() + d128 = types.T_decimal128.ToType() + dt = types.T_date.ToType() + dti = types.T_datetime.ToType() +) + +type vecType interface { + constraints.Integer | constraints.Float | bool +} + +func makeVector[T vecType](values []T, nsp []uint64, typ types.Type) *vector.Vector { + vec := vector.New(typ) + vec.Col = values + for _, n := range nsp { + nulls.Add(vec.Nsp, n) + } + return vec +} + +func makeScalar[T vecType](value T, length int, typ types.Type) *vector.Vector { + vec := NewProc().AllocScalarVector(typ) + vec.Length = length + vec.Col = []T{value} + return vec +} + +func makeStringVector(values []string, nsp []uint64, typ types.Type) *vector.Vector { + vec := vector.New(typ) + bs := &types.Bytes{ + Lengths: make([]uint32, len(values)), + Offsets: make([]uint32, len(values)), + } + next := uint32(0) + if nsp == nil { + for i, s := range values { + l := uint32(len(s)) + bs.Data = append(bs.Data, []byte(s)...) + bs.Lengths[i] = l + bs.Offsets[i] = next + next += l + } + } else { + for _, n := range nsp { + nulls.Add(vec.Nsp, n) + } + for i := range values { + if nulls.Contains(vec.Nsp, uint64(i)) { + continue + } + s := values[i] + l := uint32(len(s)) + bs.Data = append(bs.Data, []byte(s)...) + bs.Lengths[i] = l + bs.Offsets[i] = next + next += l + } + } + vec.Col = bs + return vec +} + +func NewProc() *process.Process { + return process.New(mheap.New(guest.New(1<<10, host.New(1<<10)))) +} + +func MakeScalarNull(length int) *vector.Vector { + vec := NewProc().AllocScalarNullVector(types.Type{Oid: types.T_any}) + vec.Length = length + return vec +} + +func MakeBoolVector(values []bool) *vector.Vector { + return makeVector[bool](values, nil, bt) +} + +func MakeScalarBool(v bool, length int) *vector.Vector { + return makeScalar[bool](v, length, bt) +} + +func MakeInt64Vector(values []int64, nsp []uint64) *vector.Vector { + return makeVector[int64](values, nsp, i64) +} + +func MakeScalarInt64(v int64, length int) *vector.Vector { + return makeScalar[int64](v, length, i64) +} + +func MakeInt32Vector(values []int32, nsp []uint64) *vector.Vector { + return makeVector[int32](values, nsp, i32) +} + +func MakeScalarInt32(v int32, length int) *vector.Vector { + return makeScalar[int32](v, length, i32) +} + +func MakeInt16Vector(values []int16, nsp []uint64) *vector.Vector { + return makeVector[int16](values, nsp, i16) +} + +func MakeScalarInt16(v int16, length int) *vector.Vector { + return makeScalar[int16](v, length, i16) +} + +func MakeInt8Vector(values []int8, nsp []uint64) *vector.Vector { + return makeVector[int8](values, nsp, i8) +} + +func MakeScalarInt8(v int8, length int) *vector.Vector { + return makeScalar[int8](v, length, i8) +} + +func MakeUint64Vector(values []uint64, nsp []uint64) *vector.Vector { + return makeVector[uint64](values, nsp, u64) +} + +func MakeScalarUint64(v uint64, length int) *vector.Vector { + return makeScalar[uint64](v, length, u64) +} + +func MakeUint32Vector(values []uint32, nsp []uint64) *vector.Vector { + return makeVector[uint32](values, nsp, u32) +} + +func MakeScalarUint32(v uint32, length int) *vector.Vector { + return makeScalar[uint32](v, length, u32) +} + +func MakeUint16Vector(values []uint16, nsp []uint64) *vector.Vector { + return makeVector[uint16](values, nsp, u16) +} + +func MakeScalarUint16(v uint16, length int) *vector.Vector { + return makeScalar[uint16](v, length, u16) +} + +func MakeUint8Vector(values []uint8, nsp []uint64) *vector.Vector { + return makeVector[uint8](values, nsp, u8) +} + +func MakeScalarUint8(v uint8, length int) *vector.Vector { + return makeScalar[uint8](v, length, u8) +} + +func MakeFloat32Vector(values []float32, nsp []uint64) *vector.Vector { + return makeVector[float32](values, nsp, f32) +} + +func MakeScalarFloat32(v float32, length int) *vector.Vector { + return makeScalar[float32](v, length, f32) +} + +func MakeFloat64Vector(values []float64, nsp []uint64) *vector.Vector { + return makeVector[float64](values, nsp, f64) +} + +func MakeScalarFloat64(v float64, length int) *vector.Vector { + return makeScalar[float64](v, length, f64) +} + +func MakeCharVector(values []string, nsp []uint64) *vector.Vector { + return makeStringVector(values, nsp, ct) +} + +func MakeVarcharVector(values []string, nsp []uint64) *vector.Vector { + return makeStringVector(values, nsp, vc) +} + +func MakeDecimal64Vector(values []int64, nsp []uint64) *vector.Vector { + vec := vector.New(d64) + for _, n := range nsp { + nulls.Add(vec.Nsp, n) + } + vec.Col = (*types.Decimal64)(unsafe.Pointer(&values)) + return vec +} + +func MakeScalarDecimal64(v int64, length int) *vector.Vector { + vec := NewProc().AllocScalarVector(d64) + vec.Length = length + vec.Col = []types.Decimal64{types.Decimal64(v)} + return vec +} + +func MakeDecimal128Vector(values []uint64, nsp []uint64) *vector.Vector { + vec := vector.New(d128) + cols := make([]types.Decimal128, len(values)) + if nsp == nil { + for i, v := range values { + d := types.InitDecimal128UsingUint(v) + cols[i] = d + } + } else { + for _, n := range nsp { + nulls.Add(vec.Nsp, n) + } + for i, v := range values { + if nulls.Contains(vec.Nsp, uint64(i)) { + continue + } + d := types.InitDecimal128UsingUint(v) + cols[i] = d + } + } + vec.Col = cols + return vec +} + +func MakeScalarDecimal128(v uint64, length int) *vector.Vector { + vec := NewProc().AllocScalarVector(d128) + vec.Length = length + vec.Col = []types.Decimal128{types.InitDecimal128UsingUint(v)} + return vec +} + +func MakeDateVector(values []string, nsp []uint64) *vector.Vector { + vec := vector.New(dt) + ds := make([]types.Date, len(values)) + for _, n := range nsp { + nulls.Add(vec.Nsp, n) + } + for i, s := range values { + if nulls.Contains(vec.Nsp, uint64(i)) { + continue + } + d, err := types.ParseDate(s) + if err != nil { + panic(err) + } + ds[i] = d + } + vec.Col = ds + return vec +} + +func MakeScalarDate(value string, length int) *vector.Vector { + vec := NewProc().AllocScalarVector(dt) + vec.Length = length + d, err := types.ParseDate(value) + if err != nil { + panic(err) + } + vec.Col = []types.Date{d} + return vec +} + +func MakeDateTimeVector(values []string, nsp []uint64) *vector.Vector { + vec := vector.New(dti) + ds := make([]types.Datetime, len(values)) + for _, n := range nsp { + nulls.Add(vec.Nsp, n) + } + for i, s := range values { + if nulls.Contains(vec.Nsp, uint64(i)) { + continue + } + d, err := types.ParseDatetime(s) + if err != nil { + panic(err) + } + ds[i] = d + } + vec.Col = ds + return vec +} + +func MakeScalarDateTime(value string, length int) *vector.Vector { + vec := NewProc().AllocScalarVector(dti) + vec.Length = length + d, err := types.ParseDatetime(value) + if err != nil { + panic(err) + } + vec.Col = []types.Datetime{d} + return vec +} + +func CompareVectors(expected *vector.Vector, got *vector.Vector) bool { + if expected.IsScalar() { + if !got.IsScalar() { + return false + } + if expected.IsScalarNull() { + return got.IsScalarNull() + } else { + return reflect.DeepEqual(expected.Col, got.Col) + } + } else { + if got.IsScalar() { + return false + } + // expected length and got length + expectedLength := vector.Length(expected) + gotLength := vector.Length(got) + if expectedLength != gotLength { + return false + } + if nulls.Any(expected.Nsp) { + var k uint64 = 0 + if !nulls.Any(got.Nsp) { + return false + } + for k = 0; k < uint64(expectedLength); k++ { + c1 := nulls.Contains(expected.Nsp, k) + c2 := nulls.Contains(got.Nsp, k) + if c1 != c2 { + return false + } + } + } + return reflect.DeepEqual(expected.Col, got.Col) + } +} diff --git a/pkg/vectorize/like/like_test.go b/pkg/vectorize/like/like_test.go index 8145b8067..1a60b3e26 100644 --- a/pkg/vectorize/like/like_test.go +++ b/pkg/vectorize/like/like_test.go @@ -24,7 +24,8 @@ import ( ) func makeArgs(ss []string) *types.Bytes { - return testutil.MakeBytes(ss) + vec := testutil.MakeVarcharVector(ss, nil) + return vec.Col.(*types.Bytes) } func Test_sliceLikePure(t *testing.T) { -- GitLab