mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-23 06:22:03 +08:00
Fix interval_from_now_to_internal timestamptz handling
fix interval_from_now_to_internal to handle timezone properly for timestamptz and simplify code
This commit is contained in:
parent
423d1c691e
commit
ed5067c356
36
src/utils.c
36
src/utils.c
@ -221,44 +221,22 @@ ts_time_value_to_internal(Datum time_val, Oid type_oid, bool failure_ok)
|
|||||||
int64
|
int64
|
||||||
ts_interval_from_now_to_internal(Datum interval, Oid type_oid)
|
ts_interval_from_now_to_internal(Datum interval, Oid type_oid)
|
||||||
{
|
{
|
||||||
TimestampTz now;
|
Datum res = TimestampTzGetDatum(GetCurrentTimestamp());
|
||||||
Datum res;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is really confusing but looks like it is how postgres works. Event
|
|
||||||
* though there is a function called Datum now() that calls
|
|
||||||
* GetCurrentTransactionStartTimestamp and returns TimestampTz, that is
|
|
||||||
* not the same as now() function in SQL and even though return type is
|
|
||||||
* Timestamp WITH TIMEZONE, GetCurrentTransactionStartTimestamp does not
|
|
||||||
* incorporate current session timezone infromation in the returned value.
|
|
||||||
* In order to take this timezone value set by the user into account, I
|
|
||||||
* convert timestamp to POSIX time structure using timestamp2tm *which has
|
|
||||||
* access to current timezone* setting through session_timezone variable
|
|
||||||
* and incorporates it in the returned structure. I then convert it back
|
|
||||||
* to TimestampTz through a similar function which takes this timezone
|
|
||||||
* information int account.
|
|
||||||
*/
|
|
||||||
int tzoff;
|
|
||||||
struct pg_tm tm;
|
|
||||||
fsec_t fsec;
|
|
||||||
const char *tzn;
|
|
||||||
|
|
||||||
timestamp2tm(GetCurrentTransactionStartTimestamp(),
|
|
||||||
&tzoff, &tm, &fsec, &tzn, NULL);
|
|
||||||
tm2timestamp(&tm, fsec, NULL, &now);
|
|
||||||
|
|
||||||
switch (type_oid)
|
switch (type_oid)
|
||||||
{
|
{
|
||||||
case TIMESTAMPOID:
|
case TIMESTAMPOID:
|
||||||
|
res = DirectFunctionCall1(timestamptz_timestamp, res);
|
||||||
|
res = DirectFunctionCall2(timestamp_mi_interval, res, interval);
|
||||||
|
|
||||||
|
return ts_time_value_to_internal(res, type_oid, false);
|
||||||
case TIMESTAMPTZOID:
|
case TIMESTAMPTZOID:
|
||||||
res = TimestampTzGetDatum(now);
|
|
||||||
res = DirectFunctionCall2(timestamptz_mi_interval, res, interval);
|
res = DirectFunctionCall2(timestamptz_mi_interval, res, interval);
|
||||||
|
|
||||||
return ts_time_value_to_internal(res, type_oid, false);
|
return ts_time_value_to_internal(res, type_oid, false);
|
||||||
case DATEOID:
|
case DATEOID:
|
||||||
res = TimestampTzGetDatum(now);
|
res = DirectFunctionCall1(timestamptz_timestamp, res);
|
||||||
|
res = DirectFunctionCall2(timestamp_mi_interval, res, interval);
|
||||||
res = DirectFunctionCall2(timestamptz_mi_interval, res, interval);
|
|
||||||
res = DirectFunctionCall1(timestamp_date, res);
|
res = DirectFunctionCall1(timestamp_date, res);
|
||||||
|
|
||||||
return ts_time_value_to_internal(res, type_oid, false);
|
return ts_time_value_to_internal(res, type_oid, false);
|
||||||
|
@ -838,25 +838,30 @@ NOTICE: adding not-null constraint to column "time"
|
|||||||
|
|
||||||
SET timezone = '+1';
|
SET timezone = '+1';
|
||||||
INSERT INTO PUBLIC.drop_chunk_test_ts VALUES(now()-INTERVAL '5 minutes', 1.0, 'dev1');
|
INSERT INTO PUBLIC.drop_chunk_test_ts VALUES(now()-INTERVAL '5 minutes', 1.0, 'dev1');
|
||||||
|
INSERT INTO PUBLIC.drop_chunk_test_ts VALUES(now()+INTERVAL '5 minutes', 1.0, 'dev1');
|
||||||
INSERT INTO PUBLIC.drop_chunk_test_tstz VALUES(now()-INTERVAL '5 minutes', 1.0, 'dev1');
|
INSERT INTO PUBLIC.drop_chunk_test_tstz VALUES(now()-INTERVAL '5 minutes', 1.0, 'dev1');
|
||||||
|
INSERT INTO PUBLIC.drop_chunk_test_tstz VALUES(now()+INTERVAL '5 minutes', 1.0, 'dev1');
|
||||||
SELECT * FROM test.show_subtables('drop_chunk_test_ts');
|
SELECT * FROM test.show_subtables('drop_chunk_test_ts');
|
||||||
Child | Tablespace
|
Child | Tablespace
|
||||||
-----------------------------------------+------------
|
-----------------------------------------+------------
|
||||||
_timescaledb_internal._hyper_4_19_chunk |
|
_timescaledb_internal._hyper_4_19_chunk |
|
||||||
(1 row)
|
_timescaledb_internal._hyper_4_20_chunk |
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
SELECT * FROM test.show_subtables('drop_chunk_test_tstz');
|
SELECT * FROM test.show_subtables('drop_chunk_test_tstz');
|
||||||
Child | Tablespace
|
Child | Tablespace
|
||||||
-----------------------------------------+------------
|
-----------------------------------------+------------
|
||||||
_timescaledb_internal._hyper_5_20_chunk |
|
_timescaledb_internal._hyper_5_21_chunk |
|
||||||
(1 row)
|
_timescaledb_internal._hyper_5_22_chunk |
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
BEGIN;
|
BEGIN;
|
||||||
SELECT show_chunks('drop_chunk_test_ts');
|
SELECT show_chunks('drop_chunk_test_ts');
|
||||||
show_chunks
|
show_chunks
|
||||||
-----------------------------------------
|
-----------------------------------------
|
||||||
_timescaledb_internal._hyper_4_19_chunk
|
_timescaledb_internal._hyper_4_19_chunk
|
||||||
(1 row)
|
_timescaledb_internal._hyper_4_20_chunk
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
SELECT show_chunks('drop_chunk_test_ts', now()::timestamp-interval '1 minute');
|
SELECT show_chunks('drop_chunk_test_ts', now()::timestamp-interval '1 minute');
|
||||||
show_chunks
|
show_chunks
|
||||||
@ -896,24 +901,26 @@ BEGIN;
|
|||||||
SELECT show_chunks('drop_chunk_test_tstz');
|
SELECT show_chunks('drop_chunk_test_tstz');
|
||||||
show_chunks
|
show_chunks
|
||||||
-----------------------------------------
|
-----------------------------------------
|
||||||
_timescaledb_internal._hyper_5_20_chunk
|
_timescaledb_internal._hyper_5_21_chunk
|
||||||
(1 row)
|
_timescaledb_internal._hyper_5_22_chunk
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
SELECT show_chunks('drop_chunk_test_tstz', now() - interval '1 minute', now() - interval '6 minute');
|
SELECT show_chunks('drop_chunk_test_tstz', now() - interval '1 minute', now() - interval '6 minute');
|
||||||
show_chunks
|
show_chunks
|
||||||
-----------------------------------------
|
-----------------------------------------
|
||||||
_timescaledb_internal._hyper_5_20_chunk
|
_timescaledb_internal._hyper_5_21_chunk
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT show_chunks('drop_chunk_test_tstz', newer_than => now() - interval '1 minute');
|
SELECT show_chunks('drop_chunk_test_tstz', newer_than => now() - interval '1 minute');
|
||||||
show_chunks
|
show_chunks
|
||||||
-------------
|
-----------------------------------------
|
||||||
(0 rows)
|
_timescaledb_internal._hyper_5_22_chunk
|
||||||
|
(1 row)
|
||||||
|
|
||||||
SELECT show_chunks('drop_chunk_test_tstz', older_than => now() - interval '1 minute');
|
SELECT show_chunks('drop_chunk_test_tstz', older_than => now() - interval '1 minute');
|
||||||
show_chunks
|
show_chunks
|
||||||
-----------------------------------------
|
-----------------------------------------
|
||||||
_timescaledb_internal._hyper_5_20_chunk
|
_timescaledb_internal._hyper_5_21_chunk
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT drop_chunks(interval '1 minute', 'drop_chunk_test_tstz');
|
SELECT drop_chunks(interval '1 minute', 'drop_chunk_test_tstz');
|
||||||
@ -923,9 +930,10 @@ BEGIN;
|
|||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT * FROM test.show_subtables('drop_chunk_test_tstz');
|
SELECT * FROM test.show_subtables('drop_chunk_test_tstz');
|
||||||
Child | Tablespace
|
Child | Tablespace
|
||||||
-------+------------
|
-----------------------------------------+------------
|
||||||
(0 rows)
|
_timescaledb_internal._hyper_5_22_chunk |
|
||||||
|
(1 row)
|
||||||
|
|
||||||
ROLLBACK;
|
ROLLBACK;
|
||||||
BEGIN;
|
BEGIN;
|
||||||
@ -949,9 +957,10 @@ BEGIN;
|
|||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT * FROM test.show_subtables('drop_chunk_test_ts');
|
SELECT * FROM test.show_subtables('drop_chunk_test_ts');
|
||||||
Child | Tablespace
|
Child | Tablespace
|
||||||
-------+------------
|
-----------------------------------------+------------
|
||||||
(0 rows)
|
_timescaledb_internal._hyper_4_20_chunk |
|
||||||
|
(1 row)
|
||||||
|
|
||||||
SELECT drop_chunks(interval '1 minute', 'drop_chunk_test_tstz');
|
SELECT drop_chunks(interval '1 minute', 'drop_chunk_test_tstz');
|
||||||
drop_chunks
|
drop_chunks
|
||||||
@ -960,9 +969,10 @@ BEGIN;
|
|||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT * FROM test.show_subtables('drop_chunk_test_tstz');
|
SELECT * FROM test.show_subtables('drop_chunk_test_tstz');
|
||||||
Child | Tablespace
|
Child | Tablespace
|
||||||
-------+------------
|
-----------------------------------------+------------
|
||||||
(0 rows)
|
_timescaledb_internal._hyper_5_22_chunk |
|
||||||
|
(1 row)
|
||||||
|
|
||||||
ROLLBACK;
|
ROLLBACK;
|
||||||
BEGIN;
|
BEGIN;
|
||||||
@ -973,9 +983,10 @@ BEGIN;
|
|||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT * FROM test.show_subtables('drop_chunk_test_ts');
|
SELECT * FROM test.show_subtables('drop_chunk_test_ts');
|
||||||
Child | Tablespace
|
Child | Tablespace
|
||||||
-------+------------
|
-----------------------------------------+------------
|
||||||
(0 rows)
|
_timescaledb_internal._hyper_4_20_chunk |
|
||||||
|
(1 row)
|
||||||
|
|
||||||
SELECT drop_chunks(now()-interval '1 minute', 'drop_chunk_test_tstz');
|
SELECT drop_chunks(now()-interval '1 minute', 'drop_chunk_test_tstz');
|
||||||
drop_chunks
|
drop_chunks
|
||||||
@ -984,9 +995,10 @@ BEGIN;
|
|||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
SELECT * FROM test.show_subtables('drop_chunk_test_tstz');
|
SELECT * FROM test.show_subtables('drop_chunk_test_tstz');
|
||||||
Child | Tablespace
|
Child | Tablespace
|
||||||
-------+------------
|
-----------------------------------------+------------
|
||||||
(0 rows)
|
_timescaledb_internal._hyper_5_22_chunk |
|
||||||
|
(1 row)
|
||||||
|
|
||||||
ROLLBACK;
|
ROLLBACK;
|
||||||
\dt "_timescaledb_internal"._hyper*
|
\dt "_timescaledb_internal"._hyper*
|
||||||
@ -998,8 +1010,10 @@ ROLLBACK;
|
|||||||
_timescaledb_internal | _hyper_2_8_chunk | table | default_perm_user
|
_timescaledb_internal | _hyper_2_8_chunk | table | default_perm_user
|
||||||
_timescaledb_internal | _hyper_2_9_chunk | table | default_perm_user
|
_timescaledb_internal | _hyper_2_9_chunk | table | default_perm_user
|
||||||
_timescaledb_internal | _hyper_4_19_chunk | table | default_perm_user
|
_timescaledb_internal | _hyper_4_19_chunk | table | default_perm_user
|
||||||
_timescaledb_internal | _hyper_5_20_chunk | table | default_perm_user
|
_timescaledb_internal | _hyper_4_20_chunk | table | default_perm_user
|
||||||
(6 rows)
|
_timescaledb_internal | _hyper_5_21_chunk | table | default_perm_user
|
||||||
|
_timescaledb_internal | _hyper_5_22_chunk | table | default_perm_user
|
||||||
|
(8 rows)
|
||||||
|
|
||||||
SELECT show_chunks();
|
SELECT show_chunks();
|
||||||
show_chunks
|
show_chunks
|
||||||
@ -1009,8 +1023,10 @@ SELECT show_chunks();
|
|||||||
_timescaledb_internal._hyper_2_11_chunk
|
_timescaledb_internal._hyper_2_11_chunk
|
||||||
_timescaledb_internal._hyper_2_12_chunk
|
_timescaledb_internal._hyper_2_12_chunk
|
||||||
_timescaledb_internal._hyper_4_19_chunk
|
_timescaledb_internal._hyper_4_19_chunk
|
||||||
_timescaledb_internal._hyper_5_20_chunk
|
_timescaledb_internal._hyper_4_20_chunk
|
||||||
(6 rows)
|
_timescaledb_internal._hyper_5_21_chunk
|
||||||
|
_timescaledb_internal._hyper_5_22_chunk
|
||||||
|
(8 rows)
|
||||||
|
|
||||||
\set ON_ERROR_STOP 0
|
\set ON_ERROR_STOP 0
|
||||||
SELECT show_chunks(older_than=>4);
|
SELECT show_chunks(older_than=>4);
|
||||||
@ -1037,8 +1053,10 @@ ERROR: time constraint arguments of "drop_chunks" should have same type as time
|
|||||||
_timescaledb_internal | _hyper_2_8_chunk | table | default_perm_user
|
_timescaledb_internal | _hyper_2_8_chunk | table | default_perm_user
|
||||||
_timescaledb_internal | _hyper_2_9_chunk | table | default_perm_user
|
_timescaledb_internal | _hyper_2_9_chunk | table | default_perm_user
|
||||||
_timescaledb_internal | _hyper_4_19_chunk | table | default_perm_user
|
_timescaledb_internal | _hyper_4_19_chunk | table | default_perm_user
|
||||||
_timescaledb_internal | _hyper_5_20_chunk | table | default_perm_user
|
_timescaledb_internal | _hyper_4_20_chunk | table | default_perm_user
|
||||||
(6 rows)
|
_timescaledb_internal | _hyper_5_21_chunk | table | default_perm_user
|
||||||
|
_timescaledb_internal | _hyper_5_22_chunk | table | default_perm_user
|
||||||
|
(8 rows)
|
||||||
|
|
||||||
CREATE TABLE PUBLIC.drop_chunk_test_date(time date, temp float8, device_id text);
|
CREATE TABLE PUBLIC.drop_chunk_test_date(time date, temp float8, device_id text);
|
||||||
SELECT create_hypertable('public.drop_chunk_test_date', 'time', chunk_time_interval => interval '1 day', create_default_indexes=>false);
|
SELECT create_hypertable('public.drop_chunk_test_date', 'time', chunk_time_interval => interval '1 day', create_default_indexes=>false);
|
||||||
|
@ -275,7 +275,9 @@ SELECT create_hypertable('public.drop_chunk_test_tstz', 'time', chunk_time_inter
|
|||||||
|
|
||||||
SET timezone = '+1';
|
SET timezone = '+1';
|
||||||
INSERT INTO PUBLIC.drop_chunk_test_ts VALUES(now()-INTERVAL '5 minutes', 1.0, 'dev1');
|
INSERT INTO PUBLIC.drop_chunk_test_ts VALUES(now()-INTERVAL '5 minutes', 1.0, 'dev1');
|
||||||
|
INSERT INTO PUBLIC.drop_chunk_test_ts VALUES(now()+INTERVAL '5 minutes', 1.0, 'dev1');
|
||||||
INSERT INTO PUBLIC.drop_chunk_test_tstz VALUES(now()-INTERVAL '5 minutes', 1.0, 'dev1');
|
INSERT INTO PUBLIC.drop_chunk_test_tstz VALUES(now()-INTERVAL '5 minutes', 1.0, 'dev1');
|
||||||
|
INSERT INTO PUBLIC.drop_chunk_test_tstz VALUES(now()+INTERVAL '5 minutes', 1.0, 'dev1');
|
||||||
|
|
||||||
SELECT * FROM test.show_subtables('drop_chunk_test_ts');
|
SELECT * FROM test.show_subtables('drop_chunk_test_ts');
|
||||||
SELECT * FROM test.show_subtables('drop_chunk_test_tstz');
|
SELECT * FROM test.show_subtables('drop_chunk_test_tstz');
|
||||||
|
Loading…
x
Reference in New Issue
Block a user