mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-16 02:23:49 +08:00
Time types, like date and timestamps, have limits that aren't the same as the underlying storage type. For instance, while a timestamp is stored as an `int64` internally, its max supported time value is not `INT64_MAX`. Instead, `INT64_MAX` represents `+Infinity` and the actual largest possible timestamp is close to `INT64_MAX` (but not `INT64_MAX-1` either). The same applies to min values. Unfortunately, time handling code does not check for these boundaries; in most cases, overflow handling when, e.g., bucketing, are checked against the max integer values instead of type-specific boundaries. In other cases, overflows simply throw errors instead of clamping to the boundary values, which makes more sense in many situations. Using integer time suffers from similar issues. To take one example, simply inserting a valid `smallint` value close to the max into a table with a `smallint` time column fails: ``` INSERT INTO smallint_table VALUES ('32765', 1, 2.0); ERROR: value "32770" is out of range for type smallint ``` This happens because the code that adds dimensional constraints always checks for overflow against `INT64_MAX` instead of the type-specific max value. Therefore, it tries to create a chunk constraint that ends at `32770`, which is outside the allowed range of `smallint`. The resolve these issues, several time-related utility functions have been implemented that, e.g., return type-specific range boundaries, and perform saturated addition and subtraction while clamping to supported boundaries. Fixes #2292
23 lines
928 B
SQL
23 lines
928 B
SQL
-- This file and its contents are licensed under the Apache License 2.0.
|
|
-- Please see the included NOTICE for copyright information and
|
|
-- LICENSE-APACHE for a copy of the license.
|
|
|
|
\c :TEST_DBNAME :ROLE_SUPERUSER
|
|
CREATE OR REPLACE FUNCTION test.time_to_internal_conversion() RETURNS VOID
|
|
AS :MODULE_PATHNAME, 'ts_test_time_to_internal_conversion' LANGUAGE C VOLATILE;
|
|
|
|
CREATE OR REPLACE FUNCTION test.interval_to_internal_conversion() RETURNS VOID
|
|
AS :MODULE_PATHNAME, 'ts_test_interval_to_internal_conversion' LANGUAGE C VOLATILE;
|
|
|
|
CREATE OR REPLACE FUNCTION test.adts() RETURNS VOID
|
|
AS :MODULE_PATHNAME, 'ts_test_adts' LANGUAGE C VOLATILE;
|
|
|
|
CREATE OR REPLACE FUNCTION test.time_utils() RETURNS VOID
|
|
AS :MODULE_PATHNAME, 'ts_test_time_utils' LANGUAGE C;
|
|
SET ROLE :ROLE_DEFAULT_PERM_USER;
|
|
|
|
SELECT test.time_to_internal_conversion();
|
|
SELECT test.interval_to_internal_conversion();
|
|
SELECT test.adts();
|
|
SELECT test.time_utils();
|