Good day. v14 introduced the way to get original text for some kind of expressions using new 'funcformat' - COERCE_SQL_SYNTAX: - EXTRACT(part from timestamp) - (text IS [form] NORMALIZED) and others.
Mentioned EXTRACT and NORMALIZED statements has parts, that are not usual arguments but some kind of syntax. At least, there is no way to: PREPARE a(text) as select extract($1 from now()); But JumbleExpr doesn't distinguish it and marks this argument as a variable constant, ie remembers it in 'clocations'. I believe such "non-variable constant" should not be jumbled as replaceable thing. In our case (extended pg_stat_statements), we attempt to generalize plan and then explain generalized plan. But using constant list from JumbleState we mistakenly replace first argument in EXTRACT expression with parameter. And then 'get_func_sql_syntax' fails on assertion "first argument is text constant". Sure we could workaround in our plan mutator with skipping such first argument. But I wonder, is it correct at all to not count it as a non-modifiable syntax part in JumbleExpr? ------ regards, Sokolov Yura y.soko...@postgrespro.ru funny.fal...@gmail.coma