Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1s73ED-003K41-3q for pgsql-hackers@arkaria.postgresql.org; Wed, 15 May 2024 01:14:47 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1s73ED-00609F-0A for pgsql-hackers@arkaria.postgresql.org; Wed, 15 May 2024 01:14:45 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1s73EC-00606i-L8 for pgsql-hackers@lists.postgresql.org; Wed, 15 May 2024 01:14:44 +0000 Received: from mout-u-107.mailbox.org ([80.241.59.207]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1s73E8-000Hch-IK for pgsql-hackers@postgresql.org; Wed, 15 May 2024 01:14:44 +0000 Received: from smtp1.mailbox.org (smtp1.mailbox.org [10.196.197.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-u-107.mailbox.org (Postfix) with ESMTPS id 4VfFct4gHpz9sr8 for ; Wed, 15 May 2024 03:14:38 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ewie.name; s=MBO0001; t=1715735678; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type; bh=myUWbeq6Dft9vbTP07RMjwVaXwnms4emN+nKsrP+HwI=; b=LNNssHKa6aTvsxXMa1RGDzCV3kP6FZtqP1qa/gyAF3jT1TttFmuDA6e0kdIh/Mg0GH6Dhp 9FFcz3wke13wGTi5ZQ2ka/1HfV4X4/br/I+w/xThevvFJXpRuLXC+Ru36z5bh8cAYpHj6r 1CQfYkT2mGYyIkKJPzl2pPL9ffdcJrguJ6A7YSuJtNfdZQtSli0in8ImWzzdlvHorOBuNN jt3ZbzZaIYgAjklm2uKFjhUMjfn1jT8hh0plJoInJwHri49ic4Cn9BqEE2j30Vaznp/f/i mVuXJoxHs+J7c+08AeumFSXmy4W1zkcoJfSQJKYm9NPsbFOUlQZQvUd1dsNtkw== Date: Wed, 15 May 2024 03:14:36 +0200 From: Erik Wienhold To: pgsql-hackers@postgresql.org Subject: plpgsql: fix parsing of integer range with underscores Message-ID: <808ce947-46ec-4628-85fa-3dd600b2c154@ewie.name> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="rnraovvv6dtf2rkw" Content-Disposition: inline List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --rnraovvv6dtf2rkw Content-Type: text/plain; charset=us-ascii Content-Disposition: inline plpgsql fails to parse 1_000..1_000 as 1000..1000 in FOR loops: DO $$ DECLARE i int; BEGIN FOR i IN 1_000..1_000 LOOP END LOOP; END $$; ERROR: syntax error at or near "1_000." LINE 5: FOR i IN 1_000..1_000 LOOP The scan.l defines rule "numericfail" to handle this ambiguity without requiring extra whitespace or parenthesis around the integer literals. But the rule only accepts digits 0-9. Again, an oversight in faff8f8e47. Fixed in the attached patch. -- Erik --rnraovvv6dtf2rkw Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="0001-plpgsql-fix-parsing-of-integer-range-with-underscore.patch" From 7e51d9ea7ef2ffc2a2b8c831533a382a5493575b Mon Sep 17 00:00:00 2001 From: Erik Wienhold Date: Wed, 15 May 2024 02:43:12 +0200 Subject: [PATCH] plpgsql: fix parsing of integer range with underscores Fix lexer rule "numericfail" that ensures that we parse 1_000..1_000 as 1000..1000 instead of failing with 'syntax error at or near "1_000."' or requiring extra whitespace/parenthesis to resolve the ambiguity. Oversight in faff8f8e47 which added underscores to numeric literals. --- src/backend/parser/scan.l | 2 +- src/fe_utils/psqlscan.l | 2 +- src/interfaces/ecpg/preproc/pgc.l | 2 +- src/test/regress/expected/numerology.out | 7 +++++++ src/test/regress/sql/numerology.sql | 8 ++++++++ 5 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l index 5eaadf53b2..a8e504ad09 100644 --- a/src/backend/parser/scan.l +++ b/src/backend/parser/scan.l @@ -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][-+] diff --git a/src/fe_utils/psqlscan.l b/src/fe_utils/psqlscan.l index c9df0594fd..7780151434 100644 --- a/src/fe_utils/psqlscan.l +++ b/src/fe_utils/psqlscan.l @@ -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][-+] diff --git a/src/interfaces/ecpg/preproc/pgc.l b/src/interfaces/ecpg/preproc/pgc.l index bcfbd0978b..7744d2facf 100644 --- a/src/interfaces/ecpg/preproc/pgc.l +++ b/src/interfaces/ecpg/preproc/pgc.l @@ -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][-+] diff --git a/src/test/regress/expected/numerology.out b/src/test/regress/expected/numerology.out index f662a5050a..86caccbbc5 100644 --- a/src/test/regress/expected/numerology.out +++ b/src/test/regress/expected/numerology.out @@ -297,6 +297,13 @@ SELECT 1_000.5e0_1; 10005 (1 row) +DO $$ +DECLARE + i int; +BEGIN + FOR i IN 1_000..1_000 LOOP + END LOOP; +END $$; -- error cases SELECT _100; ERROR: column "_100" does not exist diff --git a/src/test/regress/sql/numerology.sql b/src/test/regress/sql/numerology.sql index 1941c58e68..eb8d4e48d7 100644 --- a/src/test/regress/sql/numerology.sql +++ b/src/test/regress/sql/numerology.sql @@ -77,6 +77,14 @@ SELECT 1_000.; SELECT .000_005; SELECT 1_000.5e0_1; +DO $$ +DECLARE + i int; +BEGIN + FOR i IN 1_000..1_000 LOOP + END LOOP; +END $$; + -- error cases SELECT _100; SELECT 100_; -- 2.45.1 --rnraovvv6dtf2rkw--