9
9
10
10
include ! ( concat!( env!( "OUT_DIR" ) , "/scalar.rs" ) ) ;
11
11
12
- use crate :: scalar:: DomainLimit ;
13
- use mz_repr:: proto:: TryFromProtoError ;
12
+ use crate :: scalar:: { DomainLimit , EvalError } ;
13
+ use mz_repr:: proto:: { ProtoRepr , TryFromProtoError , TryIntoIfSome } ;
14
14
15
15
impl From < & DomainLimit > for ProtoDomainLimit {
16
16
fn from ( limit : & DomainLimit ) -> Self {
@@ -41,6 +41,203 @@ impl TryFrom<ProtoDomainLimit> for DomainLimit {
41
41
}
42
42
}
43
43
44
+ impl From < & EvalError > for ProtoEvalError {
45
+ fn from ( error : & EvalError ) -> Self {
46
+ use proto_eval_error:: * ;
47
+ use proto_incompatible_array_dimensions:: * ;
48
+ use Kind :: * ;
49
+ let kind = match error {
50
+ EvalError :: CharacterNotValidForEncoding ( v) => CharacterNotValidForEncoding ( * v) ,
51
+ EvalError :: CharacterTooLargeForEncoding ( v) => CharacterTooLargeForEncoding ( * v) ,
52
+ EvalError :: DateBinOutOfRange ( v) => DateBinOutOfRange ( v. clone ( ) ) ,
53
+ EvalError :: DivisionByZero => DivisionByZero ( ( ) ) ,
54
+ EvalError :: Unsupported { feature, issue_no } => Unsupported ( ProtoUnsupported {
55
+ feature : feature. clone ( ) ,
56
+ issue_no : issue_no. into_proto ( ) ,
57
+ } ) ,
58
+ EvalError :: FloatOverflow => FloatOverflow ( ( ) ) ,
59
+ EvalError :: FloatUnderflow => FloatUnderflow ( ( ) ) ,
60
+ EvalError :: NumericFieldOverflow => NumericFieldOverflow ( ( ) ) ,
61
+ EvalError :: Float32OutOfRange => Float32OutOfRange ( ( ) ) ,
62
+ EvalError :: Float64OutOfRange => Float64OutOfRange ( ( ) ) ,
63
+ EvalError :: Int16OutOfRange => Int16OutOfRange ( ( ) ) ,
64
+ EvalError :: Int32OutOfRange => Int32OutOfRange ( ( ) ) ,
65
+ EvalError :: Int64OutOfRange => Int64OutOfRange ( ( ) ) ,
66
+ EvalError :: OidOutOfRange => OidOutOfRange ( ( ) ) ,
67
+ EvalError :: IntervalOutOfRange => IntervalOutOfRange ( ( ) ) ,
68
+ EvalError :: TimestampOutOfRange => TimestampOutOfRange ( ( ) ) ,
69
+ EvalError :: CharOutOfRange => CharOutOfRange ( ( ) ) ,
70
+ EvalError :: InvalidBase64Equals => InvalidBase64Equals ( ( ) ) ,
71
+ EvalError :: InvalidBase64Symbol ( sym) => InvalidBase64Symbol ( sym. into_proto ( ) ) ,
72
+ EvalError :: InvalidBase64EndSequence => InvalidBase64EndSequence ( ( ) ) ,
73
+ EvalError :: InvalidTimezone ( tz) => InvalidTimezone ( tz. clone ( ) ) ,
74
+ EvalError :: InvalidTimezoneInterval => InvalidTimezoneInterval ( ( ) ) ,
75
+ EvalError :: InvalidTimezoneConversion => InvalidTimezoneConversion ( ( ) ) ,
76
+ EvalError :: InvalidLayer { max_layer, val } => InvalidLayer ( ProtoInvalidLayer {
77
+ max_layer : max_layer. into_proto ( ) ,
78
+ val : * val,
79
+ } ) ,
80
+ EvalError :: InvalidArray ( error) => InvalidArray ( error. into ( ) ) ,
81
+ EvalError :: InvalidEncodingName ( v) => InvalidEncodingName ( v. clone ( ) ) ,
82
+ EvalError :: InvalidHashAlgorithm ( v) => InvalidHashAlgorithm ( v. clone ( ) ) ,
83
+ EvalError :: InvalidByteSequence {
84
+ byte_sequence,
85
+ encoding_name,
86
+ } => InvalidByteSequence ( ProtoInvalidByteSequence {
87
+ byte_sequence : byte_sequence. clone ( ) ,
88
+ encoding_name : encoding_name. clone ( ) ,
89
+ } ) ,
90
+ EvalError :: InvalidJsonbCast { from, to } => InvalidJsonbCast ( ProtoInvalidJsonbCast {
91
+ from : from. clone ( ) ,
92
+ to : to. clone ( ) ,
93
+ } ) ,
94
+ EvalError :: InvalidRegex ( v) => InvalidRegex ( v. clone ( ) ) ,
95
+ EvalError :: InvalidRegexFlag ( v) => InvalidRegexFlag ( v. into_proto ( ) ) ,
96
+ EvalError :: InvalidParameterValue ( v) => InvalidParameterValue ( v. clone ( ) ) ,
97
+ EvalError :: NegSqrt => NegSqrt ( ( ) ) ,
98
+ EvalError :: NullCharacterNotPermitted => NullCharacterNotPermitted ( ( ) ) ,
99
+ EvalError :: UnknownUnits ( v) => UnknownUnits ( v. clone ( ) ) ,
100
+ EvalError :: UnsupportedUnits ( units, typ) => UnsupportedUnits ( ProtoUnsupportedUnits {
101
+ units : units. clone ( ) ,
102
+ typ : typ. clone ( ) ,
103
+ } ) ,
104
+ EvalError :: UnterminatedLikeEscapeSequence => UnterminatedLikeEscapeSequence ( ( ) ) ,
105
+ EvalError :: Parse ( error) => Parse ( error. into ( ) ) ,
106
+ EvalError :: ParseHex ( error) => ParseHex ( error. into ( ) ) ,
107
+ EvalError :: Internal ( v) => Internal ( v. clone ( ) ) ,
108
+ EvalError :: InfinityOutOfDomain ( v) => InfinityOutOfDomain ( v. clone ( ) ) ,
109
+ EvalError :: NegativeOutOfDomain ( v) => NegativeOutOfDomain ( v. clone ( ) ) ,
110
+ EvalError :: ZeroOutOfDomain ( v) => ZeroOutOfDomain ( v. clone ( ) ) ,
111
+ EvalError :: OutOfDomain ( lower, upper, id) => OutOfDomain ( ProtoOutOfDomain {
112
+ lower : Some ( lower. into ( ) ) ,
113
+ upper : Some ( upper. into ( ) ) ,
114
+ id : id. clone ( ) ,
115
+ } ) ,
116
+ EvalError :: ComplexOutOfRange ( v) => ComplexOutOfRange ( v. clone ( ) ) ,
117
+ EvalError :: MultipleRowsFromSubquery => MultipleRowsFromSubquery ( ( ) ) ,
118
+ EvalError :: Undefined ( v) => Undefined ( v. clone ( ) ) ,
119
+ EvalError :: LikePatternTooLong => LikePatternTooLong ( ( ) ) ,
120
+ EvalError :: LikeEscapeTooLong => LikeEscapeTooLong ( ( ) ) ,
121
+ EvalError :: StringValueTooLong {
122
+ target_type,
123
+ length,
124
+ } => StringValueTooLong ( ProtoStringValueTooLong {
125
+ target_type : target_type. clone ( ) ,
126
+ length : length. into_proto ( ) ,
127
+ } ) ,
128
+ EvalError :: MultidimensionalArrayRemovalNotSupported => {
129
+ MultidimensionalArrayRemovalNotSupported ( ( ) )
130
+ }
131
+ EvalError :: IncompatibleArrayDimensions { dims } => {
132
+ IncompatibleArrayDimensions ( ProtoIncompatibleArrayDimensions {
133
+ dims : dims. map ( |dims| ProtoDims {
134
+ f0 : dims. 0 . into_proto ( ) ,
135
+ f1 : dims. 1 . into_proto ( ) ,
136
+ } ) ,
137
+ } )
138
+ }
139
+ EvalError :: TypeFromOid ( v) => TypeFromOid ( v. clone ( ) ) ,
140
+ } ;
141
+ ProtoEvalError { kind : Some ( kind) }
142
+ }
143
+ }
144
+
145
+ impl TryFrom < ProtoEvalError > for EvalError {
146
+ type Error = TryFromProtoError ;
147
+
148
+ fn try_from ( error : ProtoEvalError ) -> Result < Self , Self :: Error > {
149
+ use proto_eval_error:: Kind :: * ;
150
+ match error. kind {
151
+ Some ( kind) => match kind {
152
+ CharacterNotValidForEncoding ( v) => Ok ( EvalError :: CharacterNotValidForEncoding ( v) ) ,
153
+ CharacterTooLargeForEncoding ( v) => Ok ( EvalError :: CharacterTooLargeForEncoding ( v) ) ,
154
+ DateBinOutOfRange ( v) => Ok ( EvalError :: DateBinOutOfRange ( v) ) ,
155
+ DivisionByZero ( ( ) ) => Ok ( EvalError :: DivisionByZero ) ,
156
+ Unsupported ( v) => Ok ( EvalError :: Unsupported {
157
+ feature : v. feature ,
158
+ issue_no : Option :: < usize > :: from_proto ( v. issue_no ) ?,
159
+ } ) ,
160
+ FloatOverflow ( ( ) ) => Ok ( EvalError :: FloatOverflow ) ,
161
+ FloatUnderflow ( ( ) ) => Ok ( EvalError :: FloatUnderflow ) ,
162
+ NumericFieldOverflow ( ( ) ) => Ok ( EvalError :: NumericFieldOverflow ) ,
163
+ Float32OutOfRange ( ( ) ) => Ok ( EvalError :: Float32OutOfRange ) ,
164
+ Float64OutOfRange ( ( ) ) => Ok ( EvalError :: Float64OutOfRange ) ,
165
+ Int16OutOfRange ( ( ) ) => Ok ( EvalError :: Int16OutOfRange ) ,
166
+ Int32OutOfRange ( ( ) ) => Ok ( EvalError :: Int32OutOfRange ) ,
167
+ Int64OutOfRange ( ( ) ) => Ok ( EvalError :: Int64OutOfRange ) ,
168
+ OidOutOfRange ( ( ) ) => Ok ( EvalError :: OidOutOfRange ) ,
169
+ IntervalOutOfRange ( ( ) ) => Ok ( EvalError :: IntervalOutOfRange ) ,
170
+ TimestampOutOfRange ( ( ) ) => Ok ( EvalError :: TimestampOutOfRange ) ,
171
+ CharOutOfRange ( ( ) ) => Ok ( EvalError :: CharOutOfRange ) ,
172
+ InvalidBase64Equals ( ( ) ) => Ok ( EvalError :: InvalidBase64Equals ) ,
173
+ InvalidBase64Symbol ( v) => char:: from_proto ( v) . map ( EvalError :: InvalidBase64Symbol ) ,
174
+ InvalidBase64EndSequence ( ( ) ) => Ok ( EvalError :: InvalidBase64EndSequence ) ,
175
+ InvalidTimezone ( v) => Ok ( EvalError :: InvalidTimezone ( v) ) ,
176
+ InvalidTimezoneInterval ( ( ) ) => Ok ( EvalError :: InvalidTimezoneInterval ) ,
177
+ InvalidTimezoneConversion ( ( ) ) => Ok ( EvalError :: InvalidTimezoneConversion ) ,
178
+ InvalidLayer ( v) => Ok ( EvalError :: InvalidLayer {
179
+ max_layer : usize:: from_proto ( v. max_layer ) ?,
180
+ val : v. val ,
181
+ } ) ,
182
+ InvalidArray ( error) => Ok ( EvalError :: InvalidArray ( error. try_into ( ) ?) ) ,
183
+ InvalidEncodingName ( v) => Ok ( EvalError :: InvalidEncodingName ( v) ) ,
184
+ InvalidHashAlgorithm ( v) => Ok ( EvalError :: InvalidHashAlgorithm ( v) ) ,
185
+ InvalidByteSequence ( v) => Ok ( EvalError :: InvalidByteSequence {
186
+ byte_sequence : v. byte_sequence ,
187
+ encoding_name : v. encoding_name ,
188
+ } ) ,
189
+ InvalidJsonbCast ( v) => Ok ( EvalError :: InvalidJsonbCast {
190
+ from : v. from ,
191
+ to : v. to ,
192
+ } ) ,
193
+ InvalidRegex ( v) => Ok ( EvalError :: InvalidRegex ( v) ) ,
194
+ InvalidRegexFlag ( v) => Ok ( EvalError :: InvalidRegexFlag ( char:: from_proto ( v) ?) ) ,
195
+ InvalidParameterValue ( v) => Ok ( EvalError :: InvalidParameterValue ( v) ) ,
196
+ NegSqrt ( ( ) ) => Ok ( EvalError :: NegSqrt ) ,
197
+ NullCharacterNotPermitted ( ( ) ) => Ok ( EvalError :: NullCharacterNotPermitted ) ,
198
+ UnknownUnits ( v) => Ok ( EvalError :: UnknownUnits ( v) ) ,
199
+ UnsupportedUnits ( v) => Ok ( EvalError :: UnsupportedUnits ( v. units , v. typ ) ) ,
200
+ UnterminatedLikeEscapeSequence ( ( ) ) => Ok ( EvalError :: UnterminatedLikeEscapeSequence ) ,
201
+ Parse ( error) => Ok ( EvalError :: Parse ( error. try_into ( ) ?) ) ,
202
+ ParseHex ( error) => Ok ( EvalError :: ParseHex ( error. try_into ( ) ?) ) ,
203
+ Internal ( v) => Ok ( EvalError :: Internal ( v) ) ,
204
+ InfinityOutOfDomain ( v) => Ok ( EvalError :: InfinityOutOfDomain ( v) ) ,
205
+ NegativeOutOfDomain ( v) => Ok ( EvalError :: NegativeOutOfDomain ( v) ) ,
206
+ ZeroOutOfDomain ( v) => Ok ( EvalError :: ZeroOutOfDomain ( v) ) ,
207
+ OutOfDomain ( v) => Ok ( EvalError :: OutOfDomain (
208
+ v. lower . try_into_if_some ( "`ProtoDomainLimit::lower`" ) ?,
209
+ v. upper . try_into_if_some ( "`ProtoDomainLimit::upper`" ) ?,
210
+ v. id ,
211
+ ) ) ,
212
+ ComplexOutOfRange ( v) => Ok ( EvalError :: ComplexOutOfRange ( v) ) ,
213
+ MultipleRowsFromSubquery ( ( ) ) => Ok ( EvalError :: MultipleRowsFromSubquery ) ,
214
+ Undefined ( v) => Ok ( EvalError :: Undefined ( v) ) ,
215
+ LikePatternTooLong ( ( ) ) => Ok ( EvalError :: LikePatternTooLong ) ,
216
+ LikeEscapeTooLong ( ( ) ) => Ok ( EvalError :: LikeEscapeTooLong ) ,
217
+ StringValueTooLong ( v) => Ok ( EvalError :: StringValueTooLong {
218
+ target_type : v. target_type ,
219
+ length : usize:: from_proto ( v. length ) ?,
220
+ } ) ,
221
+ MultidimensionalArrayRemovalNotSupported ( ( ) ) => {
222
+ Ok ( EvalError :: MultidimensionalArrayRemovalNotSupported )
223
+ }
224
+ IncompatibleArrayDimensions ( v) => Ok ( EvalError :: IncompatibleArrayDimensions {
225
+ dims : v
226
+ . dims
227
+ . map :: < Result < _ , TryFromProtoError > , _ > ( |dims| {
228
+ let f0 = usize:: from_proto ( dims. f0 ) ?;
229
+ let f1 = usize:: from_proto ( dims. f1 ) ?;
230
+ Ok ( ( f0, f1) )
231
+ } )
232
+ . transpose ( ) ?,
233
+ } ) ,
234
+ TypeFromOid ( v) => Ok ( EvalError :: TypeFromOid ( v) ) ,
235
+ } ,
236
+ None => Err ( TryFromProtoError :: missing_field ( "`ProtoEvalError::kind`" ) ) ,
237
+ }
238
+ }
239
+ }
240
+
44
241
#[ cfg( test) ]
45
242
mod tests {
46
243
use super :: * ;
@@ -55,4 +252,13 @@ mod tests {
55
252
assert_eq!( actual. unwrap( ) , expect) ;
56
253
}
57
254
}
255
+
256
+ proptest ! {
257
+ #[ test]
258
+ fn eval_error_protobuf_roundtrip( expect in any:: <EvalError >( ) ) {
259
+ let actual = protobuf_roundtrip:: <_, ProtoEvalError >( & expect) ;
260
+ assert!( actual. is_ok( ) ) ;
261
+ assert_eq!( actual. unwrap( ) , expect) ;
262
+ }
263
+ }
58
264
}
0 commit comments