Commit
faff8f8e47 allowed integer literals to contain underscores, but
failed to update the lexer's "numericfail" rule. As a result, a
decimal integer literal containing underscores would fail to parse, if
used in an integer range with no whitespace after the first number,
such as "1_001..1_003" in a PL/pgSQL FOR loop.
Fix and backpatch to v16, where support for underscores in integer
literals was added.
Report and patch by Erik Wienhold.
Discussion: https://postgr.es/m/
808ce947-46ec-4628-85fa-
3dd600b2c154%40ewie.name
binfail 0[bB]_?
numeric (({decinteger}\.{decinteger}?)|(\.{decinteger}))
-numericfail {decdigit}+\.\.
+numericfail {decinteger}\.\.
real ({decinteger}|{numeric})[Ee][-+]?{decinteger}
realfail ({decinteger}|{numeric})[Ee][-+]
binfail 0[bB]_?
numeric (({decinteger}\.{decinteger}?)|(\.{decinteger}))
-numericfail {decdigit}+\.\.
+numericfail {decinteger}\.\.
real ({decinteger}|{numeric})[Ee][-+]?{decinteger}
realfail ({decinteger}|{numeric})[Ee][-+]
binfail 0[bB]_?
numeric (({decinteger}\.{decinteger}?)|(\.{decinteger}))
-numericfail {decdigit}+\.\.
+numericfail {decinteger}\.\.
real ({decinteger}|{numeric})[Ee][-+]?{decinteger}
realfail ({decinteger}|{numeric})[Ee][-+]
10005
(1 row)
+DO $$
+DECLARE
+ i int;
+BEGIN
+ FOR i IN 1_001..1_003 LOOP
+ RAISE NOTICE 'i = %', i;
+ END LOOP;
+END $$;
+NOTICE: i = 1001
+NOTICE: i = 1002
+NOTICE: i = 1003
-- error cases
SELECT _100;
ERROR: column "_100" does not exist
SELECT .000_005;
SELECT 1_000.5e0_1;
+DO $$
+DECLARE
+ i int;
+BEGIN
+ FOR i IN 1_001..1_003 LOOP
+ RAISE NOTICE 'i = %', i;
+ END LOOP;
+END $$;
+
-- error cases
SELECT _100;
SELECT 100_;