|
6 | 6 | package eval |
7 | 7 |
|
8 | 8 | import ( |
| 9 | + "strings" |
| 10 | + |
9 | 11 | "github.com/cockroachdb/apd/v3" |
10 | 12 | "github.com/cockroachdb/cockroach/pkg/sql/pgwire/pgcode" |
11 | 13 | "github.com/cockroachdb/cockroach/pkg/sql/pgwire/pgerror" |
@@ -53,7 +55,8 @@ func (ctx *jsonpathCtx) evalOperation( |
53 | 55 | case jsonpath.OpLogicalAnd, jsonpath.OpLogicalOr, jsonpath.OpLogicalNot, |
54 | 56 | jsonpath.OpCompEqual, jsonpath.OpCompNotEqual, jsonpath.OpCompLess, |
55 | 57 | jsonpath.OpCompLessEqual, jsonpath.OpCompGreater, jsonpath.OpCompGreaterEqual, |
56 | | - jsonpath.OpLikeRegex, jsonpath.OpExists, jsonpath.OpIsUnknown: |
| 58 | + jsonpath.OpLikeRegex, jsonpath.OpExists, jsonpath.OpIsUnknown, |
| 59 | + jsonpath.OpStartsWith: |
57 | 60 | b, err := ctx.evalBoolean(op, jsonValue) |
58 | 61 | if err != nil { |
59 | 62 | return []json.JSON{convertFromBool(jsonpathBoolUnknown)}, err |
@@ -89,11 +92,31 @@ func (ctx *jsonpathCtx) evalBoolean( |
89 | 92 | return ctx.evalExists(op, jsonValue) |
90 | 93 | case jsonpath.OpIsUnknown: |
91 | 94 | return ctx.evalIsUnknown(op, jsonValue) |
| 95 | + case jsonpath.OpStartsWith: |
| 96 | + return ctx.evalPredicate(op, jsonValue, evalStartsWithFunc, true /* evalRight */, false /* unwrapRight */) |
92 | 97 | default: |
93 | 98 | panic(errors.AssertionFailedf("unhandled operation type")) |
94 | 99 | } |
95 | 100 | } |
96 | 101 |
|
| 102 | +func evalStartsWithFunc(_ jsonpath.Operation, l, r json.JSON) (jsonpathBool, error) { |
| 103 | + if l.Type() != json.StringJSONType || r.Type() != json.StringJSONType { |
| 104 | + return jsonpathBoolUnknown, nil |
| 105 | + } |
| 106 | + left, err := l.AsText() |
| 107 | + if err != nil { |
| 108 | + return jsonpathBoolUnknown, err |
| 109 | + } |
| 110 | + right, err := r.AsText() |
| 111 | + if err != nil { |
| 112 | + return jsonpathBoolUnknown, err |
| 113 | + } |
| 114 | + if strings.HasPrefix(*left, *right) { |
| 115 | + return jsonpathBoolTrue, nil |
| 116 | + } |
| 117 | + return jsonpathBoolFalse, nil |
| 118 | +} |
| 119 | + |
97 | 120 | func (ctx *jsonpathCtx) evalIsUnknown( |
98 | 121 | op jsonpath.Operation, jsonValue json.JSON, |
99 | 122 | ) (jsonpathBool, error) { |
|
0 commit comments