From: Michael Neumann Date: 2005-01-01T00:34:30+09:00 Subject: Re: [bug] DBD::ODBC jc wrote: > I've run into a small bug with DBD::ODBC. The following code: > > require 'dbi' > dbh = DBI.connect("DBI:ODBC:dsn", "user", "pass") > puts dbh.columns('table').collect { |c| c.name } > > produced the following error: > > /ruby/lib/ruby/site_ruby/1.8/DBD/ODBC/ODBC.rb:127 in 'columns' > undefined method '-' for nil:NilClass (NoMethodError > > This relates to the following line in ODBC.rb (line 127) > > info['precision'] = row['COLUMN_SIZE'] - (row['DECIMAL_DIGITS'] || 0) > > It appears this needs to be changed to the following: > > info['precision'] = (row['COLUMN_SIZE'] || 0) - (row['DECIMAL_DIGITS'] > || 0) > maybe it's even better to return nil, if column_size is not set. because, imagine decimal_digits is set, then a negative value is returned. The following is now commited to SVN (see patch below).u Regards, Michael Index: ODBC.rb =================================================================== --- ODBC.rb (revision 415) +++ ODBC.rb (working copy) @@ -124,7 +124,8 @@ info['type_name'] = row['TYPE_NAME'] info['sql_type'] = row['DATA_TYPE'] info['nullable'] = row['NULLABLE'] - info['precision'] = row['COLUMN_SIZE'] - (row['DECIMAL_DIGITS'] || 0) + cs = row['COLUMN_SIZE'] + info['precision'] = cs ? (cs - (row['DECIMAL_DIGITS'] || 0)) : nil info['scale'] = row['DECIMAL_DIGITS'] end