On Fri, Jan 19, 2024 at 2:11 AM Alvaro Herrera <alvhe...@alvh.no-ip.org> wrote: > On 2024-Jan-18, Alvaro Herrera wrote: > > > commands/explain.c (Hmm, I think this is a preexisting bug actually) > > > > 3893 18 : case T_TableFuncScan: > > 3894 18 : Assert(rte->rtekind == RTE_TABLEFUNC); > > 3895 18 : if (rte->tablefunc) > > 3896 0 : if (rte->tablefunc->functype == > > TFT_XMLTABLE) > > 3897 0 : objectname = "xmltable"; > > 3898 : else /* Must be > > TFT_JSON_TABLE */ > > 3899 0 : objectname = "json_table"; > > 3900 : else > > 3901 18 : objectname = NULL; > > 3902 18 : objecttag = "Table Function Name"; > > 3903 18 : break; > > Indeed -- the problem seems to be that add_rte_to_flat_rtable is > creating a new RTE and zaps the ->tablefunc pointer for it. So when > EXPLAIN goes to examine the struct, there's a NULL pointer there and > nothing is printed.
Ah yes. > One simple fix is to change add_rte_to_flat_rtable so that it doesn't > zero out the tablefunc pointer, but this is straight against what that > function is trying to do, namely to remove substructure. Yes. > Which means > that we need to preserve the name somewhere else. I added a new member > to RangeTblEntry for this, which perhaps is a little ugly. So here's > the patch for that. > > (I also added an alias to one XMLTABLE invocation > under EXPLAIN, to show what it looks like when an alias is specified. > Otherwise they're always shown as "XMLTABLE" "xmltable" which is a bit > dumb). Thanks for the patch. Seems alright to me. > Another possible way out is to decide that we don't want the > "objectname" to be reported here. I admit it's perhaps redundant. In > this case we'd just remove lines 3896-3899 shown above and let it be > NULL. Showing the function's name spelled out in the query (XMLTABLE / JSON_TABLE) seems fine to me, even though maybe a bit redundant, yes. -- Thanks, Amit Langote EDB: http://www.enterprisedb.com