mirror of
https://github.com/postgres/postgres.git
synced 2025-04-21 12:05:57 +03:00
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:
parent
5c5bccef21
commit
cd2624fd97
@ -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][-+]
|
||||
|
@ -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][-+]
|
||||
|
@ -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][-+]
|
||||
|
@ -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
|
||||
|
@ -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_;
|
||||
|
Loading…
x
Reference in New Issue
Block a user