|
5 | 5 | * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
6 | 6 | * Portions Copyright (c) 1994-5, Regents of the University of California
|
7 | 7 | *
|
8 |
| - * $Header: /cvsroot/pgsql/src/backend/commands/explain.c,v 1.95 2002/12/06 19:28:03 tgl Exp $ |
| 8 | + * $Header: /cvsroot/pgsql/src/backend/commands/explain.c,v 1.96 2002/12/12 15:49:24 tgl Exp $ |
9 | 9 | *
|
10 | 10 | */
|
11 | 11 |
|
@@ -417,20 +417,27 @@ explain_outNode(StringInfo str,
|
417 | 417 | {
|
418 | 418 | RangeTblEntry*rte=rt_fetch(((Scan*)plan)->scanrelid,
|
419 | 419 | es->rtable);
|
420 |
| -Expr*expr; |
421 |
| -Func*funcnode; |
422 |
| -Oidfuncid; |
423 | 420 | char*proname;
|
424 | 421 |
|
425 | 422 | /* Assert it's on a RangeFunction */
|
426 | 423 | Assert(rte->rtekind==RTE_FUNCTION);
|
427 | 424 |
|
428 |
| -expr= (Expr*)rte->funcexpr; |
429 |
| -funcnode= (Func*)expr->oper; |
430 |
| -funcid=funcnode->funcid; |
431 |
| - |
432 |
| -/* We only show the func name, not schema name */ |
433 |
| -proname=get_func_name(funcid); |
| 425 | +/* |
| 426 | + * If the expression is still a function call, we can get |
| 427 | + * the real name of the function. Otherwise, punt (this |
| 428 | + * can happen if the optimizer simplified away the function |
| 429 | + * call, for example). |
| 430 | + */ |
| 431 | +if (rte->funcexpr&&IsA(rte->funcexpr,FuncExpr)) |
| 432 | +{ |
| 433 | +FuncExpr*funcexpr= (FuncExpr*)rte->funcexpr; |
| 434 | +Oidfuncid=funcexpr->funcid; |
| 435 | + |
| 436 | +/* We only show the func name, not schema name */ |
| 437 | +proname=get_func_name(funcid); |
| 438 | +} |
| 439 | +else |
| 440 | +proname=rte->eref->aliasname; |
434 | 441 |
|
435 | 442 | appendStringInfo(str," on %s",
|
436 | 443 | quote_identifier(proname));
|
@@ -583,7 +590,7 @@ explain_outNode(StringInfo str,
|
583 | 590 | appendStringInfo(str," InitPlan\n");
|
584 | 591 | foreach(lst,plan->initPlan)
|
585 | 592 | {
|
586 |
| -SubPlan*subplan= (SubPlan*)lfirst(lst); |
| 593 | +SubPlanExpr*subplan= (SubPlanExpr*)lfirst(lst); |
587 | 594 | SubPlanState*subplanstate= (SubPlanState*)lfirst(pslist);
|
588 | 595 |
|
589 | 596 | es->rtable=subplan->rtable;
|
@@ -683,7 +690,7 @@ explain_outNode(StringInfo str,
|
683 | 690 | foreach(lst,planstate->subPlan)
|
684 | 691 | {
|
685 | 692 | SubPlanState*sps= (SubPlanState*)lfirst(lst);
|
686 |
| -SubPlan*sp= (SubPlan*)sps->ps.plan; |
| 693 | +SubPlanExpr*sp= (SubPlanExpr*)sps->ps.plan; |
687 | 694 |
|
688 | 695 | es->rtable=sp->rtable;
|
689 | 696 | for (i=0;i<indent;i++)
|
@@ -870,7 +877,7 @@ show_sort_keys(List *tlist, int nkeys, const char *qlabel,
|
870 | 877 | if (target->resdom->reskey==keyno)
|
871 | 878 | {
|
872 | 879 | /* Deparse the expression, showing any top-level cast */
|
873 |
| -exprstr=deparse_expression(target->expr,context, |
| 880 | +exprstr=deparse_expression((Node*)target->expr,context, |
874 | 881 | useprefix, true);
|
875 | 882 | /* And add to str */
|
876 | 883 | if (keyno>1)
|
|