typeCheckOverloadedExprs determines the correct overload to use for the given set of expression parameters, along with an optional desired return type. It returns the expression parameters after being type checked, along with a slice of candidate overloadImpls. The slice may have length: 0: overload
( ctx *SemaContext, desired *types.T, overloads []overloadImpl, inBinOp bool, exprs ...Expr, )
| 434 | // in which case we may need to make a guess that the two parameters are of the same type if one |
| 435 | // of them is NULL. |
| 436 | func typeCheckOverloadedExprs( |
| 437 | ctx *SemaContext, desired *types.T, overloads []overloadImpl, inBinOp bool, exprs ...Expr, |
| 438 | ) ([]TypedExpr, []overloadImpl, error) { |
| 439 | if len(overloads) > math.MaxUint8 { |
| 440 | return nil, nil, errors.AssertionFailedf("too many overloads (%d > 255)", len(overloads)) |
| 441 | } |
| 442 | |
| 443 | var s typeCheckOverloadState |
| 444 | s.exprs = exprs |
| 445 | s.overloads = overloads |
| 446 | |
| 447 | // Special-case the HomogeneousType overload. We determine its return type by checking that |
| 448 | // all parameters have the same type. |
| 449 | for i, overload := range overloads { |
| 450 | // Only one overload can be provided if it has parameters with HomogeneousType. |
| 451 | if _, ok := overload.params().(HomogeneousType); ok { |
| 452 | if len(overloads) > 1 { |
| 453 | return nil, nil, errors.AssertionFailedf( |
| 454 | "only one overload can have HomogeneousType parameters") |
| 455 | } |
| 456 | typedExprs, _, err := TypeCheckSameTypedExprs(ctx, desired, exprs...) |
| 457 | if err != nil { |
| 458 | return nil, nil, err |
| 459 | } |
| 460 | return typedExprs, overloads[i : i+1], nil |
| 461 | } |
| 462 | } |
| 463 | |
| 464 | // Hold the resolved type expressions of the provided exprs, in order. |
| 465 | s.typedExprs = make([]TypedExpr, len(exprs)) |
| 466 | s.constIdxs, s.placeholderIdxs, s.resolvableIdxs = typeCheckSplitExprs(ctx, exprs) |
| 467 | |
| 468 | // If no overloads are provided, just type check parameters and return. |
| 469 | if len(overloads) == 0 { |
| 470 | for _, i := range s.resolvableIdxs { |
| 471 | typ, err := exprs[i].TypeCheck(ctx, types.Any) |
| 472 | if err != nil { |
| 473 | return nil, nil, pgerror.Wrapf(err, pgcode.InvalidParameterValue, |
| 474 | "error type checking resolved expression:") |
| 475 | } |
| 476 | s.typedExprs[i] = typ |
| 477 | } |
| 478 | if err := defaultTypeCheck(ctx, &s, false); err != nil { |
| 479 | return nil, nil, err |
| 480 | } |
| 481 | return s.typedExprs, nil, nil |
| 482 | } |
| 483 | |
| 484 | s.overloadIdxs = make([]uint8, len(overloads)) |
| 485 | for i := 0; i < len(overloads); i++ { |
| 486 | s.overloadIdxs[i] = uint8(i) |
| 487 | } |
| 488 | |
| 489 | // Filter out incorrect parameter length overloads. |
| 490 | s.overloadIdxs = filterOverloads(s.overloads, s.overloadIdxs, |
| 491 | func(o overloadImpl) bool { |
| 492 | return o.params().MatchLen(len(exprs)) |
| 493 | }) |
no test coverage detected
searching dependent graphs…