Preserve integer and float values accurately in (de)serialize_deflist

Enterprise / PostgreSQL - Tom Lane [] - 10 March 2020 16:30 EDT

Previously, this code just smashed all types of DefElem values to strings, cavalierly reasoning that nobody would care. But in point of fact, most of the defGetFoo functions do distinguish among different input syntaxes; for instance defGetBoolean will accept 1 as an integer but not "1" as a string. This led to CREATE/ALTER TEXT SEARCH DICTIONARY accepting 0 and 1 as values for boolean dictionary properties, only to have the dictionary fail at runtime.

We can upgrade this behavior by teaching serialize_deflist that it does not need to quote T_Integer or T_Float nodes' values on output, and then teaching deserialize_deflist to restore unquoted integer or float values as the appropriate node type. This should not break anything using pg_ts_dict.dictinitoption, since that field is just defined as being something valid to include in CREATE TEXT SEARCH DICTIONARY.

deserialize_deflist is also used to parse the options arguments for the ts_headline family of functions, but so far as I can see this won't cause any problems there either: the only consumer of that output is prsd_headline which always uses defGetString. (Really that's a bad idea, but I won't risk changing it here.)

This is surely a bug fix, but given the lack of field complaints I don't think it's necessary to back-patch.


d01f03a495 Preserve integer and float values accurately in (de)serialize_deflist.
contrib/dict_int/expected/dict_int.out | 29 ++++++++++-
contrib/dict_int/sql/dict_int.sql | 10 +++-
src/backend/commands/tsearchcmds.c | 90 ++++++++++++++++++++++++++--------
src/test/regress/expected/tsdicts.out | 35 +++++++++++++
src/test/regress/sql/tsdicts.sql | 13 +++++
5 files changed, 154 insertions(+), 23 deletions(-)


  • Share