diff --git a/pkg/sql/plan2/function/builtin/unary/sinh.go b/pkg/sql/plan2/function/builtin/unary/sinh.go index eba65659a862c138de9b6ed84e0a5f815c125d1a..b5b32417c7193b974d74d82a9dd749d4ca9b3688 100644 --- a/pkg/sql/plan2/function/builtin/unary/sinh.go +++ b/pkg/sql/plan2/function/builtin/unary/sinh.go @@ -21,23 +21,24 @@ import ( "github.com/matrixorigin/matrixone/pkg/encoding" "github.com/matrixorigin/matrixone/pkg/vectorize/sinh" "github.com/matrixorigin/matrixone/pkg/vm/process" + "golang.org/x/exp/constraints" ) -// sinh function's evaluation for arguments: [uint64] -func SinhUint64(vs []*vector.Vector, proc *process.Process) (*vector.Vector, error) { +func Sinh[T constraints.Integer | constraints.Float](vs []*vector.Vector, proc *process.Process) (*vector.Vector, error) { origVec := vs[0] - origVecCol := origVec.Col.([]uint64) + origVecCol := origVec.Col.([]T) + resultType := types.Type{Oid: types.T_float64, Size: 8} if origVec.IsScalar() { if origVec.IsScalarNull() { - return proc.AllocScalarNullVector(types.Type{Oid: types.T_float64, Size: 8}), nil + return proc.AllocScalarNullVector(resultType), nil } - resultVector := proc.AllocScalarVector(types.Type{Oid: types.T_float64, Size: 8}) + resultVector := proc.AllocScalarVector(resultType) results := make([]float64, 1) nulls.Set(resultVector.Nsp, origVec.Nsp) - vector.SetCol(resultVector, sinh.SinhUint64(origVecCol, results)) + vector.SetCol(resultVector, sinh.Sinh(origVecCol, results)) return resultVector, nil } else { - resultVector, err := proc.AllocVector(types.Type{Oid: types.T_float64, Size: 8}, 8*int64(len(origVecCol))) + resultVector, err := proc.AllocVector(resultType, 8*int64(len(origVecCol))) if err != nil { return nil, err } @@ -45,61 +46,7 @@ func SinhUint64(vs []*vector.Vector, proc *process.Process) (*vector.Vector, err results = results[:len(origVecCol)] resultVector.Col = results nulls.Set(resultVector.Nsp, origVec.Nsp) - vector.SetCol(resultVector, sinh.SinhUint64(origVecCol, results)) - return resultVector, nil - } -} - -// sinh function's evaluation for arguments: [int64] -func SinhInt64(vs []*vector.Vector, proc *process.Process) (*vector.Vector, error) { - origVec := vs[0] - origVecCol := origVec.Col.([]int64) - if origVec.IsScalar() { - if origVec.IsScalarNull() { - return proc.AllocScalarNullVector(types.Type{Oid: types.T_float64, Size: 8}), nil - } - resultVector := proc.AllocScalarVector(types.Type{Oid: types.T_float64, Size: 8}) - results := make([]float64, 1) - nulls.Set(resultVector.Nsp, origVec.Nsp) - vector.SetCol(resultVector, sinh.SinhInt64(origVecCol, results)) - return resultVector, nil - } else { - resultVector, err := proc.AllocVector(types.Type{Oid: types.T_float64, Size: 8}, 8*int64(len(origVecCol))) - if err != nil { - return nil, err - } - results := encoding.DecodeFloat64Slice(resultVector.Data) - results = results[:len(origVecCol)] - resultVector.Col = results - nulls.Set(resultVector.Nsp, origVec.Nsp) - vector.SetCol(resultVector, sinh.SinhInt64(origVecCol, results)) - return resultVector, nil - } -} - -// sinh function's evaluation for arguments: [float64] -func SinhFloat64(vs []*vector.Vector, proc *process.Process) (*vector.Vector, error) { - origVec := vs[0] - origVecCol := origVec.Col.([]float64) - if origVec.IsScalar() { - if origVec.IsScalarNull() { - return proc.AllocScalarNullVector(types.Type{Oid: types.T_float64, Size: 8}), nil - } - resultVector := proc.AllocScalarVector(types.Type{Oid: types.T_float64, Size: 8}) - results := make([]float64, 1) - nulls.Set(resultVector.Nsp, origVec.Nsp) - vector.SetCol(resultVector, sinh.SinhFloat64(origVecCol, results)) - return resultVector, nil - } else { - resultVector, err := proc.AllocVector(types.Type{Oid: types.T_float64, Size: 8}, 8*int64(len(origVecCol))) - if err != nil { - return nil, err - } - results := encoding.DecodeFloat64Slice(resultVector.Data) - results = results[:len(origVecCol)] - resultVector.Col = results - nulls.Set(resultVector.Nsp, origVec.Nsp) - vector.SetCol(resultVector, sinh.SinhFloat64(origVecCol, results)) + vector.SetCol(resultVector, sinh.Sinh(origVecCol, results)) return resultVector, nil } } diff --git a/pkg/sql/plan2/function/builtin/unary/tan.go b/pkg/sql/plan2/function/builtin/unary/tan.go index 48e683cd9fbf0651f2229a280b5186512d55c783..5a3702d2bee1d903d46a3a09cc801bc7d6f2ef0f 100644 --- a/pkg/sql/plan2/function/builtin/unary/tan.go +++ b/pkg/sql/plan2/function/builtin/unary/tan.go @@ -21,23 +21,24 @@ import ( "github.com/matrixorigin/matrixone/pkg/encoding" "github.com/matrixorigin/matrixone/pkg/vectorize/tan" "github.com/matrixorigin/matrixone/pkg/vm/process" + "golang.org/x/exp/constraints" ) -// tan function's evaluation for arguments: [uint64] -func TanUint64(vs []*vector.Vector, proc *process.Process) (*vector.Vector, error) { +func Tan[T constraints.Integer | constraints.Float](vs []*vector.Vector, proc *process.Process) (*vector.Vector, error) { origVec := vs[0] - origVecCol := origVec.Col.([]uint64) + origVecCol := origVec.Col.([]T) + resultType := types.Type{Oid: types.T_float64, Size: 8} if origVec.IsScalar() { if origVec.IsScalarNull() { - return proc.AllocScalarNullVector(types.Type{Oid: types.T_float64, Size: 8}), nil + return proc.AllocScalarNullVector(resultType), nil } - resultVector := proc.AllocScalarVector(types.Type{Oid: types.T_float64, Size: 8}) + resultVector := proc.AllocScalarVector(resultType) results := make([]float64, 1) nulls.Set(resultVector.Nsp, origVec.Nsp) - vector.SetCol(resultVector, tan.TanUint64(origVecCol, results)) + vector.SetCol(resultVector, tan.Tan(origVecCol, results)) return resultVector, nil } else { - resultVector, err := proc.AllocVector(types.Type{Oid: types.T_float64, Size: 8}, 8*int64(len(origVecCol))) + resultVector, err := proc.AllocVector(resultType, 8*int64(len(origVecCol))) if err != nil { return nil, err } @@ -45,61 +46,7 @@ func TanUint64(vs []*vector.Vector, proc *process.Process) (*vector.Vector, erro results = results[:len(origVecCol)] resultVector.Col = results nulls.Set(resultVector.Nsp, origVec.Nsp) - vector.SetCol(resultVector, tan.TanUint64(origVecCol, results)) - return resultVector, nil - } -} - -// tan function's evaluation for arguments: [int64] -func TanInt64(vs []*vector.Vector, proc *process.Process) (*vector.Vector, error) { - origVec := vs[0] - origVecCol := origVec.Col.([]int64) - if origVec.IsScalar() { - if origVec.IsScalarNull() { - return proc.AllocScalarNullVector(types.Type{Oid: types.T_float64, Size: 8}), nil - } - resultVector := proc.AllocScalarVector(types.Type{Oid: types.T_float64, Size: 8}) - results := make([]float64, 1) - nulls.Set(resultVector.Nsp, origVec.Nsp) - vector.SetCol(resultVector, tan.TanInt64(origVecCol, results)) - return resultVector, nil - } else { - resultVector, err := proc.AllocVector(types.Type{Oid: types.T_float64, Size: 8}, 8*int64(len(origVecCol))) - if err != nil { - return nil, err - } - results := encoding.DecodeFloat64Slice(resultVector.Data) - results = results[:len(origVecCol)] - resultVector.Col = results - nulls.Set(resultVector.Nsp, origVec.Nsp) - vector.SetCol(resultVector, tan.TanInt64(origVecCol, results)) - return resultVector, nil - } -} - -// tan function's evaluation for arguments: [float64] -func TanFloat64(vs []*vector.Vector, proc *process.Process) (*vector.Vector, error) { - origVec := vs[0] - origVecCol := origVec.Col.([]float64) - if origVec.IsScalar() { - if origVec.IsScalarNull() { - return proc.AllocScalarNullVector(types.Type{Oid: types.T_float64, Size: 8}), nil - } - resultVector := proc.AllocScalarVector(types.Type{Oid: types.T_float64, Size: 8}) - results := make([]float64, 1) - nulls.Set(resultVector.Nsp, origVec.Nsp) - vector.SetCol(resultVector, tan.TanFloat64(origVecCol, results)) - return resultVector, nil - } else { - resultVector, err := proc.AllocVector(types.Type{Oid: types.T_float64, Size: 8}, 8*int64(len(origVecCol))) - if err != nil { - return nil, err - } - results := encoding.DecodeFloat64Slice(resultVector.Data) - results = results[:len(origVecCol)] - resultVector.Col = results - nulls.Set(resultVector.Nsp, origVec.Nsp) - vector.SetCol(resultVector, tan.TanFloat64(origVecCol, results)) + vector.SetCol(resultVector, tan.Tan(origVecCol, results)) return resultVector, nil } } diff --git a/pkg/sql/plan2/function/buitins.go b/pkg/sql/plan2/function/buitins.go index 7a38ec2335afd7b819382e2a73b58ce001adfb46..11149b85b21cec80af0fc426881dab15b49ba462 100644 --- a/pkg/sql/plan2/function/buitins.go +++ b/pkg/sql/plan2/function/buitins.go @@ -1621,28 +1621,91 @@ var builtins = map[int][]Function{ Index: 0, Flag: plan.Function_STRICT, Layout: STANDARD_FUNCTION, - Args: []types.T{types.T_uint64}, + Args: []types.T{types.T_uint8}, ReturnTyp: types.T_float64, TypeCheckFn: strictTypeCheck, - Fn: unary.TanUint64, + Fn: unary.Tan[uint8], }, { Index: 1, Flag: plan.Function_STRICT, Layout: STANDARD_FUNCTION, - Args: []types.T{types.T_int64}, + Args: []types.T{types.T_uint16}, ReturnTyp: types.T_float64, TypeCheckFn: strictTypeCheck, - Fn: unary.TanInt64, + Fn: unary.Tan[uint16], }, { Index: 2, Flag: plan.Function_STRICT, Layout: STANDARD_FUNCTION, + Args: []types.T{types.T_uint32}, + ReturnTyp: types.T_float64, + TypeCheckFn: strictTypeCheck, + Fn: unary.Tan[uint32], + }, + { + Index: 3, + Flag: plan.Function_STRICT, + Layout: STANDARD_FUNCTION, + Args: []types.T{types.T_uint64}, + ReturnTyp: types.T_float64, + TypeCheckFn: strictTypeCheck, + Fn: unary.Tan[uint64], + }, + { + Index: 4, + Flag: plan.Function_STRICT, + Layout: STANDARD_FUNCTION, + Args: []types.T{types.T_int8}, + ReturnTyp: types.T_float64, + TypeCheckFn: strictTypeCheck, + Fn: unary.Tan[int8], + }, + { + Index: 5, + Flag: plan.Function_STRICT, + Layout: STANDARD_FUNCTION, + Args: []types.T{types.T_int16}, + ReturnTyp: types.T_float64, + TypeCheckFn: strictTypeCheck, + Fn: unary.Tan[int16], + }, + { + Index: 6, + Flag: plan.Function_STRICT, + Layout: STANDARD_FUNCTION, + Args: []types.T{types.T_int32}, + ReturnTyp: types.T_float64, + TypeCheckFn: strictTypeCheck, + Fn: unary.Tan[int32], + }, + { + Index: 7, + Flag: plan.Function_STRICT, + Layout: STANDARD_FUNCTION, + Args: []types.T{types.T_int64}, + ReturnTyp: types.T_float64, + TypeCheckFn: strictTypeCheck, + Fn: unary.Tan[int64], + }, + { + Index: 8, + Flag: plan.Function_STRICT, + Layout: STANDARD_FUNCTION, + Args: []types.T{types.T_float32}, + ReturnTyp: types.T_float64, + TypeCheckFn: strictTypeCheck, + Fn: unary.Tan[float32], + }, + { + Index: 9, + Flag: plan.Function_STRICT, + Layout: STANDARD_FUNCTION, Args: []types.T{types.T_float64}, ReturnTyp: types.T_float64, TypeCheckFn: strictTypeCheck, - Fn: unary.TanFloat64, + Fn: unary.Tan[float64], }, }, SINH: { @@ -1650,28 +1713,91 @@ var builtins = map[int][]Function{ Index: 0, Flag: plan.Function_STRICT, Layout: STANDARD_FUNCTION, - Args: []types.T{types.T_uint64}, + Args: []types.T{types.T_uint8}, ReturnTyp: types.T_float64, TypeCheckFn: strictTypeCheck, - Fn: unary.SinhUint64, + Fn: unary.Sinh[uint8], }, { Index: 1, Flag: plan.Function_STRICT, Layout: STANDARD_FUNCTION, - Args: []types.T{types.T_int64}, + Args: []types.T{types.T_uint16}, ReturnTyp: types.T_float64, TypeCheckFn: strictTypeCheck, - Fn: unary.SinhInt64, + Fn: unary.Sinh[uint16], }, { Index: 2, Flag: plan.Function_STRICT, Layout: STANDARD_FUNCTION, + Args: []types.T{types.T_uint32}, + ReturnTyp: types.T_float64, + TypeCheckFn: strictTypeCheck, + Fn: unary.Sinh[uint32], + }, + { + Index: 3, + Flag: plan.Function_STRICT, + Layout: STANDARD_FUNCTION, + Args: []types.T{types.T_uint64}, + ReturnTyp: types.T_float64, + TypeCheckFn: strictTypeCheck, + Fn: unary.Sinh[uint64], + }, + { + Index: 4, + Flag: plan.Function_STRICT, + Layout: STANDARD_FUNCTION, + Args: []types.T{types.T_int8}, + ReturnTyp: types.T_float64, + TypeCheckFn: strictTypeCheck, + Fn: unary.Sinh[int8], + }, + { + Index: 5, + Flag: plan.Function_STRICT, + Layout: STANDARD_FUNCTION, + Args: []types.T{types.T_int16}, + ReturnTyp: types.T_float64, + TypeCheckFn: strictTypeCheck, + Fn: unary.Sinh[int16], + }, + { + Index: 6, + Flag: plan.Function_STRICT, + Layout: STANDARD_FUNCTION, + Args: []types.T{types.T_int32}, + ReturnTyp: types.T_float64, + TypeCheckFn: strictTypeCheck, + Fn: unary.Sinh[int32], + }, + { + Index: 7, + Flag: plan.Function_STRICT, + Layout: STANDARD_FUNCTION, + Args: []types.T{types.T_int64}, + ReturnTyp: types.T_float64, + TypeCheckFn: strictTypeCheck, + Fn: unary.Sinh[int64], + }, + { + Index: 8, + Flag: plan.Function_STRICT, + Layout: STANDARD_FUNCTION, + Args: []types.T{types.T_float32}, + ReturnTyp: types.T_float64, + TypeCheckFn: strictTypeCheck, + Fn: unary.Sinh[float32], + }, + { + Index: 9, + Flag: plan.Function_STRICT, + Layout: STANDARD_FUNCTION, Args: []types.T{types.T_float64}, ReturnTyp: types.T_float64, TypeCheckFn: strictTypeCheck, - Fn: unary.SinhFloat64, + Fn: unary.Sinh[float64], }, }, ATAN: { diff --git a/pkg/vectorize/sinh/sinh.go b/pkg/vectorize/sinh/sinh.go index 23deb715c46c976660dbd0644465c149c9e64fc9..193193faf67551da40d4b35424d629bd4e2291e5 100644 --- a/pkg/vectorize/sinh/sinh.go +++ b/pkg/vectorize/sinh/sinh.go @@ -14,7 +14,11 @@ package sinh -import "math" +import ( + "math" + + "golang.org/x/exp/constraints" +) var ( SinhUint8 func([]uint8, []float64) []float64 @@ -111,3 +115,10 @@ func sinhInt64(xs []int64, rs []float64) []float64 { } return rs } + +func Sinh[T constraints.Integer | constraints.Float](inputValues []T, resultValues []float64) []float64 { + for i, n := range inputValues { + resultValues[i] = math.Sinh(float64(n)) + } + return resultValues +} diff --git a/pkg/vectorize/tan/tan.go b/pkg/vectorize/tan/tan.go index 9a1211c3b5565b46fbb8f8dbd4a630437c1f88f1..9afe93b4185fedbcc389684c71a8862a8cd56461 100644 --- a/pkg/vectorize/tan/tan.go +++ b/pkg/vectorize/tan/tan.go @@ -16,6 +16,8 @@ package tan import ( "math" + + "golang.org/x/exp/constraints" ) var ( @@ -113,3 +115,10 @@ func tanFloat64(xs []float64, rs []float64) []float64 { } return rs } + +func Tan[T constraints.Integer | constraints.Float](inputValues []T, resultValues []float64) []float64 { + for i, n := range inputValues { + resultValues[i] = math.Tan(float64(n)) + } + return resultValues +}