@@ -11,7 +11,9 @@ impl Type<Odbc> for NaiveDate {
1111 OdbcTypeInfo :: DATE
1212 }
1313 fn compatible ( ty : & OdbcTypeInfo ) -> bool {
14- matches ! ( ty. data_type( ) , DataType :: Date ) || ty. data_type ( ) . accepts_character_data ( )
14+ matches ! ( ty. data_type( ) , DataType :: Date )
15+ || ty. data_type ( ) . accepts_character_data ( )
16+ || matches ! ( ty. data_type( ) , DataType :: Other { .. } | DataType :: Unknown )
1517 }
1618}
1719
@@ -20,7 +22,9 @@ impl Type<Odbc> for NaiveTime {
2022 OdbcTypeInfo :: TIME
2123 }
2224 fn compatible ( ty : & OdbcTypeInfo ) -> bool {
23- matches ! ( ty. data_type( ) , DataType :: Time { .. } ) || ty. data_type ( ) . accepts_character_data ( )
25+ matches ! ( ty. data_type( ) , DataType :: Time { .. } )
26+ || ty. data_type ( ) . accepts_character_data ( )
27+ || matches ! ( ty. data_type( ) , DataType :: Other { .. } | DataType :: Unknown )
2428 }
2529}
2630
@@ -31,6 +35,7 @@ impl Type<Odbc> for NaiveDateTime {
3135 fn compatible ( ty : & OdbcTypeInfo ) -> bool {
3236 matches ! ( ty. data_type( ) , DataType :: Timestamp { .. } )
3337 || ty. data_type ( ) . accepts_character_data ( )
38+ || matches ! ( ty. data_type( ) , DataType :: Other { .. } | DataType :: Unknown )
3439 }
3540}
3641
@@ -41,6 +46,7 @@ impl Type<Odbc> for DateTime<Utc> {
4146 fn compatible ( ty : & OdbcTypeInfo ) -> bool {
4247 matches ! ( ty. data_type( ) , DataType :: Timestamp { .. } )
4348 || ty. data_type ( ) . accepts_character_data ( )
49+ || matches ! ( ty. data_type( ) , DataType :: Other { .. } | DataType :: Unknown )
4450 }
4551}
4652
@@ -51,6 +57,7 @@ impl Type<Odbc> for DateTime<FixedOffset> {
5157 fn compatible ( ty : & OdbcTypeInfo ) -> bool {
5258 matches ! ( ty. data_type( ) , DataType :: Timestamp { .. } )
5359 || ty. data_type ( ) . accepts_character_data ( )
60+ || matches ! ( ty. data_type( ) , DataType :: Other { .. } | DataType :: Unknown )
5461 }
5562}
5663
@@ -61,6 +68,7 @@ impl Type<Odbc> for DateTime<Local> {
6168 fn compatible ( ty : & OdbcTypeInfo ) -> bool {
6269 matches ! ( ty. data_type( ) , DataType :: Timestamp { .. } )
6370 || ty. data_type ( ) . accepts_character_data ( )
71+ || matches ! ( ty. data_type( ) , DataType :: Other { .. } | DataType :: Unknown )
6472 }
6573}
6674
@@ -168,8 +176,18 @@ impl<'r> Decode<'r, Odbc> for NaiveTime {
168176
169177impl < ' r > Decode < ' r , Odbc > for NaiveDateTime {
170178 fn decode ( value : OdbcValueRef < ' r > ) -> Result < Self , BoxDynError > {
171- let s = <String as Decode < ' r , Odbc > >:: decode ( value) ?;
172- Ok ( s. parse ( ) ?)
179+ let mut s = <String as Decode < ' r , Odbc > >:: decode ( value) ?;
180+ // Some ODBC drivers (e.g. PostgreSQL) may include trailing spaces or NULs
181+ // in textual representations of timestamps. Trim them before parsing.
182+ if s. ends_with ( '\u{0}' ) {
183+ s = s. trim_end_matches ( '\u{0}' ) . to_string ( ) ;
184+ }
185+ let s_trimmed = s. trim ( ) ;
186+ // Try strict format first, then fall back to Chrono's FromStr
187+ if let Ok ( dt) = NaiveDateTime :: parse_from_str ( s_trimmed, "%Y-%m-%d %H:%M:%S" ) {
188+ return Ok ( dt) ;
189+ }
190+ Ok ( s_trimmed. parse ( ) ?)
173191 }
174192}
175193
0 commit comments