PostgreSQL Source Code  git master
print.c File Reference
#include "postgres.h"
#include "access/printtup.h"
#include "lib/stringinfo.h"
#include "nodes/nodeFuncs.h"
#include "nodes/pathnodes.h"
#include "nodes/print.h"
#include "parser/parsetree.h"
#include "utils/lsyscache.h"
Include dependency graph for print.c:

Go to the source code of this file.

Macros

#define LINELEN   78
 
#define INDENTSTOP   3
 
#define MAXINDENT   60
 
#define LINELEN   78
 

Functions

void print (const void *obj)
 
void pprint (const void *obj)
 
void elog_node_display (int lev, const char *title, const void *obj, bool pretty)
 
char * format_node_dump (const char *dump)
 
char * pretty_format_node_dump (const char *dump)
 
void print_rt (const List *rtable)
 
void print_expr (const Node *expr, const List *rtable)
 
void print_pathkeys (const List *pathkeys, const List *rtable)
 
void print_tl (const List *tlist, const List *rtable)
 
void print_slot (TupleTableSlot *slot)
 

Macro Definition Documentation

◆ INDENTSTOP

#define INDENTSTOP   3

◆ LINELEN [1/2]

#define LINELEN   78

◆ LINELEN [2/2]

#define LINELEN   78

◆ MAXINDENT

#define MAXINDENT   60

Function Documentation

◆ elog_node_display()

void elog_node_display ( int  lev,
const char *  title,
const void *  obj,
bool  pretty 
)

Definition at line 72 of file print.c.

73 {
74  char *s;
75  char *f;
76 
78  if (pretty)
80  else
81  f = format_node_dump(s);
82  pfree(s);
83  ereport(lev,
84  (errmsg_internal("%s:", title),
85  errdetail_internal("%s", f)));
86  pfree(f);
87 }
char * pretty_format_node_dump(const char *dump)
Definition: print.c:151
char * format_node_dump(const char *dump)
Definition: print.c:97
int errmsg_internal(const char *fmt,...)
Definition: elog.c:1157
int errdetail_internal(const char *fmt,...)
Definition: elog.c:1230
#define ereport(elevel,...)
Definition: elog.h:149
void pfree(void *pointer)
Definition: mcxt.c:1521
char * nodeToStringWithLocations(const void *obj)
Definition: outfuncs.c:800

References ereport, errdetail_internal(), errmsg_internal(), format_node_dump(), nodeToStringWithLocations(), pfree(), and pretty_format_node_dump().

Referenced by pg_plan_query(), and pg_rewrite_query().

◆ format_node_dump()

char* format_node_dump ( const char *  dump)

Definition at line 97 of file print.c.

98 {
99 #define LINELEN 78
100  char line[LINELEN + 1];
102  int i;
103  int j;
104  int k;
105 
107  i = 0;
108  for (;;)
109  {
110  for (j = 0; j < LINELEN && dump[i] != '\0'; i++, j++)
111  line[j] = dump[i];
112  if (dump[i] == '\0')
113  break;
114  if (dump[i] == ' ')
115  {
116  /* ok to break at adjacent space */
117  i++;
118  }
119  else
120  {
121  for (k = j - 1; k > 0; k--)
122  if (line[k] == ' ')
123  break;
124  if (k > 0)
125  {
126  /* back up; will reprint all after space */
127  i -= (j - k - 1);
128  j = k;
129  }
130  }
131  line[j] = '\0';
132  appendStringInfo(&str, "%s\n", line);
133  }
134  if (j > 0)
135  {
136  line[j] = '\0';
137  appendStringInfo(&str, "%s\n", line);
138  }
139  return str.data;
140 #undef LINELEN
141 }
#define LINELEN
const char * str
int j
Definition: isn.c:73
int i
Definition: isn.c:72
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition: stringinfo.c:94
void initStringInfo(StringInfo str)
Definition: stringinfo.c:56

References appendStringInfo(), i, initStringInfo(), j, LINELEN, and str.

Referenced by elog_node_display(), and print().

◆ pprint()

void pprint ( const void *  obj)

Definition at line 54 of file print.c.

55 {
56  char *s;
57  char *f;
58 
61  pfree(s);
62  printf("%s\n", f);
63  fflush(stdout);
64  pfree(f);
65 }
static void const char fflush(stdout)
#define printf(...)
Definition: port.h:244

References fflush(), nodeToStringWithLocations(), pfree(), pretty_format_node_dump(), printf, and generate_unaccent_rules::stdout.

Referenced by generate_partitionwise_join_paths(), preprocess_expression(), set_rel_pathlist(), and standard_join_search().

◆ pretty_format_node_dump()

char* pretty_format_node_dump ( const char *  dump)

Definition at line 151 of file print.c.

152 {
153 #define INDENTSTOP 3
154 #define MAXINDENT 60
155 #define LINELEN 78
156  char line[LINELEN + 1];
158  int indentLev;
159  int indentDist;
160  int i;
161  int j;
162 
164  indentLev = 0; /* logical indent level */
165  indentDist = 0; /* physical indent distance */
166  i = 0;
167  for (;;)
168  {
169  for (j = 0; j < indentDist; j++)
170  line[j] = ' ';
171  for (; j < LINELEN && dump[i] != '\0'; i++, j++)
172  {
173  line[j] = dump[i];
174  switch (line[j])
175  {
176  case '}':
177  if (j != indentDist)
178  {
179  /* print data before the } */
180  line[j] = '\0';
181  appendStringInfo(&str, "%s\n", line);
182  }
183  /* print the } at indentDist */
184  line[indentDist] = '}';
185  line[indentDist + 1] = '\0';
186  appendStringInfo(&str, "%s\n", line);
187  /* outdent */
188  if (indentLev > 0)
189  {
190  indentLev--;
191  indentDist = Min(indentLev * INDENTSTOP, MAXINDENT);
192  }
193  j = indentDist - 1;
194  /* j will equal indentDist on next loop iteration */
195  /* suppress whitespace just after } */
196  while (dump[i + 1] == ' ')
197  i++;
198  break;
199  case ')':
200  /* force line break after ), unless another ) follows */
201  if (dump[i + 1] != ')')
202  {
203  line[j + 1] = '\0';
204  appendStringInfo(&str, "%s\n", line);
205  j = indentDist - 1;
206  while (dump[i + 1] == ' ')
207  i++;
208  }
209  break;
210  case '{':
211  /* force line break before { */
212  if (j != indentDist)
213  {
214  line[j] = '\0';
215  appendStringInfo(&str, "%s\n", line);
216  }
217  /* indent */
218  indentLev++;
219  indentDist = Min(indentLev * INDENTSTOP, MAXINDENT);
220  for (j = 0; j < indentDist; j++)
221  line[j] = ' ';
222  line[j] = dump[i];
223  break;
224  case ':':
225  /* force line break before : */
226  if (j != indentDist)
227  {
228  line[j] = '\0';
229  appendStringInfo(&str, "%s\n", line);
230  }
231  j = indentDist;
232  line[j] = dump[i];
233  break;
234  }
235  }
236  line[j] = '\0';
237  if (dump[i] == '\0')
238  break;
239  appendStringInfo(&str, "%s\n", line);
240  }
241  if (j > 0)
242  appendStringInfo(&str, "%s\n", line);
243  return str.data;
244 #undef INDENTSTOP
245 #undef MAXINDENT
246 #undef LINELEN
247 }
#define MAXINDENT
#define INDENTSTOP
#define Min(x, y)
Definition: c.h:958

References appendStringInfo(), i, INDENTSTOP, initStringInfo(), j, LINELEN, MAXINDENT, Min, and str.

Referenced by elog_node_display(), and pprint().

◆ print()

void print ( const void *  obj)

Definition at line 36 of file print.c.

37 {
38  char *s;
39  char *f;
40 
42  f = format_node_dump(s);
43  pfree(s);
44  printf("%s\n", f);
45  fflush(stdout);
46  pfree(f);
47 }

References fflush(), format_node_dump(), nodeToStringWithLocations(), pfree(), printf, and generate_unaccent_rules::stdout.

Referenced by ecpg_free_params(), and generate_unaccent_rules::print_record().

◆ print_expr()

void print_expr ( const Node expr,
const List rtable 
)

Definition at line 325 of file print.c.

326 {
327  if (expr == NULL)
328  {
329  printf("<>");
330  return;
331  }
332 
333  if (IsA(expr, Var))
334  {
335  const Var *var = (const Var *) expr;
336  char *relname,
337  *attname;
338 
339  switch (var->varno)
340  {
341  case INNER_VAR:
342  relname = "INNER";
343  attname = "?";
344  break;
345  case OUTER_VAR:
346  relname = "OUTER";
347  attname = "?";
348  break;
349  case INDEX_VAR:
350  relname = "INDEX";
351  attname = "?";
352  break;
353  default:
354  {
355  RangeTblEntry *rte;
356 
357  Assert(var->varno > 0 &&
358  (int) var->varno <= list_length(rtable));
359  rte = rt_fetch(var->varno, rtable);
360  relname = rte->eref->aliasname;
362  }
363  break;
364  }
365  printf("%s.%s", relname, attname);
366  }
367  else if (IsA(expr, Const))
368  {
369  const Const *c = (const Const *) expr;
370  Oid typoutput;
371  bool typIsVarlena;
372  char *outputstr;
373 
374  if (c->constisnull)
375  {
376  printf("NULL");
377  return;
378  }
379 
380  getTypeOutputInfo(c->consttype,
381  &typoutput, &typIsVarlena);
382 
383  outputstr = OidOutputFunctionCall(typoutput, c->constvalue);
384  printf("%s", outputstr);
385  pfree(outputstr);
386  }
387  else if (IsA(expr, OpExpr))
388  {
389  const OpExpr *e = (const OpExpr *) expr;
390  char *opname;
391 
392  opname = get_opname(e->opno);
393  if (list_length(e->args) > 1)
394  {
395  print_expr(get_leftop((const Expr *) e), rtable);
396  printf(" %s ", ((opname != NULL) ? opname : "(invalid operator)"));
397  print_expr(get_rightop((const Expr *) e), rtable);
398  }
399  else
400  {
401  printf("%s ", ((opname != NULL) ? opname : "(invalid operator)"));
402  print_expr(get_leftop((const Expr *) e), rtable);
403  }
404  }
405  else if (IsA(expr, FuncExpr))
406  {
407  const FuncExpr *e = (const FuncExpr *) expr;
408  char *funcname;
409  ListCell *l;
410 
411  funcname = get_func_name(e->funcid);
412  printf("%s(", ((funcname != NULL) ? funcname : "(invalid function)"));
413  foreach(l, e->args)
414  {
415  print_expr(lfirst(l), rtable);
416  if (lnext(e->args, l))
417  printf(",");
418  }
419  printf(")");
420  }
421  else
422  printf("unknown expr");
423 }
void print_expr(const Node *expr, const List *rtable)
Definition: print.c:325
#define Assert(condition)
Definition: c.h:812
char * OidOutputFunctionCall(Oid functionId, Datum val)
Definition: fmgr.c:1763
#define funcname
Definition: indent_codes.h:69
char * get_opname(Oid opno)
Definition: lsyscache.c:1310
void getTypeOutputInfo(Oid type, Oid *typOutput, bool *typIsVarlena)
Definition: lsyscache.c:2907
char * get_func_name(Oid funcid)
Definition: lsyscache.c:1608
static Node * get_rightop(const void *clause)
Definition: nodeFuncs.h:95
static Node * get_leftop(const void *clause)
Definition: nodeFuncs.h:83
#define IsA(nodeptr, _type_)
Definition: nodes.h:158
char * get_rte_attribute_name(RangeTblEntry *rte, AttrNumber attnum)
#define rt_fetch(rangetable_index, rangetable)
Definition: parsetree.h:31
NameData attname
Definition: pg_attribute.h:41
NameData relname
Definition: pg_class.h:38
#define lfirst(lc)
Definition: pg_list.h:172
static int list_length(const List *l)
Definition: pg_list.h:152
static ListCell * lnext(const List *l, const ListCell *c)
Definition: pg_list.h:343
unsigned int Oid
Definition: postgres_ext.h:31
char * c
e
Definition: preproc-init.c:82
#define OUTER_VAR
Definition: primnodes.h:237
#define INNER_VAR
Definition: primnodes.h:236
#define INDEX_VAR
Definition: primnodes.h:238
Definition: primnodes.h:248
AttrNumber varattno
Definition: primnodes.h:260
int varno
Definition: primnodes.h:255

References Assert, attname, funcname, get_func_name(), get_leftop(), get_opname(), get_rightop(), get_rte_attribute_name(), getTypeOutputInfo(), INDEX_VAR, INNER_VAR, IsA, lfirst, list_length(), lnext(), OidOutputFunctionCall(), OUTER_VAR, pfree(), printf, relname, rt_fetch, Var::varattno, and Var::varno.

Referenced by print_pathkeys(), and print_tl().

◆ print_pathkeys()

void print_pathkeys ( const List pathkeys,
const List rtable 
)

Definition at line 430 of file print.c.

431 {
432  const ListCell *i;
433 
434  printf("(");
435  foreach(i, pathkeys)
436  {
437  PathKey *pathkey = (PathKey *) lfirst(i);
439  ListCell *k;
440  bool first = true;
441 
442  eclass = pathkey->pk_eclass;
443  /* chase up, in case pathkey is non-canonical */
444  while (eclass->ec_merged)
445  eclass = eclass->ec_merged;
446 
447  printf("(");
448  foreach(k, eclass->ec_members)
449  {
451 
452  if (first)
453  first = false;
454  else
455  printf(", ");
456  print_expr((Node *) mem->em_expr, rtable);
457  }
458  printf(")");
459  if (lnext(pathkeys, i))
460  printf(", ");
461  }
462  printf(")\n");
463 }
static struct cvec * eclass(struct vars *v, chr c, int cases)
Definition: regc_locale.c:500
Definition: nodes.h:129

References eclass(), EquivalenceMember::em_expr, i, lfirst, lnext(), print_expr(), and printf.

◆ print_rt()

void print_rt ( const List rtable)

Definition at line 254 of file print.c.

255 {
256  const ListCell *l;
257  int i = 1;
258 
259  printf("resno\trefname \trelid\tinFromCl\n");
260  printf("-----\t---------\t-----\t--------\n");
261  foreach(l, rtable)
262  {
263  RangeTblEntry *rte = lfirst(l);
264 
265  switch (rte->rtekind)
266  {
267  case RTE_RELATION:
268  printf("%d\t%s\t%u\t%c",
269  i, rte->eref->aliasname, rte->relid, rte->relkind);
270  break;
271  case RTE_SUBQUERY:
272  printf("%d\t%s\t[subquery]",
273  i, rte->eref->aliasname);
274  break;
275  case RTE_JOIN:
276  printf("%d\t%s\t[join]",
277  i, rte->eref->aliasname);
278  break;
279  case RTE_FUNCTION:
280  printf("%d\t%s\t[rangefunction]",
281  i, rte->eref->aliasname);
282  break;
283  case RTE_TABLEFUNC:
284  printf("%d\t%s\t[table function]",
285  i, rte->eref->aliasname);
286  break;
287  case RTE_VALUES:
288  printf("%d\t%s\t[values list]",
289  i, rte->eref->aliasname);
290  break;
291  case RTE_CTE:
292  printf("%d\t%s\t[cte]",
293  i, rte->eref->aliasname);
294  break;
295  case RTE_NAMEDTUPLESTORE:
296  printf("%d\t%s\t[tuplestore]",
297  i, rte->eref->aliasname);
298  break;
299  case RTE_RESULT:
300  printf("%d\t%s\t[result]",
301  i, rte->eref->aliasname);
302  break;
303  case RTE_GROUP:
304  printf("%d\t%s\t[group]",
305  i, rte->eref->aliasname);
306  break;
307  default:
308  printf("%d\t%s\t[unknown rtekind]",
309  i, rte->eref->aliasname);
310  }
311 
312  printf("\t%s\t%s\n",
313  (rte->inh ? "inh" : ""),
314  (rte->inFromCl ? "inFromCl" : ""));
315  i++;
316  }
317 }
@ RTE_JOIN
Definition: parsenodes.h:1019
@ RTE_CTE
Definition: parsenodes.h:1023
@ RTE_NAMEDTUPLESTORE
Definition: parsenodes.h:1024
@ RTE_VALUES
Definition: parsenodes.h:1022
@ RTE_SUBQUERY
Definition: parsenodes.h:1018
@ RTE_RESULT
Definition: parsenodes.h:1025
@ RTE_FUNCTION
Definition: parsenodes.h:1020
@ RTE_TABLEFUNC
Definition: parsenodes.h:1021
@ RTE_GROUP
Definition: parsenodes.h:1028
@ RTE_RELATION
Definition: parsenodes.h:1017
RTEKind rtekind
Definition: parsenodes.h:1047

References i, RangeTblEntry::inh, lfirst, printf, RangeTblEntry::relid, RTE_CTE, RTE_FUNCTION, RTE_GROUP, RTE_JOIN, RTE_NAMEDTUPLESTORE, RTE_RELATION, RTE_RESULT, RTE_SUBQUERY, RTE_TABLEFUNC, RTE_VALUES, and RangeTblEntry::rtekind.

◆ print_slot()

void print_slot ( TupleTableSlot slot)

Definition at line 496 of file print.c.

497 {
498  if (TupIsNull(slot))
499  {
500  printf("tuple is null.\n");
501  return;
502  }
503  if (!slot->tts_tupleDescriptor)
504  {
505  printf("no tuple descriptor.\n");
506  return;
507  }
508 
509  debugtup(slot, NULL);
510 }
bool debugtup(TupleTableSlot *slot, DestReceiver *self)
Definition: printtup.c:462
TupleDesc tts_tupleDescriptor
Definition: tuptable.h:123
#define TupIsNull(slot)
Definition: tuptable.h:306

References debugtup(), printf, TupleTableSlot::tts_tupleDescriptor, and TupIsNull.

◆ print_tl()

void print_tl ( const List tlist,
const List rtable 
)

Definition at line 470 of file print.c.

471 {
472  const ListCell *tl;
473 
474  printf("(\n");
475  foreach(tl, tlist)
476  {
477  TargetEntry *tle = (TargetEntry *) lfirst(tl);
478 
479  printf("\t%d %s\t", tle->resno,
480  tle->resname ? tle->resname : "<null>");
481  if (tle->ressortgroupref != 0)
482  printf("(%u):\t", tle->ressortgroupref);
483  else
484  printf(" :\t");
485  print_expr((Node *) tle->expr, rtable);
486  printf("\n");
487  }
488  printf(")\n");
489 }
Expr * expr
Definition: primnodes.h:2190
AttrNumber resno
Definition: primnodes.h:2192
Index ressortgroupref
Definition: primnodes.h:2196

References TargetEntry::expr, lfirst, print_expr(), printf, TargetEntry::resno, and TargetEntry::ressortgroupref.