[前][次][番号順一覧][スレッド一覧]

rails:906

From: Kazuhiro Yoshida <moriq@m...>
Date: Fri, 27 Jan 2006 20:43:06 +0900
Subject: [rails:906] Re: ArgumentError: time out of range: SELECT * FROM

もりきゅうです。

Makoto Satoh wrote:
> Linux上のRails 1.0で、Ruby-ODBC/iodbc/FreeTDS経由でSQLServerへつないでい 
> ます。
> sqlserverアダプタでmode: odbcとしています。
> 
> 普通にfind(:all)したのですが、下記のようなエラーが出ました。
> 
> ArgumentError: time out of range: SELECT * FROM .......
> |/usr/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/connection_adapters/abstract_adapter.rb:88:in 
> `log' 

ここの ....... は省略されていますか。
DBI::DBD::ODBC は出ていませんか。

> abstract_adapter.rbのlogを見ましたが、このメソッドの中で例外が投げられている
> ようですが、logメソッドの中でTimeに関係しそうなのはBenchmarkモジュールく 
> らいかと
> 思うのですが、まさかBenchmarkモジュールがそんなバグを含んでいるとは思い 
> にくく。

logメソッドに渡しているブロックの中で起きていることなので、logの実装には
関係しないと思います。

connection_adapters/abstract_adapter.rb:
        def select(sql, name = nil)
          rows = []
          repair_special_columns(sql)
          log(sql, name) do
            @connection.select_all(sql) do |row|
              record = {}
              row.column_names.each do |col|
                record[col] = row[col]
                record[col] = record[col].to_time if record[col].is_a?
DBI::Timestamp
              end
              rows << record
            end
          end
          rows
        end

ここに出てくるオブジェクトを確認しておくと、
@connection は DBI.connect で返される DBI::DatabaseHandle です。
row は DBI::Row です。
row[col] は ODBC の対応する型によりますが、Time に関係しそうなのは
DBI::Date, DBI::Time, DBI::Timestamp です。

> これはやはりBenchmarkモジュールではなく、ロードしようとしているデータ 
> ベースの
> 行にEpochより前の時刻を表すTimeオブジェクトを作ろうとしたための例外と考える
> ほうが良いでしょうか?

と思います。

> これは、そういうデータを含むデータベースが悪いのか、sqlserver_adapter.rbの
> 問題か、はたまたBenchmarkモジュールに何かあるのか、どこをどういう風に見て
> 行けば良いか、アドバイスいただけましたらと思います。

例外を投げているのは、DBI か Ruby-ODBC だと思います。

--
ML: rails@r...
使い方: http://QuickML.com/

[前][次][番号順一覧][スレッド一覧]

   @   905 2006-01-26 09:55 [satoh.makoto@g...   ] ArgumentError: time out of range: SELECT * FROM
->     906 2006-01-27 12:43 ┗[moriq@m...          ]