From 6fcda9aba83449082124825b6d375c0a61e21c42 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 14 Dec 2022 05:40:38 +0100 Subject: 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 Reviewed-by: Zhihong Yu Reviewed-by: David Rowley Reviewed-by: Dean Rasheed Discussion: https://www.postgresql.org/message-id/flat/b239564c-cad0-b23e-c57e-166d883cb97d@enterprisedb.com --- src/fe_utils/psqlscan.l | 78 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 60 insertions(+), 18 deletions(-) (limited to 'src/fe_utils') diff --git a/src/fe_utils/psqlscan.l b/src/fe_utils/psqlscan.l index ae531ec2407..cb1fc521384 100644 --- a/src/fe_utils/psqlscan.l +++ b/src/fe_utils/psqlscan.l @@ -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] - -integer {digit}+ -decimal (({digit}*\.{digit}+)|({digit}+\.{digit}*)) -decimalfail {digit}+\.\. -real ({integer}|{decimal})[Ee][-+]?{digit}+ -realfail ({integer}|{decimal})[Ee][-+] - -integer_junk {integer}{ident_start} -decimal_junk {decimal}{ident_start} +decdigit [0-9] +hexdigit [0-9A-Fa-f] +octdigit [0-7] +bindigit [0-1] + +decinteger {decdigit}+ +hexinteger 0[xX]{hexdigit}+ +octinteger 0[oO]{octdigit}+ +bininteger 0[bB]{bindigit}+ + +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; + } +{hexinteger} { + ECHO; + } +{octinteger} { + ECHO; + } +{bininteger} { + ECHO; + } +{hexfail} { ECHO; } -{decimal} { +{octfail} { ECHO; } -{decimalfail} { +{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; + } +{hexinteger_junk} { + ECHO; + } +{octinteger_junk} { + ECHO; + } +{bininteger_junk} { ECHO; } -{decimal_junk} { +{numeric_junk} { ECHO; } {real_junk} { -- cgit v1.2.3