TypeCheck implements the Expr interface.
( ctx context.Context, semaCtx *SemaContext, desired *types.T, )
| 656 | |
| 657 | // TypeCheck implements the Expr interface. |
| 658 | func (expr *ComparisonExpr) TypeCheck( |
| 659 | ctx context.Context, semaCtx *SemaContext, desired *types.T, |
| 660 | ) (TypedExpr, error) { |
| 661 | var leftTyped, rightTyped TypedExpr |
| 662 | var cmpOp *CmpOp |
| 663 | var alwaysNull bool |
| 664 | var err error |
| 665 | if expr.Operator.HasSubOperator() { |
| 666 | leftTyped, rightTyped, cmpOp, alwaysNull, err = typeCheckComparisonOpWithSubOperator( |
| 667 | ctx, |
| 668 | semaCtx, |
| 669 | expr.Operator, |
| 670 | expr.SubOperator, |
| 671 | expr.Left, |
| 672 | expr.Right, |
| 673 | ) |
| 674 | } else { |
| 675 | leftTyped, rightTyped, cmpOp, alwaysNull, err = typeCheckComparisonOp( |
| 676 | ctx, |
| 677 | semaCtx, |
| 678 | expr.Operator, |
| 679 | expr.Left, |
| 680 | expr.Right, |
| 681 | ) |
| 682 | } |
| 683 | if err != nil { |
| 684 | return nil, err |
| 685 | } |
| 686 | |
| 687 | if alwaysNull { |
| 688 | return DNull, nil |
| 689 | } |
| 690 | |
| 691 | if err := semaCtx.checkVolatility(cmpOp.Volatility); err != nil { |
| 692 | return nil, pgerror.Wrapf(err, pgcode.InvalidParameterValue, "%s", expr.Operator) |
| 693 | } |
| 694 | |
| 695 | expr.Left, expr.Right = leftTyped, rightTyped |
| 696 | expr.Fn = cmpOp |
| 697 | expr.typ = types.Bool |
| 698 | return expr, nil |
| 699 | } |
| 700 | |
| 701 | var ( |
| 702 | errStarNotAllowed = pgerror.New(pgcode.Syntax, "cannot use \"*\" in this context") |
nothing calls this directly
no test coverage detected