You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Noticed that when i tried to divide a string number which i converted to_f and then used as a divider, when the float is 0.0 ruby returns Infinity instead of a divison by zero erro. Which then the Adapter tries to persist like this:
e.g.
value="0"record.some_float=1000 / value.to_f
ActiveRecord::StatementInvalid: TinyTds::Error: Error converting data type nvarchar to float.
...
@0= Infinity
Is this correct/intended behavior of the adapter?
This sure was only a bug in my apps code but i wondered why this ended up in the SQL.
Activity
metaskills commentedon Jun 11, 2018
Interesting, what version of the adapter/rails? Also, can you tell me more about the schema (column type) under the hood for
some_float?neongrau commentedon Jun 11, 2018
just a plain FLOAT(8) that came from a migration what was simply created by
t.float :some_floati googled a bit and it seems that while other DBs support NaN, INF and -INF like the IEEE standard describes.
See https://www.codeproject.com/Tips/50340/MSSQL-doesn-t-completely-support-IEEE-floating
So i guess nothing reasonable could be done on the adapter part. Probably best to see the error like it now happens.
neongrau commentedon Jun 11, 2018
and my adapter version is the current 5.1.6
metaskills commentedon Jun 11, 2018
I do think this is an adapter but tho and we can improve the logic to rase an error when assigning. Here is our Float type.
https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/blob/5-1-stable/lib/active_record/connection_adapters/sqlserver/type/float.rb
And here is the one we inherit from in ActiveModel.
https://github.com/rails/rails/blob/5-1-stable/activemodel/lib/active_model/type/float.rb
I think we should handle the
Float::INFINITYdifferently than the base model and I'd be surprised if we were not the first adapter to do so.thomasfedb commentedon Dec 3, 2018
Might be best for the
Type::Floatto error out somehow before the statement is executed.