MCPcopy Create free account
hub / github.com/auxten/postgresql-parser / typeCheckOverloadedExprs

Function typeCheckOverloadedExprs

pkg/sql/sem/tree/overload.go:436–738  ·  view source on GitHub ↗

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,
)

Source from the content-addressed store, hash-verified

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.
436func 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 })

Callers 4

TypeCheckMethod · 0.85
TypeCheckMethod · 0.85
TypeCheckMethod · 0.85
typeCheckComparisonOpFunction · 0.85

Calls 15

EquivalentMethod · 0.95
WrapfFunction · 0.92
TypeCheckSameTypedExprsFunction · 0.85
typeCheckSplitExprsFunction · 0.85
defaultTypeCheckFunction · 0.85
filterOverloadsFunction · 0.85
canConstantBecomeFunction · 0.85
checkReturnFunction · 0.85
filterAttemptFunction · 0.85
naturalConstantTypeFunction · 0.85
commonConstantTypeFunction · 0.85
FamilyMethod · 0.80

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…