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

Method TypeCheck

postgres/parser/sem/tree/type_check.go:1336–1370  ·  view source on GitHub ↗

TypeCheck implements the Expr interface.

(
	ctx context.Context, semaCtx *SemaContext, desired *types.T,
)

Source from the content-addressed store, hash-verified

1334
1335// TypeCheck implements the Expr interface.
1336func (expr *Tuple) TypeCheck(
1337 ctx context.Context, semaCtx *SemaContext, desired *types.T,
1338) (TypedExpr, error) {
1339 // Ensure the number of labels matches the number of expressions.
1340 if len(expr.Labels) > 0 && len(expr.Labels) != len(expr.Exprs) {
1341 return nil, pgerror.Newf(pgcode.Syntax,
1342 "mismatch in tuple definition: %d expressions, %d labels",
1343 len(expr.Exprs), len(expr.Labels),
1344 )
1345 }
1346
1347 var labels []string
1348 contents := make([]*types.T, len(expr.Exprs))
1349 for i, subExpr := range expr.Exprs {
1350 desiredElem := types.Any
1351 if desired.Family() == types.TupleFamily && len(desired.TupleContents()) > i {
1352 desiredElem = desired.TupleContents()[i]
1353 }
1354 typedExpr, err := subExpr.TypeCheck(ctx, semaCtx, desiredElem)
1355 if err != nil {
1356 return nil, err
1357 }
1358 expr.Exprs[i] = typedExpr
1359 contents[i] = typedExpr.ResolvedType()
1360 }
1361 // Copy the labels if there are any.
1362 if len(expr.Labels) > 0 {
1363 labels = make([]string, len(expr.Labels))
1364 for i := range expr.Labels {
1365 labels[i] = lex.NormalizeName(expr.Labels[i])
1366 }
1367 }
1368 expr.typ = types.MakeLabeledTuple(contents, labels)
1369 return expr, nil
1370}
1371
1372var errAmbiguousArrayType = pgerror.Newf(pgcode.IndeterminateDatatype, "cannot determine type of empty array. "+
1373 "Consider annotating with the desired type, for example ARRAY[]:::int[]")

Callers

nothing calls this directly

Calls 7

NewfFunction · 0.92
NormalizeNameFunction · 0.92
MakeLabeledTupleFunction · 0.92
FamilyMethod · 0.80
TupleContentsMethod · 0.80
TypeCheckMethod · 0.65
ResolvedTypeMethod · 0.65

Tested by

no test coverage detected