On Tue, Sep 7, 2021 at 11:27 AM Денис Романенко <deromane...@gmail.com> wrote: > > If we create a column name longer than 64 bytes, it will be truncated in > PostgreSQL to max (NAMEDATALEN) length. > > For example: > "VeryLongNameVeryLongNameVeryLongNameVeryLongNameVeryLongNameVeryLongName" > will be truncated in database to > "VeryLongNameVeryLongNameVeryLongNameVeryLongNameVeryLongNameVer" > > But in the codebase we could work with full column name - SQL functions like > INSERT/UPDATE work with long names without problem, automatically searches > for suitable column (thank you for it). > > But if we try to update it with "json_populate_recordset" using full name, it > will not just ignore column with long name - data in that record will be > nulled. > > How to reproduce: > 1. create table > wow("VeryLongNameVeryLongNameVeryLongNameVeryLongNameVeryLongNameVeryLongName" > text); > 2. select * from > json_populate_recordset(null::wow,'[{"VeryLongNameVeryLongNameVeryLongNameVeryLongNameVeryLongNameVeryLongName": > "haha"}]'); > 3. "VeryLongNameVeryLongNameVeryLongNameVeryLongNameVeryLongNameVer" becomes > null.
Yes, that's because json identifiers have different rules from relation identifiers. Your only option here is to use the real / truncated identifier. Also I don't think it would be a good thing to add a way to truncate identifiers in json objects using the NAMEDATALEN limit, as this could easily lead to invalid json object that should be valid.