query T
SELECT '2000-05-05 10:00:00+03':::TIMESTAMP
----
2000-05-05 10:00:00 +0000 +0000

statement ok
CREATE TABLE a (a int); INSERT INTO a VALUES(1)

# Ensure that timestamp serialization doesn't break even if the computation is
# distributed: #28110.

query T
SELECT '2000-05-05 10:00:00+03':::TIMESTAMP FROM a
----
2000-05-05 10:00:00 +0000 +0000

query T
select '2001-1-18 1:00:00.001-8':::TIMESTAMPTZ
----
2001-01-18 09:00:00.001 +0000 UTC

# Test timezone() and ... AT TIME ZONE functions.
subtest timezone

statement ok
SET TIME ZONE 'PST8PDT'

query TT
SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'MST', timezone('MST', TIMESTAMP '2001-02-16 20:38:40')
----
2001-02-16 19:38:40 -0800 PST  2001-02-16 19:38:40 -0800 PST

query TT
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'MST', timezone('MST', TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05')
----
2001-02-16 18:38:40 +0000 +0000  2001-02-16 18:38:40 +0000 +0000

query TT
SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'MST', timezone('MST', TIMESTAMP '2001-02-16 20:38:40')
----
2001-02-16 19:38:40 -0800 PST  2001-02-16 19:38:40 -0800 PST

# Test timestamp precisions
subtest timestamp_precision

query error precision 7 out of range
select '2001-1-18 1:00:00.001':::TIMESTAMP(7)

query error precision 7 out of range
select '2001-1-18 1:00:00.001':::TIMESTAMPTZ(7)

query T
select '2001-1-18 1:00:00.001':::TIMESTAMP(0)
----
2001-01-18 01:00:00 +0000 +0000

query T
select '2001-1-18 1:00:00.001':::TIMESTAMP(6)
----
2001-01-18 01:00:00.001 +0000 +0000

query T
select '2001-1-18 1:00:00.001':::TIMESTAMP
----
2001-01-18 01:00:00.001 +0000 +0000

query T
select '2001-1-18 1:00:00.001-8':::TIMESTAMPTZ(0)
----
2001-01-18 01:00:00 -0800 PST

query T
select '2001-1-18 1:00:00.001-8':::TIMESTAMPTZ(6)
----
2001-01-18 01:00:00.001 -0800 PST

query B
select current_timestamp(3) - current_timestamp <= '1ms'::interval
----
true

statement ok
CREATE TABLE timestamp_test (
  id integer PRIMARY KEY,
  t TIMESTAMP(5),
  ttz TIMESTAMPTZ(4)
)

statement ok
INSERT INTO timestamp_test VALUES
  (1, '2001-01-01 12:00:00.123456', '2001-01-01 12:00:00.123456+4'),
  (2, '2001-01-01 12:00:00.12345', '2001-01-01 12:00:00.12345+4'),
  (3, '2001-01-01 12:00:00.1234', '2001-01-01 12:00:00.1234+4'),
  (4, '2001-01-01 12:00:00.123', '2001-01-01 12:00:00.123+4'),
  (5, '2001-01-01 12:00:00.12', '2001-01-01 12:00:00.12+4'),
  (6, '2001-01-01 12:00:00.1', '2001-01-01 12:00:00.1+4'),
  (7, '2001-01-01 12:00:00', '2001-01-01 12:00:00+4')

query ITT
SELECT * FROM timestamp_test ORDER BY id ASC
----
1  2001-01-01 12:00:00.12346 +0000 +0000  2001-01-01 00:00:00.1235 -0800 PST
2  2001-01-01 12:00:00.12345 +0000 +0000  2001-01-01 00:00:00.1235 -0800 PST
3  2001-01-01 12:00:00.1234 +0000 +0000   2001-01-01 00:00:00.1234 -0800 PST
4  2001-01-01 12:00:00.123 +0000 +0000    2001-01-01 00:00:00.123 -0800 PST
5  2001-01-01 12:00:00.12 +0000 +0000     2001-01-01 00:00:00.12 -0800 PST
6  2001-01-01 12:00:00.1 +0000 +0000      2001-01-01 00:00:00.1 -0800 PST
7  2001-01-01 12:00:00 +0000 +0000        2001-01-01 00:00:00 -0800 PST

query TT
select column_name, data_type FROM [SHOW COLUMNS FROM timestamp_test] ORDER BY column_name
----
id   INT8
t    TIMESTAMP(5)
ttz  TIMESTAMPTZ(4)

query ITTTT
SELECT id, t::timestamp(0), t::timestamp(3), ttz::timestamptz(0), ttz::timestamptz(3) FROM timestamp_test ORDER BY id
----
1  2001-01-01 12:00:00 +0000 +0000  2001-01-01 12:00:00.123 +0000 +0000  2001-01-01 00:00:00 -0800 PST  2001-01-01 00:00:00.124 -0800 PST
2  2001-01-01 12:00:00 +0000 +0000  2001-01-01 12:00:00.123 +0000 +0000  2001-01-01 00:00:00 -0800 PST  2001-01-01 00:00:00.124 -0800 PST
3  2001-01-01 12:00:00 +0000 +0000  2001-01-01 12:00:00.123 +0000 +0000  2001-01-01 00:00:00 -0800 PST  2001-01-01 00:00:00.123 -0800 PST
4  2001-01-01 12:00:00 +0000 +0000  2001-01-01 12:00:00.123 +0000 +0000  2001-01-01 00:00:00 -0800 PST  2001-01-01 00:00:00.123 -0800 PST
5  2001-01-01 12:00:00 +0000 +0000  2001-01-01 12:00:00.12 +0000 +0000   2001-01-01 00:00:00 -0800 PST  2001-01-01 00:00:00.12 -0800 PST
6  2001-01-01 12:00:00 +0000 +0000  2001-01-01 12:00:00.1 +0000 +0000    2001-01-01 00:00:00 -0800 PST  2001-01-01 00:00:00.1 -0800 PST
7  2001-01-01 12:00:00 +0000 +0000  2001-01-01 12:00:00 +0000 +0000      2001-01-01 00:00:00 -0800 PST  2001-01-01 00:00:00 -0800 PST

# Altering type to more units of precision should work.
statement ok
ALTER TABLE timestamp_test ALTER COLUMN t TYPE timestamp

statement ok
ALTER TABLE timestamp_test ALTER COLUMN ttz TYPE timestamptz(5)

statement ok
INSERT INTO timestamp_test VALUES
  (100, '2001-01-01 12:00:00.123456', '2001-01-01 12:00:00.123456+4')

query ITT
SELECT * FROM timestamp_test ORDER BY id ASC
----
1    2001-01-01 12:00:00.12346 +0000 +0000   2001-01-01 00:00:00.1235 -0800 PST
2    2001-01-01 12:00:00.12345 +0000 +0000   2001-01-01 00:00:00.1235 -0800 PST
3    2001-01-01 12:00:00.1234 +0000 +0000    2001-01-01 00:00:00.1234 -0800 PST
4    2001-01-01 12:00:00.123 +0000 +0000     2001-01-01 00:00:00.123 -0800 PST
5    2001-01-01 12:00:00.12 +0000 +0000      2001-01-01 00:00:00.12 -0800 PST
6    2001-01-01 12:00:00.1 +0000 +0000       2001-01-01 00:00:00.1 -0800 PST
7    2001-01-01 12:00:00 +0000 +0000         2001-01-01 00:00:00 -0800 PST
100  2001-01-01 12:00:00.123456 +0000 +0000  2001-01-01 00:00:00.12346 -0800 PST

query TT
select column_name, data_type FROM [SHOW COLUMNS FROM timestamp_test] ORDER BY column_name
----
id   INT8
t    TIMESTAMP
ttz  TIMESTAMPTZ(5)

subtest regression_timestamp_comparison

statement ok
SET TIME ZONE -5

query B
SELECT '2001-01-01'::date = '2001-01-01 00:00:00'::timestamp
----
true

query B
SELECT '2001-01-01'::date = '2001-01-01 00:00:00-5'::timestamptz
----
true

query B
SELECT '2001-01-01 00:00:00'::timestamp = '2001-01-01 01:00:00-4'::timestamptz
----
true

subtest regression_django-cockroachdb_47

statement ok
SET TIME ZONE -3

query R
SELECT extract(hour FROM '2001-01-01 13:00:00+01'::timestamptz)
----
9

query R
SELECT extract(hour FROM '2001-01-01 13:00:00'::timestamp)
----
13

query R
SELECT extract(timezone FROM '2001-01-01 13:00:00+01:15'::timestamptz)
----
-10800

statement ok
SET TIME ZONE +3

query R
SELECT extract(hour FROM '2001-01-01 13:00:00+01'::timestamptz)
----
15

query R
SELECT extract(hour FROM '2001-01-01 13:00:00'::timestamp)
----
13

query R
SELECT extract(timezone FROM '2001-01-01 13:00:00+01:15'::timestamptz)
----
10800

subtest regression_41776

statement ok
SET TIME ZONE 'GMT+1'

query T
SELECT '2001-01-01 00:00:00'::TIMESTAMP::TIMESTAMPTZ
----
2001-01-01 00:00:00 -0100 -0100

statement ok
SET TIME ZONE '+1:00'

query T
SELECT '2001-01-01 00:00:00'::TIMESTAMP::TIMESTAMPTZ
----
2001-01-01 00:00:00 -0100 -0100


# test that current_timestamp is correct in different timezones.
subtest current_timestamp_correct_in_timezone

statement ok
set time zone +3

statement ok
create table current_timestamp_test (a timestamp, b timestamptz)

statement ok
insert into current_timestamp_test values (current_timestamp, current_timestamp)

statement ok
set time zone 0

# a was written at an interval 3 hours ahead, and should persist that way.
# b will remember the timezone, so should be "constant" for comparison's sake.
query TT
select * from current_timestamp_test WHERE a - interval '3h' <> b
----

subtest localtimestamp_test

query TTTT
select pg_typeof(localtimestamp), pg_typeof(current_timestamp), pg_typeof(localtimestamp(3)), pg_typeof(current_timestamp(3))
----
timestamp without time zone  timestamp with time zone  timestamp without time zone  timestamp with time zone

query B
select localtimestamp(3) - localtimestamp <= '1ms'::interval
----
true

# When doing daylight savings comparisons, ensure they compare correctly.
# Test day before and after DST.
subtest regression_django-cockroachdb_120

statement ok
SET TIME ZONE 'America/Chicago'

query T
SELECT '1882-05-23T00:00:00-05:51'::timestamptz::text
----
1882-05-23 00:00:24-05:50:36

query B
SELECT '2011-03-13'::date = '2011-03-13'::timestamp
----
true

query B
SELECT '2011-03-13'::date = '2011-03-13'::timestamptz
----
true

query B
SELECT '2011-03-13'::timestamp = '2011-03-13'::timestamptz
----
true

query B
SELECT '2011-03-14'::date = '2011-03-14'::timestamp
----
true

query B
SELECT '2011-03-14'::date = '2011-03-14'::timestamptz
----
true

query B
SELECT '2011-03-14'::timestamp = '2011-03-14'::timestamptz
----
true

statement ok
SET TIME ZONE '-00:10:15'

query T
SELECT '1882-05-23T00:00:00-05:51'::timestamptz::text
----
1882-05-23 06:01:15+00:10:15

statement ok
SET TIME ZONE 0

# Check default types and expressions get truncated on insert / update.
subtest regression_44774

statement ok
CREATE TABLE regression_44774 (
  a timestamp(3) DEFAULT '1970-02-03 12:13:14.123456',
  b timestamptz(3) DEFAULT '1970-02-03 12:13:14.123456'
)

statement ok
INSERT INTO regression_44774 VALUES (default, default), ('2020-02-05 19:21:57.261286', '2020-02-05 19:21:57.261286')

query TT
SELECT a, b FROM regression_44774 ORDER BY a
----
1970-02-03 12:13:14.123 +0000 +0000  1970-02-03 12:13:14.123 +0000 +0000
2020-02-05 19:21:57.261 +0000 +0000  2020-02-05 19:21:57.261 +0000 +0000

statement ok
UPDATE regression_44774
SET a = '1970-03-04 13:14:15.123456'::timestamp + '1 sec'::interval, b = '1970-03-04 13:14:15.123456'::timestamptz + '1 sec'::interval
WHERE 1 = 1

query TT
SELECT a, b FROM regression_44774 ORDER BY a
----
1970-03-04 13:14:16.123 +0000 +0000  1970-03-04 13:14:16.123 +0000 +0000
1970-03-04 13:14:16.123 +0000 +0000  1970-03-04 13:14:16.123 +0000 +0000

statement ok
DROP TABLE regression_44774

# Test for timestamptz math with interval involving DST.
subtest regression-cockroachdb/django-cockroachdb_57

statement ok
SET TIME ZONE 'America/Chicago'

query T nosort
WITH a(a) AS ( VALUES
  ('2010-11-06 23:59:00'::timestamptz + '24 hours'::interval), -- no offset specified
  ('2010-11-06 23:59:00'::timestamptz + '1 day'::interval),
  ('2010-11-06 23:59:00'::timestamptz + '1 month'::interval),
  ('2010-11-07 23:59:00'::timestamptz - '24 hours'::interval),
  ('2010-11-07 23:59:00'::timestamptz - '1 day'::interval),
  ('2010-11-07 23:59:00'::timestamptz - '1 month'::interval),
  ('2010-11-06 23:59:00-05'::timestamptz + '24 hours'::interval), -- offset at time zone
  ('2010-11-06 23:59:00-05'::timestamptz + '1 day'::interval),
  ('2010-11-06 23:59:00-05'::timestamptz + '1 month'::interval),
  ('2010-11-07 23:59:00-06'::timestamptz - '24 hours'::interval),
  ('2010-11-07 23:59:00-06'::timestamptz - '1 day'::interval),
  ('2010-11-07 23:59:00-06'::timestamptz - '1 month'::interval),
  ('2010-11-06 23:59:00-04'::timestamptz + '24 hours'::interval), -- different offset
  ('2010-11-06 23:59:00-04'::timestamptz + '1 day'::interval),
  ('2010-11-06 23:59:00-04'::timestamptz + '1 month'::interval),
  ('2010-11-07 23:59:00-04'::timestamptz - '24 hours'::interval),
  ('2010-11-07 23:59:00-04'::timestamptz - '1 day'::interval),
  ('2010-11-07 23:59:00-04'::timestamptz - '1 month'::interval)
) select * from a;
----
2010-11-07 22:59:00 -0600 CST
2010-11-07 23:59:00 -0600 CST
2010-12-06 23:59:00 -0600 CST
2010-11-07 00:59:00 -0500 CDT
2010-11-06 23:59:00 -0500 CDT
2010-10-07 23:59:00 -0500 CDT
2010-11-07 22:59:00 -0600 CST
2010-11-07 23:59:00 -0600 CST
2010-12-06 23:59:00 -0600 CST
2010-11-07 00:59:00 -0500 CDT
2010-11-06 23:59:00 -0500 CDT
2010-10-07 23:59:00 -0500 CDT
2010-11-07 21:59:00 -0600 CST
2010-11-07 22:59:00 -0600 CST
2010-12-06 22:59:00 -0600 CST
2010-11-06 22:59:00 -0500 CDT
2010-11-06 21:59:00 -0500 CDT
2010-10-07 21:59:00 -0500 CDT

statement ok
CREATE TABLE example (a timestamptz)

statement ok
INSERT INTO example VALUES
  ('2010-11-06 23:59:00'),
  ('2010-11-07 23:59:00')

query TTTTTTTTT
SELECT
  a + '24 hours'::interval, a + '1 day'::interval, a + '1 month'::interval,
  a - '24 hours'::interval, a - '1 day'::interval, a - '1 month'::interval,
  a - '2010-11-06 23:59:00'::timestamptz,
  a - '2010-11-07 23:59:00'::timestamptz,
  a::string
FROM example
ORDER BY a
----
2010-11-07 22:59:00 -0600 CST  2010-11-07 23:59:00 -0600 CST  2010-12-06 23:59:00 -0600 CST  2010-11-05 23:59:00 -0500 CDT  2010-11-05 23:59:00 -0500 CDT  2010-10-06 23:59:00 -0500 CDT  00:00:00        -1 days -01:00:00  2010-11-06 23:59:00-05
2010-11-08 23:59:00 -0600 CST  2010-11-08 23:59:00 -0600 CST  2010-12-07 23:59:00 -0600 CST  2010-11-07 00:59:00 -0500 CDT  2010-11-06 23:59:00 -0500 CDT  2010-10-07 23:59:00 -0500 CDT  1 day 01:00:00  00:00:00           2010-11-07 23:59:00-06

statement ok
DROP TABLE example

statement ok
SET TIME ZONE 0

subtest regression_46973

statement ok
CREATE TABLE regression_46973(c0 TIMESTAMP UNIQUE, c1 TIMESTAMPTZ UNIQUE)

statement ok
INSERT INTO regression_46973 VALUES ('1970-01-01 00:00:00', '1970-01-01 00:00:00')

statement error "292277026596-12-04T15:30:08Z" exceeds supported timestamp bounds
SELECT * FROM regression_46973 WHERE (-9223372036854775808)::TIMESTAMP!=regression_46973.c0

statement error "292277026596-12-04T15:30:08Z" exceeds supported timestamp bounds
SELECT * FROM regression_46973 WHERE (-9223372036854775808)::TIMESTAMPTZ!=regression_46973.c1

statement error "294277-01-01T00:00:00Z" exceeds supported timestamp bounds
SELECT '294276-12-31 23:59:59.999999'::TIMESTAMP(0)

statement ok
DROP TABLE regression_46973

subtest regression_extract_epoch_timestamptz

query R
set time zone 'Europe/Berlin'; select extract(epoch from TIMESTAMP WITH TIME ZONE '2010-11-06 23:59:00-05:00')
----
1.28910594e+09

query R
set time zone 'UTC'; select extract(epoch from TIMESTAMP WITH TIME ZONE '2010-11-06 23:59:00-05:00')
----
1.28910594e+09

query TTTTTT nosort
SET TIME ZONE 'Europe/Berlin'; SELECT
  age(a::timestamptz, b::timestamptz),
  age(b::timestamptz, a::timestamptz),
  a::timestamptz - b::timestamptz,
  b::timestamptz - a::timestamptz,
  a::timestamp - b::timestamp,
  b::timestamp - a::timestamp
FROM (VALUES
  ('2020-05-06 11:12:13', '2015-06-07 13:14:15'),
  ('2020-05-06 15:00:00.112233', '2020-04-03 16:00:00.001122'),
  ('2020-02-29 00:02:05', '2019-02-28 18:19:01'),
  ('2020-02-29 00:02:05', '2020-01-28 18:19:01'),
  ('2020-02-29 00:02:05', '2020-03-28 18:19:01'),
  ('2021-02-27 00:02:05.333333', '2019-02-28 18:19:01.444444'),
  ('2021-02-27 00:02:05', '2021-01-28 18:19:01'),
  ('2021-02-27 00:02:05', '2021-03-28 18:19:01'),
  ('2020-02-28 00:02:05', '2020-02-28 18:19:01'),
  ('2020-06-30 11:11:11.111111', '2020-06-29 12:12:12.222222')
) regression_age_tests(a, b)
----
4 years 10 mons 28 days 21:57:58        -4 years -10 mons -28 days -21:57:58         1794 days 21:57:58        -1794 days -21:57:58        1794 days 21:57:58        -1794 days -21:57:58
1 mon 2 days 23:00:00.111111            -1 mons -2 days -23:00:00.111111             32 days 23:00:00.111111   -32 days -23:00:00.111111   32 days 23:00:00.111111   -32 days -23:00:00.111111
1 year 05:43:04                         -1 years -05:43:04                           365 days 05:43:04         -365 days -05:43:04         365 days 05:43:04         -365 days -05:43:04
1 mon 05:43:04                          -1 mons -05:43:04                            31 days 05:43:04          -31 days -05:43:04          31 days 05:43:04          -31 days -05:43:04
-28 days -18:16:56                      28 days 18:16:56                             -28 days -18:16:56        28 days 18:16:56            -28 days -18:16:56        28 days 18:16:56
1 year 11 mons 26 days 05:43:03.888889  -1 years -11 mons -26 days -05:43:03.888889  729 days 05:43:03.888889  -729 days -05:43:03.888889  729 days 05:43:03.888889  -729 days -05:43:03.888889
29 days 05:43:04                        -29 days -05:43:04                           29 days 05:43:04          -29 days -05:43:04          29 days 05:43:04          -29 days -05:43:04
-1 mons -1 days -17:16:56               1 mon 1 day 17:16:56                         -29 days -17:16:56        29 days 17:16:56            -29 days -18:16:56        29 days 18:16:56
-18:16:56                               18:16:56                                     -18:16:56                 18:16:56                    -18:16:56                 18:16:56
22:58:58.888889                         -22:58:58.888889                             22:58:58.888889           -22:58:58.888889            22:58:58.888889           -22:58:58.888889

query T
SET TIME ZONE 'AuStralIA/SyDNEY'; SELECT '2000-05-15 00:00:00'::timestamptz
----
2000-05-15 00:00:00 +1000 AEST

query T nosort
SET TIME ZONE 'Europe/Bucharest';
SELECT t FROM (VALUES
  ('2020-10-25 03:00+3'::TIMESTAMPTZ + '0 hour'::interval),
  ('2020-10-25 03:00+3'::TIMESTAMPTZ + '1 hour'::interval),
  ('2020-10-25 03:00+2'::TIMESTAMPTZ + '0 hour'::interval),
  ('2020-10-25 03:00+2'::TIMESTAMPTZ + '1 hour'::interval)
) interval_math_regression_64772(t)
----
2020-10-25 03:00:00 +0300 EEST
2020-10-25 03:00:00 +0200 EET
2020-10-25 03:00:00 +0200 EET
2020-10-25 04:00:00 +0200 EET

query TT nosort
SET TIME ZONE 'Europe/Bucharest';
SELECT date_trunc('day', t), date_trunc('hour', t) FROM (VALUES
  ('2020-10-25 03:00+03:00'::timestamptz),
  ('2020-10-25 03:00+02:00'::timestamptz)
) date_trunc_regression_64772(t)
----
2020-10-25 00:00:00 +0300 EEST  2020-10-25 03:00:00 +0300 EEST
2020-10-25 00:00:00 +0300 EEST  2020-10-25 03:00:00 +0200 EET


# Test for to_timestamp
statement ok
SET TIME ZONE 'UTC'

## Test for to_timestamp without implicit type conversion
query TTT
SELECT to_timestamp(1646906263.123456), to_timestamp(1646906263), to_timestamp('1646906263.123456')
----
2022-03-10 09:57:43.123456 +0000 UTC  2022-03-10 09:57:43 +0000 UTC  2022-03-10 09:57:43.123456 +0000 UTC

## Test for to_timestamp with positive and negative infinities
query TT
SELECT to_timestamp('infinity'), to_timestamp('-infinity')
----
infinity  -infinity

## Test for to_timestamp with NULL
query T
SELECT to_timestamp(NULL)
----
NULL

# Regression test for #83094 (vectorized engine incorrectly formatting an
# interval).
statement ok
CREATE TABLE t (t1 timestamptz, t2 timestamptz);
INSERT INTO t VALUES ('2022-01-01 00:00:00.000000+00:00', '2022-01-02 00:00:00.000000+00:00');

query T
SELECT (t2 - t1) FROM t
----
1 day

# Rough translation of the to_char tests from PostgreSQL.
statement ok
CREATE TABLE TIMESTAMPTZ_TBL (id SERIAL, d1 timestamp(2) with time zone);
INSERT INTO TIMESTAMPTZ_TBL (d1) VALUES
  ('1997-06-10 17:32:01 -07:00'),
  ('2001-09-22T18:19:20');

query T
SELECT to_char(d1, 'DAY Day day DY Dy dy MONTH Month month MON Mon mon')
   FROM TIMESTAMPTZ_TBL ORDER BY id
----
wednesday Wednesday wednesday wed Wed wed JUNE      June      june      JUN Jun jun
saturday  Saturday  saturday  sat Sat sat SEPTEMBER September september SEP Sep sep

query T
SELECT to_char(d1, 'FMDAY FMDay FMday FMMONTH FMMonth FMmonth')
   FROM TIMESTAMPTZ_TBL ORDER BY id
----
wednesday Wednesday wednesday JUNE June june
saturday Saturday saturday SEPTEMBER September september

query T
SELECT to_char(d1, 'Y,YYY YYYY YYY YY Y CC Q MM WW DDD DD D J')
   FROM TIMESTAMPTZ_TBL ORDER BY id
----
1,997 1997 997 97 7 20 2 06 24 162 11 4 2450611
2,001 2001 001 01 1 21 3 09 38 265 22 7 2452175

query T
SELECT to_char(d1, 'FMY,YYY FMYYYY FMYYY FMYY FMY FMCC FMQ FMMM FMWW FMDDD FMDD FMD FMJ')
   FROM TIMESTAMPTZ_TBL ORDER BY id
----
1,997 1997 997 97 7 20 2 6 24 162 11 4 2450611
2,001 2001 1 1 1 21 3 9 38 265 22 7 2452175

query T
SELECT to_char(d1::timestamp, 'FMY,YYY FMYYYY FMYYY FMYY FMY FMCC FMQ FMMM FMWW FMDDD FMDD FMD FMJ')
   FROM TIMESTAMPTZ_TBL ORDER BY id
----
1,997 1997 997 97 7 20 2 6 24 162 11 4 2450611
2,001 2001 1 1 1 21 3 9 38 265 22 7 2452175

query T
SELECT to_char(d1, 'HH HH12 HH24 MI SS SSSS')
   FROM TIMESTAMPTZ_TBL ORDER BY id
----
12 12 00 32 01 1921
06 06 18 19 20 65960

query T
SELECT to_char(d1, E'"HH:MI:SS is" HH:MI:SS "\\"text between quote marks\\""')
   FROM TIMESTAMPTZ_TBL ORDER BY id
----
HH:MI:SS is 12:32:01 "text between quote marks"
HH:MI:SS is 06:19:20 "text between quote marks"

query T
SELECT to_char(d1, 'HH24--text--MI--text--SS')
   FROM TIMESTAMPTZ_TBL ORDER BY id
----
00--text--32--text--01
18--text--19--text--20

query T
SELECT to_char(d1, 'YYYYTH YYYYth Jth')
   FROM TIMESTAMPTZ_TBL ORDER BY id
----
1997TH 1997th 2450611th
2001ST 2001st 2452175th

query T
SELECT to_char(d1, 'YYYY A.D. YYYY a.d. YYYY bc HH:MI:SS P.M. HH:MI:SS p.m. HH:MI:SS pm')
   FROM TIMESTAMPTZ_TBL ORDER BY id
----
1997 A.D. 1997 a.d. 1997 ad 12:32:01 A.M. 12:32:01 a.m. 12:32:01 am
2001 A.D. 2001 a.d. 2001 ad 06:19:20 P.M. 06:19:20 p.m. 06:19:20 pm

query T
SELECT to_char(d1, 'IYYY IYY IY I IW IDDD ID')
   FROM TIMESTAMPTZ_TBL ORDER BY id
----
1997 997 97 7 24 164 3
2001 001 01 1 38 265 6

query T
SELECT to_char(d1, 'FMIYYY FMIYY FMIY FMI FMIW FMIDDD FMID')
   FROM TIMESTAMPTZ_TBL ORDER BY id
----
1997 997 97 7 24 164 3
2001 1 1 1 38 265 6

query T nosort
SELECT to_char(d, 'FF1 FF2 FF3 FF4 FF5 FF6  ff1 ff2 ff3 ff4 ff5 ff6  MS US')
   FROM (VALUES
       ('2018-11-02 12:34:56'::timestamptz),
       ('2018-11-02 12:34:56.78'::timestamptz),
       ('2018-11-02 12:34:56.78901'::timestamptz),
       ('2018-11-02 12:34:56.78901234'::timestamptz)
   ) d(d)
----
0 00 000 0000 00000 000000  0 00 000 0000 00000 000000  000 000000
7 78 780 7800 78000 780000  7 78 780 7800 78000 780000  780 780000
7 78 789 7890 78901 789010  7 78 789 7890 78901 789010  789 789010
7 78 789 7890 78901 789012  7 78 789 7890 78901 789012  789 789012

query T
SET timezone = '00:00';
SELECT ARRAY[
  '2018-11-02 12:34:56.78901234'::timestamptz,
  '2018-11-02 12:34:56.78901234-07'::timestamptz
]
----
{"2018-11-02 12:34:56.789012+00","2018-11-02 19:34:56.789012+00"}

query T
SET timezone = 'Australia/Sydney';
SELECT ARRAY[
  '2018-11-02 12:34:56.78901234'::timestamptz,
  '2018-11-02 12:34:56.78901234-07'::timestamptz
]
----
{"2018-11-02 12:34:56.789012+11","2018-11-03 06:34:56.789012+11"}

query TT
SET timezone = '00:00';
SELECT to_char(now(), 'OF') as of_t, to_char(now(), 'TZH:TZM') as "TZH:TZM";
----
+00  +00:00

query TT
SET timezone = '+02:00';
SELECT to_char(now(), 'OF') as of_t, to_char(now(), 'TZH:TZM') as "TZH:TZM";
----
-02  -02:00

query TT
SET timezone = '-13:00';
SELECT to_char(now(), 'OF') as of_t, to_char(now(), 'TZH:TZM') as "TZH:TZM";
----
+13  +13:00

query TT
SET timezone = '-00:30';
SELECT to_char(now(), 'OF') as of_t, to_char(now(), 'TZH:TZM') as "TZH:TZM";
----
+00:30  +00:30

query TT
SET timezone = '00:30';
SELECT to_char(now(), 'OF') as of_t, to_char(now(), 'TZH:TZM') as "TZH:TZM";
----
-00:30  -00:30

query TT
SET timezone = '-04:30';
SELECT to_char(now(), 'OF') as of_t, to_char(now(), 'TZH:TZM') as "TZH:TZM";
----
+04:30  +04:30

query TT
SET timezone = '04:30';
SELECT to_char(now(), 'OF') as of_t, to_char(now(), 'TZH:TZM') as "TZH:TZM";
----
-04:30  -04:30

query TT
SET timezone = '-04:15';
SELECT to_char(now(), 'OF') as of_t, to_char(now(), 'TZH:TZM') as "TZH:TZM";
----
+04:15  +04:15

query TT
SET timezone = '04:15';
SELECT to_char(now(), 'OF') as of_t, to_char(now(), 'TZH:TZM') as "TZH:TZM";
----
-04:15  -04:15

query TT
RESET timezone;
-- Check of, tzh, tzm with various zone offsets.
SET timezone = '00:00';
SELECT to_char(now(), 'of') as of_t, to_char(now(), 'tzh:tzm') as "tzh:tzm";
----
+00  +00:00

query TT
SET timezone = '+02:00';
SELECT to_char(now(), 'of') as of_t, to_char(now(), 'tzh:tzm') as "tzh:tzm";
----
-02  -02:00

query TT
SET timezone = '-13:00';
SELECT to_char(now(), 'of') as of_t, to_char(now(), 'tzh:tzm') as "tzh:tzm";
----
+13  +13:00

query TT
SET timezone = '-00:30';
SELECT to_char(now(), 'of') as of_t, to_char(now(), 'tzh:tzm') as "tzh:tzm";
----
+00:30  +00:30

query TT
SET timezone = '00:30';
SELECT to_char(now(), 'of') as of_t, to_char(now(), 'tzh:tzm') as "tzh:tzm";
----
-00:30  -00:30

query TT
SET timezone = '-04:30';
SELECT to_char(now(), 'of') as of_t, to_char(now(), 'tzh:tzm') as "tzh:tzm";
----
+04:30  +04:30

query TT
SET timezone = '04:30';
SELECT to_char(now(), 'of') as of_t, to_char(now(), 'tzh:tzm') as "tzh:tzm";
----
-04:30  -04:30

query TT
SET timezone = '-04:15';
SELECT to_char(now(), 'of') as of_t, to_char(now(), 'tzh:tzm') as "tzh:tzm";
----
+04:15  +04:15

query TT
SET timezone = '04:15';
SELECT to_char(now(), 'of') as of_t, to_char(now(), 'tzh:tzm') as "tzh:tzm";
----
-04:15  -04:15

# Test for issue #41564, the behavior of infinity should be consistent with PostgreSQL.
subtest infinity_41564

query T
SELECT 'infinity':::TIMESTAMP
----
infinity

query T
SELECT '-infinity':::TIMESTAMP
----
-infinity

# infinity is greater than any timestamp, including '294276-12-31 23:59:59.999999' (MaxSupportedTime)
query B
SELECT 'infinity'::timestamp > '294276-12-31 23:59:59.999999'::timestamp;
----
true

# -infinity is less than any timestamp, including '4714-11-24 00:00:00+00 BC' (MinSupportedTime)
query B
SELECT '-infinity'::timestamp < '4714-11-24 00:00:00+00 BC'::timestamp;
----
true

# infinity and -infinity should be equal to themselves
query BB
SELECT 'infinity'::timestamp = 'infinity'::timestamp, '-infinity'::timestamp = '-infinity'::timestamp;
----
true true

# infinity add/subtract any interval results in itself
query TT
SELECT 'infinity'::timestamp + '1 second'::interval, 'infinity'::timestamp - '1 second'::interval;
----
infinity infinity

# -infinity add/subtract any interval results in itself
query TT
SELECT '-infinity'::timestamp + '1 second'::interval, '-infinity'::timestamp - '1 second'::interval;
----
-infinity -infinity

subtest end
