Hi,

While testing “[b380a56a3] Disallow CR and LF in database, role, and tablespace 
names”, I saw that CR/LF are properly rejected. However, the raw problematic 
names are printed directly in the error message, which can also reach the 
server log. This causes LF to split the error message and CR to overwrite/hide 
the beginning of the message, which seems not good.

See this simple repro:

1. Newline case
```
evantest=# create role "a
evantest"# b";
ERROR:  role name "a
b" contains a newline or carriage return character
```

And server log looks like:
```
2026-07-02 10:57:51.518 CST [96799] ERROR:  role name "a
        b" contains a newline or carriage return character
```

2. Carriage return case
```
% psql -d evantest -c $'CREATE ROLE "a\rb";'
b" contains a newline or carriage return character
```

As shown above, printing the raw name in the error message can make the log 
entry confusing: LF splits the error message across multiple lines, while CR 
can overwrite the beginning of the line and lose information.

I think we should escape CR/LF before including these names in error messages 
and line-oriented reports.

Since pg_upgrade also writes bad names into a report file, I looked for a place 
to add a helper that can be shared by both backend and frontend code. I ended 
up adding one in src/common/string.c.

See the attached patch for details.

Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/




Attachment: v1-0001-Escape-CR-LF-in-invalid-global-object-name-errors.patch
Description: Binary data

Reply via email to