hiroysato@gmail.com
2007-Apr-09 04:06 UTC
Sybase Adaptor patch: User.find("1") will fail when numconvert set to false
Dear sybase_adaptor.rb developers. Please check this patch. Problem: User.find("1") will fail when numconvert set to false. * At least above code work find with MySQL * User is a ActiveRecord Object. "1" is primary key(id column). * It is need to use the following case class UsersController < ApplicationController .... def show @user = User.find(params[:id]) end About numconvert: http://wiki.rubyonrails.org/rails/pages/HowToSetupSybaseAdapterOnRails Patch: copy from connection_adapters/abstract/quoting.rb --- sybase_adapter.rb.org 2007-04-09 12:20:06.000000000 +0900 +++ sybase_adapter.rb 2007-04-09 12:39:29.000000000 +0900 @@ -283,6 +283,9 @@ when String if column && column.type == :binary && column.class.respond_to?(:string_to_binary) "#{quote_string(column.class.string_to_binary(value))}" + elsif column && [:integer, :float].include?(column.type) + value = column.type == :integer ? value.to_i : value.to_f + value.to_s elsif @numconvert && force_numeric?(column) && value =~ / ^[+-]?[0-9]+$/o value else Environment activerecord-1.15.3 -- Hiroyuki Sato. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To post to this group, send email to rubyonrails-core@googlegroups.com To unsubscribe from this group, send email to rubyonrails-core-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en -~----------~----~----~----~------~----~------~--~---
John Sheets
2007-Aug-03 20:01 UTC
Re: Sybase Adaptor patch: User.find("1") will fail when numconvert set to false
Hi, Sorry I''m so late getting to this. It''s a bit of a stumper! I''m trying to figure out how to entirely remove the :numconvert hack from the Sybase adapter, but I''m not sure how to do it. The "problem" is that the Sybase database does not auto-convert char SQL parameters to numeric like MySQL does. For example if you call User.exist?("1") in MySQL, it''ll pass the "1" straight out to the SQL. MySQL implicitly converts it to an INT if necessary and the query succeeds. However, with Sybase, you have to explicitly convert CHAR to INT. Passing the "1" to a numeric column results in a fatal SQL error. (Incidentally, does anyone know if SQLServer does this too?) If the quote() method has column info like it does with User.find("1"), quote() can use that to skip quoting on INT columns. So the patch below fixes find(). Unfortunately, User.exist?("1") is still broken...exist? calls #quote_bound_value (base.rb:1589) which does *not* pass along any column data. There''s no way to figure out how it should quote the value. And if it guesses wrong, Sybase throws an exception. To work around this, :numconvert used a sledgehammer regexp to convert *all* numeric-looking strings to int (thus the config option to turn it off!). That''s pretty ugly, and causes problems with actual string data that looks like a number. Does anyone have suggestions or comments on what I can do here? Is there any hope of fixing this in the Sybase adapter? Thanks, John On 4/8/07, hiroysato@gmail.com <hiroysato@gmail.com> wrote:> > > Dear sybase_adaptor.rb developers. > > Please check this patch. > > Problem: > User.find("1") will fail when numconvert set to false. > > * At least above code work find with MySQL > > * User is a ActiveRecord Object. "1" is primary key(id column). > > * It is need to use the following case > > class UsersController < ApplicationController > .... > def show > @user = User.find(params[:id]) > end > > About numconvert: > http://wiki.rubyonrails.org/rails/pages/HowToSetupSybaseAdapterOnRails > > Patch: > copy from connection_adapters/abstract/quoting.rb > > --- sybase_adapter.rb.org 2007-04-09 12:20:06.000000000 +0900 > +++ sybase_adapter.rb 2007-04-09 12:39:29.000000000 +0900 > @@ -283,6 +283,9 @@ > when String > if column && column.type == :binary && > column.class.respond_to?(:string_to_binary) > "#{quote_string(column.class.string_to_binary(value))}" > + elsif column && [:integer, :float].include?(column.type) > + value = column.type == :integer ? value.to_i : > value.to_f > + value.to_s > elsif @numconvert && force_numeric?(column) && value =~ / > ^[+-]?[0-9]+$/o > value > else >-- "The Internet is not something you just dump something on. It''s not a big truck. It''s a series of tubes." --Senator Ted Stevens, R-AK John R. Sheets http://bark.metacasa.net --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To post to this group, send email to rubyonrails-core@googlegroups.com To unsubscribe from this group, send email to rubyonrails-core-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en -~----------~----~----~----~------~----~------~--~---
jrun
2007-Aug-15 11:45 UTC
Re: Sybase Adaptor patch: User.find("1") will fail when numconvert set to false
The same issue occurs with validates_uniqueness_of: http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/234451e0339d5872/11a2cf0ffba79260 Based on the tables linked below (in the Remarks section) MS SQL Server 2000 and 2005 both implicitly convert between string and number fields. http://msdn2.microsoft.com/en-US/library/aa226054(SQL.80).aspx http://msdn2.microsoft.com/en-us/library/ms187928.aspx i am interested in helping solve this problem but i don''t have any bright ideas. - jeremy On Aug 3, 3:01 pm, "John Sheets" <metac...@gmail.com> wrote:> Hi, > > Sorry I''m so late getting to this. It''s a bit of a stumper! > > I''m trying to figure out how to entirely remove the :numconvert hack from > the Sybase adapter, but I''m not sure how to do it. The "problem" is that > the Sybase database does not auto-convert char SQL parameters to numeric > like MySQL does. For example if you call User.exist?("1") in MySQL, it''ll > pass the "1" straight out to the SQL. MySQL implicitly converts it to an > INT if necessary and the query succeeds. > > However, with Sybase, you have to explicitly convert CHAR to INT. Passing > the "1" to a numeric column results in a fatal SQL error. (Incidentally, > does anyone know if SQLServer does this too?) > > If the quote() method has column info like it does with User.find("1"), > quote() can use that to skip quoting on INT columns. So the patch below > fixes find(). Unfortunately, User.exist?("1") is still broken...exist? > calls #quote_bound_value (base.rb:1589) which does *not* pass along any > column data. There''s no way to figure out how it should quote the value. > And if it guesses wrong, Sybase throws an exception. > > To work around this, :numconvert used a sledgehammer regexp to convert *all* > numeric-looking strings to int (thus the config option to turn it off!). > That''s pretty ugly, and causes problems with actual string data that looks > like a number. > > Does anyone have suggestions or comments on what I can do here? Is there > any hope of fixing this in the Sybase adapter? > > Thanks, > John > > On 4/8/07, hiroys...@gmail.com <hiroys...@gmail.com> wrote: > > > > > > > Dear sybase_adaptor.rb developers. > > > Please check this patch. > > > Problem: > > User.find("1") will fail when numconvert set to false. > > > * At least above code work find with MySQL > > > * User is a ActiveRecord Object. "1" is primary key(id column). > > > * It is need to use the following case > > > class UsersController < ApplicationController > > .... > > def show > > @user = User.find(params[:id]) > > end > > > About numconvert: > >http://wiki.rubyonrails.org/rails/pages/HowToSetupSybaseAdapterOnRails > > > Patch: > > copy from connection_adapters/abstract/quoting.rb > > > --- sybase_adapter.rb.org 2007-04-09 12:20:06.000000000 +0900 > > +++ sybase_adapter.rb 2007-04-09 12:39:29.000000000 +0900 > > @@ -283,6 +283,9 @@ > > when String > > if column && column.type == :binary && > > column.class.respond_to?(:string_to_binary) > > "#{quote_string(column.class.string_to_binary(value))}" > > + elsif column && [:integer, :float].include?(column.type) > > + value = column.type == :integer ? value.to_i : > > value.to_f > > + value.to_s > > elsif @numconvert && force_numeric?(column) && value =~ / > > ^[+-]?[0-9]+$/o > > value > > else > > -- > "The Internet is not something you just dump something > on. It''s not a big truck. It''s a series of tubes." > --Senator Ted Stevens, R-AK > > John R. Sheetshttp://bark.metacasa.net--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To post to this group, send email to rubyonrails-core@googlegroups.com To unsubscribe from this group, send email to rubyonrails-core-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en -~----------~----~----~----~------~----~------~--~---
Anthony Kelly
2008-Jan-02 20:21 UTC
Re: Sybase Adaptor patch: User.find("1") will fail when numc
Need an active record expert to look into two tickets on the Sybase adapter (which is now a gem). Tickets are #8400 and #10629. Thanks in advance! ~ Anthony Jeremy Burks wrote:> The same issue occurs with validates_uniqueness_of: > http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/234451e0339d5872/11a2cf0ffba79260 > > Based on the tables linked below (in the Remarks section) MS SQL > Server 2000 and 2005 both implicitly convert between string and number > fields. > > http://msdn2.microsoft.com/en-US/library/aa226054(SQL.80).aspx > http://msdn2.microsoft.com/en-us/library/ms187928.aspx > > i am interested in helping solve this problem but i don''t have any > bright ideas. > > - jeremy-- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To post to this group, send email to rubyonrails-core@googlegroups.com To unsubscribe from this group, send email to rubyonrails-core-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en -~----------~----~----~----~------~----~------~--~---