aboutsummaryrefslogtreecommitdiff
path: root/src/backend/nodes/print.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/nodes/print.c')
-rw-r--r--src/backend/nodes/print.c582
1 files changed, 310 insertions, 272 deletions
diff --git a/src/backend/nodes/print.c b/src/backend/nodes/print.c
index 0f92c189e51..9fb61ed3ea7 100644
--- a/src/backend/nodes/print.c
+++ b/src/backend/nodes/print.c
@@ -1,17 +1,17 @@
/*-------------------------------------------------------------------------
*
* print.c--
- * various print routines (used mostly for debugging)
+ * various print routines (used mostly for debugging)
*
* Copyright (c) 1994, Regents of the University of California
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/nodes/print.c,v 1.6 1997/08/19 21:31:43 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/print.c,v 1.7 1997/09/07 04:42:55 momjian Exp $
*
* HISTORY
- * AUTHOR DATE MAJOR EVENT
- * Andrew Yu Oct 26, 1994 file creation
+ * AUTHOR DATE MAJOR EVENT
+ * Andrew Yu Oct 26, 1994 file creation
*
*-------------------------------------------------------------------------
*/
@@ -33,21 +33,21 @@
#include "nodes/plannodes.h"
#include "optimizer/clauses.h"
-static char *plannode_type (Plan* p);
+static char *plannode_type(Plan * p);
/*
* print--
- * print contents of Node to stdout
+ * print contents of Node to stdout
*/
void
print(void *obj)
{
- char *s;
+ char *s;
- s = nodeToString(obj);
- printf("%s\n", s);
- fflush(stdout);
- return;
+ s = nodeToString(obj);
+ printf("%s\n", s);
+ fflush(stdout);
+ return;
}
/*
@@ -56,327 +56,365 @@ print(void *obj)
void
pprint(void *obj)
{
- char *s;
- int i;
- char line[80];
- int indentLev;
- int j;
-
- s = nodeToString(obj);
-
- indentLev = 0;
- i = 0;
- for(;;) {
- for(j=0; j<indentLev*3; j++) {
- line[j] = ' ';
- }
- for( ; j<75 && s[i]!='\0'; i++, j++) {
- line[j] = s[i];
- switch (line[j]) {
- case '}':
- if (j != indentLev*3) {
- line[j] = '\0';
- printf("%s\n",line);
- line[indentLev*3] = '\0';
- printf("%s}\n",line);
- }else {
- line[j] = '\0';
- printf("%s}\n",line);
- }
- indentLev--;
- j = indentLev*3-1; /* print the line before : and resets */
- break;
- case ')':
- line[j+1] = '\0';
- printf("%s\n", line);
- j = indentLev*3-1;
- break;
- case '{':
- indentLev++;
- /* !!! FALLS THROUGH */
- case ':':
- if (j != 0) {
- line[j] = '\0';
- printf("%s\n",line);
- /* print the line before : and resets */
- for(j=0; j<indentLev*3; j++) {
+ char *s;
+ int i;
+ char line[80];
+ int indentLev;
+ int j;
+
+ s = nodeToString(obj);
+
+ indentLev = 0;
+ i = 0;
+ for (;;)
+ {
+ for (j = 0; j < indentLev * 3; j++)
+ {
line[j] = ' ';
- }
}
- line[j] = s[i];
- break;
- }
+ for (; j < 75 && s[i] != '\0'; i++, j++)
+ {
+ line[j] = s[i];
+ switch (line[j])
+ {
+ case '}':
+ if (j != indentLev * 3)
+ {
+ line[j] = '\0';
+ printf("%s\n", line);
+ line[indentLev * 3] = '\0';
+ printf("%s}\n", line);
+ }
+ else
+ {
+ line[j] = '\0';
+ printf("%s}\n", line);
+ }
+ indentLev--;
+ j = indentLev * 3 - 1; /* print the line before : and
+ * resets */
+ break;
+ case ')':
+ line[j + 1] = '\0';
+ printf("%s\n", line);
+ j = indentLev * 3 - 1;
+ break;
+ case '{':
+ indentLev++;
+ /* !!! FALLS THROUGH */
+ case ':':
+ if (j != 0)
+ {
+ line[j] = '\0';
+ printf("%s\n", line);
+ /* print the line before : and resets */
+ for (j = 0; j < indentLev * 3; j++)
+ {
+ line[j] = ' ';
+ }
+ }
+ line[j] = s[i];
+ break;
+ }
+ }
+ line[j] = '\0';
+ if (s[i] == '\0')
+ break;
+ printf("%s\n", line);
}
- line[j] = '\0';
- if (s[i]=='\0')
- break;
- printf("%s\n", line);
- }
- if (j!=0) {
- printf("%s\n", line);
- }
- fflush(stdout);
- return;
+ if (j != 0)
+ {
+ printf("%s\n", line);
+ }
+ fflush(stdout);
+ return;
}
/*
* print_rt--
- * print contents of range table
+ * print contents of range table
*/
void
-print_rt(List *rtable)
+print_rt(List * rtable)
{
- List *l;
- int i=1;
-
- printf("resno\trelname(refname)\trelid\tinFromCl\n");
- printf("-----\t----------------\t-----\t--------\n");
- foreach(l, rtable) {
- RangeTblEntry *rte = lfirst(l);
- printf("%d\t%s(%s)\t%d\t%d\t%s\n",
- i,rte->relname,rte->refname,rte->relid,
- rte->inFromCl,
- (rte->inh?"inh":""));
- i++;
- }
+ List *l;
+ int i = 1;
+
+ printf("resno\trelname(refname)\trelid\tinFromCl\n");
+ printf("-----\t----------------\t-----\t--------\n");
+ foreach(l, rtable)
+ {
+ RangeTblEntry *rte = lfirst(l);
+
+ printf("%d\t%s(%s)\t%d\t%d\t%s\n",
+ i, rte->relname, rte->refname, rte->relid,
+ rte->inFromCl,
+ (rte->inh ? "inh" : ""));
+ i++;
+ }
}
/*
* print_expr--
- * print an expression
+ * print an expression
*/
void
-print_expr(Node *expr, List *rtable)
+print_expr(Node * expr, List * rtable)
{
- if (expr==NULL) {
- printf("nil");
- return;
- }
-
- if (IsA(expr,Var)) {
- Var *var = (Var*)expr;
- RangeTblEntry *rt;
- char *relname, *attname;
-
- switch (var->varno) {
- case INNER:
- relname = "INNER";
- attname = "?";
- break;
- case OUTER:
- relname = "OUTER";
- attname = "?";
- break;
- default:
- {
- Relation r;
- rt = rt_fetch(var->varno, rtable);
- relname = rt->relname;
- r = heap_openr(relname);
- if (rt->refname)
- relname = rt->refname; /* table renamed */
- attname = getAttrName(r, var->varattno);
- heap_close(r);
- }
- break;
+ if (expr == NULL)
+ {
+ printf("nil");
+ return;
}
- printf("%s.%s",relname,attname);
- } else if (IsA(expr,Expr)) {
- Expr *e = (Expr*)expr;
- if (is_opclause(expr)) {
- char *opname;
-
- print_expr((Node*)get_leftop(e), rtable);
- opname = get_opname(((Oper*)e->oper)->opno);
- printf(" %s ", opname);
- print_expr((Node*)get_rightop(e), rtable);
- } else {
- printf("an expr");
+
+ if (IsA(expr, Var))
+ {
+ Var *var = (Var *) expr;
+ RangeTblEntry *rt;
+ char *relname,
+ *attname;
+
+ switch (var->varno)
+ {
+ case INNER:
+ relname = "INNER";
+ attname = "?";
+ break;
+ case OUTER:
+ relname = "OUTER";
+ attname = "?";
+ break;
+ default:
+ {
+ Relation r;
+
+ rt = rt_fetch(var->varno, rtable);
+ relname = rt->relname;
+ r = heap_openr(relname);
+ if (rt->refname)
+ relname = rt->refname; /* table renamed */
+ attname = getAttrName(r, var->varattno);
+ heap_close(r);
+ }
+ break;
+ }
+ printf("%s.%s", relname, attname);
+ }
+ else if (IsA(expr, Expr))
+ {
+ Expr *e = (Expr *) expr;
+
+ if (is_opclause(expr))
+ {
+ char *opname;
+
+ print_expr((Node *) get_leftop(e), rtable);
+ opname = get_opname(((Oper *) e->oper)->opno);
+ printf(" %s ", opname);
+ print_expr((Node *) get_rightop(e), rtable);
+ }
+ else
+ {
+ printf("an expr");
+ }
+ }
+ else
+ {
+ printf("not an expr");
}
- } else {
- printf("not an expr");
- }
}
/*
* print_keys -
- * temporary here. where is keys list of list??
+ * temporary here. where is keys list of list??
*/
void
-print_keys(List *keys, List *rtable)
+print_keys(List * keys, List * rtable)
{
- List *k;
-
- printf("(");
- foreach(k, keys) {
- Node *var = lfirst((List*)lfirst(k));
- print_expr(var, rtable);
- if (lnext(k)) printf(", ");
- }
- printf(")\n");
+ List *k;
+
+ printf("(");
+ foreach(k, keys)
+ {
+ Node *var = lfirst((List *) lfirst(k));
+
+ print_expr(var, rtable);
+ if (lnext(k))
+ printf(", ");
+ }
+ printf(")\n");
}
/*
* print_tl --
- * print targetlist in a more legible way.
+ * print targetlist in a more legible way.
*/
-void
-print_tl(List *tlist, List *rtable)
+void
+print_tl(List * tlist, List * rtable)
{
- List *tl;
+ List *tl;
- printf("(\n");
- foreach(tl, tlist) {
- TargetEntry *tle = lfirst(tl);
+ printf("(\n");
+ foreach(tl, tlist)
+ {
+ TargetEntry *tle = lfirst(tl);
- printf("\t%d %s\t", tle->resdom->resno, tle->resdom->resname);
- if (tle->resdom->reskey!=0) {
- printf("(%d):\t", tle->resdom->reskey);
- } else {
- printf(" :\t");
+ printf("\t%d %s\t", tle->resdom->resno, tle->resdom->resname);
+ if (tle->resdom->reskey != 0)
+ {
+ printf("(%d):\t", tle->resdom->reskey);
+ }
+ else
+ {
+ printf(" :\t");
+ }
+ print_expr(tle->expr, rtable);
+ printf("\n");
}
- print_expr(tle->expr, rtable);
- printf("\n");
- }
- printf(")\n");
+ printf(")\n");
}
/*
* print_slot--
- * print out the tuple with the given TupleTableSlot
+ * print out the tuple with the given TupleTableSlot
*/
void
-print_slot(TupleTableSlot *slot)
+print_slot(TupleTableSlot * slot)
{
- if (!slot->val) {
- printf("tuple is null.\n");
- return;
- }
- if (!slot->ttc_tupleDescriptor) {
- printf("no tuple descriptor.\n");
- return;
- }
-
- debugtup(slot->val, slot->ttc_tupleDescriptor);
+ if (!slot->val)
+ {
+ printf("tuple is null.\n");
+ return;
+ }
+ if (!slot->ttc_tupleDescriptor)
+ {
+ printf("no tuple descriptor.\n");
+ return;
+ }
+
+ debugtup(slot->val, slot->ttc_tupleDescriptor);
}
-static char *
-plannode_type (Plan* p)
+static char *
+plannode_type(Plan * p)
{
- switch(nodeTag(p)) {
- case T_Plan:
- return "PLAN";
- break;
- case T_Existential:
- return "EXISTENTIAL";
- break;
- case T_Result:
- return "RESULT";
- break;
- case T_Append:
- return "APPEND";
- break;
- case T_Scan:
- return "SCAN";
- break;
- case T_SeqScan:
- return "SEQSCAN";
- break;
- case T_IndexScan:
- return "INDEXSCAN";
- break;
- case T_Join:
- return "JOIN";
- break;
- case T_NestLoop:
- return "NESTLOOP";
- break;
- case T_MergeJoin:
- return "MERGEJOIN";
- break;
- case T_HashJoin:
- return "HASHJOIN";
- break;
- case T_Temp:
- return "TEMP";
- break;
- case T_Material:
- return "MATERIAL";
- break;
- case T_Sort:
- return "SORT";
- break;
- case T_Agg:
- return "AGG";
- break;
- case T_Unique:
- return "UNIQUE";
- break;
- case T_Hash:
- return "HASH";
- break;
- case T_Tee:
- return "TEE";
- break;
- case T_Choose:
- return "CHOOSE";
- break;
- case T_Group:
- return "GROUP";
- break;
- default:
- return "UNKNOWN";
- break;
- }
+ switch (nodeTag(p))
+ {
+ case T_Plan:
+ return "PLAN";
+ break;
+ case T_Existential:
+ return "EXISTENTIAL";
+ break;
+ case T_Result:
+ return "RESULT";
+ break;
+ case T_Append:
+ return "APPEND";
+ break;
+ case T_Scan:
+ return "SCAN";
+ break;
+ case T_SeqScan:
+ return "SEQSCAN";
+ break;
+ case T_IndexScan:
+ return "INDEXSCAN";
+ break;
+ case T_Join:
+ return "JOIN";
+ break;
+ case T_NestLoop:
+ return "NESTLOOP";
+ break;
+ case T_MergeJoin:
+ return "MERGEJOIN";
+ break;
+ case T_HashJoin:
+ return "HASHJOIN";
+ break;
+ case T_Temp:
+ return "TEMP";
+ break;
+ case T_Material:
+ return "MATERIAL";
+ break;
+ case T_Sort:
+ return "SORT";
+ break;
+ case T_Agg:
+ return "AGG";
+ break;
+ case T_Unique:
+ return "UNIQUE";
+ break;
+ case T_Hash:
+ return "HASH";
+ break;
+ case T_Tee:
+ return "TEE";
+ break;
+ case T_Choose:
+ return "CHOOSE";
+ break;
+ case T_Group:
+ return "GROUP";
+ break;
+ default:
+ return "UNKNOWN";
+ break;
+ }
}
+
/*
prints the ascii description of the plan nodes
does this recursively by doing a depth-first traversal of the
plan tree. for SeqScan and IndexScan, the name of the table is also
- printed out
+ printed out
*/
void
-print_plan_recursive (Plan* p, Query *parsetree, int indentLevel, char* label)
+print_plan_recursive(Plan * p, Query * parsetree, int indentLevel, char *label)
{
- int i;
- char extraInfo[100];
+ int i;
+ char extraInfo[100];
- if (!p)
- return;
- for (i=0;i<indentLevel;i++)
- printf(" ");
- printf("%s%s :c=%.4f :s=%d :w=%d ",label, plannode_type(p),
- p->cost, p->plan_size, p->plan_width);
- if (IsA(p,Scan) || IsA(p,SeqScan)) {
- RangeTblEntry *rte;
- rte = rt_fetch(((Scan*)p)->scanrelid, parsetree->rtable);
- strNcpy(extraInfo, rte->relname, NAMEDATALEN-1);
- } else
- if (IsA(p,IndexScan)) {
- strNcpy(extraInfo,
- ((RangeTblEntry*)(nth(((IndexScan*)p)->scan.scanrelid - 1,
- parsetree->rtable)))->relname,
- NAMEDATALEN-1);
- } else
- extraInfo[0] = '\0';
- if (extraInfo[0] != '\0')
- printf(" ( %s )\n", extraInfo);
- else
- printf("\n");
- print_plan_recursive(p->lefttree, parsetree, indentLevel + 3, "l: ");
- print_plan_recursive(p->righttree, parsetree, indentLevel + 3, "r: ");
+ if (!p)
+ return;
+ for (i = 0; i < indentLevel; i++)
+ printf(" ");
+ printf("%s%s :c=%.4f :s=%d :w=%d ", label, plannode_type(p),
+ p->cost, p->plan_size, p->plan_width);
+ if (IsA(p, Scan) || IsA(p, SeqScan))
+ {
+ RangeTblEntry *rte;
+
+ rte = rt_fetch(((Scan *) p)->scanrelid, parsetree->rtable);
+ strNcpy(extraInfo, rte->relname, NAMEDATALEN - 1);
+ }
+ else if (IsA(p, IndexScan))
+ {
+ strNcpy(extraInfo,
+ ((RangeTblEntry *) (nth(((IndexScan *) p)->scan.scanrelid - 1,
+ parsetree->rtable)))->relname,
+ NAMEDATALEN - 1);
+ }
+ else
+ extraInfo[0] = '\0';
+ if (extraInfo[0] != '\0')
+ printf(" ( %s )\n", extraInfo);
+ else
+ printf("\n");
+ print_plan_recursive(p->lefttree, parsetree, indentLevel + 3, "l: ");
+ print_plan_recursive(p->righttree, parsetree, indentLevel + 3, "r: ");
}
-/* print_plan
+/* print_plan
prints just the plan node types */
void
-print_plan (Plan* p, Query* parsetree)
+print_plan(Plan * p, Query * parsetree)
{
- print_plan_recursive(p, parsetree, 0, "");
+ print_plan_recursive(p, parsetree, 0, "");
}
-
-
-