nodeExpr handles tree.Expr nodes.
(ctx *Context, node tree.Expr)
| 87 | |
| 88 | // nodeExpr handles tree.Expr nodes. |
| 89 | func nodeExpr(ctx *Context, node tree.Expr) (vitess.Expr, error) { |
| 90 | switch node := node.(type) { |
| 91 | case *tree.AllColumnsSelector: |
| 92 | return nil, errors.Errorf("table.* syntax is not yet supported in this context") |
| 93 | case *tree.AndExpr: |
| 94 | left, err := nodeExpr(ctx, node.Left) |
| 95 | if err != nil { |
| 96 | return nil, err |
| 97 | } |
| 98 | right, err := nodeExpr(ctx, node.Right) |
| 99 | if err != nil { |
| 100 | return nil, err |
| 101 | } |
| 102 | return &vitess.AndExpr{ |
| 103 | Left: left, |
| 104 | Right: right, |
| 105 | }, nil |
| 106 | case *tree.AnnotateTypeExpr: |
| 107 | return nil, errors.Errorf("ANNOTATE_TYPE is not yet supported") |
| 108 | case *tree.Array: |
| 109 | unresolvedChildren := make([]vitess.Expr, len(node.Exprs)) |
| 110 | var coercedType *pgtypes.DoltgresType |
| 111 | if node.HasResolvedType() { |
| 112 | _, resolvedType, err := nodeResolvableTypeReference(ctx, node.ResolvedType(), false) |
| 113 | if err != nil { |
| 114 | return nil, err |
| 115 | } |
| 116 | if resolvedType.IsArrayType() { |
| 117 | coercedType = resolvedType |
| 118 | } else { |
| 119 | return nil, errors.Errorf("array has invalid resolved type") |
| 120 | } |
| 121 | } |
| 122 | for i, arrayExpr := range node.Exprs { |
| 123 | var err error |
| 124 | unresolvedChildren[i], err = nodeExpr(ctx, arrayExpr) |
| 125 | if err != nil { |
| 126 | return nil, err |
| 127 | } |
| 128 | } |
| 129 | arrayExpr, err := pgexprs.NewArray(coercedType) |
| 130 | if err != nil { |
| 131 | return nil, err |
| 132 | } |
| 133 | return vitess.InjectedExpr{ |
| 134 | Expression: arrayExpr, |
| 135 | Children: unresolvedChildren, |
| 136 | }, nil |
| 137 | case *tree.ArrayFlatten: |
| 138 | subquery, err := nodeExpr(ctx, node.Subquery) |
| 139 | if err != nil { |
| 140 | return nil, err |
| 141 | } |
| 142 | return vitess.InjectedExpr{ |
| 143 | Expression: pgexprs.ArrayFlatten{}, |
| 144 | Children: vitess.Exprs{subquery}, |
| 145 | }, nil |
| 146 | case *tree.BinaryExpr: |
no test coverage detected