Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit cd2624f

Browse files
committed
Fix PL/pgSQL's handling of integer ranges containing underscores.
Commit faff8f8 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
1 parent 5c5bcce commit cd2624f

File tree

5 files changed

+23
-3
lines changed

5 files changed

+23
-3
lines changed

src/backend/parser/scan.l

+1-1
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,7 @@ octfail 0[oO]_?
407407
binfail 0[bB]_?
408408

409409
numeric (({decinteger}\.{decinteger}?)|(\.{decinteger}))
410-
numericfail {decdigit}+\.\.
410+
numericfail {decinteger}\.\.
411411

412412
real ({decinteger}|{numeric})[Ee][-+]?{decinteger}
413413
realfail ({decinteger}|{numeric})[Ee][-+]

src/fe_utils/psqlscan.l

+1-1
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ octfail 0[oO]_?
343343
binfail 0[bB]_?
344344

345345
numeric (({decinteger}\.{decinteger}?)|(\.{decinteger}))
346-
numericfail {decdigit}+\.\.
346+
numericfail {decinteger}\.\.
347347

348348
real ({decinteger}|{numeric})[Ee][-+]?{decinteger}
349349
realfail ({decinteger}|{numeric})[Ee][-+]

src/interfaces/ecpg/preproc/pgc.l

+1-1
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ octfail 0[oO]_?
376376
binfail 0[bB]_?
377377

378378
numeric (({decinteger}\.{decinteger}?)|(\.{decinteger}))
379-
numericfail {decdigit}+\.\.
379+
numericfail {decinteger}\.\.
380380

381381
real ({decinteger}|{numeric})[Ee][-+]?{decinteger}
382382
realfail ({decinteger}|{numeric})[Ee][-+]

src/test/regress/expected/numerology.out

+11
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,17 @@ SELECT 1_000.5e0_1;
297297
10005
298298
(1 row)
299299

300+
DO $$
301+
DECLARE
302+
i int;
303+
BEGIN
304+
FOR i IN 1_001..1_003 LOOP
305+
RAISE NOTICE 'i = %', i;
306+
END LOOP;
307+
END $$;
308+
NOTICE: i = 1001
309+
NOTICE: i = 1002
310+
NOTICE: i = 1003
300311
-- error cases
301312
SELECT _100;
302313
ERROR: column "_100" does not exist

src/test/regress/sql/numerology.sql

+9
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,15 @@ SELECT 1_000.;
7777
SELECT .000_005;
7878
SELECT 1_000.5e0_1;
7979

80+
DO $$
81+
DECLARE
82+
i int;
83+
BEGIN
84+
FOR i IN 1_001..1_003 LOOP
85+
RAISE NOTICE 'i = %', i;
86+
END LOOP;
87+
END $$;
88+
8089
-- error cases
8190
SELECT _100;
8291
SELECT 100_;

0 commit comments

Comments
 (0)