Skip to content

Commit

Permalink
Merge pull request #3818 from katzyn/underscore
Browse files Browse the repository at this point in the history
Add support of underscores in numeric literals
  • Loading branch information
katzyn committed Jun 12, 2023
2 parents 1990523 + d425bae commit fb86669
Show file tree
Hide file tree
Showing 9 changed files with 300 additions and 99 deletions.
2 changes: 2 additions & 0 deletions h2/src/main/org/h2/bnf/Bnf.java
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,8 @@ private void parse(Reader reader) throws SQLException, IOException {
addFixedRule("@open_bracket@", RuleFixed.OPEN_BRACKET);
addFixedRule("@close_bracket@", RuleFixed.CLOSE_BRACKET);
addFixedRule("json_text", RuleFixed.JSON_TEXT);
Rule digit = ruleMap.get("digit").getRule();
ruleMap.get("number").setRule(new RuleList(digit, new RuleOptional(new RuleRepeat(digit, false)), false));
}

/**
Expand Down
268 changes: 176 additions & 92 deletions h2/src/main/org/h2/command/Tokenizer.java

Large diffs are not rendered by default.

19 changes: 14 additions & 5 deletions h2/src/main/org/h2/res/help.csv
Original file line number Diff line number Diff line change
Expand Up @@ -2184,7 +2184,7 @@ A literal value of any data type, or null.
"

"Literals","Approximate numeric","
[ + | - ] { { number [ . number ] } | { . number } }
[ + | - ] { { number [ . [ number ] ] } | { . number } }
E [ + | - ] expNumber
","
An approximate numeric value.
Expand All @@ -2198,6 +2198,7 @@ for negative infinity, use ""CAST('-Infinity' AS dataType)"";
for ""NaN"" (not a number), use ""CAST('NaN' AS dataType)"".
","
-1.4e-10
1.111_111E3
CAST(1e2 AS REAL)
CAST('NaN' AS DOUBLE PRECISION)
"
Expand Down Expand Up @@ -2269,30 +2270,34 @@ this type, larger values small enough to fit into [BIGINT](https://h2database.co
type have this type, others also have NUMERIC data type.
","
-1600.05
134_518.235_114
"

"Literals","Hex Number","
[+|-] {0x|0X}{ digit | a-f | A-F } [...]
[+|-] {0x|0X} { [_] { digit | a-f | A-F } [...] } [...]
","
A number written in hexadecimal notation.
","
0xff
0x_ABCD_1234
"

"Literals","Octal Number","
[+|-] {0o|0O}{ 0-7 } [...]
[+|-] {0o|0O} { [_] { 0-7 } [...] } [...]
","
A number written in octal notation.
","
0o664
0o_123_777
"

"Literals","Binary Number","
[+|-] {0b|0B}{ 0-1 } [...]
[+|-] {0b|0B} { [_] { 0-1 } [...] } [...]
","
A number written in binary notation.
","
0b101
0b_01010101_10101010
"

"Literals","Int","
Expand All @@ -2301,6 +2306,7 @@ A number written in binary notation.
The maximum integer number is 2147483647, the minimum is -2147483648.
","
10
65_536
"

"Literals","GEOMETRY","
Expand Down Expand Up @@ -2340,6 +2346,7 @@ JSON X'7472' '7565'
Long numbers are between -9223372036854775808 and 9223372036854775807.
","
100000
1_000_000_000
"

"Literals","Null","
Expand All @@ -2351,11 +2358,12 @@ NULL
"

"Literals","Number","
digit [...]
digit [ [_] digit [...] ] [...]
","
The maximum length of the number depends on the data type used.
","
100
10_000
"

"Literals","Numeric","
Expand All @@ -2369,6 +2377,7 @@ An explicit CAST can be used to change the data type.
-1600.05
CAST(0 AS DOUBLE PRECISION)
-1.4e-10
999_999_999.999_999
"

"Literals","String","
Expand Down
21 changes: 21 additions & 0 deletions h2/src/test/org/h2/test/scripts/datatypes/bigint.sql
Original file line number Diff line number Diff line change
Expand Up @@ -69,3 +69,24 @@ EXPLAIN VALUES (1L, -2147483648L, 2147483647L, -2147483649L, 2147483648L);

VALUES '9223372036854775807' > 0;
>> TRUE

SELECT 123_456_789_012_345, 0x_123_456_789_012_A4F, 1000L, 1_000L, 0xFFFFL, 0xFF_FFL;
> 123456789012345 81985529205303887 1000 1000 65535 65535
> --------------- ----------------- ---- ---- ----- -----
> 123456789012345 81985529205303887 1000 1000 65535 65535
> rows: 1

SELECT 123_456_789_012_345_;
> exception SYNTAX_ERROR_2

SELECT 0o123_456_700_012_345_;
> exception SYNTAX_ERROR_2

SELECT 0o123_456_700_012_345__231;
> exception SYNTAX_ERROR_2

SELECT 1_L;
> exception SYNTAX_ERROR_2

SELECT 9223372036854775808L;
> exception SYNTAX_ERROR_2
43 changes: 43 additions & 0 deletions h2/src/test/org/h2/test/scripts/datatypes/decfloat.sql
Original file line number Diff line number Diff line change
Expand Up @@ -290,3 +290,46 @@ SELECT 'NaN' = CAST('NaN' AS DECFLOAT);

SELECT CAST('NaN' AS DOUBLE ) = CAST('NaN' AS DECFLOAT);
>> TRUE

SELECT 111222E+8_8, 111_222E+1_4;
> 1.11222E+93 1.11222E+19
> ----------- -----------
> 1.11222E+93 1.11222E+19
> rows: 1

SELECT 111222333444555666777E+8_8, 111_222_333_444_555_666_777E+1_4;
> 1.11222333444555666777E+108 1.11222333444555666777E+34
> --------------------------- --------------------------
> 1.11222333444555666777E+108 1.11222333444555666777E+34
> rows: 1

SELECT 111222333444555666777.123E+8_8, 111_222_333_444_555_666_777.888_999E+1_4;
> 1.11222333444555666777123E+108 1.11222333444555666777888999E+34
> ------------------------------ --------------------------------
> 1.11222333444555666777123E+108 1.11222333444555666777888999E+34
> rows: 1

SELECT 1E;
> exception SYNTAX_ERROR_2

SELECT 1E+;
> exception SYNTAX_ERROR_2

SELECT 1E-;
> exception SYNTAX_ERROR_2

SELECT 1E_3;
> exception SYNTAX_ERROR_2

SELECT 1E+_3;
> exception SYNTAX_ERROR_2

SELECT 1E+3__3;
> exception SYNTAX_ERROR_2

SELECT 1E+8_;
> exception SYNTAX_ERROR_2

SELECT 1.3_E+3__3;
> exception SYNTAX_ERROR_2

21 changes: 21 additions & 0 deletions h2/src/test/org/h2/test/scripts/datatypes/int.sql
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,24 @@ SELECT 0x100, 0o100, 0b100;
> --- -- -
> 256 64 4
> rows: 1

SELECT 100_000, 1_1_1, 0b_1_1, 0o_1_1, 0x_1_1;
> 100000 111 3 9 17
> ------ --- - - --
> 100000 111 3 9 17
> rows: 1

SELECT 1_;
> exception SYNTAX_ERROR_2

SELECT _1;
> exception COLUMN_NOT_FOUND_1

SELECT 1__1;
> exception SYNTAX_ERROR_2

SELECT 0x__1;
> exception SYNTAX_ERROR_2

SELECT 0x1_;
> exception SYNTAX_ERROR_2
21 changes: 21 additions & 0 deletions h2/src/test/org/h2/test/scripts/datatypes/numeric.sql
Original file line number Diff line number Diff line change
Expand Up @@ -218,3 +218,24 @@ SELECT CHAR_LENGTH(CAST(A / CAST(B AS NUMERIC(200, 100)) AS VARCHAR)) FROM TEST;

DROP TABLE TEST;
> ok

SELECT 111_222_333_444_555_666_777_888_999, 111_222_333_444_555_666_777.333_444, 123_456., .333, 345_323.765_329, 1.;
> 111222333444555666777888999 111222333444555666777.333444 123456 0.333 345323.765329 1
> --------------------------- ---------------------------- ------ ----- ------------- -
> 111222333444555666777888999 111222333444555666777.333444 123456 0.333 345323.765329 1
> rows: 1

SELECT 1_.;
> exception SYNTAX_ERROR_2

SELECT 1_1._1;
> exception SYNTAX_ERROR_2

SELECT 9_9.9_;
> exception SYNTAX_ERROR_2

SELECT 132_134.3__3;
> exception SYNTAX_ERROR_2

SELECT 111_222_333_444_555_666__777;
> exception SYNTAX_ERROR_2
2 changes: 1 addition & 1 deletion h2/src/test/org/h2/test/scripts/testScript.sql
Original file line number Diff line number Diff line change
Expand Up @@ -5109,7 +5109,7 @@ SELECT T1.* T2;
> exception SYNTAX_ERROR_1

select replace('abchihihi', 'i', 'o') abcehohoho, replace('this is tom', 'i') 1e_th_st_om from test;
> exception SYNTAX_ERROR_1
> exception SYNTAX_ERROR_2

select monthname(date )'005-0E9-12') d_set fm test;
> exception SYNTAX_ERROR_1
Expand Down
2 changes: 1 addition & 1 deletion h2/src/tools/org/h2/build/doc/dictionary.txt
Original file line number Diff line number Diff line change
Expand Up @@ -854,4 +854,4 @@ allotted mismatched wise terminator guarding revolves notion piece submission re
duplicating unnested hardening sticky massacred
bck clo cur hwm materializedview udca vol connectionpooldatasource xadatasource
ampm sssssff sstzh tzs yyyysssss newsequentialid solidus openjdk furthermore ssff secons nashorn fractions
btrim
btrim underscores ffl

0 comments on commit fb86669

Please sign in to comment.