Re-forbid underscore in positional parameters
authorPeter Eisentraut <[email protected]>
Wed, 15 May 2024 11:49:41 +0000 (13:49 +0200)
committerPeter Eisentraut <[email protected]>
Wed, 15 May 2024 11:54:00 +0000 (13:54 +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 <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
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 b2216a9eacd101e067f48ad5df679c55edf4c7b5..07d6cef2e41787a6603db2ecd0d3bfea74149385 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 84754aca4a99b012b916ac3613a9b51e2fd1eba5..cd8a000e9421dc7ff6268751cd7cd5eaa5031a47 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 bed86cc68041431a086c3c7fd534bc5b4b9518f5..86d406968479ae2e157800429c63d0f7320c898a 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