mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +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:
		@@ -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_;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user