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]_?
|
binfail 0[bB]_?
|
||||||
|
|
||||||
numeric (({decinteger}\.{decinteger}?)|(\.{decinteger}))
|
numeric (({decinteger}\.{decinteger}?)|(\.{decinteger}))
|
||||||
numericfail {decdigit}+\.\.
|
numericfail {decinteger}\.\.
|
||||||
|
|
||||||
real ({decinteger}|{numeric})[Ee][-+]?{decinteger}
|
real ({decinteger}|{numeric})[Ee][-+]?{decinteger}
|
||||||
realfail ({decinteger}|{numeric})[Ee][-+]
|
realfail ({decinteger}|{numeric})[Ee][-+]
|
||||||
|
@ -343,7 +343,7 @@ octfail 0[oO]_?
|
|||||||
binfail 0[bB]_?
|
binfail 0[bB]_?
|
||||||
|
|
||||||
numeric (({decinteger}\.{decinteger}?)|(\.{decinteger}))
|
numeric (({decinteger}\.{decinteger}?)|(\.{decinteger}))
|
||||||
numericfail {decdigit}+\.\.
|
numericfail {decinteger}\.\.
|
||||||
|
|
||||||
real ({decinteger}|{numeric})[Ee][-+]?{decinteger}
|
real ({decinteger}|{numeric})[Ee][-+]?{decinteger}
|
||||||
realfail ({decinteger}|{numeric})[Ee][-+]
|
realfail ({decinteger}|{numeric})[Ee][-+]
|
||||||
|
@ -376,7 +376,7 @@ octfail 0[oO]_?
|
|||||||
binfail 0[bB]_?
|
binfail 0[bB]_?
|
||||||
|
|
||||||
numeric (({decinteger}\.{decinteger}?)|(\.{decinteger}))
|
numeric (({decinteger}\.{decinteger}?)|(\.{decinteger}))
|
||||||
numericfail {decdigit}+\.\.
|
numericfail {decinteger}\.\.
|
||||||
|
|
||||||
real ({decinteger}|{numeric})[Ee][-+]?{decinteger}
|
real ({decinteger}|{numeric})[Ee][-+]?{decinteger}
|
||||||
realfail ({decinteger}|{numeric})[Ee][-+]
|
realfail ({decinteger}|{numeric})[Ee][-+]
|
||||||
|
@ -297,6 +297,17 @@ SELECT 1_000.5e0_1;
|
|||||||
10005
|
10005
|
||||||
(1 row)
|
(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
|
-- error cases
|
||||||
SELECT _100;
|
SELECT _100;
|
||||||
ERROR: column "_100" does not exist
|
ERROR: column "_100" does not exist
|
||||||
|
@ -77,6 +77,15 @@ SELECT 1_000.;
|
|||||||
SELECT .000_005;
|
SELECT .000_005;
|
||||||
SELECT 1_000.5e0_1;
|
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
|
-- error cases
|
||||||
SELECT _100;
|
SELECT _100;
|
||||||
SELECT 100_;
|
SELECT 100_;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user