311 lines
5.5 KiB
SQL
311 lines
5.5 KiB
SQL
# name: test/sql/parser/digit_separators.test
|
|
# group: [parser]
|
|
|
|
statement ok
|
|
PRAGMA enable_verification
|
|
|
|
# Simple parse test
|
|
query I
|
|
SELECT 1_2
|
|
----
|
|
12
|
|
|
|
# With decimal notation
|
|
query I
|
|
SELECT 1_2.1_2E1_0
|
|
----
|
|
12.12e10
|
|
|
|
# With string converison
|
|
query I
|
|
SELECT '1_2.1_2E1_0'::DOUBLE
|
|
----
|
|
12.12e10
|
|
|
|
# We cant have multiple underscores, in that case it gets interpreted as the column name
|
|
query I
|
|
SELECT 1__2
|
|
----
|
|
1
|
|
|
|
query I
|
|
SELECT 1_000_000
|
|
----
|
|
1000000
|
|
|
|
query I
|
|
SELECT '1000_000_000'::INT
|
|
----
|
|
1_000_000_000
|
|
|
|
statement error
|
|
SELECT '1000__000__000'::INT
|
|
----
|
|
Could not convert string '1000__000__000' to INT32
|
|
|
|
# Cant start with an underscore
|
|
statement error
|
|
SELECT '_1_2'::INT
|
|
----
|
|
Could not convert string '_1_2' to INT32
|
|
|
|
|
|
# Cant end with an underscore
|
|
statement error
|
|
SELECT '1_2_'::INT
|
|
----
|
|
Could not convert string '1_2_' to INT32
|
|
|
|
# Decimals
|
|
query I
|
|
SELECT 1_2.1_2
|
|
----
|
|
12.12
|
|
|
|
query I
|
|
SELECT 12.1_2
|
|
----
|
|
12.12
|
|
|
|
query I
|
|
SELECT 1_2.12
|
|
----
|
|
12.12
|
|
|
|
# Cant start with an underscore
|
|
statement error
|
|
SELECT '_12.12'::DECIMAL(4,2)
|
|
----
|
|
Conversion Error: Could not convert string "_12.12" to DECIMAL(4,2)
|
|
|
|
statement error
|
|
SELECT '12._12'::DECIMAL(4,2)
|
|
----
|
|
Conversion Error: Could not convert string "12._12" to DECIMAL(4,2)
|
|
|
|
# Cant end with an underscore
|
|
statement error
|
|
SELECT '12_.12'::DECIMAL(4,2)
|
|
----
|
|
Conversion Error: Could not convert string "12_.12" to DECIMAL(4,2)
|
|
|
|
statement error
|
|
SELECT '12.12_'::DECIMAL(4,2)
|
|
----
|
|
Conversion Error: Could not convert string "12.12_" to DECIMAL(4,2)
|
|
|
|
# Floats
|
|
statement error
|
|
SELECT '1__2.1__2'::FLOAT
|
|
----
|
|
Conversion Error: Could not convert string '1__2.1__2' to FLOAT
|
|
|
|
|
|
query I
|
|
SELECT '12.1_2'::FLOAT
|
|
----
|
|
12.12
|
|
|
|
query I
|
|
SELECT '1_2.12'::FLOAT
|
|
----
|
|
12.12
|
|
|
|
query I
|
|
SELECT '12.1_2e2'::FLOAT
|
|
----
|
|
12.12e2
|
|
|
|
# Cant start with an underscore
|
|
statement error
|
|
SELECT '_12.12'::FLOAT == 12.12
|
|
----
|
|
Conversion Error: Could not convert string '_12.12' to FLOAT
|
|
|
|
statement error
|
|
SELECT '12._12'::FLOAT == 12.12
|
|
----
|
|
Conversion Error: Could not convert string '12._12' to FLOAT
|
|
|
|
statement error
|
|
SELECT '12._12e2'::FLOAT == 12.12e2
|
|
----
|
|
Conversion Error: Could not convert string '12._12e2' to FLOAT
|
|
|
|
# Cant end with an underscore
|
|
statement error
|
|
SELECT '12_.12'::FLOAT == 12.12
|
|
----
|
|
Conversion Error: Could not convert string '12_.12' to FLOAT
|
|
|
|
statement error
|
|
SELECT '12.12_'::FLOAT == 12.12
|
|
----
|
|
Conversion Error: Could not convert string '12.12_' to FLOAT
|
|
|
|
statement error
|
|
SELECT '12.12_e2'::FLOAT == 12.12e2
|
|
----
|
|
Conversion Error: Could not convert string '12.12_e2' to FLOAT
|
|
|
|
# Large reals > 19 digits
|
|
query I
|
|
SELECT 1_000_000_000_000_000_000_000::DOUBLE
|
|
----
|
|
1e+21
|
|
|
|
query I
|
|
SELECT .000_000_000_000_000_000_000_123::DOUBLE
|
|
----
|
|
123e-23
|
|
|
|
query I
|
|
SELECT 1_000_000_000_000_000_000_000.5::DOUBLE
|
|
----
|
|
1000000000000000000000.5
|
|
|
|
query I
|
|
SELECT '1_000_000_000.000_000_000_5'::DOUBLE
|
|
----
|
|
1000000000.0000000005
|
|
|
|
# Cant start with an underscore
|
|
statement error
|
|
SELECT '_1_000_000_000_000_000_000_000'::DOUBLE == 1e+21
|
|
----
|
|
Conversion Error: Could not convert string '_1_000_000_000_000_000_000_000' to DOUBLE
|
|
|
|
statement error
|
|
SELECT '._000_000_000_000_000_000_000_123'::DOUBLE == 123e-23
|
|
----
|
|
Conversion Error: Could not convert string '._000_000_000_000_000_000_000_123' to DOUBLE
|
|
|
|
# Cant end with an underscore
|
|
statement error
|
|
SELECT '1_000_000_000_000_000_000_000_'::DOUBLE == 1e+21
|
|
----
|
|
Conversion Error: Could not convert string '1_000_000_000_000_000_000_000_' to DOUBLE
|
|
|
|
statement error
|
|
SELECT '.000_000_000_000_000_000_000_123_'::DOUBLE == 123e-23
|
|
----
|
|
Conversion Error: Could not convert string '.000_000_000_000_000_000_000_123_' to DOUBLE
|
|
|
|
# Exponents
|
|
statement error
|
|
select '20e10_'::FLOAT
|
|
----
|
|
Conversion Error: Could not convert string '20e10_' to FLOAT
|
|
|
|
statement error
|
|
select '20e_10'::FLOAT
|
|
----
|
|
Conversion Error: Could not convert string '20e_10' to FLOAT
|
|
|
|
statement error
|
|
select '20e10_'::BIGINT
|
|
----
|
|
Conversion Error: Could not convert string '20e10_' to INT64
|
|
|
|
statement error
|
|
select '20e_10'::BIGINT
|
|
----
|
|
Conversion Error: Could not convert string '20e_10' to INT64
|
|
|
|
query I
|
|
SELECT 12e1_0::BIGINT == 12e10::BIGINT
|
|
----
|
|
true
|
|
|
|
statement error
|
|
SELECT '12e10_'::BIGINT == 12e10::BIGINT
|
|
----
|
|
Conversion Error: Could not convert string '12e10_' to INT64
|
|
|
|
statement error
|
|
SELECT '_12e10::BIGINT' == 12e10::BIGINT
|
|
----
|
|
Conversion Error: Could not convert string '_12e10::BIGINT' to INT64
|
|
|
|
|
|
# Binary notation (trailing, leading and duplicate underscores)
|
|
|
|
query I
|
|
SELECT '0b01_01'::INT
|
|
----
|
|
5
|
|
|
|
query I
|
|
SELECT '0b0_1_0_1'::INT
|
|
----
|
|
5
|
|
|
|
statement error
|
|
SELECT '0b0_1_0_1_'::INT
|
|
----
|
|
Conversion Error: Could not convert string '0b0_1_0_1_' to INT32
|
|
|
|
statement error
|
|
SELECT '0b_0_1_0_1'::INT
|
|
----
|
|
Conversion Error: Could not convert string '0b_0_1_0_1' to INT32
|
|
|
|
statement error
|
|
SELECT '0b0__1_0_1'::INT
|
|
----
|
|
Conversion Error: Could not convert string '0b0__1_0_1' to INT32
|
|
|
|
# Hex notation (trailing, leading and duplicate underscores)
|
|
|
|
query I
|
|
SELECT '0xFF_FF'::INT;
|
|
----
|
|
65535
|
|
|
|
query I
|
|
SELECT '0xF_F_F_F'::INT;
|
|
----
|
|
65535
|
|
|
|
statement error
|
|
SELECT '0x0_F_F_F_'::INT
|
|
----
|
|
Conversion Error: Could not convert string '0x0_F_F_F_' to INT32
|
|
|
|
statement error
|
|
SELECT '0x_F_F_F'::INT
|
|
----
|
|
Conversion Error: Could not convert string '0x_F_F_F' to INT32
|
|
|
|
statement error
|
|
SELECT '0x0__F_F_F'::INT
|
|
----
|
|
Conversion Error: Could not convert string '0x0__F_F_F' to INT32
|
|
|
|
|
|
# Test decimals keep their width
|
|
query IIII
|
|
SELECT typeof(10.00), typeof(10.0_0), typeof(1_0.00), typeof(1_0.0_0);
|
|
----
|
|
DECIMAL(4,2) DECIMAL(4,2) DECIMAL(4,2) DECIMAL(4,2)
|
|
|
|
|
|
query I
|
|
select 1_2e1_0::FLOAT
|
|
----
|
|
1.2e+11
|
|
|
|
query I
|
|
select '1_2e1_0'::FLOAT
|
|
----
|
|
1.2e+11
|
|
|
|
query I
|
|
select 1_2e1_0::BIGINT
|
|
----
|
|
120000000000
|
|
|
|
query I
|
|
select '1_2e1_0'::BIGINT
|
|
----
|
|
120000000000 |