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

Commit 98b4f53

Browse files
committed
Re-forbid underscore in positional parameters
Underscores were added to numeric literals in faff8f8. 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
1 parent 96bc29e commit 98b4f53

File tree

5 files changed

+14
-6
lines changed

5 files changed

+14
-6
lines changed

src/backend/parser/scan.l

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -419,8 +419,9 @@ bininteger_junk {bininteger}{ident_start}
419419
numeric_junk {numeric}{ident_start}
420420
real_junk {real}{ident_start}
421421

422-
param \${decinteger}
423-
param_junk \${decinteger}{ident_start}
422+
/* Positional parameters don't accept underscores. */
423+
param \${decdigit}+
424+
param_junk \${decdigit}+{ident_start}
424425

425426
other .
426427

src/fe_utils/psqlscan.l

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -355,8 +355,9 @@ bininteger_junk {bininteger}{ident_start}
355355
numeric_junk {numeric}{ident_start}
356356
real_junk {real}{ident_start}
357357

358-
param \${decinteger}
359-
param_junk \${decinteger}{ident_start}
358+
/* Positional parameters don't accept underscores. */
359+
param \${decdigit}+
360+
param_junk \${decdigit}+{ident_start}
360361

361362
/* psql-specific: characters allowed in variable names */
362363
variable_char [A-Za-z\200-\377_0-9]

src/interfaces/ecpg/preproc/pgc.l

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -388,8 +388,9 @@ bininteger_junk {bininteger}{ident_start}
388388
numeric_junk {numeric}{ident_start}
389389
real_junk {real}{ident_start}
390390

391-
param \${decinteger}
392-
param_junk \${decinteger}{ident_start}
391+
/* Positional parameters don't accept underscores. */
392+
param \${decdigit}+
393+
param_junk \${decdigit}+{ident_start}
393394

394395
/* special characters for other dbms */
395396
/* we have to react differently in compat mode */

src/test/regress/expected/numerology.out

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,10 @@ SELECT 1_000.5e_1;
330330
ERROR: trailing junk after numeric literal at or near "1_000.5e"
331331
LINE 1: SELECT 1_000.5e_1;
332332
^
333+
PREPARE p1 AS SELECT $0_1;
334+
ERROR: trailing junk after parameter at or near "$0_"
335+
LINE 1: PREPARE p1 AS SELECT $0_1;
336+
^
333337
--
334338
-- Test implicit type conversions
335339
-- This fails for Postgres v6.1 (and earlier?)

src/test/regress/sql/numerology.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ SELECT 1_000._5;
8888
SELECT 1_000.5_;
8989
SELECT 1_000.5e_1;
9090

91+
PREPARE p1 AS SELECT $0_1;
9192

9293
--
9394
-- Test implicit type conversions

0 commit comments

Comments
 (0)