Skip to content
Next Next commit
fix(coderd/database): migrate workspaces.last_used_at to timestamptz
  • Loading branch information
johnstcn committed Sep 15, 2023
commit 0fedbd3bfc6fd215ece6c9e37afffb4e9838ccd9
2 changes: 1 addition & 1 deletion coderd/database/dump.sql

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
ALTER TABLE ONLY workspaces
ALTER COLUMN last_used_at
SET DATA TYPE timestamp
USING last_used_at::timestamptz,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we want to be 100% correct, this could use an AT TIME ZONE 'UTC' too because during the up migration we are changing the time (correctly) if the db time zone is non-UTC.

This demonstrates how the timestamp would be coerced into the wrong time without

woop=# create temp table testy (ts timestamp, tsz timestamptz);
CREATE TABLE
woop=# insert into testy (ts, tsz) values ('0001-01-01 00:00:00+00', '0001-01-01 00:00:00+00'); select * from testy;
INSERT 0 1
         ts          |             tsz
---------------------+------------------------------
 0001-01-01 00:00:00 | 0001-01-01 01:39:49+01:39:49
(1 row)

woop=# update testy set ts = tsz::timestamptz; select * from testy;
UPDATE 1
         ts          |             tsz
---------------------+------------------------------
 0001-01-01 01:39:49 | 0001-01-01 01:39:49+01:39:49
(1 row)

Whereas with the time zone change:

woop=# truncate table testy;
TRUNCATE TABLE
woop=# insert into testy (ts, tsz) values ('0001-01-01 00:00:00+00', '0001-01-01 00:00:00+00'); select * from testy;
INSERT 0 1
         ts          |             tsz
---------------------+------------------------------
 0001-01-01 00:00:00 | 0001-01-01 01:39:49+01:39:49
(1 row)

woop=# update testy set ts = tsz at time zone 'utc'; select * from testy;
UPDATE 1
         ts          |             tsz
---------------------+------------------------------
 0001-01-01 00:00:00 | 0001-01-01 01:39:49+01:39:49
(1 row)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated!

ALTER COLUMN last_used_at
SET DEFAULT '0001-01-01 00:00:00'::timestamp;
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
ALTER TABLE ONLY workspaces
ALTER COLUMN last_used_at
SET DATA TYPE timestamptz
USING last_used_at::timestamp AT TIME ZONE 'UTC',
ALTER COLUMN last_used_at
SET DEFAULT '0001-01-01 00:00:00+00:00'::timestamptz;