From b9b5b7a509a0c28ded9c7a1cb16378ed5f8d7c25 Mon Sep 17 00:00:00 2001 From: Alexander Korotkov Date: Mon, 25 Nov 2019 01:22:21 +0300 Subject: [PATCH 4/5] Move scalar distance operators from btree_gist to core Currently btree_gist is the only way to have knn search for scalar datatypes. This is why distance operators for those types are defined inside btree_gist as well. Upcoming knn-btree needs these distance operators to be defined in core. This commit moves them from btree_gist to core. Assuming that extension shared library should still work with non-upgraded extension catalog, we btree_gist still provides wrappers over core functions. Extension upgrade scripts switch opclasses to core operators and drops extension operators. Extension upgrade script has to refer @extschema@ to distinguish between operators with same name. Have to mark btree_gist as non-relocatable in order to do that. Catversion is bumped. btree_gist extension version is bumped. Discussion: https://postgr.es/m/ce35e97b-cf34-3f5d-6b99-2c25bae49999%40postgrespro.ru Author: Nikita Glukhov Reviewed-by: Robert Haas, Tom Lane, Anastasia Lubennikova, Alexander Korotkov --- contrib/btree_gist/Makefile | 3 +- contrib/btree_gist/btree_cash.c | 16 +- contrib/btree_gist/btree_date.c | 7 +- contrib/btree_gist/btree_float4.c | 11 +- contrib/btree_gist/btree_float8.c | 11 +- contrib/btree_gist/btree_gist--1.7--1.8.sql | 90 +++++ contrib/btree_gist/btree_gist.control | 6 +- contrib/btree_gist/btree_int2.c | 16 +- contrib/btree_gist/btree_int4.c | 16 +- contrib/btree_gist/btree_int8.c | 16 +- contrib/btree_gist/btree_interval.c | 6 +- contrib/btree_gist/btree_oid.c | 11 +- contrib/btree_gist/btree_time.c | 6 +- contrib/btree_gist/btree_ts.c | 38 +- doc/src/sgml/btree-gist.sgml | 13 + src/backend/utils/adt/cash.c | 20 + src/backend/utils/adt/date.c | 112 ++++++ src/backend/utils/adt/float.c | 49 +++ src/backend/utils/adt/int.c | 51 +++ src/backend/utils/adt/int8.c | 44 ++ src/backend/utils/adt/oid.c | 22 + src/backend/utils/adt/timestamp.c | 103 +++++ src/include/catalog/pg_operator.dat | 108 +++++ src/include/catalog/pg_proc.dat | 86 ++++ src/include/utils/datetime.h | 2 + src/include/utils/timestamp.h | 4 +- src/test/regress/expected/date.out | 64 +++ src/test/regress/expected/float4.out | 20 + src/test/regress/expected/float8.out | 21 + src/test/regress/expected/int2.out | 33 ++ src/test/regress/expected/int4.out | 32 ++ src/test/regress/expected/int8.out | 31 ++ src/test/regress/expected/interval.out | 17 + src/test/regress/expected/money.out | 6 + src/test/regress/expected/oid.out | 13 + src/test/regress/expected/time.out | 16 + src/test/regress/expected/timestamp.out | 421 ++++++++++++++++++++ src/test/regress/expected/timestamptz.out | 421 ++++++++++++++++++++ src/test/regress/sql/date.sql | 5 + src/test/regress/sql/float4.sql | 3 + src/test/regress/sql/float8.sql | 3 + src/test/regress/sql/int2.sql | 10 + src/test/regress/sql/int4.sql | 10 + src/test/regress/sql/int8.sql | 5 + src/test/regress/sql/interval.sql | 2 + src/test/regress/sql/money.sql | 1 + src/test/regress/sql/oid.sql | 2 + src/test/regress/sql/time.sql | 3 + src/test/regress/sql/timestamp.sql | 9 + src/test/regress/sql/timestamptz.sql | 8 + 50 files changed, 1883 insertions(+), 140 deletions(-) create mode 100644 contrib/btree_gist/btree_gist--1.7--1.8.sql diff --git a/contrib/btree_gist/Makefile b/contrib/btree_gist/Makefile index 073dcc745c..d54c615e96 100644 --- a/contrib/btree_gist/Makefile +++ b/contrib/btree_gist/Makefile @@ -33,7 +33,8 @@ EXTENSION = btree_gist DATA = btree_gist--1.0--1.1.sql \ btree_gist--1.1--1.2.sql btree_gist--1.2.sql btree_gist--1.2--1.3.sql \ btree_gist--1.3--1.4.sql btree_gist--1.4--1.5.sql \ - btree_gist--1.5--1.6.sql btree_gist--1.6--1.7.sql + btree_gist--1.5--1.6.sql btree_gist--1.6--1.7.sql \ + btree_gist--1.7--1.8.sql PGFILEDESC = "btree_gist - B-tree equivalent GiST operator classes" REGRESS = init int2 int4 int8 float4 float8 cash oid timestamp timestamptz \ diff --git a/contrib/btree_gist/btree_cash.c b/contrib/btree_gist/btree_cash.c index 546b948ea4..398282732b 100644 --- a/contrib/btree_gist/btree_cash.c +++ b/contrib/btree_gist/btree_cash.c @@ -6,6 +6,7 @@ #include "btree_gist.h" #include "btree_utils_num.h" #include "common/int.h" +#include "utils/builtins.h" #include "utils/cash.h" typedef struct @@ -95,20 +96,7 @@ PG_FUNCTION_INFO_V1(cash_dist); Datum cash_dist(PG_FUNCTION_ARGS) { - Cash a = PG_GETARG_CASH(0); - Cash b = PG_GETARG_CASH(1); - Cash r; - Cash ra; - - if (pg_sub_s64_overflow(a, b, &r) || - r == PG_INT64_MIN) - ereport(ERROR, - (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), - errmsg("money out of range"))); - - ra = i64abs(r); - - PG_RETURN_CASH(ra); + return cash_distance(fcinfo); } /************************************************** diff --git a/contrib/btree_gist/btree_date.c b/contrib/btree_gist/btree_date.c index 68a4107dbf..0262478265 100644 --- a/contrib/btree_gist/btree_date.c +++ b/contrib/btree_gist/btree_date.c @@ -118,12 +118,7 @@ PG_FUNCTION_INFO_V1(date_dist); Datum date_dist(PG_FUNCTION_ARGS) { - /* we assume the difference can't overflow */ - Datum diff = DirectFunctionCall2(date_mi, - PG_GETARG_DATUM(0), - PG_GETARG_DATUM(1)); - - PG_RETURN_INT32(abs(DatumGetInt32(diff))); + return date_distance(fcinfo); } diff --git a/contrib/btree_gist/btree_float4.c b/contrib/btree_gist/btree_float4.c index 84ca5eee50..7c9934feb8 100644 --- a/contrib/btree_gist/btree_float4.c +++ b/contrib/btree_gist/btree_float4.c @@ -6,6 +6,7 @@ #include "btree_gist.h" #include "btree_utils_num.h" #include "utils/float.h" +#include "utils/builtins.h" typedef struct float4key { @@ -94,15 +95,7 @@ PG_FUNCTION_INFO_V1(float4_dist); Datum float4_dist(PG_FUNCTION_ARGS) { - float4 a = PG_GETARG_FLOAT4(0); - float4 b = PG_GETARG_FLOAT4(1); - float4 r; - - r = a - b; - if (unlikely(isinf(r)) && !isinf(a) && !isinf(b)) - float_overflow_error(); - - PG_RETURN_FLOAT4(fabsf(r)); + return float4dist(fcinfo); } diff --git a/contrib/btree_gist/btree_float8.c b/contrib/btree_gist/btree_float8.c index 081a719b00..612f300059 100644 --- a/contrib/btree_gist/btree_float8.c +++ b/contrib/btree_gist/btree_float8.c @@ -6,6 +6,7 @@ #include "btree_gist.h" #include "btree_utils_num.h" #include "utils/float.h" +#include "utils/builtins.h" typedef struct float8key { @@ -102,15 +103,7 @@ PG_FUNCTION_INFO_V1(float8_dist); Datum float8_dist(PG_FUNCTION_ARGS) { - float8 a = PG_GETARG_FLOAT8(0); - float8 b = PG_GETARG_FLOAT8(1); - float8 r; - - r = a - b; - if (unlikely(isinf(r)) && !isinf(a) && !isinf(b)) - float_overflow_error(); - - PG_RETURN_FLOAT8(fabs(r)); + return float8dist(fcinfo); } /************************************************** diff --git a/contrib/btree_gist/btree_gist--1.7--1.8.sql b/contrib/btree_gist/btree_gist--1.7--1.8.sql new file mode 100644 index 0000000000..4dbdd13f4b --- /dev/null +++ b/contrib/btree_gist/btree_gist--1.7--1.8.sql @@ -0,0 +1,90 @@ +/* contrib/btree_gist/btree_gist--1.7--1.8.sql */ + +-- complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "ALTER EXTENSION btree_gist UPDATE TO '1.8'" to load this file. \quit + +-- drop btree_gist distance operators from opfamilies + +ALTER OPERATOR FAMILY gist_int2_ops USING gist DROP OPERATOR 15 (int2, int2); +ALTER OPERATOR FAMILY gist_int4_ops USING gist DROP OPERATOR 15 (int4, int4); +ALTER OPERATOR FAMILY gist_int8_ops USING gist DROP OPERATOR 15 (int8, int8); +ALTER OPERATOR FAMILY gist_float4_ops USING gist DROP OPERATOR 15 (float4, float4); +ALTER OPERATOR FAMILY gist_float8_ops USING gist DROP OPERATOR 15 (float8, float8); +ALTER OPERATOR FAMILY gist_oid_ops USING gist DROP OPERATOR 15 (oid, oid); +ALTER OPERATOR FAMILY gist_cash_ops USING gist DROP OPERATOR 15 (money, money); +ALTER OPERATOR FAMILY gist_date_ops USING gist DROP OPERATOR 15 (date, date); +ALTER OPERATOR FAMILY gist_time_ops USING gist DROP OPERATOR 15 (time, time); +ALTER OPERATOR FAMILY gist_timestamp_ops USING gist DROP OPERATOR 15 (timestamp, timestamp); +ALTER OPERATOR FAMILY gist_timestamptz_ops USING gist DROP OPERATOR 15 (timestamptz, timestamptz); +ALTER OPERATOR FAMILY gist_interval_ops USING gist DROP OPERATOR 15 (interval, interval); + +-- add pg_catalog distance operators to opfamilies + +ALTER OPERATOR FAMILY gist_int2_ops USING gist ADD OPERATOR 15 pg_catalog.<-> (int2, int2) FOR ORDER BY pg_catalog.integer_ops; +ALTER OPERATOR FAMILY gist_int4_ops USING gist ADD OPERATOR 15 pg_catalog.<-> (int4, int4) FOR ORDER BY pg_catalog.integer_ops; +ALTER OPERATOR FAMILY gist_int8_ops USING gist ADD OPERATOR 15 pg_catalog.<-> (int8, int8) FOR ORDER BY pg_catalog.integer_ops; +ALTER OPERATOR FAMILY gist_float4_ops USING gist ADD OPERATOR 15 pg_catalog.<-> (float4, float4) FOR ORDER BY pg_catalog.float_ops; +ALTER OPERATOR FAMILY gist_float8_ops USING gist ADD OPERATOR 15 pg_catalog.<-> (float8, float8) FOR ORDER BY pg_catalog.float_ops; +ALTER OPERATOR FAMILY gist_oid_ops USING gist ADD OPERATOR 15 pg_catalog.<-> (oid, oid) FOR ORDER BY pg_catalog.oid_ops; +ALTER OPERATOR FAMILY gist_cash_ops USING gist ADD OPERATOR 15 pg_catalog.<-> (money, money) FOR ORDER BY pg_catalog.money_ops; +ALTER OPERATOR FAMILY gist_date_ops USING gist ADD OPERATOR 15 pg_catalog.<-> (date, date) FOR ORDER BY pg_catalog.integer_ops; +ALTER OPERATOR FAMILY gist_time_ops USING gist ADD OPERATOR 15 pg_catalog.<-> (time, time) FOR ORDER BY pg_catalog.interval_ops; +ALTER OPERATOR FAMILY gist_timestamp_ops USING gist ADD OPERATOR 15 pg_catalog.<-> (timestamp, timestamp) FOR ORDER BY pg_catalog.interval_ops; +ALTER OPERATOR FAMILY gist_timestamptz_ops USING gist ADD OPERATOR 15 pg_catalog.<-> (timestamptz, timestamptz) FOR ORDER BY pg_catalog.interval_ops; +ALTER OPERATOR FAMILY gist_interval_ops USING gist ADD OPERATOR 15 pg_catalog.<-> (interval, interval) FOR ORDER BY pg_catalog.interval_ops; + +-- drop distance operators + +ALTER EXTENSION btree_gist DROP OPERATOR @extschema@.<-> (int2, int2); +ALTER EXTENSION btree_gist DROP OPERATOR @extschema@.<-> (int4, int4); +ALTER EXTENSION btree_gist DROP OPERATOR @extschema@.<-> (int8, int8); +ALTER EXTENSION btree_gist DROP OPERATOR @extschema@.<-> (float4, float4); +ALTER EXTENSION btree_gist DROP OPERATOR @extschema@.<-> (float8, float8); +ALTER EXTENSION btree_gist DROP OPERATOR @extschema@.<-> (oid, oid); +ALTER EXTENSION btree_gist DROP OPERATOR @extschema@.<-> (money, money); +ALTER EXTENSION btree_gist DROP OPERATOR @extschema@.<-> (date, date); +ALTER EXTENSION btree_gist DROP OPERATOR @extschema@.<-> (time, time); +ALTER EXTENSION btree_gist DROP OPERATOR @extschema@.<-> (timestamp, timestamp); +ALTER EXTENSION btree_gist DROP OPERATOR @extschema@.<-> (timestamptz, timestamptz); +ALTER EXTENSION btree_gist DROP OPERATOR @extschema@.<-> (interval, interval); + +DROP OPERATOR @extschema@.<-> (int2, int2); +DROP OPERATOR @extschema@.<-> (int4, int4); +DROP OPERATOR @extschema@.<-> (int8, int8); +DROP OPERATOR @extschema@.<-> (float4, float4); +DROP OPERATOR @extschema@.<-> (float8, float8); +DROP OPERATOR @extschema@.<-> (oid, oid); +DROP OPERATOR @extschema@.<-> (money, money); +DROP OPERATOR @extschema@.<-> (date, date); +DROP OPERATOR @extschema@.<-> (time, time); +DROP OPERATOR @extschema@.<-> (timestamp, timestamp); +DROP OPERATOR @extschema@.<-> (timestamptz, timestamptz); +DROP OPERATOR @extschema@.<-> (interval, interval); + +-- drop distance functions + +ALTER EXTENSION btree_gist DROP FUNCTION @extschema@.int2_dist(int2, int2); +ALTER EXTENSION btree_gist DROP FUNCTION @extschema@.int4_dist(int4, int4); +ALTER EXTENSION btree_gist DROP FUNCTION @extschema@.int8_dist(int8, int8); +ALTER EXTENSION btree_gist DROP FUNCTION @extschema@.float4_dist(float4, float4); +ALTER EXTENSION btree_gist DROP FUNCTION @extschema@.float8_dist(float8, float8); +ALTER EXTENSION btree_gist DROP FUNCTION @extschema@.oid_dist(oid, oid); +ALTER EXTENSION btree_gist DROP FUNCTION @extschema@.cash_dist(money, money); +ALTER EXTENSION btree_gist DROP FUNCTION @extschema@.date_dist(date, date); +ALTER EXTENSION btree_gist DROP FUNCTION @extschema@.time_dist(time, time); +ALTER EXTENSION btree_gist DROP FUNCTION @extschema@.ts_dist(timestamp, timestamp); +ALTER EXTENSION btree_gist DROP FUNCTION @extschema@.tstz_dist(timestamptz, timestamptz); +ALTER EXTENSION btree_gist DROP FUNCTION @extschema@.interval_dist(interval, interval); + +DROP FUNCTION @extschema@.int2_dist(int2, int2); +DROP FUNCTION @extschema@.int4_dist(int4, int4); +DROP FUNCTION @extschema@.int8_dist(int8, int8); +DROP FUNCTION @extschema@.float4_dist(float4, float4); +DROP FUNCTION @extschema@.float8_dist(float8, float8); +DROP FUNCTION @extschema@.oid_dist(oid, oid); +DROP FUNCTION @extschema@.cash_dist(money, money); +DROP FUNCTION @extschema@.date_dist(date, date); +DROP FUNCTION @extschema@.time_dist(time, time); +DROP FUNCTION @extschema@.ts_dist(timestamp, timestamp); +DROP FUNCTION @extschema@.tstz_dist(timestamptz, timestamptz); +DROP FUNCTION @extschema@.interval_dist(interval, interval); diff --git a/contrib/btree_gist/btree_gist.control b/contrib/btree_gist/btree_gist.control index fa9171a80a..4c93737560 100644 --- a/contrib/btree_gist/btree_gist.control +++ b/contrib/btree_gist/btree_gist.control @@ -1,6 +1,6 @@ # btree_gist extension comment = 'support for indexing common datatypes in GiST' -default_version = '1.7' +default_version = '1.8' module_pathname = '$libdir/btree_gist' -relocatable = true -trusted = true +relocatable = false +trusted = true \ No newline at end of file diff --git a/contrib/btree_gist/btree_int2.c b/contrib/btree_gist/btree_int2.c index fdbf156586..88214454b5 100644 --- a/contrib/btree_gist/btree_int2.c +++ b/contrib/btree_gist/btree_int2.c @@ -6,6 +6,7 @@ #include "btree_gist.h" #include "btree_utils_num.h" #include "common/int.h" +#include "utils/builtins.h" typedef struct int16key { @@ -94,20 +95,7 @@ PG_FUNCTION_INFO_V1(int2_dist); Datum int2_dist(PG_FUNCTION_ARGS) { - int16 a = PG_GETARG_INT16(0); - int16 b = PG_GETARG_INT16(1); - int16 r; - int16 ra; - - if (pg_sub_s16_overflow(a, b, &r) || - r == PG_INT16_MIN) - ereport(ERROR, - (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), - errmsg("smallint out of range"))); - - ra = abs(r); - - PG_RETURN_INT16(ra); + return int2dist(fcinfo); } diff --git a/contrib/btree_gist/btree_int4.c b/contrib/btree_gist/btree_int4.c index 8915fb5d08..2a4e2165f5 100644 --- a/contrib/btree_gist/btree_int4.c +++ b/contrib/btree_gist/btree_int4.c @@ -6,6 +6,7 @@ #include "btree_gist.h" #include "btree_utils_num.h" #include "common/int.h" +#include "utils/builtins.h" typedef struct int32key { @@ -95,20 +96,7 @@ PG_FUNCTION_INFO_V1(int4_dist); Datum int4_dist(PG_FUNCTION_ARGS) { - int32 a = PG_GETARG_INT32(0); - int32 b = PG_GETARG_INT32(1); - int32 r; - int32 ra; - - if (pg_sub_s32_overflow(a, b, &r) || - r == PG_INT32_MIN) - ereport(ERROR, - (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), - errmsg("integer out of range"))); - - ra = abs(r); - - PG_RETURN_INT32(ra); + return int4dist(fcinfo); } diff --git a/contrib/btree_gist/btree_int8.c b/contrib/btree_gist/btree_int8.c index 7c63a5b6dc..11f34d6506 100644 --- a/contrib/btree_gist/btree_int8.c +++ b/contrib/btree_gist/btree_int8.c @@ -6,6 +6,7 @@ #include "btree_gist.h" #include "btree_utils_num.h" #include "common/int.h" +#include "utils/builtins.h" typedef struct int64key { @@ -95,20 +96,7 @@ PG_FUNCTION_INFO_V1(int8_dist); Datum int8_dist(PG_FUNCTION_ARGS) { - int64 a = PG_GETARG_INT64(0); - int64 b = PG_GETARG_INT64(1); - int64 r; - int64 ra; - - if (pg_sub_s64_overflow(a, b, &r) || - r == PG_INT64_MIN) - ereport(ERROR, - (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), - errmsg("bigint out of range"))); - - ra = i64abs(r); - - PG_RETURN_INT64(ra); + return int8dist(fcinfo); } diff --git a/contrib/btree_gist/btree_interval.c b/contrib/btree_gist/btree_interval.c index b0afdf02bb..bd9bdf960b 100644 --- a/contrib/btree_gist/btree_interval.c +++ b/contrib/btree_gist/btree_interval.c @@ -128,11 +128,7 @@ PG_FUNCTION_INFO_V1(interval_dist); Datum interval_dist(PG_FUNCTION_ARGS) { - Datum diff = DirectFunctionCall2(interval_mi, - PG_GETARG_DATUM(0), - PG_GETARG_DATUM(1)); - - PG_RETURN_INTERVAL_P(abs_interval(DatumGetIntervalP(diff))); + return interval_distance(fcinfo); } diff --git a/contrib/btree_gist/btree_oid.c b/contrib/btree_gist/btree_oid.c index 3cc7d4245d..0561d86c69 100644 --- a/contrib/btree_gist/btree_oid.c +++ b/contrib/btree_gist/btree_oid.c @@ -5,6 +5,7 @@ #include "btree_gist.h" #include "btree_utils_num.h" +#include "utils/builtins.h" typedef struct { @@ -100,15 +101,7 @@ PG_FUNCTION_INFO_V1(oid_dist); Datum oid_dist(PG_FUNCTION_ARGS) { - Oid a = PG_GETARG_OID(0); - Oid b = PG_GETARG_OID(1); - Oid res; - - if (a < b) - res = b - a; - else - res = a - b; - PG_RETURN_OID(res); + return oiddist(fcinfo); } diff --git a/contrib/btree_gist/btree_time.c b/contrib/btree_gist/btree_time.c index d89401c0f5..777082792f 100644 --- a/contrib/btree_gist/btree_time.c +++ b/contrib/btree_gist/btree_time.c @@ -141,11 +141,7 @@ PG_FUNCTION_INFO_V1(time_dist); Datum time_dist(PG_FUNCTION_ARGS) { - Datum diff = DirectFunctionCall2(time_mi_time, - PG_GETARG_DATUM(0), - PG_GETARG_DATUM(1)); - - PG_RETURN_INTERVAL_P(abs_interval(DatumGetIntervalP(diff))); + return time_distance(fcinfo); } diff --git a/contrib/btree_gist/btree_ts.c b/contrib/btree_gist/btree_ts.c index 3f5ba91891..db0e5304fb 100644 --- a/contrib/btree_gist/btree_ts.c +++ b/contrib/btree_gist/btree_ts.c @@ -146,48 +146,14 @@ PG_FUNCTION_INFO_V1(ts_dist); Datum ts_dist(PG_FUNCTION_ARGS) { - Timestamp a = PG_GETARG_TIMESTAMP(0); - Timestamp b = PG_GETARG_TIMESTAMP(1); - Interval *r; - - if (TIMESTAMP_NOT_FINITE(a) || TIMESTAMP_NOT_FINITE(b)) - { - Interval *p = palloc(sizeof(Interval)); - - p->day = INT_MAX; - p->month = INT_MAX; - p->time = PG_INT64_MAX; - PG_RETURN_INTERVAL_P(p); - } - else - r = DatumGetIntervalP(DirectFunctionCall2(timestamp_mi, - PG_GETARG_DATUM(0), - PG_GETARG_DATUM(1))); - PG_RETURN_INTERVAL_P(abs_interval(r)); + return timestamp_distance(fcinfo); } PG_FUNCTION_INFO_V1(tstz_dist); Datum tstz_dist(PG_FUNCTION_ARGS) { - TimestampTz a = PG_GETARG_TIMESTAMPTZ(0); - TimestampTz b = PG_GETARG_TIMESTAMPTZ(1); - Interval *r; - - if (TIMESTAMP_NOT_FINITE(a) || TIMESTAMP_NOT_FINITE(b)) - { - Interval *p = palloc(sizeof(Interval)); - - p->day = INT_MAX; - p->month = INT_MAX; - p->time = PG_INT64_MAX; - PG_RETURN_INTERVAL_P(p); - } - - r = DatumGetIntervalP(DirectFunctionCall2(timestamp_mi, - PG_GETARG_DATUM(0), - PG_GETARG_DATUM(1))); - PG_RETURN_INTERVAL_P(abs_interval(r)); + return timestamptz_distance(fcinfo); } diff --git a/doc/src/sgml/btree-gist.sgml b/doc/src/sgml/btree-gist.sgml index 31e7c78aae..9d5c57c3e7 100644 --- a/doc/src/sgml/btree-gist.sgml +++ b/doc/src/sgml/btree-gist.sgml @@ -102,6 +102,19 @@ INSERT 0 1 + Upgrade notes for version 1.6 + + + In version 1.6 btree_gist switched to using in-core + distance operators, and its own implementations were removed. References to + these operators in btree_gist opclasses will be updated + automatically during the extension upgrade, but if the user has created + objects referencing these operators or functions, then these objects must be + dropped manually before updating the extension. + + + + Authors diff --git a/src/backend/utils/adt/cash.c b/src/backend/utils/adt/cash.c index 32fbad2f57..4543cddac9 100644 --- a/src/backend/utils/adt/cash.c +++ b/src/backend/utils/adt/cash.c @@ -29,6 +29,7 @@ #include "utils/numeric.h" #include "utils/pg_locale.h" +#define SAMESIGN(a,b) (((a) < 0) == ((b) < 0)) /************************************************************************* * Private routines @@ -1174,3 +1175,22 @@ int8_cash(PG_FUNCTION_ARGS) PG_RETURN_CASH(result); } + +Datum +cash_distance(PG_FUNCTION_ARGS) +{ + Cash a = PG_GETARG_CASH(0); + Cash b = PG_GETARG_CASH(1); + Cash r; + Cash ra; + + if (pg_sub_s64_overflow(a, b, &r) || + r == PG_INT64_MIN) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("money out of range"))); + + ra = i64abs(r); + + PG_RETURN_CASH(ra); +} diff --git a/src/backend/utils/adt/date.c b/src/backend/utils/adt/date.c index 9c854e0e5c..73e1a4f5b6 100644 --- a/src/backend/utils/adt/date.c +++ b/src/backend/utils/adt/date.c @@ -546,6 +546,16 @@ date_mii(PG_FUNCTION_ARGS) PG_RETURN_DATEADT(result); } +Datum +date_distance(PG_FUNCTION_ARGS) +{ + /* we assume the difference can't overflow */ + Datum diff = DirectFunctionCall2(date_mi, + PG_GETARG_DATUM(0), + PG_GETARG_DATUM(1)); + + PG_RETURN_INT32(abs(DatumGetInt32(diff))); +} /* * Promote date to timestamp. @@ -840,6 +850,29 @@ date_cmp_timestamptz_internal(DateADT dateVal, TimestampTz dt2) return timestamptz_cmp_internal(dt1, dt2); } +Datum +date_dist_timestamp(PG_FUNCTION_ARGS) +{ + DateADT dateVal = PG_GETARG_DATEADT(0); + Timestamp dt2 = PG_GETARG_TIMESTAMP(1); + Timestamp dt1; + + if (DATE_NOT_FINITE(dateVal) || TIMESTAMP_NOT_FINITE(dt2)) + { + Interval *r = palloc(sizeof(Interval)); + + r->day = INT_MAX; + r->month = INT_MAX; + r->time = PG_INT64_MAX; + + PG_RETURN_INTERVAL_P(r); + } + + dt1 = date2timestamp(dateVal); + + PG_RETURN_INTERVAL_P(timestamp_dist_internal(dt1, dt2)); +} + Datum date_eq_timestamptz(PG_FUNCTION_ARGS) { @@ -903,6 +936,30 @@ date_cmp_timestamptz(PG_FUNCTION_ARGS) PG_RETURN_INT32(date_cmp_timestamptz_internal(dateVal, dt2)); } +Datum +date_dist_timestamptz(PG_FUNCTION_ARGS) +{ + DateADT dateVal = PG_GETARG_DATEADT(0); + TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1); + TimestampTz dt1; + + if (DATE_NOT_FINITE(dateVal) || TIMESTAMP_NOT_FINITE(dt2)) + { + Interval *r = palloc(sizeof(Interval)); + + r->day = INT_MAX; + r->month = INT_MAX; + r->time = PG_INT64_MAX; + + PG_RETURN_INTERVAL_P(r); + } + + dt1 = date2timestamptz(dateVal); + + PG_RETURN_INTERVAL_P(timestamptz_dist_internal(dt1, dt2)); +} + + Datum timestamp_eq_date(PG_FUNCTION_ARGS) { @@ -966,6 +1023,29 @@ timestamp_cmp_date(PG_FUNCTION_ARGS) PG_RETURN_INT32(-date_cmp_timestamp_internal(dateVal, dt1)); } +Datum +timestamp_dist_date(PG_FUNCTION_ARGS) +{ + Timestamp dt1 = PG_GETARG_TIMESTAMP(0); + DateADT dateVal = PG_GETARG_DATEADT(1); + Timestamp dt2; + + if (DATE_NOT_FINITE(dateVal) || TIMESTAMP_NOT_FINITE(dt1)) + { + Interval *r = palloc(sizeof(Interval)); + + r->day = INT_MAX; + r->month = INT_MAX; + r->time = PG_INT64_MAX; + + PG_RETURN_INTERVAL_P(r); + } + + dt2 = date2timestamp(dateVal); + + PG_RETURN_INTERVAL_P(timestamp_dist_internal(dt1, dt2)); +} + Datum timestamptz_eq_date(PG_FUNCTION_ARGS) { @@ -1058,6 +1138,28 @@ in_range_date_interval(PG_FUNCTION_ARGS) BoolGetDatum(less)); } +Datum +timestamptz_dist_date(PG_FUNCTION_ARGS) +{ + TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0); + DateADT dateVal = PG_GETARG_DATEADT(1); + TimestampTz dt2; + + if (DATE_NOT_FINITE(dateVal) || TIMESTAMP_NOT_FINITE(dt1)) + { + Interval *r = palloc(sizeof(Interval)); + + r->day = INT_MAX; + r->month = INT_MAX; + r->time = PG_INT64_MAX; + + PG_RETURN_INTERVAL_P(r); + } + + dt2 = date2timestamptz(dateVal); + + PG_RETURN_INTERVAL_P(timestamptz_dist_internal(dt1, dt2)); +} /* extract_date() * Extract specified field from date type. @@ -2251,6 +2353,16 @@ extract_time(PG_FUNCTION_ARGS) return time_part_common(fcinfo, true); } +Datum +time_distance(PG_FUNCTION_ARGS) +{ + Datum diff = DirectFunctionCall2(time_mi_time, + PG_GETARG_DATUM(0), + PG_GETARG_DATUM(1)); + + PG_RETURN_INTERVAL_P(abs_interval(DatumGetIntervalP(diff))); +} + /***************************************************************************** * Time With Time Zone ADT diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c index 901edcc896..08694b25d2 100644 --- a/src/backend/utils/adt/float.c +++ b/src/backend/utils/adt/float.c @@ -4175,3 +4175,52 @@ width_bucket_float8(PG_FUNCTION_ARGS) PG_RETURN_INT32(result); } + +Datum +float4dist(PG_FUNCTION_ARGS) +{ + float4 a = PG_GETARG_FLOAT4(0); + float4 b = PG_GETARG_FLOAT4(1); + float4 r; + + r = a - b; + if (unlikely(isinf(r)) && !isinf(a) && !isinf(b)) + float_overflow_error(); + + PG_RETURN_FLOAT4(fabsf(r)); +} + +Datum +float8dist(PG_FUNCTION_ARGS) +{ + float8 a = PG_GETARG_FLOAT8(0); + float8 b = PG_GETARG_FLOAT8(1); + float8 r; + + r = a - b; + if (unlikely(isinf(r)) && !isinf(a) && !isinf(b)) + float_overflow_error(); + + PG_RETURN_FLOAT8(fabs(r)); +} + + +Datum +float48dist(PG_FUNCTION_ARGS) +{ + float4 a = PG_GETARG_FLOAT4(0); + float8 b = PG_GETARG_FLOAT8(1); + float8 r = float8_mi(a, b); + + PG_RETURN_FLOAT8(fabs(r)); +} + +Datum +float84dist(PG_FUNCTION_ARGS) +{ + float8 a = PG_GETARG_FLOAT8(0); + float4 b = PG_GETARG_FLOAT4(1); + float8 r = float8_mi(a, b); + + PG_RETURN_FLOAT8(fabs(r)); +} \ No newline at end of file diff --git a/src/backend/utils/adt/int.c b/src/backend/utils/adt/int.c index 234f20796b..87664cf2e6 100644 --- a/src/backend/utils/adt/int.c +++ b/src/backend/utils/adt/int.c @@ -1647,3 +1647,54 @@ generate_series_int4_support(PG_FUNCTION_ARGS) PG_RETURN_POINTER(ret); } + +Datum +int2dist(PG_FUNCTION_ARGS) +{ + int16 a = PG_GETARG_INT16(0); + int16 b = PG_GETARG_INT16(1); + int16 r; + int16 ra; + + if (pg_sub_s16_overflow(a, b, &r) || + r == PG_INT16_MIN) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("smallint out of range"))); + + ra = abs(r); + + PG_RETURN_INT16(ra); +} + +static int32 +int44_dist(int32 a, int32 b) +{ + int32 r; + + if (pg_sub_s32_overflow(a, b, &r) || + r == PG_INT32_MIN) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("integer out of range"))); + + return abs(r); +} + +Datum +int4dist(PG_FUNCTION_ARGS) +{ + PG_RETURN_INT32(int44_dist(PG_GETARG_INT32(0), PG_GETARG_INT32(1))); +} + +Datum +int24dist(PG_FUNCTION_ARGS) +{ + PG_RETURN_INT32(int44_dist(PG_GETARG_INT16(0), PG_GETARG_INT32(1))); +} + +Datum +int42dist(PG_FUNCTION_ARGS) +{ + PG_RETURN_INT32(int44_dist(PG_GETARG_INT32(0), PG_GETARG_INT16(1))); +} diff --git a/src/backend/utils/adt/int8.c b/src/backend/utils/adt/int8.c index ede14086ae..482a74199a 100644 --- a/src/backend/utils/adt/int8.c +++ b/src/backend/utils/adt/int8.c @@ -1522,3 +1522,47 @@ generate_series_int8_support(PG_FUNCTION_ARGS) PG_RETURN_POINTER(ret); } + +static int64 +int88_dist(int64 a, int64 b) +{ + int64 r; + + if (pg_sub_s64_overflow(a, b, &r) || + r == PG_INT64_MIN) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("bigint out of range"))); + + return i64abs(r); +} + +Datum +int8dist(PG_FUNCTION_ARGS) +{ + PG_RETURN_INT64(int88_dist(PG_GETARG_INT64(0), PG_GETARG_INT64(1))); +} + +Datum +int82dist(PG_FUNCTION_ARGS) +{ + PG_RETURN_INT64(int88_dist(PG_GETARG_INT64(0), (int64) PG_GETARG_INT16(1))); +} + +Datum +int84dist(PG_FUNCTION_ARGS) +{ + PG_RETURN_INT64(int88_dist(PG_GETARG_INT64(0), (int64) PG_GETARG_INT32(1))); +} + +Datum +int28dist(PG_FUNCTION_ARGS) +{ + PG_RETURN_INT64(int88_dist((int64) PG_GETARG_INT16(0), PG_GETARG_INT64(1))); +} + +Datum +int48dist(PG_FUNCTION_ARGS) +{ + PG_RETURN_INT64(int88_dist((int64) PG_GETARG_INT32(0), PG_GETARG_INT64(1))); +} diff --git a/src/backend/utils/adt/oid.c b/src/backend/utils/adt/oid.c index 62bcfc5b56..e9bedf648f 100644 --- a/src/backend/utils/adt/oid.c +++ b/src/backend/utils/adt/oid.c @@ -18,6 +18,7 @@ #include #include "catalog/pg_type.h" +#include "common/int.h" #include "libpq/pqformat.h" #include "nodes/miscnodes.h" #include "nodes/value.h" @@ -390,3 +391,24 @@ oidvectorgt(PG_FUNCTION_ARGS) PG_RETURN_BOOL(cmp > 0); } + +Datum +oiddist(PG_FUNCTION_ARGS) +{ + Oid a = PG_GETARG_OID(0); + Oid b = PG_GETARG_OID(1); + Oid res; + bool overflow; + + if (a < b) + overflow = pg_sub_u32_overflow(b, a, &res); + else + overflow = pg_sub_u32_overflow(a, b, &res); + + if (overflow) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("oid out of range"))); + + PG_RETURN_OID(res); +} diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index 866fdd5af8..c5aafa29ad 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -2859,6 +2859,86 @@ timestamp_mi(PG_FUNCTION_ARGS) PG_RETURN_INTERVAL_P(result); } +Datum +timestamp_distance(PG_FUNCTION_ARGS) +{ + Timestamp a = PG_GETARG_TIMESTAMP(0); + Timestamp b = PG_GETARG_TIMESTAMP(1); + Interval *r; + + if (TIMESTAMP_NOT_FINITE(a) || TIMESTAMP_NOT_FINITE(b)) + { + Interval *p = palloc(sizeof(Interval)); + + p->day = INT_MAX; + p->month = INT_MAX; + p->time = PG_INT64_MAX; + PG_RETURN_INTERVAL_P(p); + } + else + r = DatumGetIntervalP(DirectFunctionCall2(timestamp_mi, + PG_GETARG_DATUM(0), + PG_GETARG_DATUM(1))); + PG_RETURN_INTERVAL_P(abs_interval(r)); +} + +Interval * +timestamp_dist_internal(Timestamp a, Timestamp b) +{ + Interval *r; + + if (TIMESTAMP_NOT_FINITE(a) || TIMESTAMP_NOT_FINITE(b)) + { + r = palloc(sizeof(Interval)); + + r->day = INT_MAX; + r->month = INT_MAX; + r->time = PG_INT64_MAX; + + return r; + } + + r = DatumGetIntervalP(DirectFunctionCall2(timestamp_mi, + TimestampGetDatum(a), + TimestampGetDatum(b))); + + return abs_interval(r); +} + +Datum +timestamptz_distance(PG_FUNCTION_ARGS) +{ + TimestampTz a = PG_GETARG_TIMESTAMPTZ(0); + TimestampTz b = PG_GETARG_TIMESTAMPTZ(1); + + PG_RETURN_INTERVAL_P(timestamp_dist_internal(a, b)); +} + +Datum +timestamp_dist_timestamptz(PG_FUNCTION_ARGS) +{ + Timestamp ts1 = PG_GETARG_TIMESTAMP(0); + TimestampTz tstz2 = PG_GETARG_TIMESTAMPTZ(1); + TimestampTz tstz1; + + tstz1 = timestamp2timestamptz(ts1); + + PG_RETURN_INTERVAL_P(timestamp_dist_internal(tstz1, tstz2)); +} + +Datum +timestamptz_dist_timestamp(PG_FUNCTION_ARGS) +{ + TimestampTz tstz1 = PG_GETARG_TIMESTAMPTZ(0); + Timestamp ts2 = PG_GETARG_TIMESTAMP(1); + TimestampTz tstz2; + + tstz2 = timestamp2timestamptz(ts2); + + PG_RETURN_INTERVAL_P(timestamp_dist_internal(tstz1, tstz2)); +} + + /* * interval_justify_interval() * @@ -4200,6 +4280,29 @@ interval_sum(PG_FUNCTION_ARGS) PG_RETURN_INTERVAL_P(result); } +Interval * +abs_interval(Interval *a) +{ + static Interval zero = {0, 0, 0}; + + if (DatumGetBool(DirectFunctionCall2(interval_lt, + IntervalPGetDatum(a), + IntervalPGetDatum(&zero)))) + a = DatumGetIntervalP(DirectFunctionCall1(interval_um, + IntervalPGetDatum(a))); + + return a; +} + +Datum +interval_distance(PG_FUNCTION_ARGS) +{ + Datum diff = DirectFunctionCall2(interval_mi, + PG_GETARG_DATUM(0), + PG_GETARG_DATUM(1)); + + PG_RETURN_INTERVAL_P(abs_interval(DatumGetIntervalP(diff))); +} /* timestamp_age() * Calculate time difference while retaining year/month fields. diff --git a/src/include/catalog/pg_operator.dat b/src/include/catalog/pg_operator.dat index 0e7511dde1..0d45443cb4 100644 --- a/src/include/catalog/pg_operator.dat +++ b/src/include/catalog/pg_operator.dat @@ -2845,6 +2845,114 @@ oprname => '-', oprleft => 'pg_lsn', oprright => 'numeric', oprresult => 'pg_lsn', oprcode => 'pg_lsn_mii' }, +# distance operators +{ oid => '9447', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'int2', + oprright => 'int2', oprresult => 'int2', + oprcode => 'int2dist'}, +{ oid => '9448', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'int4', + oprright => 'int4', oprresult => 'int4', + oprcode => 'int4dist'}, +{ oid => '9449', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'int8', + oprright => 'int8', oprresult => 'int8', + oprcode => 'int8dist'}, +{ oid => '9450', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'oid', + oprright => 'oid', oprresult => 'oid', + oprcode => 'oiddist'}, +{ oid => '9451', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'float4', + oprright => 'float4', oprresult => 'float4', + oprcode => 'float4dist'}, +{ oid => '9452', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'float8', + oprright => 'float8', oprresult => 'float8', + oprcode => 'float8dist'}, +{ oid => '9453', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'money', + oprright => 'money', oprresult => 'money', + oprcode => 'cash_distance'}, +{ oid => '9454', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'date', + oprright => 'date', oprresult => 'int4', + oprcode => 'date_distance'}, +{ oid => '9455', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'time', + oprright => 'time', oprresult => 'interval', + oprcode => 'time_distance'}, +{ oid => '9456', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'timestamp', + oprright => 'timestamp', oprresult => 'interval', + oprcode => 'timestamp_distance'}, +{ oid => '9457', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'timestamptz', + oprright => 'timestamptz', oprresult => 'interval', + oprcode => 'timestamptz_distance'}, +{ oid => '9458', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'interval', + oprright => 'interval', oprresult => 'interval', + oprcode => 'interval_distance'}, + +# cross-type distance operators +{ oid => '9432', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'int2', + oprright => 'int4', oprresult => 'int4', oprcom => '<->(int4,int2)', + oprcode => 'int24dist'}, +{ oid => '9433', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'int4', + oprright => 'int2', oprresult => 'int4', oprcom => '<->(int2,int4)', + oprcode => 'int42dist'}, +{ oid => '9434', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'int2', + oprright => 'int8', oprresult => 'int8', oprcom => '<->(int8,int2)', + oprcode => 'int28dist'}, +{ oid => '9435', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'int8', + oprright => 'int2', oprresult => 'int8', oprcom => '<->(int2,int8)', + oprcode => 'int82dist'}, +{ oid => '9436', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'int4', + oprright => 'int8', oprresult => 'int8', oprcom => '<->(int8,int4)', + oprcode => 'int48dist'}, +{ oid => '9437', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'int8', + oprright => 'int4', oprresult => 'int8', oprcom => '<->(int4,int8)', + oprcode => 'int84dist'}, +{ oid => '9438', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'float4', + oprright => 'float8', oprresult => 'float8', oprcom => '<->(float8,float4)', + oprcode => 'float48dist'}, +{ oid => '9439', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'float8', + oprright => 'float4', oprresult => 'float8', oprcom => '<->(float4,float8)', + oprcode => 'float84dist'}, +{ oid => '9440', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'date', + oprright => 'timestamp', oprresult => 'interval', oprcom => '<->(timestamp,date)', + oprcode => 'date_dist_timestamp'}, +{ oid => '9441', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'timestamp', + oprright => 'date', oprresult => 'interval', oprcom => '<->(date,timestamp)', + oprcode => 'timestamp_dist_date'}, +{ oid => '9442', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'date', + oprright => 'timestamptz', oprresult => 'interval', oprcom => '<->(timestamptz,date)', + oprcode => 'date_dist_timestamptz'}, +{ oid => '9443', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'timestamptz', + oprright => 'date', oprresult => 'interval', oprcom => '<->(date,timestamptz)', + oprcode => 'timestamptz_dist_date'}, +{ oid => '9444', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'timestamp', + oprright => 'timestamptz', oprresult => 'interval', oprcom => '<->(timestamptz,timestamp)', + oprcode => 'timestamp_dist_timestamptz'}, +{ oid => '9445', descr => 'distance between', + oprname => '<->', oprcanmerge => 'f', oprcanhash => 'f', oprleft => 'timestamptz', + oprright => 'timestamp', oprresult => 'interval', oprcom => '<->(timestamp,timestamptz)', + oprcode => 'timestamptz_dist_timestamp'}, + # enum operators { oid => '3516', descr => 'equal', oprname => '=', oprcanmerge => 't', oprcanhash => 't', oprleft => 'anyenum', diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index 58811a6530..add53c03ff 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -12152,4 +12152,90 @@ proargnames => '{summarized_tli,summarized_lsn,pending_lsn,summarizer_pid}', prosrc => 'pg_get_wal_summarizer_state' }, +# distance functions +{ oid => '9406', + proname => 'int2dist', prorettype => 'int2', + proargtypes => 'int2 int2', prosrc => 'int2dist' }, +{ oid => '9407', + proname => 'int4dist', prorettype => 'int4', + proargtypes => 'int4 int4', prosrc => 'int4dist' }, +{ oid => '9408', + proname => 'int8dist', prorettype => 'int8', + proargtypes => 'int8 int8', prosrc => 'int8dist' }, +{ oid => '9409', + proname => 'oiddist', prorettype => 'oid', + proargtypes => 'oid oid', prosrc => 'oiddist' }, +{ oid => '9410', + proname => 'float4dist', prorettype => 'float4', + proargtypes => 'float4 float4', prosrc => 'float4dist' }, +{ oid => '9411', + proname => 'float8dist', prorettype => 'float8', + proargtypes => 'float8 float8', prosrc => 'float8dist' }, +{ oid => '9412', + proname => 'cash_distance', prorettype => 'money', + proargtypes => 'money money', prosrc => 'cash_distance' }, +{ oid => '9413', + proname => 'date_distance', prorettype => 'int4', + proargtypes => 'date date', prosrc => 'date_distance' }, +{ oid => '9414', + proname => 'time_distance', prorettype => 'interval', + proargtypes => 'time time', prosrc => 'time_distance' }, +{ oid => '9415', + proname => 'timestamp_distance', prorettype => 'interval', + proargtypes => 'timestamp timestamp', prosrc => 'timestamp_distance' }, +{ oid => '9416', + proname => 'timestamptz_distance', prorettype => 'interval', + proargtypes => 'timestamptz timestamptz', prosrc => 'timestamptz_distance' }, +{ oid => '9417', + proname => 'interval_distance', prorettype => 'interval', + proargtypes => 'interval interval', prosrc => 'interval_distance' }, + +# cross-type distance functions +{ oid => '9418', + proname => 'int24dist', prorettype => 'int4', + proargtypes => 'int2 int4', prosrc => 'int24dist' }, +{ oid => '9419', + proname => 'int28dist', prorettype => 'int8', + proargtypes => 'int2 int8', prosrc => 'int28dist' }, +{ oid => '9420', + proname => 'int42dist', prorettype => 'int4', + proargtypes => 'int4 int2', prosrc => 'int42dist' }, +{ oid => '9221', + proname => 'int48dist', prorettype => 'int8', + proargtypes => 'int4 int8', prosrc => 'int48dist' }, +{ oid => '9422', + proname => 'int82dist', prorettype => 'int8', + proargtypes => 'int8 int2', prosrc => 'int82dist' }, +{ oid => '9423', + proname => 'int84dist', prorettype => 'int8', + proargtypes => 'int8 int4', prosrc => 'int84dist' }, +{ oid => '9424', + proname => 'float48dist', prorettype => 'float8', + proargtypes => 'float4 float8', prosrc => 'float48dist' }, +{ oid => '9425', + proname => 'float84dist', prorettype => 'float8', + proargtypes => 'float8 float4', prosrc => 'float84dist' }, +{ oid => '9426', + proname => 'date_dist_timestamp', prorettype => 'interval', + proargtypes => 'date timestamp', prosrc => 'date_dist_timestamp' }, +{ oid => '9427', + proname => 'date_dist_timestamptz', provolatile => 's', + prorettype => 'interval', proargtypes => 'date timestamptz', + prosrc => 'date_dist_timestamptz' }, +{ oid => '9428', + proname => 'timestamp_dist_date', prorettype => 'interval', + proargtypes => 'timestamp date', prosrc => 'timestamp_dist_date' }, +{ oid => '9429', + proname => 'timestamp_dist_timestamptz', provolatile => 's', + prorettype => 'interval', proargtypes => 'timestamp timestamptz', + prosrc => 'timestamp_dist_timestamptz' }, +{ oid => '9430', + proname => 'timestamptz_dist_date', provolatile => 's', + prorettype => 'interval', proargtypes => 'timestamptz date', + prosrc => 'timestamptz_dist_date' }, +{ oid => '9431', + proname => 'timestamptz_dist_timestamp', provolatile => 's', + prorettype => 'interval', proargtypes => 'timestamptz timestamp', + prosrc => 'timestamptz_dist_timestamp' }, + ] diff --git a/src/include/utils/datetime.h b/src/include/utils/datetime.h index 460c75cfdd..682d3fa82f 100644 --- a/src/include/utils/datetime.h +++ b/src/include/utils/datetime.h @@ -361,4 +361,6 @@ extern void InstallTimeZoneAbbrevs(TimeZoneAbbrevTable *tbl); extern bool AdjustTimestampForTypmod(Timestamp *time, int32 typmod, struct Node *escontext); +extern Interval *abs_interval(Interval *a); + #endif /* DATETIME_H */ diff --git a/src/include/utils/timestamp.h b/src/include/utils/timestamp.h index a6ce03ed46..27015a36bb 100644 --- a/src/include/utils/timestamp.h +++ b/src/include/utils/timestamp.h @@ -126,9 +126,11 @@ extern Timestamp SetEpochTimestamp(void); extern void GetEpochTime(struct pg_tm *tm); extern int timestamp_cmp_internal(Timestamp dt1, Timestamp dt2); +extern Interval *timestamp_dist_internal(Timestamp a, Timestamp b); -/* timestamp comparison works for timestamptz also */ +/* timestamp comparison and distance works for timestamptz also */ #define timestamptz_cmp_internal(dt1,dt2) timestamp_cmp_internal(dt1, dt2) +#define timestamptz_dist_internal(dt1,dt2) timestamp_dist_internal(dt1, dt2) extern TimestampTz timestamp2timestamptz_opt_overflow(Timestamp timestamp, int *overflow); diff --git a/src/test/regress/expected/date.out b/src/test/regress/expected/date.out index f5949f3d17..611c669137 100644 --- a/src/test/regress/expected/date.out +++ b/src/test/regress/expected/date.out @@ -1532,3 +1532,67 @@ select make_time(10, 55, 100.1); ERROR: time field value out of range: 10:55:100.1 select make_time(24, 0, 2.1); ERROR: time field value out of range: 24:00:2.1 +-- distance operators +SELECT '' AS "Fifteen", f1 <-> date '2001-02-03' AS "Distance" FROM DATE_TBL; + Fifteen | Distance +---------+---------- + | 16006 + | 15941 + | 1802 + | 1801 + | 1800 + | 1799 + | 1436 + | 1435 + | 1434 + | 308 + | 307 + | 306 + | 13578 + | 13944 + | 14311 + | 1475514 +(16 rows) + +SELECT '' AS "Fifteen", f1 <-> timestamp '2001-02-03 01:23:45' AS "Distance" FROM DATE_TBL; + Fifteen | Distance +---------+--------------------------------------- + | @ 16006 days 1 hour 23 mins 45 secs + | @ 15941 days 1 hour 23 mins 45 secs + | @ 1802 days 1 hour 23 mins 45 secs + | @ 1801 days 1 hour 23 mins 45 secs + | @ 1800 days 1 hour 23 mins 45 secs + | @ 1799 days 1 hour 23 mins 45 secs + | @ 1436 days 1 hour 23 mins 45 secs + | @ 1435 days 1 hour 23 mins 45 secs + | @ 1434 days 1 hour 23 mins 45 secs + | @ 308 days 1 hour 23 mins 45 secs + | @ 307 days 1 hour 23 mins 45 secs + | @ 306 days 1 hour 23 mins 45 secs + | @ 13577 days 22 hours 36 mins 15 secs + | @ 13943 days 22 hours 36 mins 15 secs + | @ 14310 days 22 hours 36 mins 15 secs + | @ 1475514 days 1 hour 23 mins 45 secs +(16 rows) + +SELECT '' AS "Fifteen", f1 <-> timestamptz '2001-02-03 01:23:45+03' AS "Distance" FROM DATE_TBL; + Fifteen | Distance +---------+----------------------------------------- + | @ 16005 days 14 hours 23 mins 45 secs + | @ 15940 days 14 hours 23 mins 45 secs + | @ 1801 days 14 hours 23 mins 45 secs + | @ 1800 days 14 hours 23 mins 45 secs + | @ 1799 days 14 hours 23 mins 45 secs + | @ 1798 days 14 hours 23 mins 45 secs + | @ 1435 days 14 hours 23 mins 45 secs + | @ 1434 days 14 hours 23 mins 45 secs + | @ 1433 days 14 hours 23 mins 45 secs + | @ 307 days 14 hours 23 mins 45 secs + | @ 306 days 14 hours 23 mins 45 secs + | @ 305 days 15 hours 23 mins 45 secs + | @ 13578 days 8 hours 36 mins 15 secs + | @ 13944 days 8 hours 36 mins 15 secs + | @ 14311 days 8 hours 36 mins 15 secs + | @ 1475513 days 14 hours 23 mins 45 secs +(16 rows) + diff --git a/src/test/regress/expected/float4.out b/src/test/regress/expected/float4.out index 65ee82caae..a04ea173ca 100644 --- a/src/test/regress/expected/float4.out +++ b/src/test/regress/expected/float4.out @@ -318,6 +318,26 @@ SELECT * FROM FLOAT4_TBL; -1.2345679e-20 (5 rows) +SELECT '' AS five, f.f1, f.f1 <-> '1004.3' AS dist FROM FLOAT4_TBL f; + five | f1 | dist +------+----------------+--------------- + | 0 | 1004.3 + | -34.84 | 1039.14 + | -1004.3 | 2008.6 + | -1.2345679e+20 | 1.2345679e+20 + | -1.2345679e-20 | 1004.3 +(5 rows) + +SELECT '' AS five, f.f1, f.f1 <-> '1004.3'::float8 AS dist FROM FLOAT4_TBL f; + five | f1 | dist +------+----------------+------------------------ + | 0 | 1004.3 + | -34.84 | 1039.1400001525878 + | -1004.3 | 2008.5999877929687 + | -1.2345679e+20 | 1.2345678955701443e+20 + | -1.2345679e-20 | 1004.3 +(5 rows) + -- test edge-case coercions to integer SELECT '32767.4'::float4::int2; int2 diff --git a/src/test/regress/expected/float8.out b/src/test/regress/expected/float8.out index 344d6b7d6d..7fcf3b7d6e 100644 --- a/src/test/regress/expected/float8.out +++ b/src/test/regress/expected/float8.out @@ -617,6 +617,27 @@ SELECT f.f1, ||/f.f1 AS cbrt_f1 FROM FLOAT8_TBL f; 1.2345678901234e-200 | 2.3112042409018e-67 (5 rows) +-- distance +SELECT f.f1, f.f1 <-> '1004.3'::float8 AS dist FROM FLOAT8_TBL f; + f1 | dist +----------------------+---------------------- + 0 | 1004.3 + 1004.3 | 0 + -34.84 | 1039.14 + 1.2345678901234e+200 | 1.2345678901234e+200 + 1.2345678901234e-200 | 1004.3 +(5 rows) + +SELECT f.f1, f.f1 <-> '1004.3'::float4 AS dist FROM FLOAT8_TBL f; + f1 | dist +----------------------+---------------------- + 0 | 1004.29998779297 + 1004.3 | 1.22070312045253e-05 + -34.84 | 1039.13998779297 + 1.2345678901234e+200 | 1.2345678901234e+200 + 1.2345678901234e-200 | 1004.29998779297 +(5 rows) + SELECT * FROM FLOAT8_TBL; f1 ---------------------- diff --git a/src/test/regress/expected/int2.out b/src/test/regress/expected/int2.out index 4e03a5faee..0631e028c6 100644 --- a/src/test/regress/expected/int2.out +++ b/src/test/regress/expected/int2.out @@ -284,6 +284,39 @@ SELECT i.f1, i.f1 / int4 '2' AS x FROM INT2_TBL i; -32767 | -16383 (5 rows) +-- distance +SELECT '' AS five, i.f1, i.f1 <-> int2 '2' AS x FROM INT2_TBL i; +ERROR: smallint out of range +SELECT '' AS four, i.f1, i.f1 <-> int2 '2' AS x FROM INT2_TBL i +WHERE f1 > -32767; + four | f1 | x +------+-------+------- + | 0 | 2 + | 1234 | 1232 + | -1234 | 1236 + | 32767 | 32765 +(4 rows) + +SELECT '' AS five, i.f1, i.f1 <-> int4 '2' AS x FROM INT2_TBL i; + five | f1 | x +------+--------+------- + | 0 | 2 + | 1234 | 1232 + | -1234 | 1236 + | 32767 | 32765 + | -32767 | 32769 +(5 rows) + +SELECT '' AS five, i.f1, i.f1 <-> int8 '2' AS x FROM INT2_TBL i; + five | f1 | x +------+--------+------- + | 0 | 2 + | 1234 | 1232 + | -1234 | 1236 + | 32767 | 32765 + | -32767 | 32769 +(5 rows) + -- corner cases SELECT (-1::int2<<15)::text; text diff --git a/src/test/regress/expected/int4.out b/src/test/regress/expected/int4.out index b1a15888ef..261bc5b263 100644 --- a/src/test/regress/expected/int4.out +++ b/src/test/regress/expected/int4.out @@ -266,6 +266,38 @@ SELECT i.f1, i.f1 / int4 '2' AS x FROM INT4_TBL i; -2147483647 | -1073741823 (5 rows) +SELECT '' AS five, i.f1, i.f1 <-> int2 '2' AS x FROM INT4_TBL i; +ERROR: integer out of range +SELECT '' AS four, i.f1, i.f1 <-> int2 '2' AS x FROM INT4_TBL i +WHERE f1 > -2147483647; + four | f1 | x +------+------------+------------ + | 0 | 2 + | 123456 | 123454 + | -123456 | 123458 + | 2147483647 | 2147483645 +(4 rows) + +SELECT '' AS four, i.f1, i.f1 <-> int4 '2' AS x FROM INT4_TBL i +WHERE f1 > -2147483647; + four | f1 | x +------+------------+------------ + | 0 | 2 + | 123456 | 123454 + | -123456 | 123458 + | 2147483647 | 2147483645 +(4 rows) + +SELECT '' AS five, i.f1, i.f1 <-> int8 '2' AS x FROM INT4_TBL i; + five | f1 | x +------+-------------+------------ + | 0 | 2 + | 123456 | 123454 + | -123456 | 123458 + | 2147483647 | 2147483645 + | -2147483647 | 2147483649 +(5 rows) + -- -- more complex expressions -- diff --git a/src/test/regress/expected/int8.out b/src/test/regress/expected/int8.out index fddc09f630..412ba3e4f4 100644 --- a/src/test/regress/expected/int8.out +++ b/src/test/regress/expected/int8.out @@ -452,6 +452,37 @@ SELECT 246::int2 + q1 AS "2plus8", 246::int2 - q1 AS "2minus8", 246::int2 * q1 A 4567890123457035 | -4567890123456543 | 1123700970370370094 | 0 (5 rows) +-- distance +SELECT '' AS five, q2, q2 <-> int2 '123' AS dist FROM INT8_TBL i; + five | q2 | dist +------+-------------------+------------------ + | 456 | 333 + | 4567890123456789 | 4567890123456666 + | 123 | 0 + | 4567890123456789 | 4567890123456666 + | -4567890123456789 | 4567890123456912 +(5 rows) + +SELECT '' AS five, q2, q2 <-> int4 '123' AS dist FROM INT8_TBL i; + five | q2 | dist +------+-------------------+------------------ + | 456 | 333 + | 4567890123456789 | 4567890123456666 + | 123 | 0 + | 4567890123456789 | 4567890123456666 + | -4567890123456789 | 4567890123456912 +(5 rows) + +SELECT '' AS five, q2, q2 <-> int8 '123' AS dist FROM INT8_TBL i; + five | q2 | dist +------+-------------------+------------------ + | 456 | 333 + | 4567890123456789 | 4567890123456666 + | 123 | 0 + | 4567890123456789 | 4567890123456666 + | -4567890123456789 | 4567890123456912 +(5 rows) + SELECT q2, abs(q2) FROM INT8_TBL; q2 | abs -------------------+------------------ diff --git a/src/test/regress/expected/interval.out b/src/test/regress/expected/interval.out index b79b6fcd4d..e4266786e9 100644 --- a/src/test/regress/expected/interval.out +++ b/src/test/regress/expected/interval.out @@ -325,6 +325,23 @@ SELECT -('-9223372036854775807 us'::interval); -- ok SELECT -('-2147483647 months -2147483647 days -9223372036854775807 us'::interval); -- should fail ERROR: interval out of range +SELECT f1 <-> interval '@ 2 day 3 hours' FROM INTERVAL_TBL; + ?column? +---------------------------- + 2 days 02:59:00 + 2 days -02:00:00 + 8 days -03:00:00 + 34 years -2 days -03:00:00 + 3 mons -2 days -03:00:00 + 2 days 03:00:14 + 1 day 00:56:56 + 6 years -2 days -03:00:00 + 5 mons -2 days -03:00:00 + 5 mons -2 days +09:00:00 + infinity + infinity +(12 rows) + -- Test intervals that are large enough to overflow 64 bits in comparisons CREATE TEMP TABLE INTERVAL_TBL_OF (f1 interval); INSERT INTO INTERVAL_TBL_OF (f1) VALUES diff --git a/src/test/regress/expected/money.out b/src/test/regress/expected/money.out index 7fd4e31804..0336b743fe 100644 --- a/src/test/regress/expected/money.out +++ b/src/test/regress/expected/money.out @@ -125,6 +125,12 @@ SELECT m / 2::float4 FROM money_data; $61.50 (1 row) +SELECT m <-> '$123.45' FROM money_data; + ?column? +---------- + $0.45 +(1 row) + -- All true SELECT m = '$123.00' FROM money_data; ?column? diff --git a/src/test/regress/expected/oid.out b/src/test/regress/expected/oid.out index b80cb47e0c..1d705042c2 100644 --- a/src/test/regress/expected/oid.out +++ b/src/test/regress/expected/oid.out @@ -181,4 +181,17 @@ SELECT o.* FROM OID_TBL o WHERE o.f1 > '1234'; 99999999 (3 rows) +SELECT '' AS eight, f1, f1 <-> oid '123' FROM OID_TBL; + eight | f1 | ?column? +-------+------------+------------ + | 1234 | 1111 + | 1235 | 1112 + | 987 | 864 + | 4294966256 | 4294966133 + | 99999999 | 99999876 + | 5 | 118 + | 10 | 113 + | 15 | 108 +(8 rows) + DROP TABLE OID_TBL; diff --git a/src/test/regress/expected/time.out b/src/test/regress/expected/time.out index 4247fae941..38280d4449 100644 --- a/src/test/regress/expected/time.out +++ b/src/test/regress/expected/time.out @@ -229,3 +229,19 @@ SELECT date_part('epoch', TIME '2020-05-26 13:30:25.575401'); 48625.575401 (1 row) +-- distance +SELECT f1 <-> time '01:23:45' AS "Distance" FROM TIME_TBL; + Distance +------------------------------- + @ 1 hour 23 mins 45 secs + @ 23 mins 45 secs + @ 39 mins 15 secs + @ 10 hours 35 mins 15 secs + @ 10 hours 36 mins 15 secs + @ 10 hours 37 mins 15 secs + @ 22 hours 35 mins 15 secs + @ 22 hours 36 mins 14.99 secs + @ 14 hours 12 mins 54 secs + @ 14 hours 12 mins 54 secs +(10 rows) + diff --git a/src/test/regress/expected/timestamp.out b/src/test/regress/expected/timestamp.out index 835f0e5762..cfb299b6f1 100644 --- a/src/test/regress/expected/timestamp.out +++ b/src/test/regress/expected/timestamp.out @@ -2187,3 +2187,424 @@ select age(timestamp '-infinity', timestamp 'infinity'); select age(timestamp '-infinity', timestamp '-infinity'); ERROR: interval out of range +SELECT make_timestamp(2014,12,28,6,30,45.887); + make_timestamp +------------------------------ + Sun Dec 28 06:30:45.887 2014 +(1 row) + +-- distance operators +SELECT d1 <-> date '2001-02-03' AS "Distance" FROM TIMESTAMP_TBL; + Distance +--------------------------------------- + infinity + infinity + @ 11356 days + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 58 secs + @ 1453 days 6 hours 27 mins 58.6 secs + @ 1453 days 6 hours 27 mins 58.5 secs + @ 1453 days 6 hours 27 mins 58.4 secs + @ 1493 days + @ 1492 days 20 hours 55 mins 55 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1333 days 6 hours 27 mins 59 secs + @ 231 days 18 hours 19 mins 20 secs + @ 324 days 15 hours 45 mins 59 secs + @ 324 days 10 hours 45 mins 58 secs + @ 324 days 11 hours 45 mins 57 secs + @ 324 days 20 hours 45 mins 56 secs + @ 324 days 21 hours 45 mins 55 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 28 mins + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1333 days 5 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1452 days 6 hours 27 mins 59 secs + @ 1451 days 6 hours 27 mins 59 secs + @ 1450 days 6 hours 27 mins 59 secs + @ 1449 days 6 hours 27 mins 59 secs + @ 1448 days 6 hours 27 mins 59 secs + @ 1447 days 6 hours 27 mins 59 secs + @ 765901 days 6 hours 27 mins 59 secs + @ 695407 days 6 hours 27 mins 59 secs + @ 512786 days 6 hours 27 mins 59 secs + @ 330165 days 6 hours 27 mins 59 secs + @ 111019 days 6 hours 27 mins 59 secs + @ 74495 days 6 hours 27 mins 59 secs + @ 37971 days 6 hours 27 mins 59 secs + @ 1447 days 6 hours 27 mins 59 secs + @ 35077 days 17 hours 32 mins 1 sec + @ 1801 days 6 hours 27 mins 59 secs + @ 1800 days 6 hours 27 mins 59 secs + @ 1799 days 6 hours 27 mins 59 secs + @ 1495 days 6 hours 27 mins 59 secs + @ 1494 days 6 hours 27 mins 59 secs + @ 1493 days 6 hours 27 mins 59 secs + @ 1435 days 6 hours 27 mins 59 secs + @ 1434 days 6 hours 27 mins 59 secs + @ 1130 days 6 hours 27 mins 59 secs + @ 1129 days 6 hours 27 mins 59 secs + @ 399 days 6 hours 27 mins 59 secs + @ 398 days 6 hours 27 mins 59 secs + @ 33 days 6 hours 27 mins 59 secs + @ 32 days 6 hours 27 mins 59 secs +(65 rows) + +SELECT d1 <-> date '2001-02-03' AS "Distance" FROM TIMESTAMP_TBL WHERE isfinite(d1); + Distance +--------------------------------------- + @ 11356 days + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 58 secs + @ 1453 days 6 hours 27 mins 58.6 secs + @ 1453 days 6 hours 27 mins 58.5 secs + @ 1453 days 6 hours 27 mins 58.4 secs + @ 1493 days + @ 1492 days 20 hours 55 mins 55 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1333 days 6 hours 27 mins 59 secs + @ 231 days 18 hours 19 mins 20 secs + @ 324 days 15 hours 45 mins 59 secs + @ 324 days 10 hours 45 mins 58 secs + @ 324 days 11 hours 45 mins 57 secs + @ 324 days 20 hours 45 mins 56 secs + @ 324 days 21 hours 45 mins 55 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 28 mins + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1333 days 5 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1452 days 6 hours 27 mins 59 secs + @ 1451 days 6 hours 27 mins 59 secs + @ 1450 days 6 hours 27 mins 59 secs + @ 1449 days 6 hours 27 mins 59 secs + @ 1448 days 6 hours 27 mins 59 secs + @ 1447 days 6 hours 27 mins 59 secs + @ 765901 days 6 hours 27 mins 59 secs + @ 695407 days 6 hours 27 mins 59 secs + @ 512786 days 6 hours 27 mins 59 secs + @ 330165 days 6 hours 27 mins 59 secs + @ 111019 days 6 hours 27 mins 59 secs + @ 74495 days 6 hours 27 mins 59 secs + @ 37971 days 6 hours 27 mins 59 secs + @ 1447 days 6 hours 27 mins 59 secs + @ 35077 days 17 hours 32 mins 1 sec + @ 1801 days 6 hours 27 mins 59 secs + @ 1800 days 6 hours 27 mins 59 secs + @ 1799 days 6 hours 27 mins 59 secs + @ 1495 days 6 hours 27 mins 59 secs + @ 1494 days 6 hours 27 mins 59 secs + @ 1493 days 6 hours 27 mins 59 secs + @ 1435 days 6 hours 27 mins 59 secs + @ 1434 days 6 hours 27 mins 59 secs + @ 1130 days 6 hours 27 mins 59 secs + @ 1129 days 6 hours 27 mins 59 secs + @ 399 days 6 hours 27 mins 59 secs + @ 398 days 6 hours 27 mins 59 secs + @ 33 days 6 hours 27 mins 59 secs + @ 32 days 6 hours 27 mins 59 secs +(63 rows) + +SELECT d1 <-> timestamp '2001-02-03 01:23:45' AS "Distance" FROM TIMESTAMP_TBL; + Distance +--------------------------------------- + infinity + infinity + @ 11356 days 1 hour 23 mins 45 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 43 secs + @ 1453 days 7 hours 51 mins 43.6 secs + @ 1453 days 7 hours 51 mins 43.5 secs + @ 1453 days 7 hours 51 mins 43.4 secs + @ 1493 days 1 hour 23 mins 45 secs + @ 1492 days 22 hours 19 mins 40 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1333 days 7 hours 51 mins 44 secs + @ 231 days 16 hours 55 mins 35 secs + @ 324 days 17 hours 9 mins 44 secs + @ 324 days 12 hours 9 mins 43 secs + @ 324 days 13 hours 9 mins 42 secs + @ 324 days 22 hours 9 mins 41 secs + @ 324 days 23 hours 9 mins 40 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 45 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1333 days 6 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1452 days 7 hours 51 mins 44 secs + @ 1451 days 7 hours 51 mins 44 secs + @ 1450 days 7 hours 51 mins 44 secs + @ 1449 days 7 hours 51 mins 44 secs + @ 1448 days 7 hours 51 mins 44 secs + @ 1447 days 7 hours 51 mins 44 secs + @ 765901 days 7 hours 51 mins 44 secs + @ 695407 days 7 hours 51 mins 44 secs + @ 512786 days 7 hours 51 mins 44 secs + @ 330165 days 7 hours 51 mins 44 secs + @ 111019 days 7 hours 51 mins 44 secs + @ 74495 days 7 hours 51 mins 44 secs + @ 37971 days 7 hours 51 mins 44 secs + @ 1447 days 7 hours 51 mins 44 secs + @ 35077 days 16 hours 8 mins 16 secs + @ 1801 days 7 hours 51 mins 44 secs + @ 1800 days 7 hours 51 mins 44 secs + @ 1799 days 7 hours 51 mins 44 secs + @ 1495 days 7 hours 51 mins 44 secs + @ 1494 days 7 hours 51 mins 44 secs + @ 1493 days 7 hours 51 mins 44 secs + @ 1435 days 7 hours 51 mins 44 secs + @ 1434 days 7 hours 51 mins 44 secs + @ 1130 days 7 hours 51 mins 44 secs + @ 1129 days 7 hours 51 mins 44 secs + @ 399 days 7 hours 51 mins 44 secs + @ 398 days 7 hours 51 mins 44 secs + @ 33 days 7 hours 51 mins 44 secs + @ 32 days 7 hours 51 mins 44 secs +(65 rows) + +SELECT d1 <-> timestamp '2001-02-03 01:23:45' AS "Distance" FROM TIMESTAMP_TBL WHERE isfinite(d1); + Distance +--------------------------------------- + @ 11356 days 1 hour 23 mins 45 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 43 secs + @ 1453 days 7 hours 51 mins 43.6 secs + @ 1453 days 7 hours 51 mins 43.5 secs + @ 1453 days 7 hours 51 mins 43.4 secs + @ 1493 days 1 hour 23 mins 45 secs + @ 1492 days 22 hours 19 mins 40 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1333 days 7 hours 51 mins 44 secs + @ 231 days 16 hours 55 mins 35 secs + @ 324 days 17 hours 9 mins 44 secs + @ 324 days 12 hours 9 mins 43 secs + @ 324 days 13 hours 9 mins 42 secs + @ 324 days 22 hours 9 mins 41 secs + @ 324 days 23 hours 9 mins 40 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 45 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1333 days 6 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1452 days 7 hours 51 mins 44 secs + @ 1451 days 7 hours 51 mins 44 secs + @ 1450 days 7 hours 51 mins 44 secs + @ 1449 days 7 hours 51 mins 44 secs + @ 1448 days 7 hours 51 mins 44 secs + @ 1447 days 7 hours 51 mins 44 secs + @ 765901 days 7 hours 51 mins 44 secs + @ 695407 days 7 hours 51 mins 44 secs + @ 512786 days 7 hours 51 mins 44 secs + @ 330165 days 7 hours 51 mins 44 secs + @ 111019 days 7 hours 51 mins 44 secs + @ 74495 days 7 hours 51 mins 44 secs + @ 37971 days 7 hours 51 mins 44 secs + @ 1447 days 7 hours 51 mins 44 secs + @ 35077 days 16 hours 8 mins 16 secs + @ 1801 days 7 hours 51 mins 44 secs + @ 1800 days 7 hours 51 mins 44 secs + @ 1799 days 7 hours 51 mins 44 secs + @ 1495 days 7 hours 51 mins 44 secs + @ 1494 days 7 hours 51 mins 44 secs + @ 1493 days 7 hours 51 mins 44 secs + @ 1435 days 7 hours 51 mins 44 secs + @ 1434 days 7 hours 51 mins 44 secs + @ 1130 days 7 hours 51 mins 44 secs + @ 1129 days 7 hours 51 mins 44 secs + @ 399 days 7 hours 51 mins 44 secs + @ 398 days 7 hours 51 mins 44 secs + @ 33 days 7 hours 51 mins 44 secs + @ 32 days 7 hours 51 mins 44 secs +(63 rows) + +SELECT d1 <-> timestamptz '2001-02-03 01:23:45+03' AS "Distance" FROM TIMESTAMP_TBL; + Distance +---------------------------------------- + infinity + infinity + @ 11355 days 14 hours 23 mins 45 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 43 secs + @ 1452 days 20 hours 51 mins 43.6 secs + @ 1452 days 20 hours 51 mins 43.5 secs + @ 1452 days 20 hours 51 mins 43.4 secs + @ 1492 days 14 hours 23 mins 45 secs + @ 1492 days 11 hours 19 mins 40 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1332 days 21 hours 51 mins 44 secs + @ 232 days 2 hours 55 mins 35 secs + @ 324 days 6 hours 9 mins 44 secs + @ 324 days 1 hour 9 mins 43 secs + @ 324 days 2 hours 9 mins 42 secs + @ 324 days 11 hours 9 mins 41 secs + @ 324 days 12 hours 9 mins 40 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 45 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1332 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1451 days 20 hours 51 mins 44 secs + @ 1450 days 20 hours 51 mins 44 secs + @ 1449 days 20 hours 51 mins 44 secs + @ 1448 days 20 hours 51 mins 44 secs + @ 1447 days 20 hours 51 mins 44 secs + @ 1446 days 20 hours 51 mins 44 secs + @ 765900 days 20 hours 51 mins 44 secs + @ 695406 days 20 hours 51 mins 44 secs + @ 512785 days 20 hours 51 mins 44 secs + @ 330164 days 20 hours 51 mins 44 secs + @ 111018 days 20 hours 51 mins 44 secs + @ 74494 days 20 hours 51 mins 44 secs + @ 37970 days 20 hours 51 mins 44 secs + @ 1446 days 20 hours 51 mins 44 secs + @ 35078 days 3 hours 8 mins 16 secs + @ 1800 days 20 hours 51 mins 44 secs + @ 1799 days 20 hours 51 mins 44 secs + @ 1798 days 20 hours 51 mins 44 secs + @ 1494 days 20 hours 51 mins 44 secs + @ 1493 days 20 hours 51 mins 44 secs + @ 1492 days 20 hours 51 mins 44 secs + @ 1434 days 20 hours 51 mins 44 secs + @ 1433 days 20 hours 51 mins 44 secs + @ 1129 days 20 hours 51 mins 44 secs + @ 1128 days 20 hours 51 mins 44 secs + @ 398 days 20 hours 51 mins 44 secs + @ 397 days 20 hours 51 mins 44 secs + @ 32 days 20 hours 51 mins 44 secs + @ 31 days 20 hours 51 mins 44 secs +(65 rows) + +SELECT d1 <-> timestamptz '2001-02-03 01:23:45+03' AS "Distance" FROM TIMESTAMP_TBL WHERE isfinite(d1); + Distance +---------------------------------------- + @ 11355 days 14 hours 23 mins 45 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 43 secs + @ 1452 days 20 hours 51 mins 43.6 secs + @ 1452 days 20 hours 51 mins 43.5 secs + @ 1452 days 20 hours 51 mins 43.4 secs + @ 1492 days 14 hours 23 mins 45 secs + @ 1492 days 11 hours 19 mins 40 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1332 days 21 hours 51 mins 44 secs + @ 232 days 2 hours 55 mins 35 secs + @ 324 days 6 hours 9 mins 44 secs + @ 324 days 1 hour 9 mins 43 secs + @ 324 days 2 hours 9 mins 42 secs + @ 324 days 11 hours 9 mins 41 secs + @ 324 days 12 hours 9 mins 40 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 45 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1332 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1451 days 20 hours 51 mins 44 secs + @ 1450 days 20 hours 51 mins 44 secs + @ 1449 days 20 hours 51 mins 44 secs + @ 1448 days 20 hours 51 mins 44 secs + @ 1447 days 20 hours 51 mins 44 secs + @ 1446 days 20 hours 51 mins 44 secs + @ 765900 days 20 hours 51 mins 44 secs + @ 695406 days 20 hours 51 mins 44 secs + @ 512785 days 20 hours 51 mins 44 secs + @ 330164 days 20 hours 51 mins 44 secs + @ 111018 days 20 hours 51 mins 44 secs + @ 74494 days 20 hours 51 mins 44 secs + @ 37970 days 20 hours 51 mins 44 secs + @ 1446 days 20 hours 51 mins 44 secs + @ 35078 days 3 hours 8 mins 16 secs + @ 1800 days 20 hours 51 mins 44 secs + @ 1799 days 20 hours 51 mins 44 secs + @ 1798 days 20 hours 51 mins 44 secs + @ 1494 days 20 hours 51 mins 44 secs + @ 1493 days 20 hours 51 mins 44 secs + @ 1492 days 20 hours 51 mins 44 secs + @ 1434 days 20 hours 51 mins 44 secs + @ 1433 days 20 hours 51 mins 44 secs + @ 1129 days 20 hours 51 mins 44 secs + @ 1128 days 20 hours 51 mins 44 secs + @ 398 days 20 hours 51 mins 44 secs + @ 397 days 20 hours 51 mins 44 secs + @ 32 days 20 hours 51 mins 44 secs + @ 31 days 20 hours 51 mins 44 secs +(63 rows) + diff --git a/src/test/regress/expected/timestamptz.out b/src/test/regress/expected/timestamptz.out index a084357480..1cf5959216 100644 --- a/src/test/regress/expected/timestamptz.out +++ b/src/test/regress/expected/timestamptz.out @@ -3272,3 +3272,424 @@ SELECT age(timestamptz '-infinity', timestamptz 'infinity'); SELECT age(timestamptz '-infinity', timestamptz '-infinity'); ERROR: interval out of range +-- distance operators +SELECT d1 <-> date '2001-02-03' AS "Distance" FROM TIMESTAMPTZ_TBL; + Distance +--------------------------------------- + infinity + infinity + @ 11356 days 8 hours + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 58 secs + @ 1453 days 6 hours 27 mins 58.6 secs + @ 1453 days 6 hours 27 mins 58.5 secs + @ 1453 days 6 hours 27 mins 58.4 secs + @ 1493 days + @ 1492 days 20 hours 55 mins 55 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1333 days 7 hours 27 mins 59 secs + @ 231 days 17 hours 19 mins 20 secs + @ 324 days 15 hours 45 mins 59 secs + @ 324 days 19 hours 45 mins 58 secs + @ 324 days 21 hours 45 mins 57 secs + @ 324 days 20 hours 45 mins 56 secs + @ 324 days 22 hours 45 mins 55 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 28 mins + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 14 hours 27 mins 59 secs + @ 1453 days 14 hours 27 mins 59 secs + @ 1453 days 14 hours 27 mins 59 secs + @ 1453 days 9 hours 27 mins 59 secs + @ 1303 days 10 hours 27 mins 59 secs + @ 1333 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1452 days 6 hours 27 mins 59 secs + @ 1451 days 6 hours 27 mins 59 secs + @ 1450 days 6 hours 27 mins 59 secs + @ 1449 days 6 hours 27 mins 59 secs + @ 1448 days 6 hours 27 mins 59 secs + @ 1447 days 6 hours 27 mins 59 secs + @ 765901 days 6 hours 27 mins 59 secs + @ 695407 days 6 hours 27 mins 59 secs + @ 512786 days 6 hours 27 mins 59 secs + @ 330165 days 6 hours 27 mins 59 secs + @ 111019 days 6 hours 27 mins 59 secs + @ 74495 days 6 hours 27 mins 59 secs + @ 37971 days 6 hours 27 mins 59 secs + @ 1447 days 6 hours 27 mins 59 secs + @ 35077 days 17 hours 32 mins 1 sec + @ 1801 days 6 hours 27 mins 59 secs + @ 1800 days 6 hours 27 mins 59 secs + @ 1799 days 6 hours 27 mins 59 secs + @ 1495 days 6 hours 27 mins 59 secs + @ 1494 days 6 hours 27 mins 59 secs + @ 1493 days 6 hours 27 mins 59 secs + @ 1435 days 6 hours 27 mins 59 secs + @ 1434 days 6 hours 27 mins 59 secs + @ 1130 days 6 hours 27 mins 59 secs + @ 1129 days 6 hours 27 mins 59 secs + @ 399 days 6 hours 27 mins 59 secs + @ 398 days 6 hours 27 mins 59 secs + @ 33 days 6 hours 27 mins 59 secs + @ 32 days 6 hours 27 mins 59 secs +(66 rows) + +SELECT d1 <-> date '2001-02-03' AS "Distance" FROM TIMESTAMPTZ_TBL WHERE isfinite(d1); + Distance +--------------------------------------- + @ 11356 days 8 hours + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 58 secs + @ 1453 days 6 hours 27 mins 58.6 secs + @ 1453 days 6 hours 27 mins 58.5 secs + @ 1453 days 6 hours 27 mins 58.4 secs + @ 1493 days + @ 1492 days 20 hours 55 mins 55 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1333 days 7 hours 27 mins 59 secs + @ 231 days 17 hours 19 mins 20 secs + @ 324 days 15 hours 45 mins 59 secs + @ 324 days 19 hours 45 mins 58 secs + @ 324 days 21 hours 45 mins 57 secs + @ 324 days 20 hours 45 mins 56 secs + @ 324 days 22 hours 45 mins 55 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 28 mins + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1453 days 14 hours 27 mins 59 secs + @ 1453 days 14 hours 27 mins 59 secs + @ 1453 days 14 hours 27 mins 59 secs + @ 1453 days 9 hours 27 mins 59 secs + @ 1303 days 10 hours 27 mins 59 secs + @ 1333 days 6 hours 27 mins 59 secs + @ 1453 days 6 hours 27 mins 59 secs + @ 1452 days 6 hours 27 mins 59 secs + @ 1451 days 6 hours 27 mins 59 secs + @ 1450 days 6 hours 27 mins 59 secs + @ 1449 days 6 hours 27 mins 59 secs + @ 1448 days 6 hours 27 mins 59 secs + @ 1447 days 6 hours 27 mins 59 secs + @ 765901 days 6 hours 27 mins 59 secs + @ 695407 days 6 hours 27 mins 59 secs + @ 512786 days 6 hours 27 mins 59 secs + @ 330165 days 6 hours 27 mins 59 secs + @ 111019 days 6 hours 27 mins 59 secs + @ 74495 days 6 hours 27 mins 59 secs + @ 37971 days 6 hours 27 mins 59 secs + @ 1447 days 6 hours 27 mins 59 secs + @ 35077 days 17 hours 32 mins 1 sec + @ 1801 days 6 hours 27 mins 59 secs + @ 1800 days 6 hours 27 mins 59 secs + @ 1799 days 6 hours 27 mins 59 secs + @ 1495 days 6 hours 27 mins 59 secs + @ 1494 days 6 hours 27 mins 59 secs + @ 1493 days 6 hours 27 mins 59 secs + @ 1435 days 6 hours 27 mins 59 secs + @ 1434 days 6 hours 27 mins 59 secs + @ 1130 days 6 hours 27 mins 59 secs + @ 1129 days 6 hours 27 mins 59 secs + @ 399 days 6 hours 27 mins 59 secs + @ 398 days 6 hours 27 mins 59 secs + @ 33 days 6 hours 27 mins 59 secs + @ 32 days 6 hours 27 mins 59 secs +(64 rows) + +SELECT d1 <-> timestamp '2001-02-03 01:23:45' AS "Distance" FROM TIMESTAMPTZ_TBL; + Distance +--------------------------------------- + infinity + infinity + @ 11356 days 9 hours 23 mins 45 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 43 secs + @ 1453 days 7 hours 51 mins 43.6 secs + @ 1453 days 7 hours 51 mins 43.5 secs + @ 1453 days 7 hours 51 mins 43.4 secs + @ 1493 days 1 hour 23 mins 45 secs + @ 1492 days 22 hours 19 mins 40 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1333 days 8 hours 51 mins 44 secs + @ 231 days 15 hours 55 mins 35 secs + @ 324 days 17 hours 9 mins 44 secs + @ 324 days 21 hours 9 mins 43 secs + @ 324 days 23 hours 9 mins 42 secs + @ 324 days 22 hours 9 mins 41 secs + @ 325 days 9 mins 40 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 45 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 15 hours 51 mins 44 secs + @ 1453 days 15 hours 51 mins 44 secs + @ 1453 days 15 hours 51 mins 44 secs + @ 1453 days 10 hours 51 mins 44 secs + @ 1303 days 11 hours 51 mins 44 secs + @ 1333 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1452 days 7 hours 51 mins 44 secs + @ 1451 days 7 hours 51 mins 44 secs + @ 1450 days 7 hours 51 mins 44 secs + @ 1449 days 7 hours 51 mins 44 secs + @ 1448 days 7 hours 51 mins 44 secs + @ 1447 days 7 hours 51 mins 44 secs + @ 765901 days 7 hours 51 mins 44 secs + @ 695407 days 7 hours 51 mins 44 secs + @ 512786 days 7 hours 51 mins 44 secs + @ 330165 days 7 hours 51 mins 44 secs + @ 111019 days 7 hours 51 mins 44 secs + @ 74495 days 7 hours 51 mins 44 secs + @ 37971 days 7 hours 51 mins 44 secs + @ 1447 days 7 hours 51 mins 44 secs + @ 35077 days 16 hours 8 mins 16 secs + @ 1801 days 7 hours 51 mins 44 secs + @ 1800 days 7 hours 51 mins 44 secs + @ 1799 days 7 hours 51 mins 44 secs + @ 1495 days 7 hours 51 mins 44 secs + @ 1494 days 7 hours 51 mins 44 secs + @ 1493 days 7 hours 51 mins 44 secs + @ 1435 days 7 hours 51 mins 44 secs + @ 1434 days 7 hours 51 mins 44 secs + @ 1130 days 7 hours 51 mins 44 secs + @ 1129 days 7 hours 51 mins 44 secs + @ 399 days 7 hours 51 mins 44 secs + @ 398 days 7 hours 51 mins 44 secs + @ 33 days 7 hours 51 mins 44 secs + @ 32 days 7 hours 51 mins 44 secs +(66 rows) + +SELECT d1 <-> timestamp '2001-02-03 01:23:45' AS "Distance" FROM TIMESTAMPTZ_TBL WHERE isfinite(d1); + Distance +--------------------------------------- + @ 11356 days 9 hours 23 mins 45 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 43 secs + @ 1453 days 7 hours 51 mins 43.6 secs + @ 1453 days 7 hours 51 mins 43.5 secs + @ 1453 days 7 hours 51 mins 43.4 secs + @ 1493 days 1 hour 23 mins 45 secs + @ 1492 days 22 hours 19 mins 40 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1333 days 8 hours 51 mins 44 secs + @ 231 days 15 hours 55 mins 35 secs + @ 324 days 17 hours 9 mins 44 secs + @ 324 days 21 hours 9 mins 43 secs + @ 324 days 23 hours 9 mins 42 secs + @ 324 days 22 hours 9 mins 41 secs + @ 325 days 9 mins 40 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 45 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1453 days 15 hours 51 mins 44 secs + @ 1453 days 15 hours 51 mins 44 secs + @ 1453 days 15 hours 51 mins 44 secs + @ 1453 days 10 hours 51 mins 44 secs + @ 1303 days 11 hours 51 mins 44 secs + @ 1333 days 7 hours 51 mins 44 secs + @ 1453 days 7 hours 51 mins 44 secs + @ 1452 days 7 hours 51 mins 44 secs + @ 1451 days 7 hours 51 mins 44 secs + @ 1450 days 7 hours 51 mins 44 secs + @ 1449 days 7 hours 51 mins 44 secs + @ 1448 days 7 hours 51 mins 44 secs + @ 1447 days 7 hours 51 mins 44 secs + @ 765901 days 7 hours 51 mins 44 secs + @ 695407 days 7 hours 51 mins 44 secs + @ 512786 days 7 hours 51 mins 44 secs + @ 330165 days 7 hours 51 mins 44 secs + @ 111019 days 7 hours 51 mins 44 secs + @ 74495 days 7 hours 51 mins 44 secs + @ 37971 days 7 hours 51 mins 44 secs + @ 1447 days 7 hours 51 mins 44 secs + @ 35077 days 16 hours 8 mins 16 secs + @ 1801 days 7 hours 51 mins 44 secs + @ 1800 days 7 hours 51 mins 44 secs + @ 1799 days 7 hours 51 mins 44 secs + @ 1495 days 7 hours 51 mins 44 secs + @ 1494 days 7 hours 51 mins 44 secs + @ 1493 days 7 hours 51 mins 44 secs + @ 1435 days 7 hours 51 mins 44 secs + @ 1434 days 7 hours 51 mins 44 secs + @ 1130 days 7 hours 51 mins 44 secs + @ 1129 days 7 hours 51 mins 44 secs + @ 399 days 7 hours 51 mins 44 secs + @ 398 days 7 hours 51 mins 44 secs + @ 33 days 7 hours 51 mins 44 secs + @ 32 days 7 hours 51 mins 44 secs +(64 rows) + +SELECT d1 <-> timestamptz '2001-02-03 01:23:45+03' AS "Distance" FROM TIMESTAMPTZ_TBL; + Distance +---------------------------------------- + infinity + infinity + @ 11355 days 22 hours 23 mins 45 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 43 secs + @ 1452 days 20 hours 51 mins 43.6 secs + @ 1452 days 20 hours 51 mins 43.5 secs + @ 1452 days 20 hours 51 mins 43.4 secs + @ 1492 days 14 hours 23 mins 45 secs + @ 1492 days 11 hours 19 mins 40 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1332 days 21 hours 51 mins 44 secs + @ 232 days 2 hours 55 mins 35 secs + @ 324 days 6 hours 9 mins 44 secs + @ 324 days 10 hours 9 mins 43 secs + @ 324 days 12 hours 9 mins 42 secs + @ 324 days 11 hours 9 mins 41 secs + @ 324 days 13 hours 9 mins 40 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 45 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1453 days 4 hours 51 mins 44 secs + @ 1453 days 4 hours 51 mins 44 secs + @ 1453 days 4 hours 51 mins 44 secs + @ 1452 days 23 hours 51 mins 44 secs + @ 1303 days 51 mins 44 secs + @ 1332 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1451 days 20 hours 51 mins 44 secs + @ 1450 days 20 hours 51 mins 44 secs + @ 1449 days 20 hours 51 mins 44 secs + @ 1448 days 20 hours 51 mins 44 secs + @ 1447 days 20 hours 51 mins 44 secs + @ 1446 days 20 hours 51 mins 44 secs + @ 765900 days 20 hours 51 mins 44 secs + @ 695406 days 20 hours 51 mins 44 secs + @ 512785 days 20 hours 51 mins 44 secs + @ 330164 days 20 hours 51 mins 44 secs + @ 111018 days 20 hours 51 mins 44 secs + @ 74494 days 20 hours 51 mins 44 secs + @ 37970 days 20 hours 51 mins 44 secs + @ 1446 days 20 hours 51 mins 44 secs + @ 35078 days 3 hours 8 mins 16 secs + @ 1800 days 20 hours 51 mins 44 secs + @ 1799 days 20 hours 51 mins 44 secs + @ 1798 days 20 hours 51 mins 44 secs + @ 1494 days 20 hours 51 mins 44 secs + @ 1493 days 20 hours 51 mins 44 secs + @ 1492 days 20 hours 51 mins 44 secs + @ 1434 days 20 hours 51 mins 44 secs + @ 1433 days 20 hours 51 mins 44 secs + @ 1129 days 20 hours 51 mins 44 secs + @ 1128 days 20 hours 51 mins 44 secs + @ 398 days 20 hours 51 mins 44 secs + @ 397 days 20 hours 51 mins 44 secs + @ 32 days 20 hours 51 mins 44 secs + @ 31 days 20 hours 51 mins 44 secs +(66 rows) + +SELECT d1 <-> timestamptz '2001-02-03 01:23:45+03' AS "Distance" FROM TIMESTAMPTZ_TBL WHERE isfinite(d1); + Distance +---------------------------------------- + @ 11355 days 22 hours 23 mins 45 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 43 secs + @ 1452 days 20 hours 51 mins 43.6 secs + @ 1452 days 20 hours 51 mins 43.5 secs + @ 1452 days 20 hours 51 mins 43.4 secs + @ 1492 days 14 hours 23 mins 45 secs + @ 1492 days 11 hours 19 mins 40 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1332 days 21 hours 51 mins 44 secs + @ 232 days 2 hours 55 mins 35 secs + @ 324 days 6 hours 9 mins 44 secs + @ 324 days 10 hours 9 mins 43 secs + @ 324 days 12 hours 9 mins 42 secs + @ 324 days 11 hours 9 mins 41 secs + @ 324 days 13 hours 9 mins 40 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 45 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1453 days 4 hours 51 mins 44 secs + @ 1453 days 4 hours 51 mins 44 secs + @ 1453 days 4 hours 51 mins 44 secs + @ 1452 days 23 hours 51 mins 44 secs + @ 1303 days 51 mins 44 secs + @ 1332 days 20 hours 51 mins 44 secs + @ 1452 days 20 hours 51 mins 44 secs + @ 1451 days 20 hours 51 mins 44 secs + @ 1450 days 20 hours 51 mins 44 secs + @ 1449 days 20 hours 51 mins 44 secs + @ 1448 days 20 hours 51 mins 44 secs + @ 1447 days 20 hours 51 mins 44 secs + @ 1446 days 20 hours 51 mins 44 secs + @ 765900 days 20 hours 51 mins 44 secs + @ 695406 days 20 hours 51 mins 44 secs + @ 512785 days 20 hours 51 mins 44 secs + @ 330164 days 20 hours 51 mins 44 secs + @ 111018 days 20 hours 51 mins 44 secs + @ 74494 days 20 hours 51 mins 44 secs + @ 37970 days 20 hours 51 mins 44 secs + @ 1446 days 20 hours 51 mins 44 secs + @ 35078 days 3 hours 8 mins 16 secs + @ 1800 days 20 hours 51 mins 44 secs + @ 1799 days 20 hours 51 mins 44 secs + @ 1798 days 20 hours 51 mins 44 secs + @ 1494 days 20 hours 51 mins 44 secs + @ 1493 days 20 hours 51 mins 44 secs + @ 1492 days 20 hours 51 mins 44 secs + @ 1434 days 20 hours 51 mins 44 secs + @ 1433 days 20 hours 51 mins 44 secs + @ 1129 days 20 hours 51 mins 44 secs + @ 1128 days 20 hours 51 mins 44 secs + @ 398 days 20 hours 51 mins 44 secs + @ 397 days 20 hours 51 mins 44 secs + @ 32 days 20 hours 51 mins 44 secs + @ 31 days 20 hours 51 mins 44 secs +(64 rows) + diff --git a/src/test/regress/sql/date.sql b/src/test/regress/sql/date.sql index 1c58ff6966..43bdd65417 100644 --- a/src/test/regress/sql/date.sql +++ b/src/test/regress/sql/date.sql @@ -373,3 +373,8 @@ select make_date(2013, 13, 1); select make_date(2013, 11, -1); select make_time(10, 55, 100.1); select make_time(24, 0, 2.1); + +-- distance operators +SELECT '' AS "Fifteen", f1 <-> date '2001-02-03' AS "Distance" FROM DATE_TBL; +SELECT '' AS "Fifteen", f1 <-> timestamp '2001-02-03 01:23:45' AS "Distance" FROM DATE_TBL; +SELECT '' AS "Fifteen", f1 <-> timestamptz '2001-02-03 01:23:45+03' AS "Distance" FROM DATE_TBL; diff --git a/src/test/regress/sql/float4.sql b/src/test/regress/sql/float4.sql index 8fb12368c3..594ac2fadf 100644 --- a/src/test/regress/sql/float4.sql +++ b/src/test/regress/sql/float4.sql @@ -100,6 +100,9 @@ UPDATE FLOAT4_TBL SELECT * FROM FLOAT4_TBL; +SELECT '' AS five, f.f1, f.f1 <-> '1004.3' AS dist FROM FLOAT4_TBL f; +SELECT '' AS five, f.f1, f.f1 <-> '1004.3'::float8 AS dist FROM FLOAT4_TBL f; + -- test edge-case coercions to integer SELECT '32767.4'::float4::int2; SELECT '32767.6'::float4::int2; diff --git a/src/test/regress/sql/float8.sql b/src/test/regress/sql/float8.sql index 98e9926c9e..e477534a59 100644 --- a/src/test/regress/sql/float8.sql +++ b/src/test/regress/sql/float8.sql @@ -176,6 +176,9 @@ SELECT ||/ float8 '27' AS three; SELECT f.f1, ||/f.f1 AS cbrt_f1 FROM FLOAT8_TBL f; +-- distance +SELECT f.f1, f.f1 <-> '1004.3'::float8 AS dist FROM FLOAT8_TBL f; +SELECT f.f1, f.f1 <-> '1004.3'::float4 AS dist FROM FLOAT8_TBL f; SELECT * FROM FLOAT8_TBL; diff --git a/src/test/regress/sql/int2.sql b/src/test/regress/sql/int2.sql index df1e46d4e2..30678e0a13 100644 --- a/src/test/regress/sql/int2.sql +++ b/src/test/regress/sql/int2.sql @@ -87,6 +87,16 @@ SELECT i.f1, i.f1 / int2 '2' AS x FROM INT2_TBL i; SELECT i.f1, i.f1 / int4 '2' AS x FROM INT2_TBL i; +-- distance +SELECT '' AS five, i.f1, i.f1 <-> int2 '2' AS x FROM INT2_TBL i; + +SELECT '' AS four, i.f1, i.f1 <-> int2 '2' AS x FROM INT2_TBL i +WHERE f1 > -32767; + +SELECT '' AS five, i.f1, i.f1 <-> int4 '2' AS x FROM INT2_TBL i; + +SELECT '' AS five, i.f1, i.f1 <-> int8 '2' AS x FROM INT2_TBL i; + -- corner cases SELECT (-1::int2<<15)::text; SELECT ((-1::int2<<15)+1::int2)::text; diff --git a/src/test/regress/sql/int4.sql b/src/test/regress/sql/int4.sql index e9d89e8111..888da6eede 100644 --- a/src/test/regress/sql/int4.sql +++ b/src/test/regress/sql/int4.sql @@ -87,6 +87,16 @@ SELECT i.f1, i.f1 / int2 '2' AS x FROM INT4_TBL i; SELECT i.f1, i.f1 / int4 '2' AS x FROM INT4_TBL i; +SELECT '' AS five, i.f1, i.f1 <-> int2 '2' AS x FROM INT4_TBL i; + +SELECT '' AS four, i.f1, i.f1 <-> int2 '2' AS x FROM INT4_TBL i +WHERE f1 > -2147483647; + +SELECT '' AS four, i.f1, i.f1 <-> int4 '2' AS x FROM INT4_TBL i +WHERE f1 > -2147483647; + +SELECT '' AS five, i.f1, i.f1 <-> int8 '2' AS x FROM INT4_TBL i; + -- -- more complex expressions -- diff --git a/src/test/regress/sql/int8.sql b/src/test/regress/sql/int8.sql index fffb28906a..4e759a9838 100644 --- a/src/test/regress/sql/int8.sql +++ b/src/test/regress/sql/int8.sql @@ -90,6 +90,11 @@ SELECT q1 + 42::int2 AS "8plus2", q1 - 42::int2 AS "8minus2", q1 * 42::int2 AS " -- int2 op int8 SELECT 246::int2 + q1 AS "2plus8", 246::int2 - q1 AS "2minus8", 246::int2 * q1 AS "2mul8", 246::int2 / q1 AS "2div8" FROM INT8_TBL; +-- distance +SELECT '' AS five, q2, q2 <-> int2 '123' AS dist FROM INT8_TBL i; +SELECT '' AS five, q2, q2 <-> int4 '123' AS dist FROM INT8_TBL i; +SELECT '' AS five, q2, q2 <-> int8 '123' AS dist FROM INT8_TBL i; + SELECT q2, abs(q2) FROM INT8_TBL; SELECT min(q1), min(q2) FROM INT8_TBL; SELECT max(q1), max(q2) FROM INT8_TBL; diff --git a/src/test/regress/sql/interval.sql b/src/test/regress/sql/interval.sql index 5566ad0e51..89f409c976 100644 --- a/src/test/regress/sql/interval.sql +++ b/src/test/regress/sql/interval.sql @@ -81,6 +81,8 @@ SELECT -('-9223372036854775808 us'::interval); -- should fail SELECT -('-9223372036854775807 us'::interval); -- ok SELECT -('-2147483647 months -2147483647 days -9223372036854775807 us'::interval); -- should fail +SELECT f1 <-> interval '@ 2 day 3 hours' FROM INTERVAL_TBL; + -- Test intervals that are large enough to overflow 64 bits in comparisons CREATE TEMP TABLE INTERVAL_TBL_OF (f1 interval); INSERT INTO INTERVAL_TBL_OF (f1) VALUES diff --git a/src/test/regress/sql/money.sql b/src/test/regress/sql/money.sql index 81c92dd960..2cd65c1f59 100644 --- a/src/test/regress/sql/money.sql +++ b/src/test/regress/sql/money.sql @@ -27,6 +27,7 @@ SELECT m / 2::float8 FROM money_data; SELECT m * 2::float4 FROM money_data; SELECT 2::float4 * m FROM money_data; SELECT m / 2::float4 FROM money_data; +SELECT m <-> '$123.45' FROM money_data; -- All true SELECT m = '$123.00' FROM money_data; diff --git a/src/test/regress/sql/oid.sql b/src/test/regress/sql/oid.sql index a96b2aa1e3..223c082c73 100644 --- a/src/test/regress/sql/oid.sql +++ b/src/test/regress/sql/oid.sql @@ -54,4 +54,6 @@ SELECT o.* FROM OID_TBL o WHERE o.f1 >= '1234'; SELECT o.* FROM OID_TBL o WHERE o.f1 > '1234'; +SELECT '' AS eight, f1, f1 <-> oid '123' FROM OID_TBL; + DROP TABLE OID_TBL; diff --git a/src/test/regress/sql/time.sql b/src/test/regress/sql/time.sql index eb375a36e9..4c40158669 100644 --- a/src/test/regress/sql/time.sql +++ b/src/test/regress/sql/time.sql @@ -77,3 +77,6 @@ SELECT date_part('microsecond', TIME '2020-05-26 13:30:25.575401'); SELECT date_part('millisecond', TIME '2020-05-26 13:30:25.575401'); SELECT date_part('second', TIME '2020-05-26 13:30:25.575401'); SELECT date_part('epoch', TIME '2020-05-26 13:30:25.575401'); + +-- distance +SELECT f1 <-> time '01:23:45' AS "Distance" FROM TIME_TBL; diff --git a/src/test/regress/sql/timestamp.sql b/src/test/regress/sql/timestamp.sql index ea12ffd18d..d449b5d3f1 100644 --- a/src/test/regress/sql/timestamp.sql +++ b/src/test/regress/sql/timestamp.sql @@ -416,3 +416,12 @@ select age(timestamp 'infinity', timestamp 'infinity'); select age(timestamp 'infinity', timestamp '-infinity'); select age(timestamp '-infinity', timestamp 'infinity'); select age(timestamp '-infinity', timestamp '-infinity'); +SELECT make_timestamp(2014,12,28,6,30,45.887); + +-- distance operators +SELECT d1 <-> date '2001-02-03' AS "Distance" FROM TIMESTAMP_TBL; +SELECT d1 <-> date '2001-02-03' AS "Distance" FROM TIMESTAMP_TBL WHERE isfinite(d1); +SELECT d1 <-> timestamp '2001-02-03 01:23:45' AS "Distance" FROM TIMESTAMP_TBL; +SELECT d1 <-> timestamp '2001-02-03 01:23:45' AS "Distance" FROM TIMESTAMP_TBL WHERE isfinite(d1); +SELECT d1 <-> timestamptz '2001-02-03 01:23:45+03' AS "Distance" FROM TIMESTAMP_TBL; +SELECT d1 <-> timestamptz '2001-02-03 01:23:45+03' AS "Distance" FROM TIMESTAMP_TBL WHERE isfinite(d1); diff --git a/src/test/regress/sql/timestamptz.sql b/src/test/regress/sql/timestamptz.sql index a2dcd5f5d8..fdd9a9a72c 100644 --- a/src/test/regress/sql/timestamptz.sql +++ b/src/test/regress/sql/timestamptz.sql @@ -660,3 +660,11 @@ SELECT age(timestamptz 'infinity', timestamptz 'infinity'); SELECT age(timestamptz 'infinity', timestamptz '-infinity'); SELECT age(timestamptz '-infinity', timestamptz 'infinity'); SELECT age(timestamptz '-infinity', timestamptz '-infinity'); + +-- distance operators +SELECT d1 <-> date '2001-02-03' AS "Distance" FROM TIMESTAMPTZ_TBL; +SELECT d1 <-> date '2001-02-03' AS "Distance" FROM TIMESTAMPTZ_TBL WHERE isfinite(d1); +SELECT d1 <-> timestamp '2001-02-03 01:23:45' AS "Distance" FROM TIMESTAMPTZ_TBL; +SELECT d1 <-> timestamp '2001-02-03 01:23:45' AS "Distance" FROM TIMESTAMPTZ_TBL WHERE isfinite(d1); +SELECT d1 <-> timestamptz '2001-02-03 01:23:45+03' AS "Distance" FROM TIMESTAMPTZ_TBL; +SELECT d1 <-> timestamptz '2001-02-03 01:23:45+03' AS "Distance" FROM TIMESTAMPTZ_TBL WHERE isfinite(d1); -- 2.43.0