@@ -3,6 +3,7 @@ use std::mem;
33use std:: ops:: Index ;
44use std:: os:: raw as libc;
55
6+ use super :: stmt:: MysqlFieldMetadata ;
67use super :: stmt:: Statement ;
78use crate :: mysql:: connection:: stmt:: StatementMetadata ;
89use crate :: mysql:: types:: MYSQL_TIME ;
@@ -31,13 +32,7 @@ impl Binds {
3132 . fields ( )
3233 . iter ( )
3334 . zip ( types. into_iter ( ) . chain ( std:: iter:: repeat ( None ) ) )
34- . map ( |( field, tpe) | {
35- if let Some ( tpe) = tpe {
36- BindData :: for_output ( tpe. into ( ) )
37- } else {
38- BindData :: for_output ( ( field. field_type ( ) , field. flags ( ) ) )
39- }
40- } )
35+ . map ( |( field, tpe) | BindData :: for_output ( tpe, field) )
4136 . collect ( ) ;
4237
4338 Binds { data }
@@ -152,7 +147,156 @@ impl BindData {
152147 }
153148 }
154149
155- fn for_output ( ( tpe, flags) : ( ffi:: enum_field_types , Flags ) ) -> Self {
150+ fn for_output ( tpe : Option < MysqlType > , metadata : & MysqlFieldMetadata ) -> Self {
151+ let ( tpe, flags) = if let Some ( tpe) = tpe {
152+ match ( tpe, metadata. field_type ( ) ) {
153+ // Those are types where we handle the conversion in diesel itself
154+ // and do not relay on libmysqlclient
155+ ( MysqlType :: Tiny , ffi:: enum_field_types:: MYSQL_TYPE_DECIMAL )
156+ | ( MysqlType :: Tiny , ffi:: enum_field_types:: MYSQL_TYPE_TINY )
157+ | ( MysqlType :: Tiny , ffi:: enum_field_types:: MYSQL_TYPE_SHORT )
158+ | ( MysqlType :: Tiny , ffi:: enum_field_types:: MYSQL_TYPE_LONG )
159+ | ( MysqlType :: Tiny , ffi:: enum_field_types:: MYSQL_TYPE_FLOAT )
160+ | ( MysqlType :: Tiny , ffi:: enum_field_types:: MYSQL_TYPE_DOUBLE )
161+ | ( MysqlType :: Tiny , ffi:: enum_field_types:: MYSQL_TYPE_INT24 )
162+ | ( MysqlType :: Tiny , ffi:: enum_field_types:: MYSQL_TYPE_NEWDECIMAL )
163+ | ( MysqlType :: Tiny , ffi:: enum_field_types:: MYSQL_TYPE_LONGLONG )
164+ | ( MysqlType :: UnsignedTiny , ffi:: enum_field_types:: MYSQL_TYPE_DECIMAL )
165+ | ( MysqlType :: UnsignedTiny , ffi:: enum_field_types:: MYSQL_TYPE_TINY )
166+ | ( MysqlType :: UnsignedTiny , ffi:: enum_field_types:: MYSQL_TYPE_SHORT )
167+ | ( MysqlType :: UnsignedTiny , ffi:: enum_field_types:: MYSQL_TYPE_LONG )
168+ | ( MysqlType :: UnsignedTiny , ffi:: enum_field_types:: MYSQL_TYPE_FLOAT )
169+ | ( MysqlType :: UnsignedTiny , ffi:: enum_field_types:: MYSQL_TYPE_DOUBLE )
170+ | ( MysqlType :: UnsignedTiny , ffi:: enum_field_types:: MYSQL_TYPE_INT24 )
171+ | ( MysqlType :: UnsignedTiny , ffi:: enum_field_types:: MYSQL_TYPE_NEWDECIMAL )
172+ | ( MysqlType :: UnsignedTiny , ffi:: enum_field_types:: MYSQL_TYPE_LONGLONG )
173+ | ( MysqlType :: Short , ffi:: enum_field_types:: MYSQL_TYPE_DECIMAL )
174+ | ( MysqlType :: Short , ffi:: enum_field_types:: MYSQL_TYPE_TINY )
175+ | ( MysqlType :: Short , ffi:: enum_field_types:: MYSQL_TYPE_SHORT )
176+ | ( MysqlType :: Short , ffi:: enum_field_types:: MYSQL_TYPE_LONG )
177+ | ( MysqlType :: Short , ffi:: enum_field_types:: MYSQL_TYPE_FLOAT )
178+ | ( MysqlType :: Short , ffi:: enum_field_types:: MYSQL_TYPE_DOUBLE )
179+ | ( MysqlType :: Short , ffi:: enum_field_types:: MYSQL_TYPE_INT24 )
180+ | ( MysqlType :: Short , ffi:: enum_field_types:: MYSQL_TYPE_NEWDECIMAL )
181+ | ( MysqlType :: Short , ffi:: enum_field_types:: MYSQL_TYPE_LONGLONG )
182+ | ( MysqlType :: UnsignedShort , ffi:: enum_field_types:: MYSQL_TYPE_DECIMAL )
183+ | ( MysqlType :: UnsignedShort , ffi:: enum_field_types:: MYSQL_TYPE_TINY )
184+ | ( MysqlType :: UnsignedShort , ffi:: enum_field_types:: MYSQL_TYPE_SHORT )
185+ | ( MysqlType :: UnsignedShort , ffi:: enum_field_types:: MYSQL_TYPE_LONG )
186+ | ( MysqlType :: UnsignedShort , ffi:: enum_field_types:: MYSQL_TYPE_FLOAT )
187+ | ( MysqlType :: UnsignedShort , ffi:: enum_field_types:: MYSQL_TYPE_DOUBLE )
188+ | ( MysqlType :: UnsignedShort , ffi:: enum_field_types:: MYSQL_TYPE_INT24 )
189+ | ( MysqlType :: UnsignedShort , ffi:: enum_field_types:: MYSQL_TYPE_NEWDECIMAL )
190+ | ( MysqlType :: UnsignedShort , ffi:: enum_field_types:: MYSQL_TYPE_LONGLONG )
191+ | ( MysqlType :: Long , ffi:: enum_field_types:: MYSQL_TYPE_DECIMAL )
192+ | ( MysqlType :: Long , ffi:: enum_field_types:: MYSQL_TYPE_TINY )
193+ | ( MysqlType :: Long , ffi:: enum_field_types:: MYSQL_TYPE_SHORT )
194+ | ( MysqlType :: Long , ffi:: enum_field_types:: MYSQL_TYPE_LONG )
195+ | ( MysqlType :: Long , ffi:: enum_field_types:: MYSQL_TYPE_FLOAT )
196+ | ( MysqlType :: Long , ffi:: enum_field_types:: MYSQL_TYPE_DOUBLE )
197+ | ( MysqlType :: Long , ffi:: enum_field_types:: MYSQL_TYPE_INT24 )
198+ | ( MysqlType :: Long , ffi:: enum_field_types:: MYSQL_TYPE_NEWDECIMAL )
199+ | ( MysqlType :: Long , ffi:: enum_field_types:: MYSQL_TYPE_LONGLONG )
200+ | ( MysqlType :: UnsignedLong , ffi:: enum_field_types:: MYSQL_TYPE_DECIMAL )
201+ | ( MysqlType :: UnsignedLong , ffi:: enum_field_types:: MYSQL_TYPE_TINY )
202+ | ( MysqlType :: UnsignedLong , ffi:: enum_field_types:: MYSQL_TYPE_SHORT )
203+ | ( MysqlType :: UnsignedLong , ffi:: enum_field_types:: MYSQL_TYPE_LONG )
204+ | ( MysqlType :: UnsignedLong , ffi:: enum_field_types:: MYSQL_TYPE_FLOAT )
205+ | ( MysqlType :: UnsignedLong , ffi:: enum_field_types:: MYSQL_TYPE_DOUBLE )
206+ | ( MysqlType :: UnsignedLong , ffi:: enum_field_types:: MYSQL_TYPE_INT24 )
207+ | ( MysqlType :: UnsignedLong , ffi:: enum_field_types:: MYSQL_TYPE_NEWDECIMAL )
208+ | ( MysqlType :: UnsignedLong , ffi:: enum_field_types:: MYSQL_TYPE_LONGLONG )
209+ | ( MysqlType :: LongLong , ffi:: enum_field_types:: MYSQL_TYPE_DECIMAL )
210+ | ( MysqlType :: LongLong , ffi:: enum_field_types:: MYSQL_TYPE_TINY )
211+ | ( MysqlType :: LongLong , ffi:: enum_field_types:: MYSQL_TYPE_SHORT )
212+ | ( MysqlType :: LongLong , ffi:: enum_field_types:: MYSQL_TYPE_LONG )
213+ | ( MysqlType :: LongLong , ffi:: enum_field_types:: MYSQL_TYPE_FLOAT )
214+ | ( MysqlType :: LongLong , ffi:: enum_field_types:: MYSQL_TYPE_DOUBLE )
215+ | ( MysqlType :: LongLong , ffi:: enum_field_types:: MYSQL_TYPE_INT24 )
216+ | ( MysqlType :: LongLong , ffi:: enum_field_types:: MYSQL_TYPE_NEWDECIMAL )
217+ | ( MysqlType :: LongLong , ffi:: enum_field_types:: MYSQL_TYPE_LONGLONG )
218+ | ( MysqlType :: UnsignedLongLong , ffi:: enum_field_types:: MYSQL_TYPE_DECIMAL )
219+ | ( MysqlType :: UnsignedLongLong , ffi:: enum_field_types:: MYSQL_TYPE_TINY )
220+ | ( MysqlType :: UnsignedLongLong , ffi:: enum_field_types:: MYSQL_TYPE_SHORT )
221+ | ( MysqlType :: UnsignedLongLong , ffi:: enum_field_types:: MYSQL_TYPE_LONG )
222+ | ( MysqlType :: UnsignedLongLong , ffi:: enum_field_types:: MYSQL_TYPE_FLOAT )
223+ | ( MysqlType :: UnsignedLongLong , ffi:: enum_field_types:: MYSQL_TYPE_DOUBLE )
224+ | ( MysqlType :: UnsignedLongLong , ffi:: enum_field_types:: MYSQL_TYPE_INT24 )
225+ | ( MysqlType :: UnsignedLongLong , ffi:: enum_field_types:: MYSQL_TYPE_NEWDECIMAL )
226+ | ( MysqlType :: UnsignedLongLong , ffi:: enum_field_types:: MYSQL_TYPE_LONGLONG )
227+ | ( MysqlType :: Float , ffi:: enum_field_types:: MYSQL_TYPE_DECIMAL )
228+ | ( MysqlType :: Float , ffi:: enum_field_types:: MYSQL_TYPE_TINY )
229+ | ( MysqlType :: Float , ffi:: enum_field_types:: MYSQL_TYPE_SHORT )
230+ | ( MysqlType :: Float , ffi:: enum_field_types:: MYSQL_TYPE_LONG )
231+ | ( MysqlType :: Float , ffi:: enum_field_types:: MYSQL_TYPE_FLOAT )
232+ | ( MysqlType :: Float , ffi:: enum_field_types:: MYSQL_TYPE_DOUBLE )
233+ | ( MysqlType :: Float , ffi:: enum_field_types:: MYSQL_TYPE_INT24 )
234+ | ( MysqlType :: Float , ffi:: enum_field_types:: MYSQL_TYPE_NEWDECIMAL )
235+ | ( MysqlType :: Float , ffi:: enum_field_types:: MYSQL_TYPE_LONGLONG )
236+ | ( MysqlType :: Numeric , ffi:: enum_field_types:: MYSQL_TYPE_DECIMAL )
237+ | ( MysqlType :: Numeric , ffi:: enum_field_types:: MYSQL_TYPE_TINY )
238+ | ( MysqlType :: Numeric , ffi:: enum_field_types:: MYSQL_TYPE_SHORT )
239+ | ( MysqlType :: Numeric , ffi:: enum_field_types:: MYSQL_TYPE_LONG )
240+ | ( MysqlType :: Numeric , ffi:: enum_field_types:: MYSQL_TYPE_FLOAT )
241+ | ( MysqlType :: Numeric , ffi:: enum_field_types:: MYSQL_TYPE_DOUBLE )
242+ | ( MysqlType :: Numeric , ffi:: enum_field_types:: MYSQL_TYPE_INT24 )
243+ | ( MysqlType :: Numeric , ffi:: enum_field_types:: MYSQL_TYPE_NEWDECIMAL )
244+ | ( MysqlType :: Numeric , ffi:: enum_field_types:: MYSQL_TYPE_LONGLONG )
245+ | ( MysqlType :: String , ffi:: enum_field_types:: MYSQL_TYPE_JSON )
246+ | ( MysqlType :: String , ffi:: enum_field_types:: MYSQL_TYPE_ENUM )
247+ | ( MysqlType :: String , ffi:: enum_field_types:: MYSQL_TYPE_SET )
248+ | ( MysqlType :: String , ffi:: enum_field_types:: MYSQL_TYPE_TINY_BLOB )
249+ | ( MysqlType :: String , ffi:: enum_field_types:: MYSQL_TYPE_MEDIUM_BLOB )
250+ | ( MysqlType :: String , ffi:: enum_field_types:: MYSQL_TYPE_LONG_BLOB )
251+ | ( MysqlType :: String , ffi:: enum_field_types:: MYSQL_TYPE_BLOB )
252+ | ( MysqlType :: String , ffi:: enum_field_types:: MYSQL_TYPE_VAR_STRING )
253+ | ( MysqlType :: String , ffi:: enum_field_types:: MYSQL_TYPE_STRING )
254+ | ( MysqlType :: Blob , ffi:: enum_field_types:: MYSQL_TYPE_TINY_BLOB )
255+ | ( MysqlType :: Blob , ffi:: enum_field_types:: MYSQL_TYPE_MEDIUM_BLOB )
256+ | ( MysqlType :: Blob , ffi:: enum_field_types:: MYSQL_TYPE_LONG_BLOB )
257+ | ( MysqlType :: Blob , ffi:: enum_field_types:: MYSQL_TYPE_BLOB )
258+ | ( MysqlType :: Set , ffi:: enum_field_types:: MYSQL_TYPE_ENUM )
259+ | ( MysqlType :: Set , ffi:: enum_field_types:: MYSQL_TYPE_SET )
260+ | ( MysqlType :: Set , ffi:: enum_field_types:: MYSQL_TYPE_TINY_BLOB )
261+ | ( MysqlType :: Set , ffi:: enum_field_types:: MYSQL_TYPE_MEDIUM_BLOB )
262+ | ( MysqlType :: Set , ffi:: enum_field_types:: MYSQL_TYPE_LONG_BLOB )
263+ | ( MysqlType :: Set , ffi:: enum_field_types:: MYSQL_TYPE_BLOB )
264+ | ( MysqlType :: Set , ffi:: enum_field_types:: MYSQL_TYPE_VAR_STRING )
265+ | ( MysqlType :: Set , ffi:: enum_field_types:: MYSQL_TYPE_STRING )
266+ | ( MysqlType :: Enum , ffi:: enum_field_types:: MYSQL_TYPE_ENUM )
267+ | ( MysqlType :: Enum , ffi:: enum_field_types:: MYSQL_TYPE_SET )
268+ | ( MysqlType :: Enum , ffi:: enum_field_types:: MYSQL_TYPE_TINY_BLOB )
269+ | ( MysqlType :: Enum , ffi:: enum_field_types:: MYSQL_TYPE_MEDIUM_BLOB )
270+ | ( MysqlType :: Enum , ffi:: enum_field_types:: MYSQL_TYPE_LONG_BLOB )
271+ | ( MysqlType :: Enum , ffi:: enum_field_types:: MYSQL_TYPE_BLOB )
272+ | ( MysqlType :: Enum , ffi:: enum_field_types:: MYSQL_TYPE_VAR_STRING )
273+ | ( MysqlType :: Enum , ffi:: enum_field_types:: MYSQL_TYPE_STRING ) => {
274+ ( metadata. field_type ( ) , metadata. flags ( ) )
275+ }
276+
277+ ( tpe, _) => tpe. into ( ) ,
278+ }
279+ } else {
280+ ( metadata. field_type ( ) , metadata. flags ( ) )
281+ } ;
282+
283+ let bytes = known_buffer_size_for_ffi_type ( tpe)
284+ . map ( |len| vec ! [ 0 ; len] )
285+ . unwrap_or_default ( ) ;
286+ let length = bytes. len ( ) as libc:: c_ulong ;
287+
288+ BindData {
289+ tpe,
290+ bytes,
291+ length,
292+ is_null : 0 ,
293+ is_truncated : Some ( 0 ) ,
294+ flags,
295+ }
296+ }
297+
298+ #[ cfg( test) ]
299+ fn for_test_output ( ( tpe, flags) : ( ffi:: enum_field_types , Flags ) ) -> Self {
156300 let bytes = known_buffer_size_for_ffi_type ( tpe)
157301 . map ( |len| vec ! [ 0 ; len] )
158302 . unwrap_or_default ( ) ;
@@ -937,7 +1081,7 @@ mod tests {
9371081 ) -> BindData {
9381082 let mut stmt: Statement = conn. raw_connection . prepare ( query) . unwrap ( ) ;
9391083
940- let bind = BindData :: for_output ( bind_tpe. into ( ) ) ;
1084+ let bind = BindData :: for_test_output ( bind_tpe. into ( ) ) ;
9411085
9421086 let mut binds = Binds { data : vec ! [ bind] } ;
9431087
0 commit comments