Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Saving "Infinity" in a Float column #651

Open
neongrau opened this issue Jun 11, 2018 · 5 comments
Open

Saving "Infinity" in a Float column #651

neongrau opened this issue Jun 11, 2018 · 5 comments

Comments

@neongrau
Copy link

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.

@metaskills
Copy link
Member

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
Copy link
Author

just a plain FLOAT(8) that came from a migration what was simply created by
t.float :some_float

i 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
Copy link
Author

and my adapter version is the current 5.1.6

@metaskills
Copy link
Member

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::INFINITY differently than the base model and I'd be surprised if we were not the first adapter to do so.

@thomasfedb
Copy link

Might be best for the Type::Float to error out somehow before the statement is executed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants