Fix PL/pgSQL's handling of integer ranges containing underscores.

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
This commit is contained in:
Dean Rasheed 2024-06-04 11:48:01 +01:00
parent 5c5bccef21
commit cd2624fd97
5 changed files with 23 additions and 3 deletions

View File

@ -407,7 +407,7 @@ octfail 0[oO]_?
binfail 0[bB]_?
numeric (({decinteger}\.{decinteger}?)|(\.{decinteger}))
numericfail {decdigit}+\.\.
numericfail {decinteger}\.\.
real ({decinteger}|{numeric})[Ee][-+]?{decinteger}
realfail ({decinteger}|{numeric})[Ee][-+]

View File

@ -343,7 +343,7 @@ octfail 0[oO]_?
binfail 0[bB]_?
numeric (({decinteger}\.{decinteger}?)|(\.{decinteger}))
numericfail {decdigit}+\.\.
numericfail {decinteger}\.\.
real ({decinteger}|{numeric})[Ee][-+]?{decinteger}
realfail ({decinteger}|{numeric})[Ee][-+]

View File

@ -376,7 +376,7 @@ octfail 0[oO]_?
binfail 0[bB]_?
numeric (({decinteger}\.{decinteger}?)|(\.{decinteger}))
numericfail {decdigit}+\.\.
numericfail {decinteger}\.\.
real ({decinteger}|{numeric})[Ee][-+]?{decinteger}
realfail ({decinteger}|{numeric})[Ee][-+]

View File

@ -297,6 +297,17 @@ SELECT 1_000.5e0_1;
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

View File

@ -77,6 +77,15 @@ SELECT 1_000.;
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_;