Re-forbid underscore in positional parameters
authorPeter Eisentraut <peter@eisentraut.org>
Wed, 15 May 2024 11:49:41 +0000 (13:49 +0200)
committerPeter Eisentraut <peter@eisentraut.org>
Wed, 15 May 2024 11:49:41 +0000 (13:49 +0200)
Underscores were added to numeric literals in faff8f8e47.  This change
also affected the positional parameters (e.g., $1) rule, which uses
the same production for its digits.  But this did not actually work,
because the digits for parameters are processed using atol(), which
does not handle underscores and ignores whatever it cannot parse.

The underscores notation is probably not useful for positional
parameters, so for simplicity revert that rule to its old form that
only accepts digits 0-9.

Author: Erik Wienhold <ewie@ewie.name>
Reviewed-by: Michael Paquier <michael@paquier.xyz>
Discussion: https://www.postgresql.org/message-id/flat/5d216d1c-91f6-4cbe-95e2-b4cbd930520c%40ewie.name

src/backend/parser/scan.l
src/fe_utils/psqlscan.l
src/interfaces/ecpg/preproc/pgc.l
src/test/regress/expected/numerology.out
src/test/regress/sql/numerology.sql

index 5eaadf53b200c7a6b51a4134d0a74adf9b007b57..b499975e9c450978316190dab9cd04789875452c 100644 (file)
@@ -419,8 +419,9 @@ bininteger_junk {bininteger}{ident_start}
 numeric_junk   {numeric}{ident_start}
 real_junk      {real}{ident_start}
 
-param          \${decinteger}
-param_junk     \${decinteger}{ident_start}
+/* Positional parameters don't accept underscores. */
+param          \${decdigit}+
+param_junk     \${decdigit}+{ident_start}
 
 other          .
 
index c9df0594fda6255a80a8bdd45f958a6b42aea9d6..c6d02439ab2cdb7dd05dde3cbc00464ce43026ec 100644 (file)
@@ -355,8 +355,9 @@ bininteger_junk {bininteger}{ident_start}
 numeric_junk   {numeric}{ident_start}
 real_junk      {real}{ident_start}
 
-param          \${decinteger}
-param_junk     \${decinteger}{ident_start}
+/* Positional parameters don't accept underscores. */
+param          \${decdigit}+
+param_junk     \${decdigit}+{ident_start}
 
 /* psql-specific: characters allowed in variable names */
 variable_char  [A-Za-z\200-\377_0-9]
index bcfbd0978bb87811601b86cd640f0c35e0036f74..d117cafce65d3504aab19f0a9246c747a7615f6d 100644 (file)
@@ -388,8 +388,9 @@ bininteger_junk {bininteger}{ident_start}
 numeric_junk   {numeric}{ident_start}
 real_junk      {real}{ident_start}
 
-param          \${decinteger}
-param_junk     \${decinteger}{ident_start}
+/* Positional parameters don't accept underscores. */
+param          \${decdigit}+
+param_junk     \${decdigit}+{ident_start}
 
 /* special characters for other dbms */
 /* we have to react differently in compat mode */
index f662a5050ac004d344d9e10d0e45be6a164af105..c8196d2c85a3056a46cfdaa53c49c1755137bd39 100644 (file)
@@ -330,6 +330,10 @@ SELECT 1_000.5e_1;
 ERROR:  trailing junk after numeric literal at or near "1_000.5e"
 LINE 1: SELECT 1_000.5e_1;
                ^
+PREPARE p1 AS SELECT $0_1;
+ERROR:  trailing junk after parameter at or near "$0_"
+LINE 1: PREPARE p1 AS SELECT $0_1;
+                             ^
 --
 -- Test implicit type conversions
 -- This fails for Postgres v6.1 (and earlier?)
index 1941c58e681f47117e937f70ef33f5df32afe536..3f0ec34ecfa6d53c29df4c5767cbc5cb90e43fc4 100644 (file)
@@ -88,6 +88,7 @@ SELECT 1_000._5;
 SELECT 1_000.5_;
 SELECT 1_000.5e_1;
 
+PREPARE p1 AS SELECT $0_1;
 
 --
 -- Test implicit type conversions