PostgreSQL Source Code git master
outfuncs.c File Reference
#include "postgres.h"
#include <ctype.h>
#include "access/attnum.h"
#include "common/shortest_dec.h"
#include "lib/stringinfo.h"
#include "miscadmin.h"
#include "nodes/bitmapset.h"
#include "nodes/nodes.h"
#include "nodes/pg_list.h"
#include "utils/datum.h"
#include "outfuncs.funcs.c"
#include "outfuncs.switch.c"
Include dependency graph for outfuncs.c:

Go to the source code of this file.

Macros

#define WRITE_NODE_TYPE(nodelabel)    appendStringInfoString(str, nodelabel)
 
#define WRITE_INT_FIELD(fldname)    appendStringInfo(str, " :" CppAsString(fldname) " %d", node->fldname)
 
#define WRITE_UINT_FIELD(fldname)    appendStringInfo(str, " :" CppAsString(fldname) " %u", node->fldname)
 
#define WRITE_INT64_FIELD(fldname)
 
#define WRITE_UINT64_FIELD(fldname)
 
#define WRITE_OID_FIELD(fldname)    appendStringInfo(str, " :" CppAsString(fldname) " %u", node->fldname)
 
#define WRITE_LONG_FIELD(fldname)    appendStringInfo(str, " :" CppAsString(fldname) " %ld", node->fldname)
 
#define WRITE_CHAR_FIELD(fldname)
 
#define WRITE_ENUM_FIELD(fldname, enumtype)
 
#define WRITE_FLOAT_FIELD(fldname)
 
#define WRITE_BOOL_FIELD(fldname)
 
#define WRITE_STRING_FIELD(fldname)
 
#define WRITE_LOCATION_FIELD(fldname)    appendStringInfo(str, " :" CppAsString(fldname) " %d", write_location_fields ? node->fldname : -1)
 
#define WRITE_NODE_FIELD(fldname)
 
#define WRITE_BITMAPSET_FIELD(fldname)
 
#define WRITE_NODE_ARRAY(fldname, len)
 
#define WRITE_ATTRNUMBER_ARRAY(fldname, len)
 
#define WRITE_OID_ARRAY(fldname, len)
 
#define WRITE_INDEX_ARRAY(fldname, len)
 
#define WRITE_INT_ARRAY(fldname, len)
 
#define WRITE_BOOL_ARRAY(fldname, len)
 
#define booltostr(x)   ((x) ? "true" : "false")
 
#define WRITE_SCALAR_ARRAY(fnname, datatype, fmtstr, convfunc)
 

Functions

static void outChar (StringInfo str, char c)
 
static void outDouble (StringInfo str, double d)
 
void outToken (StringInfo str, const char *s)
 
static void writeNodeArray (StringInfo str, const Node *const *arr, int len)
 
static void _outList (StringInfo str, const List *node)
 
void outBitmapset (StringInfo str, const Bitmapset *bms)
 
void outDatum (StringInfo str, Datum value, int typlen, bool typbyval)
 
static void _outConst (StringInfo str, const Const *node)
 
static void _outBoolExpr (StringInfo str, const BoolExpr *node)
 
static void _outForeignKeyOptInfo (StringInfo str, const ForeignKeyOptInfo *node)
 
static void _outEquivalenceClass (StringInfo str, const EquivalenceClass *node)
 
static void _outExtensibleNode (StringInfo str, const ExtensibleNode *node)
 
static void _outRangeTblEntry (StringInfo str, const RangeTblEntry *node)
 
static void _outA_Expr (StringInfo str, const A_Expr *node)
 
static void _outInteger (StringInfo str, const Integer *node)
 
static void _outFloat (StringInfo str, const Float *node)
 
static void _outBoolean (StringInfo str, const Boolean *node)
 
static void _outString (StringInfo str, const String *node)
 
static void _outBitString (StringInfo str, const BitString *node)
 
static void _outA_Const (StringInfo str, const A_Const *node)
 
void outNode (StringInfo str, const void *obj)
 
static char * nodeToStringInternal (const void *obj, bool write_loc_fields)
 
char * nodeToString (const void *obj)
 
char * nodeToStringWithLocations (const void *obj)
 
char * bmsToString (const Bitmapset *bms)
 

Variables

static bool write_location_fields = false
 

Macro Definition Documentation

◆ booltostr

#define booltostr (   x)    ((x) ? "true" : "false")

Definition at line 142 of file outfuncs.c.

◆ WRITE_ATTRNUMBER_ARRAY

#define WRITE_ATTRNUMBER_ARRAY (   fldname,
  len 
)
Value:
(appendStringInfoString(str, " :" CppAsString(fldname) " "), \
writeAttrNumberCols(str, node->fldname, len))
#define CppAsString(identifier)
Definition: c.h:422
const char * str
const void size_t len
void appendStringInfoString(StringInfo str, const char *s)
Definition: stringinfo.c:230

Definition at line 118 of file outfuncs.c.

◆ WRITE_BITMAPSET_FIELD

#define WRITE_BITMAPSET_FIELD (   fldname)
Value:
(appendStringInfoString(str, " :" CppAsString(fldname) " "), \
outBitmapset(str, node->fldname))

Definition at line 108 of file outfuncs.c.

◆ WRITE_BOOL_ARRAY

#define WRITE_BOOL_ARRAY (   fldname,
  len 
)
Value:
(appendStringInfoString(str, " :" CppAsString(fldname) " "), \
writeBoolCols(str, node->fldname, len))

Definition at line 138 of file outfuncs.c.

◆ WRITE_BOOL_FIELD

#define WRITE_BOOL_FIELD (   fldname)
Value:
appendStringInfo(str, " :" CppAsString(fldname) " %s", \
booltostr(node->fldname))
#define booltostr(x)
Definition: outfuncs.c:142
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition: stringinfo.c:145

Definition at line 89 of file outfuncs.c.

◆ WRITE_CHAR_FIELD

#define WRITE_CHAR_FIELD (   fldname)
Value:
(appendStringInfo(str, " :" CppAsString(fldname) " "), \
outChar(str, node->fldname))

Definition at line 74 of file outfuncs.c.

◆ WRITE_ENUM_FIELD

#define WRITE_ENUM_FIELD (   fldname,
  enumtype 
)
Value:
appendStringInfo(str, " :" CppAsString(fldname) " %d", \
(int) node->fldname)

Definition at line 79 of file outfuncs.c.

◆ WRITE_FLOAT_FIELD

#define WRITE_FLOAT_FIELD (   fldname)
Value:
(appendStringInfo(str, " :" CppAsString(fldname) " "), \
outDouble(str, node->fldname))

Definition at line 84 of file outfuncs.c.

◆ WRITE_INDEX_ARRAY

#define WRITE_INDEX_ARRAY (   fldname,
  len 
)
Value:
(appendStringInfoString(str, " :" CppAsString(fldname) " "), \
writeIndexCols(str, node->fldname, len))

Definition at line 128 of file outfuncs.c.

◆ WRITE_INT64_FIELD

#define WRITE_INT64_FIELD (   fldname)
Value:
" :" CppAsString(fldname) " " INT64_FORMAT, \
node->fldname)
#define INT64_FORMAT
Definition: c.h:559

Definition at line 55 of file outfuncs.c.

◆ WRITE_INT_ARRAY

#define WRITE_INT_ARRAY (   fldname,
  len 
)
Value:
(appendStringInfoString(str, " :" CppAsString(fldname) " "), \
writeIntCols(str, node->fldname, len))

Definition at line 133 of file outfuncs.c.

◆ WRITE_INT_FIELD

#define WRITE_INT_FIELD (   fldname)     appendStringInfo(str, " :" CppAsString(fldname) " %d", node->fldname)

Definition at line 47 of file outfuncs.c.

◆ WRITE_LOCATION_FIELD

#define WRITE_LOCATION_FIELD (   fldname)     appendStringInfo(str, " :" CppAsString(fldname) " %d", write_location_fields ? node->fldname : -1)

Definition at line 99 of file outfuncs.c.

◆ WRITE_LONG_FIELD

#define WRITE_LONG_FIELD (   fldname)     appendStringInfo(str, " :" CppAsString(fldname) " %ld", node->fldname)

Definition at line 70 of file outfuncs.c.

◆ WRITE_NODE_ARRAY

#define WRITE_NODE_ARRAY (   fldname,
  len 
)
Value:
(appendStringInfoString(str, " :" CppAsString(fldname) " "), \
writeNodeArray(str, (const Node * const *) node->fldname, len))
Definition: nodes.h:135

Definition at line 113 of file outfuncs.c.

◆ WRITE_NODE_FIELD

#define WRITE_NODE_FIELD (   fldname)
Value:
(appendStringInfoString(str, " :" CppAsString(fldname) " "), \
outNode(str, node->fldname))

Definition at line 103 of file outfuncs.c.

◆ WRITE_NODE_TYPE

#define WRITE_NODE_TYPE (   nodelabel)     appendStringInfoString(str, nodelabel)

Definition at line 43 of file outfuncs.c.

◆ WRITE_OID_ARRAY

#define WRITE_OID_ARRAY (   fldname,
  len 
)
Value:
(appendStringInfoString(str, " :" CppAsString(fldname) " "), \
writeOidCols(str, node->fldname, len))

Definition at line 123 of file outfuncs.c.

◆ WRITE_OID_FIELD

#define WRITE_OID_FIELD (   fldname)     appendStringInfo(str, " :" CppAsString(fldname) " %u", node->fldname)

Definition at line 66 of file outfuncs.c.

◆ WRITE_SCALAR_ARRAY

#define WRITE_SCALAR_ARRAY (   fnname,
  datatype,
  fmtstr,
  convfunc 
)
Value:
static void \
fnname(StringInfo str, const datatype *arr, int len) \
{ \
if (arr != NULL) \
{ \
appendStringInfoChar(str, '('); \
for (int i = 0; i < len; i++) \
appendStringInfo(str, fmtstr, convfunc(arr[i])); \
appendStringInfoChar(str, ')'); \
} \
}
int i
Definition: isn.c:77
static void fmtstr(const char *value, int leftjust, int minlen, int maxwidth, int pointflag, PrintfTarget *target)
Definition: snprintf.c:956

Definition at line 233 of file outfuncs.c.

◆ WRITE_STRING_FIELD

#define WRITE_STRING_FIELD (   fldname)
Value:
(appendStringInfoString(str, " :" CppAsString(fldname) " "), \
outToken(str, node->fldname))

Definition at line 94 of file outfuncs.c.

◆ WRITE_UINT64_FIELD

#define WRITE_UINT64_FIELD (   fldname)
Value:
node->fldname)
#define UINT64_FORMAT
Definition: c.h:560

Definition at line 61 of file outfuncs.c.

◆ WRITE_UINT_FIELD

#define WRITE_UINT_FIELD (   fldname)     appendStringInfo(str, " :" CppAsString(fldname) " %u", node->fldname)

Definition at line 51 of file outfuncs.c.

Function Documentation

◆ _outA_Const()

static void _outA_Const ( StringInfo  str,
const A_Const node 
)
static

Definition at line 707 of file outfuncs.c.

708{
709 WRITE_NODE_TYPE("A_CONST");
710
711 if (node->isnull)
712 appendStringInfoString(str, " NULL");
713 else
714 {
715 appendStringInfoString(str, " :val ");
716 outNode(str, &node->val);
717 }
718 WRITE_LOCATION_FIELD(location);
719}
#define WRITE_NODE_TYPE(nodelabel)
Definition: outfuncs.c:43
void outNode(StringInfo str, const void *obj)
Definition: outfuncs.c:727
#define WRITE_LOCATION_FIELD(fldname)
Definition: outfuncs.c:99
bool isnull
Definition: parsenodes.h:388
union ValUnion val
Definition: parsenodes.h:387

References appendStringInfoString(), A_Const::isnull, outNode(), str, A_Const::val, WRITE_LOCATION_FIELD, and WRITE_NODE_TYPE.

◆ _outA_Expr()

static void _outA_Expr ( StringInfo  str,
const A_Expr node 
)
static

Definition at line 585 of file outfuncs.c.

586{
587 WRITE_NODE_TYPE("A_EXPR");
588
589 switch (node->kind)
590 {
591 case AEXPR_OP:
593 break;
594 case AEXPR_OP_ANY:
597 break;
598 case AEXPR_OP_ALL:
601 break;
602 case AEXPR_DISTINCT:
603 appendStringInfoString(str, " DISTINCT");
605 break;
607 appendStringInfoString(str, " NOT_DISTINCT");
609 break;
610 case AEXPR_NULLIF:
611 appendStringInfoString(str, " NULLIF");
613 break;
614 case AEXPR_IN:
617 break;
618 case AEXPR_LIKE:
619 appendStringInfoString(str, " LIKE");
621 break;
622 case AEXPR_ILIKE:
623 appendStringInfoString(str, " ILIKE");
625 break;
626 case AEXPR_SIMILAR:
627 appendStringInfoString(str, " SIMILAR");
629 break;
630 case AEXPR_BETWEEN:
631 appendStringInfoString(str, " BETWEEN");
633 break;
635 appendStringInfoString(str, " NOT_BETWEEN");
637 break;
639 appendStringInfoString(str, " BETWEEN_SYM");
641 break;
643 appendStringInfoString(str, " NOT_BETWEEN_SYM");
645 break;
646 default:
647 elog(ERROR, "unrecognized A_Expr_Kind: %d", (int) node->kind);
648 break;
649 }
650
651 WRITE_NODE_FIELD(lexpr);
652 WRITE_NODE_FIELD(rexpr);
653 WRITE_LOCATION_FIELD(rexpr_list_start);
654 WRITE_LOCATION_FIELD(rexpr_list_end);
655 WRITE_LOCATION_FIELD(location);
656}
#define ERROR
Definition: elog.h:39
#define elog(elevel,...)
Definition: elog.h:226
#define WRITE_NODE_FIELD(fldname)
Definition: outfuncs.c:103
@ AEXPR_BETWEEN
Definition: parsenodes.h:340
@ AEXPR_NULLIF
Definition: parsenodes.h:335
@ AEXPR_NOT_DISTINCT
Definition: parsenodes.h:334
@ AEXPR_BETWEEN_SYM
Definition: parsenodes.h:342
@ AEXPR_NOT_BETWEEN_SYM
Definition: parsenodes.h:343
@ AEXPR_ILIKE
Definition: parsenodes.h:338
@ AEXPR_IN
Definition: parsenodes.h:336
@ AEXPR_NOT_BETWEEN
Definition: parsenodes.h:341
@ AEXPR_DISTINCT
Definition: parsenodes.h:333
@ AEXPR_SIMILAR
Definition: parsenodes.h:339
@ AEXPR_LIKE
Definition: parsenodes.h:337
@ AEXPR_OP
Definition: parsenodes.h:330
@ AEXPR_OP_ANY
Definition: parsenodes.h:331
@ AEXPR_OP_ALL
Definition: parsenodes.h:332
A_Expr_Kind kind
Definition: parsenodes.h:351
const char * name

References AEXPR_BETWEEN, AEXPR_BETWEEN_SYM, AEXPR_DISTINCT, AEXPR_ILIKE, AEXPR_IN, AEXPR_LIKE, AEXPR_NOT_BETWEEN, AEXPR_NOT_BETWEEN_SYM, AEXPR_NOT_DISTINCT, AEXPR_NULLIF, AEXPR_OP, AEXPR_OP_ALL, AEXPR_OP_ANY, AEXPR_SIMILAR, appendStringInfoString(), elog, ERROR, A_Expr::kind, name, str, WRITE_LOCATION_FIELD, WRITE_NODE_FIELD, and WRITE_NODE_TYPE.

◆ _outBitString()

static void _outBitString ( StringInfo  str,
const BitString node 
)
static

Definition at line 695 of file outfuncs.c.

696{
697 /*
698 * The lexer will always produce a string starting with 'b' or 'x'. There
699 * might be characters following that that need escaping, but outToken
700 * won't escape the 'b' or 'x'. This is relied on by nodeTokenType.
701 */
702 Assert(node->bsval[0] == 'b' || node->bsval[0] == 'x');
703 outToken(str, node->bsval);
704}
Assert(PointerIsAligned(start, uint64))
void outToken(StringInfo str, const char *s)
Definition: outfuncs.c:155
char * bsval
Definition: value.h:76

References Assert(), BitString::bsval, outToken(), and str.

Referenced by outNode().

◆ _outBoolean()

static void _outBoolean ( StringInfo  str,
const Boolean node 
)
static

Definition at line 675 of file outfuncs.c.

676{
677 appendStringInfoString(str, node->boolval ? "true" : "false");
678}
bool boolval
Definition: value.h:60

References appendStringInfoString(), Boolean::boolval, and str.

Referenced by outNode().

◆ _outBoolExpr()

static void _outBoolExpr ( StringInfo  str,
const BoolExpr node 
)
static

Definition at line 407 of file outfuncs.c.

408{
409 char *opstr = NULL;
410
411 WRITE_NODE_TYPE("BOOLEXPR");
412
413 /* do-it-yourself enum representation */
414 switch (node->boolop)
415 {
416 case AND_EXPR:
417 opstr = "and";
418 break;
419 case OR_EXPR:
420 opstr = "or";
421 break;
422 case NOT_EXPR:
423 opstr = "not";
424 break;
425 }
426 appendStringInfoString(str, " :boolop ");
427 outToken(str, opstr);
428
430 WRITE_LOCATION_FIELD(location);
431}
@ AND_EXPR
Definition: primnodes.h:963
@ OR_EXPR
Definition: primnodes.h:963
@ NOT_EXPR
Definition: primnodes.h:963
BoolExprType boolop
Definition: primnodes.h:971

References AND_EXPR, appendStringInfoString(), generate_unaccent_rules::args, BoolExpr::boolop, NOT_EXPR, OR_EXPR, outToken(), str, WRITE_LOCATION_FIELD, WRITE_NODE_FIELD, and WRITE_NODE_TYPE.

◆ _outConst()

static void _outConst ( StringInfo  str,
const Const node 
)
static

Definition at line 387 of file outfuncs.c.

388{
389 WRITE_NODE_TYPE("CONST");
390
391 WRITE_OID_FIELD(consttype);
392 WRITE_INT_FIELD(consttypmod);
393 WRITE_OID_FIELD(constcollid);
394 WRITE_INT_FIELD(constlen);
395 WRITE_BOOL_FIELD(constbyval);
396 WRITE_BOOL_FIELD(constisnull);
397 WRITE_LOCATION_FIELD(location);
398
399 appendStringInfoString(str, " :constvalue ");
400 if (node->constisnull)
402 else
403 outDatum(str, node->constvalue, node->constlen, node->constbyval);
404}
#define WRITE_OID_FIELD(fldname)
Definition: outfuncs.c:66
void outDatum(StringInfo str, Datum value, int typlen, bool typbyval)
Definition: outfuncs.c:347
#define WRITE_BOOL_FIELD(fldname)
Definition: outfuncs.c:89
#define WRITE_INT_FIELD(fldname)
Definition: outfuncs.c:47

References appendStringInfoString(), outDatum(), str, WRITE_BOOL_FIELD, WRITE_INT_FIELD, WRITE_LOCATION_FIELD, WRITE_NODE_TYPE, and WRITE_OID_FIELD.

◆ _outEquivalenceClass()

static void _outEquivalenceClass ( StringInfo  str,
const EquivalenceClass node 
)
static

Definition at line 458 of file outfuncs.c.

459{
460 /*
461 * To simplify reading, we just chase up to the topmost merged EC and
462 * print that, without bothering to show the merge-ees separately.
463 */
464 while (node->ec_merged)
465 node = node->ec_merged;
466
467 WRITE_NODE_TYPE("EQUIVALENCECLASS");
468
469 WRITE_NODE_FIELD(ec_opfamilies);
470 WRITE_OID_FIELD(ec_collation);
471 WRITE_INT_FIELD(ec_childmembers_size);
472 WRITE_NODE_FIELD(ec_members);
473 WRITE_NODE_ARRAY(ec_childmembers, node->ec_childmembers_size);
474 WRITE_NODE_FIELD(ec_sources);
475 /* Only ec_derives_list is written; hash is not serialized. */
476 WRITE_NODE_FIELD(ec_derives_list);
477 WRITE_BITMAPSET_FIELD(ec_relids);
478 WRITE_BOOL_FIELD(ec_has_const);
479 WRITE_BOOL_FIELD(ec_has_volatile);
480 WRITE_BOOL_FIELD(ec_broken);
481 WRITE_UINT_FIELD(ec_sortref);
482 WRITE_UINT_FIELD(ec_min_security);
483 WRITE_UINT_FIELD(ec_max_security);
484}
#define WRITE_NODE_ARRAY(fldname, len)
Definition: outfuncs.c:113
#define WRITE_BITMAPSET_FIELD(fldname)
Definition: outfuncs.c:108
#define WRITE_UINT_FIELD(fldname)
Definition: outfuncs.c:51
int ec_childmembers_size
Definition: pathnodes.h:1563
struct EquivalenceClass * ec_merged
Definition: pathnodes.h:1579

References EquivalenceClass::ec_childmembers_size, EquivalenceClass::ec_merged, WRITE_BITMAPSET_FIELD, WRITE_BOOL_FIELD, WRITE_INT_FIELD, WRITE_NODE_ARRAY, WRITE_NODE_FIELD, WRITE_NODE_TYPE, WRITE_OID_FIELD, and WRITE_UINT_FIELD.

◆ _outExtensibleNode()

static void _outExtensibleNode ( StringInfo  str,
const ExtensibleNode node 
)
static

Definition at line 487 of file outfuncs.c.

488{
489 const ExtensibleNodeMethods *methods;
490
491 methods = GetExtensibleNodeMethods(node->extnodename, false);
492
493 WRITE_NODE_TYPE("EXTENSIBLENODE");
494
495 WRITE_STRING_FIELD(extnodename);
496
497 /* serialize the private fields */
498 methods->nodeOut(str, node);
499}
const ExtensibleNodeMethods * GetExtensibleNodeMethods(const char *extnodename, bool missing_ok)
Definition: extensible.c:125
#define WRITE_STRING_FIELD(fldname)
Definition: outfuncs.c:94
void(* nodeOut)(struct StringInfoData *str, const struct ExtensibleNode *node)
Definition: extensible.h:70
const char * extnodename
Definition: extensible.h:37

References ExtensibleNode::extnodename, GetExtensibleNodeMethods(), ExtensibleNodeMethods::nodeOut, str, WRITE_NODE_TYPE, and WRITE_STRING_FIELD.

◆ _outFloat()

static void _outFloat ( StringInfo  str,
const Float node 
)
static

Definition at line 665 of file outfuncs.c.

666{
667 /*
668 * We assume the value is a valid numeric literal and so does not need
669 * quoting.
670 */
672}
char * fval
Definition: value.h:52

References appendStringInfoString(), Float::fval, and str.

Referenced by outNode().

◆ _outForeignKeyOptInfo()

static void _outForeignKeyOptInfo ( StringInfo  str,
const ForeignKeyOptInfo node 
)
static

Definition at line 434 of file outfuncs.c.

435{
436 WRITE_NODE_TYPE("FOREIGNKEYOPTINFO");
437
438 WRITE_UINT_FIELD(con_relid);
439 WRITE_UINT_FIELD(ref_relid);
440 WRITE_INT_FIELD(nkeys);
441 WRITE_ATTRNUMBER_ARRAY(conkey, node->nkeys);
442 WRITE_ATTRNUMBER_ARRAY(confkey, node->nkeys);
443 WRITE_OID_ARRAY(conpfeqop, node->nkeys);
444 WRITE_INT_FIELD(nmatched_ec);
445 WRITE_INT_FIELD(nconst_ec);
446 WRITE_INT_FIELD(nmatched_rcols);
447 WRITE_INT_FIELD(nmatched_ri);
448 /* for compactness, just print the number of matches per column: */
449 appendStringInfoString(str, " :eclass");
450 for (int i = 0; i < node->nkeys; i++)
451 appendStringInfo(str, " %d", (node->eclass[i] != NULL));
452 appendStringInfoString(str, " :rinfos");
453 for (int i = 0; i < node->nkeys; i++)
454 appendStringInfo(str, " %d", list_length(node->rinfos[i]));
455}
#define WRITE_ATTRNUMBER_ARRAY(fldname, len)
Definition: outfuncs.c:118
#define WRITE_OID_ARRAY(fldname, len)
Definition: outfuncs.c:123
static int list_length(const List *l)
Definition: pg_list.h:152
struct EquivalenceClass * eclass[INDEX_MAX_KEYS]
Definition: pathnodes.h:1398
List * rinfos[INDEX_MAX_KEYS]
Definition: pathnodes.h:1402

References appendStringInfo(), appendStringInfoString(), ForeignKeyOptInfo::eclass, i, list_length(), ForeignKeyOptInfo::nkeys, ForeignKeyOptInfo::rinfos, str, WRITE_ATTRNUMBER_ARRAY, WRITE_INT_FIELD, WRITE_NODE_TYPE, WRITE_OID_ARRAY, and WRITE_UINT_FIELD.

◆ _outInteger()

static void _outInteger ( StringInfo  str,
const Integer node 
)
static

Definition at line 659 of file outfuncs.c.

660{
661 appendStringInfo(str, "%d", node->ival);
662}
int ival
Definition: value.h:33

References appendStringInfo(), Integer::ival, and str.

Referenced by outNode().

◆ _outList()

static void _outList ( StringInfo  str,
const List node 
)
static

Definition at line 281 of file outfuncs.c.

282{
283 const ListCell *lc;
284
286
287 if (IsA(node, IntList))
289 else if (IsA(node, OidList))
291 else if (IsA(node, XidList))
293
294 foreach(lc, node)
295 {
296 /*
297 * For the sake of backward compatibility, we emit a slightly
298 * different whitespace format for lists of nodes vs. other types of
299 * lists. XXX: is this necessary?
300 */
301 if (IsA(node, List))
302 {
303 outNode(str, lfirst(lc));
304 if (lnext(node, lc))
306 }
307 else if (IsA(node, IntList))
308 appendStringInfo(str, " %d", lfirst_int(lc));
309 else if (IsA(node, OidList))
310 appendStringInfo(str, " %u", lfirst_oid(lc));
311 else if (IsA(node, XidList))
312 appendStringInfo(str, " %u", lfirst_xid(lc));
313 else
314 elog(ERROR, "unrecognized list node type: %d",
315 (int) node->type);
316 }
317
319}
#define IsA(nodeptr, _type_)
Definition: nodes.h:164
#define lfirst(lc)
Definition: pg_list.h:172
#define lfirst_int(lc)
Definition: pg_list.h:173
static ListCell * lnext(const List *l, const ListCell *c)
Definition: pg_list.h:343
#define lfirst_oid(lc)
Definition: pg_list.h:174
#define lfirst_xid(lc)
Definition: pg_list.h:175
void appendStringInfoChar(StringInfo str, char ch)
Definition: stringinfo.c:242
Definition: pg_list.h:54
NodeTag type
Definition: pg_list.h:55

References appendStringInfo(), appendStringInfoChar(), elog, ERROR, IsA, lfirst, lfirst_int, lfirst_oid, lfirst_xid, lnext(), outNode(), str, and List::type.

Referenced by outNode().

◆ _outRangeTblEntry()

static void _outRangeTblEntry ( StringInfo  str,
const RangeTblEntry node 
)
static

Definition at line 502 of file outfuncs.c.

503{
504 WRITE_NODE_TYPE("RANGETBLENTRY");
505
506 WRITE_NODE_FIELD(alias);
507 WRITE_NODE_FIELD(eref);
508 WRITE_ENUM_FIELD(rtekind, RTEKind);
509
510 switch (node->rtekind)
511 {
512 case RTE_RELATION:
513 WRITE_OID_FIELD(relid);
514 WRITE_BOOL_FIELD(inh);
515 WRITE_CHAR_FIELD(relkind);
516 WRITE_INT_FIELD(rellockmode);
517 WRITE_UINT_FIELD(perminfoindex);
518 WRITE_NODE_FIELD(tablesample);
519 break;
520 case RTE_SUBQUERY:
521 WRITE_NODE_FIELD(subquery);
522 WRITE_BOOL_FIELD(security_barrier);
523 /* we re-use these RELATION fields, too: */
524 WRITE_OID_FIELD(relid);
525 WRITE_BOOL_FIELD(inh);
526 WRITE_CHAR_FIELD(relkind);
527 WRITE_INT_FIELD(rellockmode);
528 WRITE_UINT_FIELD(perminfoindex);
529 break;
530 case RTE_JOIN:
531 WRITE_ENUM_FIELD(jointype, JoinType);
532 WRITE_INT_FIELD(joinmergedcols);
533 WRITE_NODE_FIELD(joinaliasvars);
534 WRITE_NODE_FIELD(joinleftcols);
535 WRITE_NODE_FIELD(joinrightcols);
536 WRITE_NODE_FIELD(join_using_alias);
537 break;
538 case RTE_FUNCTION:
540 WRITE_BOOL_FIELD(funcordinality);
541 break;
542 case RTE_TABLEFUNC:
543 WRITE_NODE_FIELD(tablefunc);
544 break;
545 case RTE_VALUES:
546 WRITE_NODE_FIELD(values_lists);
547 WRITE_NODE_FIELD(coltypes);
548 WRITE_NODE_FIELD(coltypmods);
549 WRITE_NODE_FIELD(colcollations);
550 break;
551 case RTE_CTE:
552 WRITE_STRING_FIELD(ctename);
553 WRITE_UINT_FIELD(ctelevelsup);
554 WRITE_BOOL_FIELD(self_reference);
555 WRITE_NODE_FIELD(coltypes);
556 WRITE_NODE_FIELD(coltypmods);
557 WRITE_NODE_FIELD(colcollations);
558 break;
560 WRITE_STRING_FIELD(enrname);
561 WRITE_FLOAT_FIELD(enrtuples);
562 WRITE_NODE_FIELD(coltypes);
563 WRITE_NODE_FIELD(coltypmods);
564 WRITE_NODE_FIELD(colcollations);
565 /* we re-use these RELATION fields, too: */
566 WRITE_OID_FIELD(relid);
567 break;
568 case RTE_RESULT:
569 /* no extra fields */
570 break;
571 case RTE_GROUP:
572 WRITE_NODE_FIELD(groupexprs);
573 break;
574 default:
575 elog(ERROR, "unrecognized RTE kind: %d", (int) node->rtekind);
576 break;
577 }
578
579 WRITE_BOOL_FIELD(lateral);
580 WRITE_BOOL_FIELD(inFromCl);
581 WRITE_NODE_FIELD(securityQuals);
582}
JoinType
Definition: nodes.h:298
#define WRITE_ENUM_FIELD(fldname, enumtype)
Definition: outfuncs.c:79
#define WRITE_FLOAT_FIELD(fldname)
Definition: outfuncs.c:84
#define WRITE_CHAR_FIELD(fldname)
Definition: outfuncs.c:74
RTEKind
Definition: parsenodes.h:1042
@ RTE_JOIN
Definition: parsenodes.h:1045
@ RTE_CTE
Definition: parsenodes.h:1049
@ RTE_NAMEDTUPLESTORE
Definition: parsenodes.h:1050
@ RTE_VALUES
Definition: parsenodes.h:1048
@ RTE_SUBQUERY
Definition: parsenodes.h:1044
@ RTE_RESULT
Definition: parsenodes.h:1051
@ RTE_FUNCTION
Definition: parsenodes.h:1046
@ RTE_TABLEFUNC
Definition: parsenodes.h:1047
@ RTE_GROUP
Definition: parsenodes.h:1054
@ RTE_RELATION
Definition: parsenodes.h:1043
static const struct fns functions
Definition: regcomp.c:358
RTEKind rtekind
Definition: parsenodes.h:1078

References elog, ERROR, functions, RTE_CTE, RTE_FUNCTION, RTE_GROUP, RTE_JOIN, RTE_NAMEDTUPLESTORE, RTE_RELATION, RTE_RESULT, RTE_SUBQUERY, RTE_TABLEFUNC, RTE_VALUES, RangeTblEntry::rtekind, WRITE_BOOL_FIELD, WRITE_CHAR_FIELD, WRITE_ENUM_FIELD, WRITE_FLOAT_FIELD, WRITE_INT_FIELD, WRITE_NODE_FIELD, WRITE_NODE_TYPE, WRITE_OID_FIELD, WRITE_STRING_FIELD, and WRITE_UINT_FIELD.

◆ _outString()

static void _outString ( StringInfo  str,
const String node 
)
static

Definition at line 681 of file outfuncs.c.

682{
683 /*
684 * We use outToken to provide escaping of the string's content, but we
685 * don't want it to convert an empty string to '""', because we're putting
686 * double quotes around the string already.
687 */
689 if (node->sval[0] != '\0')
690 outToken(str, node->sval);
692}
char * sval
Definition: value.h:68

References appendStringInfoChar(), outToken(), str, and String::sval.

Referenced by outNode().

◆ bmsToString()

char * bmsToString ( const Bitmapset bms)

Definition at line 819 of file outfuncs.c.

820{
822
823 /* see stringinfo.h for an explanation of this maneuver */
825 outBitmapset(&str, bms);
826 return str.data;
827}
void outBitmapset(StringInfo str, const Bitmapset *bms)
Definition: outfuncs.c:331
void initStringInfo(StringInfo str)
Definition: stringinfo.c:97

References initStringInfo(), outBitmapset(), and str.

Referenced by ExecInitPartitionExecPruning(), search_indexed_tlist_for_phv(), and search_indexed_tlist_for_var().

◆ nodeToString()

◆ nodeToStringInternal()

static char * nodeToStringInternal ( const void *  obj,
bool  write_loc_fields 
)
static

Definition at line 781 of file outfuncs.c.

782{
784 bool save_write_location_fields;
785
786 save_write_location_fields = write_location_fields;
787 write_location_fields = write_loc_fields;
788
789 /* see stringinfo.h for an explanation of this maneuver */
791 outNode(&str, obj);
792
793 write_location_fields = save_write_location_fields;
794
795 return str.data;
796}
static bool write_location_fields
Definition: outfuncs.c:29

References initStringInfo(), outNode(), str, and write_location_fields.

Referenced by nodeToString(), and nodeToStringWithLocations().

◆ nodeToStringWithLocations()

char * nodeToStringWithLocations ( const void *  obj)

Definition at line 808 of file outfuncs.c.

809{
810 return nodeToStringInternal(obj, true);
811}

References nodeToStringInternal().

Referenced by elog_node_display(), pg_parse_query(), pg_plan_query(), pg_rewrite_query(), pprint(), and print().

◆ outBitmapset()

void outBitmapset ( StringInfo  str,
const Bitmapset bms 
)

Definition at line 331 of file outfuncs.c.

332{
333 int x;
334
337 x = -1;
338 while ((x = bms_next_member(bms, x)) >= 0)
339 appendStringInfo(str, " %d", x);
341}
int bms_next_member(const Bitmapset *a, int prevbit)
Definition: bitmapset.c:1305
int x
Definition: isn.c:75

References appendStringInfo(), appendStringInfoChar(), bms_next_member(), str, and x.

Referenced by bmsToString(), and outNode().

◆ outChar()

static void outChar ( StringInfo  str,
char  c 
)
static

Definition at line 196 of file outfuncs.c.

197{
198 char in[2];
199
200 /* Traditionally, we've represented \0 as <>, so keep doing that */
201 if (c == '\0')
202 {
204 return;
205 }
206
207 in[0] = c;
208 in[1] = '\0';
209
210 outToken(str, in);
211}
char * c

References appendStringInfoString(), outToken(), and str.

◆ outDatum()

void outDatum ( StringInfo  str,
Datum  value,
int  typlen,
bool  typbyval 
)

Definition at line 347 of file outfuncs.c.

348{
349 Size length;
350 char *s;
351
352 length = datumGetSize(value, typbyval, typlen);
353
354 if (typbyval)
355 {
356 s = (char *) (&value);
357 appendStringInfo(str, "%u [ ", (unsigned int) length);
358 for (Size i = 0; i < (Size) sizeof(Datum); i++)
359 appendStringInfo(str, "%d ", (int) (s[i]));
361 }
362 else
363 {
364 s = (char *) DatumGetPointer(value);
365 if (!s)
366 appendStringInfoString(str, "0 [ ]");
367 else
368 {
369 appendStringInfo(str, "%u [ ", (unsigned int) length);
370 for (Size i = 0; i < length; i++)
371 appendStringInfo(str, "%d ", (int) (s[i]));
373 }
374 }
375}
size_t Size
Definition: c.h:613
Size datumGetSize(Datum value, bool typByVal, int typLen)
Definition: datum.c:65
static struct @171 value
uint64_t Datum
Definition: postgres.h:70
static Pointer DatumGetPointer(Datum X)
Definition: postgres.h:322

References appendStringInfo(), appendStringInfoChar(), appendStringInfoString(), DatumGetPointer(), datumGetSize(), i, str, and value.

Referenced by _outConst().

◆ outDouble()

static void outDouble ( StringInfo  str,
double  d 
)
static

Definition at line 217 of file outfuncs.c.

218{
220
223}
int double_to_shortest_decimal_buf(double f, char *result)
Definition: d2s.c:1053
static char * buf
Definition: pg_test_fsync.c:72
#define DOUBLE_SHORTEST_DECIMAL_LEN
Definition: shortest_dec.h:44

References appendStringInfoString(), buf, DOUBLE_SHORTEST_DECIMAL_LEN, double_to_shortest_decimal_buf(), and str.

◆ outNode()

void outNode ( StringInfo  str,
const void *  obj 
)

Definition at line 727 of file outfuncs.c.

728{
729 /* Guard against stack overflow due to overly complex expressions */
731
732 if (obj == NULL)
734 else if (IsA(obj, List) || IsA(obj, IntList) || IsA(obj, OidList) ||
735 IsA(obj, XidList))
736 _outList(str, obj);
737 /* nodeRead does not want to see { } around these! */
738 else if (IsA(obj, Integer))
739 _outInteger(str, (Integer *) obj);
740 else if (IsA(obj, Float))
741 _outFloat(str, (Float *) obj);
742 else if (IsA(obj, Boolean))
743 _outBoolean(str, (Boolean *) obj);
744 else if (IsA(obj, String))
745 _outString(str, (String *) obj);
746 else if (IsA(obj, BitString))
747 _outBitString(str, (BitString *) obj);
748 else if (IsA(obj, Bitmapset))
749 outBitmapset(str, (Bitmapset *) obj);
750 else
751 {
753 switch (nodeTag(obj))
754 {
755#include "outfuncs.switch.c"
756
757 default:
758
759 /*
760 * This should be an ERROR, but it's too useful to be able to
761 * dump structures that outNode only understands part of.
762 */
763 elog(WARNING, "could not dump unrecognized node type: %d",
764 (int) nodeTag(obj));
765 break;
766 }
768 }
769}
#define WARNING
Definition: elog.h:36
#define nodeTag(nodeptr)
Definition: nodes.h:139
static void _outString(StringInfo str, const String *node)
Definition: outfuncs.c:681
static void _outInteger(StringInfo str, const Integer *node)
Definition: outfuncs.c:659
static void _outList(StringInfo str, const List *node)
Definition: outfuncs.c:281
static void _outFloat(StringInfo str, const Float *node)
Definition: outfuncs.c:665
static void _outBitString(StringInfo str, const BitString *node)
Definition: outfuncs.c:695
static void _outBoolean(StringInfo str, const Boolean *node)
Definition: outfuncs.c:675
void check_stack_depth(void)
Definition: stack_depth.c:95
Definition: value.h:56
Definition: value.h:48
Definition: value.h:29
Definition: value.h:64

References _outBitString(), _outBoolean(), _outFloat(), _outInteger(), _outList(), _outString(), appendStringInfoChar(), appendStringInfoString(), check_stack_depth(), elog, IsA, nodeTag, outBitmapset(), str, and WARNING.

Referenced by _outA_Const(), _outList(), nodeToStringInternal(), and writeNodeArray().

◆ outToken()

void outToken ( StringInfo  str,
const char *  s 
)

Definition at line 155 of file outfuncs.c.

156{
157 if (s == NULL)
158 {
160 return;
161 }
162 if (*s == '\0')
163 {
165 return;
166 }
167
168 /*
169 * Look for characters or patterns that are treated specially by read.c
170 * (either in pg_strtok() or in nodeRead()), and therefore need a
171 * protective backslash.
172 */
173 /* These characters only need to be quoted at the start of the string */
174 if (*s == '<' ||
175 *s == '"' ||
176 isdigit((unsigned char) *s) ||
177 ((*s == '+' || *s == '-') &&
178 (isdigit((unsigned char) s[1]) || s[1] == '.')))
180 while (*s)
181 {
182 /* These chars must be backslashed anywhere in the string */
183 if (*s == ' ' || *s == '\n' || *s == '\t' ||
184 *s == '(' || *s == ')' || *s == '{' || *s == '}' ||
185 *s == '\\')
188 }
189}

References appendStringInfoChar(), appendStringInfoString(), and str.

Referenced by _outBitString(), _outBoolExpr(), _outString(), and outChar().

◆ writeNodeArray()

static void writeNodeArray ( StringInfo  str,
const Node *const *  arr,
int  len 
)
static

Definition at line 261 of file outfuncs.c.

262{
263 if (arr != NULL)
264 {
266 for (int i = 0; i < len; i++)
267 {
269 outNode(str, arr[i]);
270 }
272 }
273 else
275}

References appendStringInfoChar(), appendStringInfoString(), i, len, outNode(), and str.

Variable Documentation

◆ write_location_fields

bool write_location_fields = false
static

Definition at line 29 of file outfuncs.c.

Referenced by nodeToStringInternal().