I was able to get sequel_pg running on my local and got the same output you 
did. Interesting that I am not able to reproduce. 

Setting ENV["NO_SEQUEL_PG"] = "true" in the testing environment I *was* 
still able to to reproduce...

Could this be at the level of the operating system?

My system uses: ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) 
[x86_64-darwin21]
But the system where I can reproduce has ruby 3.1.2p20 (2022-04-12 revision 
4491bb740a) [x86_64-linux]

On Tuesday, September 27, 2022 at 6:27:21 PM UTC-4 Charlie Pham wrote:

> To add, 
>
> I ran the following script on a test environment (non-local) and was able 
> to reproduce the issue:
>
> DB.create_table(:foo){Integer :id; Time :t}
> ds = DB[:foo]
> ds.insert(1, '2021-11-07 01:35:44.443726')
> ds.insert(2, '2022-02-21 08:22:37.146317')
> ds.insert(3, '2021-03-23 08:36:22.655691')
> p ds.where(id: 1).get(:t)
> p ds.where(id: 2).get(:t)
> p ds.where(id: 1).get(:t)
> p ds.where(id: 3).get(:t)
> p ds.where(id: 1).get(:t)
>
> *2021-11-07 01:35:44.443726 -0700*
> 2022-02-21 08:22:37.146317 -0800
> *2021-11-07 01:35:44.443726 -0800*
> 2021-03-23 08:36:22.655691 -0700
> *2021-11-07 01:35:44.443726 -0700*
>
> I will try to figure out what the difference between my test environment 
> and local environment is
> On Tuesday, September 27, 2022 at 6:03:10 PM UTC-4 Charlie Pham wrote:
>
>> Ah, shoot. 
>>
>> I'm unable to reproduce this on my local database but am able to 
>> reproduce it in another setting.
>>
>> When trying to monkey patch on my local with the following code:
>>
>> module Sequel
>> module Postgres
>> class Dataset
>>
>> def fetch_rows(sql)
>> return cursor_fetch_rows(sql){|h| yield h} if @opts[:cursor]
>> execute(sql) do |res| 
>> cols = fetch_rows_set_cols(res)
>> *puts cols*
>> yield_hash_rows(res, cols) do |h| yield h
>> end
>> end
>> end
>> end
>> end
>> end
>>
>> The bolded line correctly puts out #<Method: 
>> Sequel::Postgres::Database(Sequel::Database)#to_application_timestamp(v) 
>> /Users/charliepham/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/sequel-5.60.1/lib/sequel/database/misc.rb:311>
>>  
>>
>> Which always returns that consistent value.
>>
>> When I run it on the environment that has the issue, `cols` is actually 
>> nil! I thought that it was `pg_sequel` that was overwriting these methods 
>> (fetch_rows_set_cols, yield_hash_rows, etc.). Is that correct? Or perhaps 
>> there's another plugin I'm neglecting...
>> On Tuesday, September 27, 2022 at 5:27:34 PM UTC-4 Jeremy Evans wrote:
>>
>>> On Tue, Sep 27, 2022 at 2:08 PM 'Charlie Pham' via sequel-talk <
>>> seque...@googlegroups.com> wrote:
>>>
>>>> Hello, 
>>>>
>>>> I have a model that has a field `created_at` that is of type timestamp 
>>>> without timezone in Postgres. All of the relevant timezone settings are 
>>>> set 
>>>> to `:local`. We are in PST (-8) and PDT (-7). 
>>>>
>>>> I am running into an issue that I believe stems from `pg_sequel` that 
>>>> results in an ambiguous (during the hour where daylight savings ends) time 
>>>> value in Ruby flip-flopping between the -7 and -8 timezones. 
>>>>
>>>> Observe the behaviour here:
>>>> *Model**[132639966].changed_at => 2021-11-07 01:35:44.443726 -0700 *
>>>> Model[150890643].changed_at => 2022-02-21 08:22:37.146317 -0800
>>>> *Model**[132639966].changed_at => 2021-11-07 01:35:44.443726 -0800*
>>>> Model.first.changed_at => 2021-03-23 08:36:22.655691 -0700 
>>>> *Model**[132639966].changed_at 
>>>> => 2021-11-07 01:35:44.443726 -0700*
>>>>
>>>> It appears that whether the -7 or -8 appears depends on the last 
>>>> encountered value (see the previous lines). Repeating any of the bold 
>>>> lines 
>>>> sequentially yields the same result, but running any of the non-bolded 
>>>> lines immediately changes the bold lines' outputs to match the timezone of 
>>>> the non-bolded lines.
>>>>
>>>> I believe the source of this is pg_sequel since patching the vanilla 
>>>> `fetch_rows_set_cols` and `yield_hash_rows` results in consistent 
>>>> behaviour 
>>>> (always -8)
>>>> *Model[132639966].changed_at => 2021-11-07 01:35:44.443726 -0800*
>>>> Model[150890643].changed_at => 2022-02-21 08:22:37.146317 -0800
>>>> *Model**[132639966].changed_at => 2021-11-07 01:35:44.443726 -0800*
>>>> Model.first.changed_at => 2021-03-23 08:36:22.655691 -0700
>>>> *Model**[132639966].changed_at => 2021-11-07 01:35:44.443726 -0800*
>>>>
>>>>  I tried looking at the source code for handling timestamp columns in 
>>>> the c code but can't figure it out.
>>>>
>>>> Best,
>>>> Charlie
>>>>
>>>
>>> Charlie,
>>>
>>> Are the underlying columns timestamp or timestamptz (timestamp with 
>>> timezone)?  If they are timestamp and not timestamptz, they are stored in 
>>> local time, and local time uses daylight savings time, then the underlying 
>>> values are ambiguous.  Why exactly they flip-flop, I'm not sure, but in any 
>>> case, the result would not be considered a bug as the underlying values are 
>>> ambiguous.
>>>
>>> Is this issue specific to sequel_pg?  If you run sequel without 
>>> sequel_pg (NO_SEQUEL_PG in the environment will disable the use of 
>>> sequel_pg), do you get consistent results?  I'm not seeing anything 
>>> specific in sequel_pg that would cause this, but maybe it is using a Ruby 
>>> C-API that does this (rb_time_timespec_new maybe?).
>>>
>>> If you could submit a minimal self contained example showing this issue, 
>>> that would significantly speed up debugging.  Something like:
>>>
>>> DB.create_table(:foo){Integer :id; Time :t}
>>> ds = DB[:foo]
>>> ds.insert(1, '*2021-11-07 01:35:44.443726*')
>>> ds.insert(2, ' 2022-02-21 08:22:37.146317')
>>> p ds.where(id: 1).get(:t)
>>> p ds.where(id: 2).get(:t)
>>> p ds.where(id: 1).get(:t)
>>>
>>> That example doesn't show the issue in my environment, though:
>>>
>>> 2021-11-07 01:35:44 -0700
>>> 2022-02-21 08:22:37 -0800
>>> 2021-11-07 01:35:44 -0700
>>>
>>> Does it show the issue in your environment?  If not, hopefully you can 
>>> modify it so that it does show the issue.
>>>
>>> Thanks,
>>> Jeremy
>>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sequel-talk+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sequel-talk/97813a02-4370-4a12-b609-63ff7eb9fbf1n%40googlegroups.com.

Reply via email to