MCPcopy Create free account
hub / github.com/dolthub/doltgresql / typeCheckOverloadedExprs

Function typeCheckOverloadedExprs

postgres/parser/sem/tree/overload.go:387–747  ·  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: overl

(
	ctx context.Context,
	semaCtx *SemaContext,
	desired *types.T,
	overloads []overloadImpl,
	inBinOp bool,
	exprs ...Expr,
)

Source from the content-addressed store, hash-verified

385// in which case we may need to make a guess that the two parameters are of the same type if one
386// of them is NULL.
387func typeCheckOverloadedExprs(
388 ctx context.Context,
389 semaCtx *SemaContext,
390 desired *types.T,
391 overloads []overloadImpl,
392 inBinOp bool,
393 exprs ...Expr,
394) ([]TypedExpr, []overloadImpl, error) {
395 if len(overloads) > math.MaxUint8 {
396 return nil, nil, errors.AssertionFailedf("too many overloads (%d > 255)", len(overloads))
397 }
398
399 var s typeCheckOverloadState
400 s.exprs = exprs
401 s.overloads = overloads
402
403 // Special-case the HomogeneousType overload. We determine its return type by checking that
404 // all parameters have the same type.
405 for i, overload := range overloads {
406 // Only one overload can be provided if it has parameters with HomogeneousType.
407 if _, ok := overload.params().(HomogeneousType); ok {
408 if len(overloads) > 1 {
409 return nil, nil, errors.AssertionFailedf(
410 "only one overload can have HomogeneousType parameters")
411 }
412 typedExprs, _, err := TypeCheckSameTypedExprs(ctx, semaCtx, desired, exprs...)
413 if err != nil {
414 return nil, nil, err
415 }
416 return typedExprs, overloads[i : i+1], nil
417 }
418 }
419
420 // Hold the resolved type expressions of the provided exprs, in order.
421 s.typedExprs = make([]TypedExpr, len(exprs))
422 s.constIdxs, s.placeholderIdxs, s.resolvableIdxs = typeCheckSplitExprs(ctx, semaCtx, exprs)
423
424 // If no overloads are provided, just type check parameters and return.
425 if len(overloads) == 0 {
426 for _, i := range s.resolvableIdxs {
427 typ, err := exprs[i].TypeCheck(ctx, semaCtx, types.Any)
428 if err != nil {
429 return nil, nil, pgerror.Wrapf(err, pgcode.InvalidParameterValue,
430 "error type checking resolved expression:")
431 }
432 s.typedExprs[i] = typ
433 }
434 if err := defaultTypeCheck(ctx, semaCtx, &s, false); err != nil {
435 return nil, nil, err
436 }
437 return s.typedExprs, nil, nil
438 }
439
440 s.overloadIdxs = make([]uint8, len(overloads))
441 for i := 0; i < len(overloads); i++ {
442 s.overloadIdxs[i] = uint8(i)
443 }
444

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
MakeSemaContextFunction · 0.85

Tested by

no test coverage detected