github.com/matrixorigin/matrixone@v0.7.0/pkg/sql/colexec/agg/new.go (about)

     1  // Copyright 2021 Matrix Origin
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //      http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package agg
    16  
    17  import (
    18  	"github.com/matrixorigin/matrixone/pkg/common/moerr"
    19  	"github.com/matrixorigin/matrixone/pkg/container/types"
    20  )
    21  
    22  // ReturnType get aggregate operator's return type according to its operator-id and input-types.
    23  func ReturnType(op int, typ types.Type) (types.Type, error) {
    24  	var otyp types.Type
    25  
    26  	switch op {
    27  	case AggregateAvg:
    28  		otyp = AvgReturnType([]types.Type{typ})
    29  	case AggregateMax:
    30  		otyp = MaxReturnType([]types.Type{typ})
    31  	case AggregateMin:
    32  		otyp = MinReturnType([]types.Type{typ})
    33  	case AggregateSum:
    34  		otyp = SumReturnType([]types.Type{typ})
    35  	case AggregateCount, AggregateStarCount:
    36  		otyp = CountReturnType([]types.Type{typ})
    37  	case AggregateApproxCountDistinct:
    38  		otyp = ApproxCountReturnType([]types.Type{typ})
    39  	case AggregateVariance:
    40  		otyp = VarianceReturnType([]types.Type{typ})
    41  	case AggregateBitAnd:
    42  		otyp = BitAndReturnType([]types.Type{typ})
    43  	case AggregateBitXor:
    44  		otyp = BitXorReturnType([]types.Type{typ})
    45  	case AggregateBitOr:
    46  		otyp = BitOrReturnType([]types.Type{typ})
    47  	case AggregateStdDevPop:
    48  		otyp = StdDevPopReturnType([]types.Type{typ})
    49  	case AggregateMedian:
    50  		otyp = MedianReturnType([]types.Type{typ})
    51  	}
    52  	if otyp.Oid == types.T_any {
    53  		return typ, moerr.NewInternalErrorNoCtx("'%v' not support %s", typ, Names[op])
    54  	}
    55  	return otyp, nil
    56  }
    57  
    58  func New(op int, dist bool, typ types.Type) (Agg[any], error) {
    59  	switch op {
    60  	case AggregateSum:
    61  		return newSum(typ, dist), nil
    62  	case AggregateAvg:
    63  		return newAvg(typ, dist), nil
    64  	case AggregateMax:
    65  		return newMax(typ, dist), nil
    66  	case AggregateMin:
    67  		return newMin(typ, dist), nil
    68  	case AggregateCount:
    69  		return newCount(typ, dist, false), nil
    70  	case AggregateStarCount:
    71  		return newCount(typ, dist, true), nil
    72  	case AggregateApproxCountDistinct:
    73  		return newApprox(typ, dist), nil
    74  	case AggregateVariance:
    75  		return newVariance(typ, dist), nil
    76  	case AggregateBitAnd:
    77  		return newBitAnd(typ, dist), nil
    78  	case AggregateBitXor:
    79  		return newBitXor(typ, dist), nil
    80  	case AggregateBitOr:
    81  		return newBitOr(typ, dist), nil
    82  	case AggregateStdDevPop:
    83  		return newStdDevPop(typ, dist), nil
    84  	case AggregateAnyValue:
    85  		return newAnyValue(typ, dist), nil
    86  	case AggregateMedian:
    87  		return newMedian(typ, dist), nil
    88  	}
    89  	panic(moerr.NewInternalErrorNoCtx("unsupported type '%s' for aggregate %s", typ, Names[op]))
    90  }
    91  
    92  func newCount(typ types.Type, dist bool, isStar bool) Agg[any] {
    93  	switch typ.Oid {
    94  	case types.T_bool:
    95  		return newGenericCount[bool](typ, dist, isStar)
    96  	case types.T_int8:
    97  		return newGenericCount[int8](typ, dist, isStar)
    98  	case types.T_int16:
    99  		return newGenericCount[int16](typ, dist, isStar)
   100  	case types.T_int32:
   101  		return newGenericCount[int32](typ, dist, isStar)
   102  	case types.T_int64:
   103  		return newGenericCount[int64](typ, dist, isStar)
   104  	case types.T_uint8:
   105  		return newGenericCount[uint8](typ, dist, isStar)
   106  	case types.T_uint16:
   107  		return newGenericCount[uint16](typ, dist, isStar)
   108  	case types.T_uint32:
   109  		return newGenericCount[uint32](typ, dist, isStar)
   110  	case types.T_uint64:
   111  		return newGenericCount[uint64](typ, dist, isStar)
   112  	case types.T_float32:
   113  		return newGenericCount[float32](typ, dist, isStar)
   114  	case types.T_float64:
   115  		return newGenericCount[float64](typ, dist, isStar)
   116  	case types.T_char:
   117  		return newGenericCount[[]byte](typ, dist, isStar)
   118  	case types.T_varchar:
   119  		return newGenericCount[[]byte](typ, dist, isStar)
   120  	case types.T_blob:
   121  		return newGenericCount[[]byte](typ, dist, isStar)
   122  	case types.T_json:
   123  		return newGenericCount[[]byte](typ, dist, isStar)
   124  	case types.T_text:
   125  		return newGenericCount[[]byte](typ, dist, isStar)
   126  	case types.T_date:
   127  		return newGenericCount[types.Date](typ, dist, isStar)
   128  	case types.T_datetime:
   129  		return newGenericCount[types.Datetime](typ, dist, isStar)
   130  	case types.T_time:
   131  		return newGenericCount[types.Time](typ, dist, isStar)
   132  	case types.T_timestamp:
   133  		return newGenericCount[types.Timestamp](typ, dist, isStar)
   134  	case types.T_decimal64:
   135  		return newGenericCount[types.Decimal64](typ, dist, isStar)
   136  	case types.T_decimal128:
   137  		return newGenericCount[types.Decimal128](typ, dist, isStar)
   138  	case types.T_uuid:
   139  		return newGenericCount[types.Uuid](typ, dist, isStar)
   140  	}
   141  	panic(moerr.NewInternalErrorNoCtx("unsupported type '%s' for count", typ))
   142  }
   143  
   144  func newAnyValue(typ types.Type, dist bool) Agg[any] {
   145  	switch typ.Oid {
   146  	case types.T_bool:
   147  		return newGenericAnyValue[bool](typ, dist)
   148  	case types.T_int8:
   149  		return newGenericAnyValue[int8](typ, dist)
   150  	case types.T_int16:
   151  		return newGenericAnyValue[int16](typ, dist)
   152  	case types.T_int32:
   153  		return newGenericAnyValue[int32](typ, dist)
   154  	case types.T_int64:
   155  		return newGenericAnyValue[int64](typ, dist)
   156  	case types.T_uint8:
   157  		return newGenericAnyValue[uint8](typ, dist)
   158  	case types.T_uint16:
   159  		return newGenericAnyValue[uint16](typ, dist)
   160  	case types.T_uint32:
   161  		return newGenericAnyValue[uint32](typ, dist)
   162  	case types.T_uint64:
   163  		return newGenericAnyValue[uint64](typ, dist)
   164  	case types.T_float32:
   165  		return newGenericAnyValue[float32](typ, dist)
   166  	case types.T_float64:
   167  		return newGenericAnyValue[float64](typ, dist)
   168  	case types.T_char:
   169  		return newGenericAnyValue[[]byte](typ, dist)
   170  	case types.T_varchar:
   171  		return newGenericAnyValue[[]byte](typ, dist)
   172  	case types.T_blob:
   173  		return newGenericAnyValue[[]byte](typ, dist)
   174  	case types.T_text:
   175  		return newGenericApproxcd[[]byte](typ, dist)
   176  	case types.T_date:
   177  		return newGenericAnyValue[types.Date](typ, dist)
   178  	case types.T_datetime:
   179  		return newGenericAnyValue[types.Datetime](typ, dist)
   180  	case types.T_time:
   181  		return newGenericAnyValue[types.Time](typ, dist)
   182  	case types.T_timestamp:
   183  		return newGenericAnyValue[types.Timestamp](typ, dist)
   184  	case types.T_decimal64:
   185  		return newGenericAnyValue[types.Decimal64](typ, dist)
   186  	case types.T_decimal128:
   187  		return newGenericAnyValue[types.Decimal128](typ, dist)
   188  	case types.T_uuid:
   189  		return newGenericAnyValue[types.Uuid](typ, dist)
   190  	}
   191  	panic(moerr.NewInternalErrorNoCtx("unsupported type '%s' for anyvalue", typ))
   192  }
   193  
   194  func newAvg(typ types.Type, dist bool) Agg[any] {
   195  	switch typ.Oid {
   196  	case types.T_int8:
   197  		return newGenericAvg[int8](typ, dist)
   198  	case types.T_int16:
   199  		return newGenericAvg[int16](typ, dist)
   200  	case types.T_int32:
   201  		return newGenericAvg[int32](typ, dist)
   202  	case types.T_int64:
   203  		return newGenericAvg[int64](typ, dist)
   204  	case types.T_uint8:
   205  		return newGenericAvg[uint8](typ, dist)
   206  	case types.T_uint16:
   207  		return newGenericAvg[uint16](typ, dist)
   208  	case types.T_uint32:
   209  		return newGenericAvg[uint32](typ, dist)
   210  	case types.T_uint64:
   211  		return newGenericAvg[uint64](typ, dist)
   212  	case types.T_float32:
   213  		return newGenericAvg[float32](typ, dist)
   214  	case types.T_float64:
   215  		return newGenericAvg[float64](typ, dist)
   216  	case types.T_decimal64:
   217  		aggPriv := NewD64Avg()
   218  		if dist {
   219  			return NewUnaryDistAgg(AggregateAvg, aggPriv, false, typ, AvgReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   220  		}
   221  		return NewUnaryAgg(AggregateAvg, aggPriv, false, typ, AvgReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, aggPriv.BatchFill)
   222  	case types.T_decimal128:
   223  		aggPriv := NewD128Avg()
   224  		if dist {
   225  			return NewUnaryDistAgg(AggregateAvg, aggPriv, false, typ, AvgReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   226  		}
   227  		return NewUnaryAgg(AggregateAvg, aggPriv, false, typ, AvgReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, aggPriv.BatchFill)
   228  	}
   229  	panic(moerr.NewInternalErrorNoCtx("unsupported type '%s' for avg", typ))
   230  }
   231  
   232  func newSum(typ types.Type, dist bool) Agg[any] {
   233  	switch typ.Oid {
   234  	case types.T_int8:
   235  		return newGenericSum[int8, int64](typ, dist)
   236  	case types.T_int16:
   237  		return newGenericSum[int16, int64](typ, dist)
   238  	case types.T_int32:
   239  		return newGenericSum[int32, int64](typ, dist)
   240  	case types.T_int64:
   241  		return newGenericSum[int64, int64](typ, dist)
   242  	case types.T_uint8:
   243  		return newGenericSum[uint8, uint64](typ, dist)
   244  	case types.T_uint16:
   245  		return newGenericSum[uint16, uint64](typ, dist)
   246  	case types.T_uint32:
   247  		return newGenericSum[uint32, uint64](typ, dist)
   248  	case types.T_uint64:
   249  		return newGenericSum[uint64, uint64](typ, dist)
   250  	case types.T_float32:
   251  		return newGenericSum[float32, float64](typ, dist)
   252  	case types.T_float64:
   253  		return newGenericSum[float64, float64](typ, dist)
   254  	case types.T_decimal64:
   255  		aggPriv := NewD64Sum()
   256  		if dist {
   257  			return NewUnaryDistAgg(AggregateSum, aggPriv, false, typ, SumReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   258  		}
   259  		return NewUnaryAgg(AggregateSum, aggPriv, false, typ, SumReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, aggPriv.BatchFill)
   260  	case types.T_decimal128:
   261  		aggPriv := NewD128Sum()
   262  		if dist {
   263  			return NewUnaryDistAgg(AggregateSum, aggPriv, false, typ, SumReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   264  		}
   265  		return NewUnaryAgg(AggregateSum, aggPriv, false, typ, SumReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, aggPriv.BatchFill)
   266  	}
   267  	panic(moerr.NewInternalErrorNoCtx("unsupported type '%s' for sum", typ))
   268  }
   269  
   270  func newMax(typ types.Type, dist bool) Agg[any] {
   271  	switch typ.Oid {
   272  	case types.T_bool:
   273  		aggPriv := NewBoolMax()
   274  		if dist {
   275  			return NewUnaryDistAgg(AggregateMax, aggPriv, false, typ, MaxReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   276  		}
   277  		return NewUnaryAgg(AggregateMax, aggPriv, false, typ, MaxReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   278  	case types.T_int8:
   279  		return newGenericMax[int8](typ, dist)
   280  	case types.T_int16:
   281  		return newGenericMax[int16](typ, dist)
   282  	case types.T_int32:
   283  		return newGenericMax[int32](typ, dist)
   284  	case types.T_int64:
   285  		return newGenericMax[int64](typ, dist)
   286  	case types.T_uint8:
   287  		return newGenericMax[uint8](typ, dist)
   288  	case types.T_uint16:
   289  		return newGenericMax[uint16](typ, dist)
   290  	case types.T_uint32:
   291  		return newGenericMax[uint32](typ, dist)
   292  	case types.T_uint64:
   293  		return newGenericMax[uint64](typ, dist)
   294  	case types.T_float32:
   295  		return newGenericMax[float32](typ, dist)
   296  	case types.T_float64:
   297  		return newGenericMax[float64](typ, dist)
   298  	case types.T_char:
   299  		aggPriv := NewStrMax()
   300  		if dist {
   301  			return NewUnaryDistAgg(AggregateMax, aggPriv, false, typ, MaxReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   302  		}
   303  		return NewUnaryAgg(AggregateMax, aggPriv, false, typ, MaxReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   304  	case types.T_varchar:
   305  		aggPriv := NewStrMax()
   306  		if dist {
   307  			return NewUnaryDistAgg(AggregateMax, aggPriv, false, typ, MaxReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   308  		}
   309  		return NewUnaryAgg(AggregateMax, aggPriv, false, typ, MaxReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   310  	case types.T_blob:
   311  		aggPriv := NewStrMax()
   312  		if dist {
   313  			return NewUnaryDistAgg(AggregateMax, aggPriv, false, typ, MaxReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   314  		}
   315  		return NewUnaryAgg(AggregateMax, aggPriv, false, typ, MaxReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   316  	case types.T_text:
   317  		aggPriv := NewStrMax()
   318  		if dist {
   319  			return NewUnaryDistAgg(AggregateMax, aggPriv, false, typ, MaxReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   320  		}
   321  		return NewUnaryAgg(AggregateMax, aggPriv, false, typ, MaxReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   322  	case types.T_date:
   323  		return newGenericMax[types.Date](typ, dist)
   324  	case types.T_datetime:
   325  		return newGenericMax[types.Datetime](typ, dist)
   326  	case types.T_time:
   327  		return newGenericMax[types.Time](typ, dist)
   328  	case types.T_timestamp:
   329  		return newGenericMax[types.Timestamp](typ, dist)
   330  	case types.T_decimal64:
   331  		aggPriv := NewD64Max()
   332  		if dist {
   333  			return NewUnaryDistAgg(AggregateMax, aggPriv, false, typ, MaxReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   334  		}
   335  		return NewUnaryAgg(AggregateMax, aggPriv, false, typ, MaxReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   336  	case types.T_decimal128:
   337  		aggPriv := NewD128Max()
   338  		if dist {
   339  			return NewUnaryDistAgg(AggregateMax, aggPriv, false, typ, MaxReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   340  		}
   341  		return NewUnaryAgg(AggregateMax, aggPriv, false, typ, MaxReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   342  	case types.T_uuid:
   343  		aggPriv := NewUuidMax()
   344  		if dist {
   345  			return NewUnaryDistAgg(AggregateMax, aggPriv, false, typ, MaxReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   346  		}
   347  		return NewUnaryAgg(AggregateMax, aggPriv, false, typ, MaxReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   348  	}
   349  	panic(moerr.NewInternalErrorNoCtx("unsupported type '%s' for max", typ))
   350  }
   351  
   352  func newMin(typ types.Type, dist bool) Agg[any] {
   353  	switch typ.Oid {
   354  	case types.T_bool:
   355  		aggPriv := NewBoolMin()
   356  		if dist {
   357  			return NewUnaryDistAgg(AggregateMin, aggPriv, false, typ, MinReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   358  		}
   359  		return NewUnaryAgg(AggregateMin, aggPriv, false, typ, MinReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   360  	case types.T_int8:
   361  		return newGenericMin[int8](typ, dist)
   362  	case types.T_int16:
   363  		return newGenericMin[int16](typ, dist)
   364  	case types.T_int32:
   365  		return newGenericMin[int32](typ, dist)
   366  	case types.T_int64:
   367  		return newGenericMin[int64](typ, dist)
   368  	case types.T_uint8:
   369  		return newGenericMin[uint8](typ, dist)
   370  	case types.T_uint16:
   371  		return newGenericMin[uint16](typ, dist)
   372  	case types.T_uint32:
   373  		return newGenericMin[uint32](typ, dist)
   374  	case types.T_uint64:
   375  		return newGenericMin[uint64](typ, dist)
   376  	case types.T_float32:
   377  		return newGenericMin[float32](typ, dist)
   378  	case types.T_float64:
   379  		return newGenericMin[float64](typ, dist)
   380  	case types.T_char:
   381  		aggPriv := NewStrMin()
   382  		if dist {
   383  			return NewUnaryDistAgg(AggregateMin, aggPriv, false, typ, MinReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   384  		}
   385  		return NewUnaryAgg(AggregateMin, aggPriv, false, typ, MinReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   386  	case types.T_varchar:
   387  		aggPriv := NewStrMin()
   388  		if dist {
   389  			return NewUnaryDistAgg(AggregateMin, aggPriv, false, typ, MinReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   390  		}
   391  		return NewUnaryAgg(AggregateMin, aggPriv, false, typ, MinReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   392  	case types.T_blob:
   393  		aggPriv := NewStrMin()
   394  		if dist {
   395  			return NewUnaryDistAgg(AggregateMin, aggPriv, false, typ, MinReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   396  		}
   397  		return NewUnaryAgg(AggregateMin, aggPriv, false, typ, MinReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   398  	case types.T_text:
   399  		aggPriv := NewStrMin()
   400  		if dist {
   401  			return NewUnaryDistAgg(AggregateMin, aggPriv, false, typ, MinReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   402  		}
   403  		return NewUnaryAgg(AggregateMin, aggPriv, false, typ, MinReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   404  	case types.T_date:
   405  		return newGenericMin[types.Date](typ, dist)
   406  	case types.T_datetime:
   407  		return newGenericMin[types.Datetime](typ, dist)
   408  	case types.T_time:
   409  		return newGenericMin[types.Time](typ, dist)
   410  	case types.T_timestamp:
   411  		return newGenericMin[types.Timestamp](typ, dist)
   412  	case types.T_decimal64:
   413  		aggPriv := NewD64Min()
   414  		if dist {
   415  			return NewUnaryDistAgg(AggregateMin, aggPriv, false, typ, MinReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   416  		}
   417  		return NewUnaryAgg(AggregateMin, aggPriv, false, typ, MinReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   418  	case types.T_decimal128:
   419  		aggPriv := NewD128Min()
   420  		if dist {
   421  			return NewUnaryDistAgg(AggregateMin, aggPriv, false, typ, MinReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   422  		}
   423  		return NewUnaryAgg(AggregateMin, aggPriv, false, typ, MinReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   424  	case types.T_uuid:
   425  		aggPriv := NewUuidMin()
   426  		if dist {
   427  			return NewUnaryDistAgg(AggregateMin, aggPriv, false, typ, MinReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   428  		}
   429  		return NewUnaryAgg(AggregateMin, aggPriv, false, typ, MinReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   430  	}
   431  	panic(moerr.NewInternalErrorNoCtx("unsupported type '%s' for min", typ))
   432  }
   433  
   434  func newApprox(typ types.Type, dist bool) Agg[any] {
   435  	switch typ.Oid {
   436  	case types.T_bool:
   437  		return newGenericApproxcd[bool](typ, dist)
   438  	case types.T_int8:
   439  		return newGenericApproxcd[int8](typ, dist)
   440  	case types.T_int16:
   441  		return newGenericApproxcd[int16](typ, dist)
   442  	case types.T_int32:
   443  		return newGenericApproxcd[int32](typ, dist)
   444  	case types.T_int64:
   445  		return newGenericApproxcd[int64](typ, dist)
   446  	case types.T_uint8:
   447  		return newGenericApproxcd[uint8](typ, dist)
   448  	case types.T_uint16:
   449  		return newGenericApproxcd[uint16](typ, dist)
   450  	case types.T_uint32:
   451  		return newGenericApproxcd[uint32](typ, dist)
   452  	case types.T_uint64:
   453  		return newGenericApproxcd[uint64](typ, dist)
   454  	case types.T_float32:
   455  		return newGenericApproxcd[float32](typ, dist)
   456  	case types.T_float64:
   457  		return newGenericApproxcd[float64](typ, dist)
   458  	case types.T_char:
   459  		return newGenericApproxcd[[]byte](typ, dist)
   460  	case types.T_varchar:
   461  		return newGenericApproxcd[[]byte](typ, dist)
   462  	case types.T_blob:
   463  		return newGenericApproxcd[[]byte](typ, dist)
   464  	case types.T_text:
   465  		return newGenericApproxcd[[]byte](typ, dist)
   466  	case types.T_date:
   467  		return newGenericApproxcd[types.Date](typ, dist)
   468  	case types.T_datetime:
   469  		return newGenericApproxcd[types.Datetime](typ, dist)
   470  	case types.T_time:
   471  		return newGenericApproxcd[types.Time](typ, dist)
   472  	case types.T_timestamp:
   473  		return newGenericApproxcd[types.Timestamp](typ, dist)
   474  	case types.T_decimal64:
   475  		return newGenericApproxcd[types.Decimal64](typ, dist)
   476  	case types.T_decimal128:
   477  		return newGenericApproxcd[types.Decimal128](typ, dist)
   478  	case types.T_uuid:
   479  		return newGenericApproxcd[types.Uuid](typ, dist)
   480  	}
   481  	panic(moerr.NewInternalErrorNoCtx("unsupported type '%s' for approx_count_distinct", typ))
   482  }
   483  
   484  func newBitOr(typ types.Type, dist bool) Agg[any] {
   485  	switch typ.Oid {
   486  	case types.T_int8:
   487  		return newGenericBitOr[int8](typ, dist)
   488  	case types.T_int16:
   489  		return newGenericBitOr[int16](typ, dist)
   490  	case types.T_int32:
   491  		return newGenericBitOr[int32](typ, dist)
   492  	case types.T_int64:
   493  		return newGenericBitOr[int64](typ, dist)
   494  	case types.T_uint8:
   495  		return newGenericBitOr[uint8](typ, dist)
   496  	case types.T_uint16:
   497  		return newGenericBitOr[uint16](typ, dist)
   498  	case types.T_uint32:
   499  		return newGenericBitOr[uint32](typ, dist)
   500  	case types.T_uint64:
   501  		return newGenericBitOr[uint64](typ, dist)
   502  	case types.T_float32:
   503  		return newGenericBitOr[float32](typ, dist)
   504  	case types.T_float64:
   505  		return newGenericBitOr[float64](typ, dist)
   506  	}
   507  	panic(moerr.NewInternalErrorNoCtx("unsupported type '%s' for bitor", typ))
   508  }
   509  
   510  func newBitXor(typ types.Type, dist bool) Agg[any] {
   511  	switch typ.Oid {
   512  	case types.T_int8:
   513  		return newGenericBitXor[int8](typ, dist)
   514  	case types.T_int16:
   515  		return newGenericBitXor[int16](typ, dist)
   516  	case types.T_int32:
   517  		return newGenericBitXor[int32](typ, dist)
   518  	case types.T_int64:
   519  		return newGenericBitXor[int64](typ, dist)
   520  	case types.T_uint8:
   521  		return newGenericBitXor[uint8](typ, dist)
   522  	case types.T_uint16:
   523  		return newGenericBitXor[uint16](typ, dist)
   524  	case types.T_uint32:
   525  		return newGenericBitXor[uint32](typ, dist)
   526  	case types.T_uint64:
   527  		return newGenericBitXor[uint64](typ, dist)
   528  	case types.T_float32:
   529  		return newGenericBitXor[float32](typ, dist)
   530  	case types.T_float64:
   531  		return newGenericBitXor[float64](typ, dist)
   532  	}
   533  	panic(moerr.NewInternalErrorNoCtx("unsupported type '%s' for bitxor", typ))
   534  }
   535  
   536  func newBitAnd(typ types.Type, dist bool) Agg[any] {
   537  	switch typ.Oid {
   538  	case types.T_int8:
   539  		return newGenericBitAnd[int8](typ, dist)
   540  	case types.T_int16:
   541  		return newGenericBitAnd[int16](typ, dist)
   542  	case types.T_int32:
   543  		return newGenericBitAnd[int32](typ, dist)
   544  	case types.T_int64:
   545  		return newGenericBitAnd[int64](typ, dist)
   546  	case types.T_uint8:
   547  		return newGenericBitAnd[uint8](typ, dist)
   548  	case types.T_uint16:
   549  		return newGenericBitAnd[uint16](typ, dist)
   550  	case types.T_uint32:
   551  		return newGenericBitAnd[uint32](typ, dist)
   552  	case types.T_uint64:
   553  		return newGenericBitAnd[uint64](typ, dist)
   554  	case types.T_float32:
   555  		return newGenericBitAnd[float32](typ, dist)
   556  	case types.T_float64:
   557  		return newGenericBitAnd[float64](typ, dist)
   558  	}
   559  	panic(moerr.NewInternalErrorNoCtx("unsupported type '%s' for bitand", typ))
   560  }
   561  
   562  func newVariance(typ types.Type, dist bool) Agg[any] {
   563  	switch typ.Oid {
   564  	case types.T_int8:
   565  		return newGenericVariance[int8](typ, dist)
   566  	case types.T_int16:
   567  		return newGenericVariance[int16](typ, dist)
   568  	case types.T_int32:
   569  		return newGenericVariance[int32](typ, dist)
   570  	case types.T_int64:
   571  		return newGenericVariance[int64](typ, dist)
   572  	case types.T_uint8:
   573  		return newGenericVariance[uint8](typ, dist)
   574  	case types.T_uint16:
   575  		return newGenericVariance[uint16](typ, dist)
   576  	case types.T_uint32:
   577  		return newGenericVariance[uint32](typ, dist)
   578  	case types.T_uint64:
   579  		return newGenericVariance[uint64](typ, dist)
   580  	case types.T_float32:
   581  		return newGenericVariance[float32](typ, dist)
   582  	case types.T_float64:
   583  		return newGenericVariance[float64](typ, dist)
   584  	case types.T_decimal64:
   585  		aggPriv := NewVD64()
   586  		if dist {
   587  			return NewUnaryDistAgg(AggregateVariance, aggPriv, false, typ, VarianceReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   588  		}
   589  		return NewUnaryAgg(AggregateVariance, aggPriv, false, typ, VarianceReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   590  	case types.T_decimal128:
   591  		aggPriv := NewVD128()
   592  		if dist {
   593  			return NewUnaryDistAgg(AggregateVariance, aggPriv, false, typ, VarianceReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   594  		}
   595  		return NewUnaryAgg(AggregateVariance, aggPriv, false, typ, VarianceReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   596  
   597  	}
   598  	panic(moerr.NewInternalErrorNoCtx("unsupported type '%s' for variance", typ))
   599  }
   600  
   601  func newStdDevPop(typ types.Type, dist bool) Agg[any] {
   602  	switch typ.Oid {
   603  	case types.T_int8:
   604  		return newGenericStdDevPop[int8](typ, dist)
   605  	case types.T_int16:
   606  		return newGenericStdDevPop[int16](typ, dist)
   607  	case types.T_int32:
   608  		return newGenericStdDevPop[int32](typ, dist)
   609  	case types.T_int64:
   610  		return newGenericStdDevPop[int64](typ, dist)
   611  	case types.T_uint8:
   612  		return newGenericStdDevPop[uint8](typ, dist)
   613  	case types.T_uint16:
   614  		return newGenericStdDevPop[uint16](typ, dist)
   615  	case types.T_uint32:
   616  		return newGenericStdDevPop[uint32](typ, dist)
   617  	case types.T_uint64:
   618  		return newGenericStdDevPop[uint64](typ, dist)
   619  	case types.T_float32:
   620  		return newGenericStdDevPop[float32](typ, dist)
   621  	case types.T_float64:
   622  		return newGenericStdDevPop[float64](typ, dist)
   623  	case types.T_decimal64:
   624  		aggPriv := NewStdD64()
   625  		if dist {
   626  			return NewUnaryDistAgg(AggregateStdDevPop, aggPriv, false, typ, StdDevPopReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   627  		}
   628  		return NewUnaryAgg(AggregateStdDevPop, aggPriv, false, typ, StdDevPopReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   629  	case types.T_decimal128:
   630  		aggPriv := NewStdD128()
   631  		if dist {
   632  			return NewUnaryDistAgg(AggregateStdDevPop, aggPriv, false, typ, StdDevPopReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   633  		}
   634  		return NewUnaryAgg(AggregateStdDevPop, aggPriv, false, typ, StdDevPopReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   635  
   636  	}
   637  	panic(moerr.NewInternalErrorNoCtx("unsupported type '%s' for stddev", typ))
   638  }
   639  
   640  func newMedian(typ types.Type, dist bool) Agg[any] {
   641  	switch typ.Oid {
   642  	case types.T_int8:
   643  		return newGenericMedian[int8](typ, dist)
   644  	case types.T_int16:
   645  		return newGenericMedian[int16](typ, dist)
   646  	case types.T_int32:
   647  		return newGenericMedian[int32](typ, dist)
   648  	case types.T_int64:
   649  		return newGenericMedian[int64](typ, dist)
   650  	case types.T_uint8:
   651  		return newGenericMedian[uint8](typ, dist)
   652  	case types.T_uint16:
   653  		return newGenericMedian[uint16](typ, dist)
   654  	case types.T_uint32:
   655  		return newGenericMedian[uint32](typ, dist)
   656  	case types.T_uint64:
   657  		return newGenericMedian[uint64](typ, dist)
   658  	case types.T_float32:
   659  		return newGenericMedian[float32](typ, dist)
   660  	case types.T_float64:
   661  		return newGenericMedian[float64](typ, dist)
   662  	case types.T_decimal64:
   663  		aggPriv := NewD64Median()
   664  		if dist {
   665  			panic(moerr.NewNotSupportedNoCtx("median in distinct mode"))
   666  		}
   667  		return NewUnaryAgg(AggregateMedian, aggPriv, false, typ, MedianReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   668  	case types.T_decimal128:
   669  		aggPriv := NewD128Median()
   670  		if dist {
   671  			panic(moerr.NewNotSupportedNoCtx("median in distinct mode"))
   672  		}
   673  		return NewUnaryAgg(AggregateMedian, aggPriv, false, typ, MedianReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   674  	}
   675  	panic(moerr.NewNotSupportedNoCtx("median on type '%s'", typ))
   676  }
   677  
   678  func newGenericAnyValue[T any](typ types.Type, dist bool) Agg[any] {
   679  	aggPriv := NewAnyValue[T]()
   680  	if dist {
   681  		return NewUnaryDistAgg(AggregateAnyValue, aggPriv, false, typ, AnyValueReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   682  	}
   683  	return NewUnaryAgg(AggregateAnyValue, aggPriv, false, typ, AnyValueReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   684  }
   685  
   686  func newGenericSum[T1 Numeric, T2 ReturnTyp](typ types.Type, dist bool) Agg[any] {
   687  	aggPriv := NewSum[T1, T2]()
   688  	if dist {
   689  		return NewUnaryDistAgg(AggregateSum, aggPriv, false, typ, SumReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   690  	}
   691  	return NewUnaryAgg(AggregateSum, aggPriv, false, typ, SumReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   692  }
   693  
   694  func newGenericAvg[T Numeric](typ types.Type, dist bool) Agg[any] {
   695  	aggPriv := NewAvg[T]()
   696  	if dist {
   697  		return NewUnaryDistAgg(AggregateAvg, aggPriv, false, typ, AvgReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   698  	}
   699  	return NewUnaryAgg(AggregateAvg, aggPriv, false, typ, AvgReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   700  }
   701  
   702  func newGenericMax[T Compare](typ types.Type, dist bool) Agg[any] {
   703  	aggPriv := NewMax[T]()
   704  	if dist {
   705  		return NewUnaryDistAgg(AggregateMax, aggPriv, false, typ, MaxReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   706  	}
   707  	return NewUnaryAgg(AggregateMax, aggPriv, false, typ, MaxReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   708  }
   709  
   710  func newGenericMin[T Compare](typ types.Type, dist bool) Agg[any] {
   711  	aggPriv := NewMin[T]()
   712  	if dist {
   713  		return NewUnaryDistAgg(AggregateMin, aggPriv, false, typ, MinReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   714  	}
   715  	return NewUnaryAgg(AggregateMin, aggPriv, false, typ, MinReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   716  }
   717  
   718  func newGenericCount[T types.OrderedT | Decimal128AndString](typ types.Type, dist bool, isStar bool) Agg[any] {
   719  	aggPriv := NewCount[T](isStar)
   720  	if dist {
   721  		return NewUnaryDistAgg(AggregateCount, aggPriv, true, typ, CountReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   722  	}
   723  	return NewUnaryAgg(AggregateCount, aggPriv, true, typ, CountReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   724  }
   725  
   726  func newGenericApproxcd[T any](typ types.Type, dist bool) Agg[any] {
   727  	aggPriv := NewApproxc[T]()
   728  	if dist {
   729  		return NewUnaryDistAgg(AggregateApproxCountDistinct, aggPriv, false, typ, ApproxCountReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   730  	}
   731  	return NewUnaryAgg(AggregateApproxCountDistinct, aggPriv, false, typ, ApproxCountReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   732  }
   733  
   734  func newGenericBitOr[T types.Ints | types.UInts | types.Floats](typ types.Type, dist bool) Agg[any] {
   735  	aggPriv := NewBitOr[T]()
   736  	if dist {
   737  		return NewUnaryDistAgg(AggregateBitOr, aggPriv, false, typ, BitOrReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   738  	}
   739  	return NewUnaryAgg(AggregateBitOr, aggPriv, false, typ, BitOrReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   740  }
   741  
   742  func newGenericBitXor[T types.Ints | types.UInts | types.Floats](typ types.Type, dist bool) Agg[any] {
   743  	aggPriv := NewBitXor[T]()
   744  	if dist {
   745  		return NewUnaryDistAgg(AggregateBitXor, aggPriv, false, typ, BitXorReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   746  	}
   747  	return NewUnaryAgg(AggregateBitXor, aggPriv, false, typ, BitXorReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   748  }
   749  
   750  func newGenericBitAnd[T types.Ints | types.UInts | types.Floats](typ types.Type, dist bool) Agg[any] {
   751  	aggPriv := NewBitAnd[T]()
   752  	if dist {
   753  		return NewUnaryDistAgg(AggregateBitAnd, aggPriv, false, typ, BitAndReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   754  	}
   755  	return NewUnaryAgg(AggregateBitAnd, aggPriv, false, typ, BitAndReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   756  }
   757  
   758  func newGenericVariance[T types.Ints | types.UInts | types.Floats](typ types.Type, dist bool) Agg[any] {
   759  	aggPriv := NewVariance[T]()
   760  	if dist {
   761  		return NewUnaryDistAgg(AggregateVariance, aggPriv, false, typ, VarianceReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   762  	}
   763  	return NewUnaryAgg(AggregateVariance, aggPriv, false, typ, VarianceReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   764  }
   765  
   766  func newGenericStdDevPop[T types.Ints | types.UInts | types.Floats](typ types.Type, dist bool) Agg[any] {
   767  	aggPriv := NewStdDevPop[T]()
   768  	if dist {
   769  		return NewUnaryDistAgg(AggregateStdDevPop, aggPriv, false, typ, StdDevPopReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill)
   770  	}
   771  	return NewUnaryAgg(AggregateStdDevPop, aggPriv, false, typ, StdDevPopReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   772  }
   773  func newGenericMedian[T Numeric](typ types.Type, dist bool) Agg[any] {
   774  	aggPriv := NewMedian[T]()
   775  	if dist {
   776  		panic(moerr.NewNotSupportedNoCtx("median in distinct mode"))
   777  	}
   778  	return NewUnaryAgg(AggregateMedian, aggPriv, false, typ, MedianReturnType([]types.Type{typ}), aggPriv.Grows, aggPriv.Eval, aggPriv.Merge, aggPriv.Fill, nil)
   779  }