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 }