typeCheckTupleComparison type checks a comparison between two tuples, asserting that the elements of the two tuples are comparable at each index.
( ctx context.Context, semaCtx *SemaContext, op ComparisonOperator, left *Tuple, right *Tuple, )
| 2231 | // typeCheckTupleComparison type checks a comparison between two tuples, |
| 2232 | // asserting that the elements of the two tuples are comparable at each index. |
| 2233 | func typeCheckTupleComparison( |
| 2234 | ctx context.Context, semaCtx *SemaContext, op ComparisonOperator, left *Tuple, right *Tuple, |
| 2235 | ) (TypedExpr, TypedExpr, error) { |
| 2236 | // All tuples must have the same length. |
| 2237 | tupLen := len(left.Exprs) |
| 2238 | if err := checkTupleHasLength(right, tupLen); err != nil { |
| 2239 | return nil, nil, err |
| 2240 | } |
| 2241 | left.typ = types.MakeTuple(make([]*types.T, tupLen)) |
| 2242 | right.typ = types.MakeTuple(make([]*types.T, tupLen)) |
| 2243 | for elemIdx := range left.Exprs { |
| 2244 | leftSubExpr := left.Exprs[elemIdx] |
| 2245 | rightSubExpr := right.Exprs[elemIdx] |
| 2246 | leftSubExprTyped, rightSubExprTyped, _, _, err := typeCheckComparisonOp(ctx, semaCtx, op, leftSubExpr, rightSubExpr) |
| 2247 | if err != nil { |
| 2248 | exps := Exprs([]Expr{left, right}) |
| 2249 | return nil, nil, pgerror.Newf(pgcode.DatatypeMismatch, "tuples %s are not comparable at index %d: %s", |
| 2250 | &exps, elemIdx+1, err) |
| 2251 | } |
| 2252 | left.Exprs[elemIdx] = leftSubExprTyped |
| 2253 | left.typ.TupleContents()[elemIdx] = leftSubExprTyped.ResolvedType() |
| 2254 | right.Exprs[elemIdx] = rightSubExprTyped |
| 2255 | right.typ.TupleContents()[elemIdx] = rightSubExprTyped.ResolvedType() |
| 2256 | } |
| 2257 | return left, right, nil |
| 2258 | } |
| 2259 | |
| 2260 | // typeCheckSameTypedTupleExprs type checks a list of expressions, asserting |
| 2261 | // that all are tuples which have the same type or nulls. The function expects |
no test coverage detected