• Tom Lane's avatar
    Preserve integer and float values accurately in (de)serialize_deflist. · d01f03a4
    Tom Lane authored
    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.
    
    Discussion: https://postgr.es/m/CAMkU=1xRcs_BUPzR0+V3WndaCAv0E_m3h6aUEJ8NF-sY1nnHsw@mail.gmail.com
    d01f03a4
tsdicts.out 17.9 KB