# Cast from bytes to string uses the current value of bytea_output.

eval
x'636174'::bytes::string
----
e'\\x636174'

eval
e'\\x636174'::BYTES
----
'\x636174'

eval
e'\\X636174'::BYTES
----
'\x636174'

eval
e'\\x636174'::STRING::BYTES
----
'\x636174'

eval
e'\\x636174'::STRING
----
e'\\x636174'

# Cast expressions.
eval
true::boolean
----
true

eval
true::int
----
1

eval
true::float
----
1.0

eval
length(true::text)
----
4

eval
false::boolean
----
false

eval
false::int
----
0

eval
false::float
----
0.0

eval
true::decimal
----
1

eval
false::decimal
----
0

eval
length(false::text)
----
5

eval
1::boolean
----
true

eval
0::boolean
----
false

eval
1::int
----
1

eval
'1'::int
----
1

eval
1::float
----
1.0

eval
'1'::float
----
1.0

eval
1::decimal
----
1

eval
'1'::decimal
----
1

eval
length(123::text)
----
3

eval
1.1::boolean
----
true

eval
0.0::boolean
----
false

eval
(1.1::decimal)::int
----
1

eval
(1.9::decimal)::int
----
2

eval
(1.1::decimal)::float
----
1.1

eval
(1.1::decimal)::boolean
----
true

eval
(0.0::decimal)::boolean
----
false

eval
(1e300::decimal)::float
----
1e+300

eval
(9223372036854775807::decimal)::int
----
9223372036854775807

# The two largest floats that can be converted to an int, albeit inexactly.
eval
9223372036854775295::float::int
----
9223372036854774784

eval
-9223372036854775295::float::int
----
-9223372036854774784

eval
1.1::int
----
1

eval
1.5::int
----
2

eval
1.9::int
----
2

eval
2.5::int
----
3

eval
3.5::int
----
4

eval
-1.5::int
----
-2

eval
-2.5::int
----
-3

eval
1.1::float
----
1.1

eval
'1.1'::float
----
1.1

eval
-1e+06::float
----
-1e+06

eval
-9.99999e+05
----
-999999

eval
999999.0
----
999999.0

eval
1000000.0
----
1000000.0

eval
-1e+06
----
-1E+6

eval
-9.99999e+05::decimal
----
-999999

eval
999999.0::decimal
----
999999.0

eval
'999999.0'::decimal
----
999999.0

eval
1000000.0::decimal
----
1000000.0

eval
length(1.23::text)
----
4

eval
't'::boolean
----
true

eval
'T'::boolean
----
true

eval
'true'::boolean
----
true

eval
'True'::boolean
----
true

eval
'TRUE'::boolean
----
true

eval
'1'::boolean
----
true

eval
'f'::boolean
----
false

eval
'F'::boolean
----
false

eval
'false'::boolean
----
false

eval
'False'::boolean
----
false

eval
'FALSE'::boolean
----
false

eval
'0'::boolean
----
false

eval
'123'::int + 1
----
124

eval
NULL::int
----
NULL

eval
'0x123'::int + 1
----
292

eval
'0123'::int + 1
----
84

eval
'1.23'::float + 1.0
----
2.23

eval
'hello'::text
----
'hello'

eval
CAST('123' AS int) + 1
----
124

eval
CAST(NULL AS int)
----
NULL

eval
'hello'::char(2)
----
'he'

eval
'a🐛b🏠c'::char(3)
----
e'a\U0001F41Bb'

eval
'hello'::varchar(2)
----
'he'

eval
'a🐛b🏠c'::varchar(3)
----
e'a\U0001F41Bb'

eval
'hello'::bytes
----
'\x68656c6c6f'

eval
b'hello'::string
----
'hello'

# Casting a byte array to string uses the current value of
# bytea_output, which is hex by default in this test.
eval
b'hello'::bytes::string
----
e'\\x68656c6c6f'

eval
b'\xff'
----
'\xff'

eval
123::text
----
'123'

eval
date '2010-09-28'
----
'2010-09-28'

eval
CAST('2010-09-28' AS date)
----
'2010-09-28'

eval
'2010-09-28'::date
----
'2010-09-28'

eval
'2010-09-28'::date::text
----
'2010-09-28'

eval
('2010-09-28'::date)::date
----
'2010-09-28'

eval
'2010-09-28T12:00:00Z'::date
----
'2010-09-28'

eval
'1969-12-30 01:00:00'::timestamp::date
----
'1969-12-30'

eval
time '12:00:00'
----
'12:00:00'

eval
CAST('12:00:00' AS time)
----
'12:00:00'

eval
'12:00:00'::time
----
'12:00:00'

eval
'12:00:00'::time::text
----
'12:00:00'

eval
timetz '12:00:00'
----
'12:00:00+00'

eval
timetz '12:00:00+01'
----
'12:00:00+01'

eval
CAST('12:00:00+01' AS timetz)
----
'12:00:00+01'

eval
'12:00:00+01'::timetz
----
'12:00:00+01'

eval
'12:00:00+01'::timetz::text
----
'12:00:00+01'

eval
timestamp '2010-09-28'
----
'2010-09-28 00:00:00'

eval
CAST('2010-09-28' AS timestamp)
----
'2010-09-28 00:00:00'

eval
'2010-09-28'::timestamp
----
'2010-09-28 00:00:00'

eval
timestamptz '2010-09-28'
----
'2010-09-28 00:00:00+00'

eval
CAST('2010-09-28' AS timestamptz)
----
'2010-09-28 00:00:00+00'

eval
'2010-09-28'::timestamptz
----
'2010-09-28 00:00:00+00'

eval
('2010-09-28 12:00:00.1'::timestamp)::date
----
'2010-09-28'

eval
'2010-09-28 12:00:00.1'::timestamp
----
'2010-09-28 12:00:00.1'

eval
'2010-09-28 12:00:00.1+02:00'::timestamp
----
'2010-09-28 12:00:00.1'

eval
'2010-09-28 12:00:00.524000 +02:00:00'::timestamp
----
'2010-09-28 12:00:00.524'

eval
'2010-09-28 12:00:00.1-07:00'::timestamp
----
'2010-09-28 12:00:00.1'

eval
'2010-09-28T12:00:00'::timestamp
----
'2010-09-28 12:00:00'

eval
'2010-09-28T12:00:00Z'::timestamp
----
'2010-09-28 12:00:00'

eval
'2010-09-28T12:00:00.1'::timestamp
----
'2010-09-28 12:00:00.1'

eval
('2010-09-28'::date)::timestamp
----
'2010-09-28 00:00:00'

eval
'2010-09-28 12:00:00.1-04'::timestamp
----
'2010-09-28 12:00:00.1'

eval
'2010-09-28 12:00:00.1-04'::timestamp::text
----
'2010-09-28 12:00:00.1'

eval
'2010-09-28 12:00:00.1-04'::timestamptz::text
----
'2010-09-28 16:00:00.1+00'

eval
'1969-12-30-01.00.00'::timestamp
----
'1969-12-30 01:00:00'

eval
'1969-12-30 01.00.00'::timestamp
----
'1969-12-30 01:00:00'

eval
'1969-12-30 01.00.00.12300'::timestamp
----
'1969-12-30 01:00:00.123'

eval
'1969-12-30-01.00.00.'::timestamp
----
'1969-12-30 01:00:00'

eval
'12h2m1s23ms'::interval
----
'12:02:01.023'

eval
'12h2m1s23ms'::interval::text
----
'12:02:01.023'

eval
'12:01:02.123456789'::interval::text
----
'12:01:02.123457'

eval
'12:01:02.1234564'::interval
----
'12:01:02.123456'

eval
'12:01:02.1234565'::interval
----
'12:01:02.123457'

eval
'12:01:02.1234566'::interval
----
'12:01:02.123457'

eval
interval '1'
----
'00:00:01'

eval
CAST('1' AS interval)
----
'00:00:01'

eval
'1'::interval
----
'00:00:01'

eval
1::interval
----
'00:00:01'

eval
(1::interval)::interval
----
'00:00:01'

eval
'00:00:01.123456'::interval::interval(3)
----
'00:00:01.123'

eval
'00:00:01.123'::interval::interval(3)
----
'00:00:01.123'

eval
'00:00:01.123456'::interval::interval second(3)
----
'00:00:01.123'

eval
'00:00:01.123'::interval::interval second(3)
----
'00:00:01.123'

eval
'00:02:01.123456'::interval::interval minute
----
'00:02:00'

eval
'00:02:01.123456'::interval minute
----
'00:02:00'

eval
interval '1 year 1 day 02:03:04.567'::int
----
31651384

eval
interval '1 year 1 day 02:03:04.567'::float
----
3.1651384567e+07

eval
'2010-09-28'::date + 3
----
'2010-10-01'

eval
3 + '2010-09-28'::date
----
'2010-10-01'

eval
'2010-09-28'::date - 3
----
'2010-09-25'

eval
'2010-09-28'::date - '2010-10-21'::date
----
-23

eval
'12:00:00'::time + '1s'::interval
----
'12:00:01'

eval
'1s'::interval + '12:00:00'::time
----
'12:00:01'

eval
'12:00:01'::time - '12:00:00'::time
----
'00:00:01'

eval
'2010-09-28 12:00:00.1-04:00'::timestamp + '12h2m'::interval
----
'2010-09-29 00:02:00.1'

eval
'12h2m'::interval + '2010-09-28 12:00:00.1-04:00'::timestamp
----
'2010-09-29 00:02:00.1'

eval
'12 hours 2 minutes'::interval + '2010-09-28 12:00:00.1-04:00'::timestamp
----
'2010-09-29 00:02:00.1'

eval
'PT12H2M'::interval + '2010-09-28 12:00:00.1-04:00'::timestamp
----
'2010-09-29 00:02:00.1'

eval
'12:2'::interval + '2010-09-28 12:00:00.1-04:00'::timestamp
----
'2010-09-29 00:02:00.1'

eval
'2010-09-28 12:00:00.1-04:00'::timestamp - '12h2m'::interval
----
'2010-09-27 23:58:00.1'

eval
'2010-09-28 12:00:00.1-04:00'::timestamp - '12 hours 2 minutes'::interval
----
'2010-09-27 23:58:00.1'

eval
'2010-09-28 12:00:00.1-04:00'::timestamp - 'PT12H2M'::interval
----
'2010-09-27 23:58:00.1'

eval
'2010-09-28 12:00:00.1-04:00'::timestamp - '12:2'::interval
----
'2010-09-27 23:58:00.1'

eval
'2010-09-28 12:00:00.1-04:00'::timestamp - '2010-09-28 12:00:00.1+00:00'::timestamp
----
'00:00:00'

eval
'2010-09-28 12:00:00.1-04:00'::timestamptz - '2010-09-28 16:00:00.1+00:00'::timestamp
----
'00:00:00'

eval
'2010-09-28 12:00:00.1-04:00'::timestamp - '2010-09-28 12:00:00.1+00:00'::timestamptz
----
'00:00:00'

eval
'1970-01-01 00:01:00.123456-00:00'::timestamp::int
----
60

eval
'1970-01-01 00:01:00.123456-00:00'::timestamptz::int
----
60

# Ensure timezone is stripped when casting to timestamp.
eval
'1970-01-01 00:01:00.1-01:00'::timestamptz::timestamp
----
'1970-01-01 01:01:00.1'

eval
'1970-01-01 00:01:00.1-01:00'::timestamp
----
'1970-01-01 00:01:00.1'

eval
'1970-01-10'::date::int
----
9

eval
'2h3s4us'::interval::int
----
7203

eval
'2h3s4us'::interval::int::interval
----
'02:00:03'

eval
'-2h-3s-4us'::interval::int::interval
----
'-02:00:03'

eval
'1mon2d3h4s5us'::interval::int
----
2775604

eval
(-2775604)::int::interval
----
'-1 mons -2 days -03:00:04'

eval
'1mon2d3h4s5us'::interval::int::interval
----
'1 mon 2 days 03:00:04'

eval
'-1mon-2d-3h-4s-5us'::interval::int::interval
----
'-1 mons -2 days -03:00:04'

eval
'1970-01-01 00:01:00.123456-00:00'::timestamp::decimal
----
60.123456

eval
'1970-01-01 00:01:00.123456-00:00'::timestamptz::decimal
----
60.123456

eval
'1970-01-10'::date::decimal
----
9

eval
'2h3s4us'::interval::decimal
----
7203.000004000

eval
7203.000004005::decimal::interval
----
'02:00:03.000004'

eval
'2h3s4us'::interval::decimal::interval
----
'02:00:03.000004'

eval
'-2h-3s-4us'::interval::decimal::interval
----
'-02:00:03.000004'

eval
'1mon2d3h4s5us'::interval::decimal
----
2775604.000005000

eval
'1mon2d3h4s5us'::interval::decimal::interval
----
'1 mon 2 days 03:00:04.000005'

eval
(-2775604.000005006)::decimal::interval
----
'-1 mons -2 days -03:00:04.000005'

eval
'-1mon-2d-3h-4s-5us'::interval::decimal::interval
----
'-1 mons -2 days -03:00:04.000005'

# MaxInt64
eval
(decimal '9223372036854775807.000000001')::interval::decimal
----
9223372036854775807.000000000

# MinInt64
eval
(decimal '-9223372036854775808.000000001')::interval::decimal
----
-9223372036854775808.000000000

# MaxInt64
eval
'296533308798y20d15h30m7s'::interval::decimal::interval
----
'296533308798 years 20 days 15:30:07'

# MinInt64
eval
'-296533308798y-20d-15h-30m-8s'::interval::decimal::interval
----
'-296533308798 years -20 days -15:30:08'

eval
'1970-01-01 00:01:00.123456-00:00'::timestamp::float
----
60.123456

eval
'1970-01-01 00:01:00.123456-00:00'::timestamptz::float
----
60.123456

eval
'1970-01-10'::date::float
----
9.0

eval
'2h3s4us'::interval::float
----
7203.000004

eval
'2h3s4us'::interval::float::interval
----
'02:00:03.000004'

eval
'1mon2d3h4s5us'::interval::float
----
2.775604000005e+06

eval
'1mon2d3h4s5us'::interval::float::interval
----
'1 mon 2 days 03:00:04.000005'

eval
(-2775604.000005006)::float::interval
----
'-1 mons -2 days -03:00:04.000005'

eval
'-1mon-2d-3h-4s-5us'::interval::float::interval
----
'-1 mons -2 days -03:00:04.000005'

eval
10::int::date
----
'1970-01-11'

eval
10::int::timestamp
----
'1970-01-01 00:00:10'

eval
10::int::timestamptz
----
'1970-01-01 00:00:10+00'

eval
10123456::int::interval
----
'3 mons 27 days 04:04:16'

eval
ARRAY[NULL]::string[]
----
ARRAY[NULL]

eval
ARRAY[1,2,3]::string[]
----
ARRAY['1','2','3']

eval
ARRAY['1','2','3']::int[]
----
ARRAY[1,2,3]

eval
ARRAY['1','2','3']::name[]
----
ARRAY['1','2','3']

eval
ARRAY[1,2,3]::decimal[]
----
ARRAY[1,2,3]

eval
ARRAY[1.2,2.4,3.5]::float[]
----
ARRAY[1.2,2.4,3.5]

eval
ARRAY[19620326,19931223]::timestamp[]
----
ARRAY['1970-08-16 02:05:26','1970-08-19 16:27:03']

eval
ARRAY[1.2,2.4,3.5]::decimal[]::float[]
----
ARRAY[1.2,2.4,3.5]

eval
ARRAY['3h3us']::interval[]::decimal[]
----
ARRAY[10800.000003000]

eval
ARRAY[1,NULL,3]::string[]
----
ARRAY['1',NULL,'3']

eval
ARRAY['hello','world']::char(2)[]
----
ARRAY['he','wo']

eval
ARRAY['a🐛b🏠c','def']::char(2)[]
----
ARRAY[e'a\U0001F41B','de']

# regression for #45850
eval
cast(B'11011' || B'00' as bit varying(8))
----
B'1101100'

eval
cast(B'11011' || B'00' as bit varying(6))
----
B'110110'

eval
cast(B'11011' || B'00' as bit(8))
----
B'11011000'

eval
cast(B'11011' || B'00' as bit(6))
----
B'110110'

eval
'0101000000000000000000F03F000000000000F03F'::geography::geometry
----
'0101000020E6100000000000000000F03F000000000000F03F'

eval
'0101000000000000000000F03F000000000000F03F'::geometry::geography
----
'0101000020E6100000000000000000F03F000000000000F03F'

# Test that decimals are correctly cast when the original value is negative.
eval
'-2020-10-10'::timestamp::decimal
----
-125887824000.000000

eval
'-2020-10-10-2020 10:10:00.11111111111111111'::timestamptz::decimal
----
-125887714199.888889

eval
'-10'::interval::decimal
----
-10.000000000

eval
'{hello,a🐛b🏠c}'::VARCHAR(2)[]
----
ARRAY['he',e'a\U0001F41B']

# Test the same cast, but not with a literal constant (see #50132).
eval
('{he' || ',a🐛b🏠}')::VARCHAR(2)[]
----
ARRAY['he',e'a\U0001F41B']

# Chars should truncate trailing space characters.
eval
'hello '::char(100)
----
'hello'

eval
'hello t'::char(100)
----
'hello t'

eval
'hello '::string::char(100)
----
'hello'

eval
'hello t'::string::char(100)
----
'hello t'

# Test that numeric jsonb values can be cast to a numeric data type.
eval
'1'::jsonb::int
----
1

eval
'1'::jsonb::int4
----
1

eval
'1'::jsonb::int2
----
1

eval
'1'::jsonb::float
----
1.0

eval
'1'::jsonb::decimal
----
1

eval
'1'::jsonb::string
----
'1'

eval
'2.0'::jsonb::int
----
2

eval
'1.5'::jsonb::int
----
2

eval
'2.0'::jsonb::float
----
2.0

eval
'2.0'::jsonb::decimal
----
2.0

eval
'2.0'::jsonb::string
----
'2.0'

eval
'3.14'::jsonb::float
----
3.14

eval
'3.14'::jsonb::float4
----
3.14

eval
'3.14'::jsonb::decimal
----
3.14

eval
'9223372036854775808'::jsonb::int
----
integer out of range

eval
'"1"'::jsonb::int
----
cannot cast jsonb string to type int

eval
'true'::jsonb::float
----
cannot cast jsonb boolean to type float

eval
'null'::jsonb::float
----
cannot cast jsonb null to type float

eval
'{}'::jsonb::float
----
cannot cast jsonb object to type float

eval
'[]'::jsonb::float
----
cannot cast jsonb array to type float

eval
'"1"'::jsonb::decimal
----
cannot cast jsonb string to type decimal

# Test that boolean jsonb values can be cast to a BOOL.
eval
'true'::jsonb::bool
----
true

eval
'false'::jsonb::bool
----
false

eval
'1'::jsonb::bool
----
cannot cast jsonb numeric to type bool

# "char" is supposed to truncate long values
eval
'abc'::"char"
----
'a'

eval
'abc'::string::"char"
----
'a'

eval
'null'::jsonb::geography
----
NULL

eval
'null'::jsonb::geometry
----
NULL

# "char" will cast integer values to ASCII characters
eval
99::"char"
----
'c'

eval
93::"char"
----
']'

eval
93::char
----
'9'

eval
65::"char"
----
'A'

eval
65::text
----
'65'

eval
65::char
----
'6'

eval
123::"char"
----
'{'

eval
129::"char"
----
"char" out of range

eval
(-129)::"char"
----
"char" out of range

eval
0::"char"
----
''

eval
32::"char"
----
' '

eval
0::char
----
'0'

eval
1::BIT
----
B'1'

eval
2::BIT
----
B'0'

eval
123::BIT
----
B'1'

eval
'1'::BIT
----
B'1'

eval
'01'::BIT
----
B'0'

eval
'2'::BIT
----
could not parse string as bit array: "2" is not a valid binary digit

eval
(-1)::oid
----
4294967295

# -2147483648 is MinInt32.
eval
(-2147483648)::oid
----
2147483648

# -2147483649 is (MinInt32 - 1).
eval
(-2147483649)::oid
----
OID out of range: -2147483649

# 4294967295 is MaxUint32.
eval
(4294967295)::oid
----
4294967295

# 4294967296 is (MaxUint32 + 1).
eval
(4294967296)::oid
----
OID out of range: 4294967296

eval
date('2020-05-03 01:02:03')
----
'2020-05-03'

eval
date('2020-05-03 01:02:03'::timestamptz)
----
'2020-05-03'

eval
int2(12.1)
----
12

eval
int4(12.1)
----
12

eval
int8(12.1)
----
12

eval
"numeric"('1.1'::string)
----
1.1

eval
"char"(90::int)
----
'Z'

eval
"bpchar"(90::int)
----
'90'

eval
"varbit"('010')
----
B'010'

eval
"bit"('010')
----
B'010'

eval
text(1.11::float8)
----
'1.11'

# Issue #112515: float casting returns the nearest integer,
# rounding ties to even (Banker's rounding).
eval
int8(0.5::float8)
----
0

eval
int8(1.5::float8)
----
2

eval
int8(-0.5::float8)
----
0

eval
int8(-1.5::float8)
----
-2
