mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
Non-decimal integer literals
Add support for hexadecimal, octal, and binary integer literals: 0x42F 0o273 0b100101 per SQL:202x draft. This adds support in the lexer as well as in the integer type input functions. Reviewed-by: John Naylor <john.naylor@enterprisedb.com> Reviewed-by: Zhihong Yu <zyu@yugabyte.com> Reviewed-by: David Rowley <dgrowleyml@gmail.com> Reviewed-by: Dean Rasheed <dean.a.rasheed@gmail.com> Discussion: https://www.postgresql.org/message-id/flat/b239564c-cad0-b23e-c57e-166d883cb97d@enterprisedb.com
This commit is contained in:
@@ -323,25 +323,40 @@ operator {op_chars}+
|
||||
* Unary minus is not part of a number here. Instead we pass it separately to
|
||||
* the parser, and there it gets coerced via doNegate().
|
||||
*
|
||||
* {decimalfail} is used because we would like "1..10" to lex as 1, dot_dot, 10.
|
||||
* {numericfail} is used because we would like "1..10" to lex as 1, dot_dot, 10.
|
||||
*
|
||||
* {realfail} is added to prevent the need for scanner
|
||||
* backup when the {real} rule fails to match completely.
|
||||
*/
|
||||
digit [0-9]
|
||||
decdigit [0-9]
|
||||
hexdigit [0-9A-Fa-f]
|
||||
octdigit [0-7]
|
||||
bindigit [0-1]
|
||||
|
||||
integer {digit}+
|
||||
decimal (({digit}*\.{digit}+)|({digit}+\.{digit}*))
|
||||
decimalfail {digit}+\.\.
|
||||
real ({integer}|{decimal})[Ee][-+]?{digit}+
|
||||
realfail ({integer}|{decimal})[Ee][-+]
|
||||
decinteger {decdigit}+
|
||||
hexinteger 0[xX]{hexdigit}+
|
||||
octinteger 0[oO]{octdigit}+
|
||||
bininteger 0[bB]{bindigit}+
|
||||
|
||||
integer_junk {integer}{ident_start}
|
||||
decimal_junk {decimal}{ident_start}
|
||||
hexfail 0[xX]
|
||||
octfail 0[oO]
|
||||
binfail 0[bB]
|
||||
|
||||
numeric (({decinteger}\.{decinteger}?)|(\.{decinteger}))
|
||||
numericfail {decdigit}+\.\.
|
||||
|
||||
real ({decinteger}|{numeric})[Ee][-+]?{decdigit}+
|
||||
realfail ({decinteger}|{numeric})[Ee][-+]
|
||||
|
||||
decinteger_junk {decinteger}{ident_start}
|
||||
hexinteger_junk {hexinteger}{ident_start}
|
||||
octinteger_junk {octinteger}{ident_start}
|
||||
bininteger_junk {bininteger}{ident_start}
|
||||
numeric_junk {numeric}{ident_start}
|
||||
real_junk {real}{ident_start}
|
||||
|
||||
param \${integer}
|
||||
param_junk \${integer}{ident_start}
|
||||
param \${decinteger}
|
||||
param_junk \${decinteger}{ident_start}
|
||||
|
||||
/* psql-specific: characters allowed in variable names */
|
||||
variable_char [A-Za-z\200-\377_0-9]
|
||||
@@ -847,13 +862,31 @@ other .
|
||||
ECHO;
|
||||
}
|
||||
|
||||
{integer} {
|
||||
{decinteger} {
|
||||
ECHO;
|
||||
}
|
||||
{decimal} {
|
||||
{hexinteger} {
|
||||
ECHO;
|
||||
}
|
||||
{decimalfail} {
|
||||
{octinteger} {
|
||||
ECHO;
|
||||
}
|
||||
{bininteger} {
|
||||
ECHO;
|
||||
}
|
||||
{hexfail} {
|
||||
ECHO;
|
||||
}
|
||||
{octfail} {
|
||||
ECHO;
|
||||
}
|
||||
{binfail} {
|
||||
ECHO;
|
||||
}
|
||||
{numeric} {
|
||||
ECHO;
|
||||
}
|
||||
{numericfail} {
|
||||
/* throw back the .., and treat as integer */
|
||||
yyless(yyleng - 2);
|
||||
ECHO;
|
||||
@@ -864,10 +897,19 @@ other .
|
||||
{realfail} {
|
||||
ECHO;
|
||||
}
|
||||
{integer_junk} {
|
||||
{decinteger_junk} {
|
||||
ECHO;
|
||||
}
|
||||
{decimal_junk} {
|
||||
{hexinteger_junk} {
|
||||
ECHO;
|
||||
}
|
||||
{octinteger_junk} {
|
||||
ECHO;
|
||||
}
|
||||
{bininteger_junk} {
|
||||
ECHO;
|
||||
}
|
||||
{numeric_junk} {
|
||||
ECHO;
|
||||
}
|
||||
{real_junk} {
|
||||
|
Reference in New Issue
Block a user