LCOV - differential code coverage report
Current view: top level - src/backend/nodes - outfuncs.c (source / functions) Coverage Total Hit UNC LBC UIC UBC GBC GIC GNC CBC DUB DCB
Current: 7a15cff1f11193467898da1c1fabf06fd2caee04 vs 84a3778c79c2d28b4dc281d03ef2ab019b16483b Lines: 53.6 % 371 199 2 8 162 1 5 193 2 5
Current Date: 2025-12-15 18:36:29 -0500 Functions: 56.7 % 30 17 1 12 1 16
Baseline: lcov-20251216-010103-baseline Branches: 36.2 % 594 215 5 21 4 349 21 1 5 188
Baseline Date: 2025-12-15 13:30:48 -0800 Line coverage date bins:
Legend: Lines:     hit not hit
Branches: + taken - not taken # not executed
(1,7] days: 100.0 % 2 2 2
(7,30] days: 50.0 % 4 2 2 2
(30,360] days: 16.7 % 6 1 5 1
(360..) days: 54.0 % 359 194 8 157 1 193
Function coverage date bins:
(360..) days: 56.7 % 30 17 1 12 1 16
Branch coverage date bins:
(7,30] days: 50.0 % 8 4 4 4
(30,360] days: 16.7 % 6 1 1 4 1
(360..) days: 36.2 % 580 210 21 4 345 21 1 188

 Age         Owner                    Branch data    TLA  Line data    Source code
                                  1                 :                : /*-------------------------------------------------------------------------
                                  2                 :                :  *
                                  3                 :                :  * outfuncs.c
                                  4                 :                :  *    Output functions for Postgres tree nodes.
                                  5                 :                :  *
                                  6                 :                :  * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
                                  7                 :                :  * Portions Copyright (c) 1994, Regents of the University of California
                                  8                 :                :  *
                                  9                 :                :  *
                                 10                 :                :  * IDENTIFICATION
                                 11                 :                :  *    src/backend/nodes/outfuncs.c
                                 12                 :                :  *
                                 13                 :                :  *-------------------------------------------------------------------------
                                 14                 :                :  */
                                 15                 :                : #include "postgres.h"
                                 16                 :                : 
                                 17                 :                : #include <ctype.h>
                                 18                 :                : 
                                 19                 :                : #include "access/attnum.h"
                                 20                 :                : #include "common/shortest_dec.h"
                                 21                 :                : #include "lib/stringinfo.h"
                                 22                 :                : #include "miscadmin.h"
                                 23                 :                : #include "nodes/bitmapset.h"
                                 24                 :                : #include "nodes/nodes.h"
                                 25                 :                : #include "nodes/pg_list.h"
                                 26                 :                : #include "utils/datum.h"
                                 27                 :                : 
                                 28                 :                : /* State flag that determines how nodeToStringInternal() should treat location fields */
                                 29                 :                : static bool write_location_fields = false;
                                 30                 :                : 
                                 31                 :                : static void outChar(StringInfo str, char c);
                                 32                 :                : static void outDouble(StringInfo str, double d);
                                 33                 :                : 
                                 34                 :                : 
                                 35                 :                : /*
                                 36                 :                :  * Macros to simplify output of different kinds of fields.  Use these
                                 37                 :                :  * wherever possible to reduce the chance for silly typos.  Note that these
                                 38                 :                :  * hard-wire conventions about the names of the local variables in an Out
                                 39                 :                :  * routine.
                                 40                 :                :  */
                                 41                 :                : 
                                 42                 :                : /* Write the label for the node type */
                                 43                 :                : #define WRITE_NODE_TYPE(nodelabel) \
                                 44                 :                :     appendStringInfoString(str, nodelabel)
                                 45                 :                : 
                                 46                 :                : /* Write an integer field (anything written as ":fldname %d") */
                                 47                 :                : #define WRITE_INT_FIELD(fldname) \
                                 48                 :                :     appendStringInfo(str, " :" CppAsString(fldname) " %d", node->fldname)
                                 49                 :                : 
                                 50                 :                : /* Write an unsigned integer field (anything written as ":fldname %u") */
                                 51                 :                : #define WRITE_UINT_FIELD(fldname) \
                                 52                 :                :     appendStringInfo(str, " :" CppAsString(fldname) " %u", node->fldname)
                                 53                 :                : 
                                 54                 :                : /* Write a signed integer field (anything written with INT64_FORMAT) */
                                 55                 :                : #define WRITE_INT64_FIELD(fldname) \
                                 56                 :                :     appendStringInfo(str, \
                                 57                 :                :                      " :" CppAsString(fldname) " " INT64_FORMAT, \
                                 58                 :                :                      node->fldname)
                                 59                 :                : 
                                 60                 :                : /* Write an unsigned integer field (anything written with UINT64_FORMAT) */
                                 61                 :                : #define WRITE_UINT64_FIELD(fldname) \
                                 62                 :                :     appendStringInfo(str, " :" CppAsString(fldname) " " UINT64_FORMAT, \
                                 63                 :                :                      node->fldname)
                                 64                 :                : 
                                 65                 :                : /* Write an OID field (don't hard-wire assumption that OID is same as uint) */
                                 66                 :                : #define WRITE_OID_FIELD(fldname) \
                                 67                 :                :     appendStringInfo(str, " :" CppAsString(fldname) " %u", node->fldname)
                                 68                 :                : 
                                 69                 :                : /* Write a long-integer field */
                                 70                 :                : #define WRITE_LONG_FIELD(fldname) \
                                 71                 :                :     appendStringInfo(str, " :" CppAsString(fldname) " %ld", node->fldname)
                                 72                 :                : 
                                 73                 :                : /* Write a char field (ie, one ascii character) */
                                 74                 :                : #define WRITE_CHAR_FIELD(fldname) \
                                 75                 :                :     (appendStringInfo(str, " :" CppAsString(fldname) " "), \
                                 76                 :                :      outChar(str, node->fldname))
                                 77                 :                : 
                                 78                 :                : /* Write an enumerated-type field as an integer code */
                                 79                 :                : #define WRITE_ENUM_FIELD(fldname, enumtype) \
                                 80                 :                :     appendStringInfo(str, " :" CppAsString(fldname) " %d", \
                                 81                 :                :                      (int) node->fldname)
                                 82                 :                : 
                                 83                 :                : /* Write a float field (actually, they're double) */
                                 84                 :                : #define WRITE_FLOAT_FIELD(fldname) \
                                 85                 :                :     (appendStringInfo(str, " :" CppAsString(fldname) " "), \
                                 86                 :                :      outDouble(str, node->fldname))
                                 87                 :                : 
                                 88                 :                : /* Write a boolean field */
                                 89                 :                : #define WRITE_BOOL_FIELD(fldname) \
                                 90                 :                :     appendStringInfo(str, " :" CppAsString(fldname) " %s", \
                                 91                 :                :                      booltostr(node->fldname))
                                 92                 :                : 
                                 93                 :                : /* Write a character-string (possibly NULL) field */
                                 94                 :                : #define WRITE_STRING_FIELD(fldname) \
                                 95                 :                :     (appendStringInfoString(str, " :" CppAsString(fldname) " "), \
                                 96                 :                :      outToken(str, node->fldname))
                                 97                 :                : 
                                 98                 :                : /* Write a parse location field (actually same as INT case) */
                                 99                 :                : #define WRITE_LOCATION_FIELD(fldname) \
                                100                 :                :     appendStringInfo(str, " :" CppAsString(fldname) " %d", write_location_fields ? node->fldname : -1)
                                101                 :                : 
                                102                 :                : /* Write a Node field */
                                103                 :                : #define WRITE_NODE_FIELD(fldname) \
                                104                 :                :     (appendStringInfoString(str, " :" CppAsString(fldname) " "), \
                                105                 :                :      outNode(str, node->fldname))
                                106                 :                : 
                                107                 :                : /* Write a bitmapset field */
                                108                 :                : #define WRITE_BITMAPSET_FIELD(fldname) \
                                109                 :                :     (appendStringInfoString(str, " :" CppAsString(fldname) " "), \
                                110                 :                :      outBitmapset(str, node->fldname))
                                111                 :                : 
                                112                 :                : /* Write a variable-length array (not a List) of Node pointers */
                                113                 :                : #define WRITE_NODE_ARRAY(fldname, len) \
                                114                 :                :     (appendStringInfoString(str, " :" CppAsString(fldname) " "), \
                                115                 :                :      writeNodeArray(str, (const Node * const *) node->fldname, len))
                                116                 :                : 
                                117                 :                : /* Write a variable-length array of AttrNumber */
                                118                 :                : #define WRITE_ATTRNUMBER_ARRAY(fldname, len) \
                                119                 :                :     (appendStringInfoString(str, " :" CppAsString(fldname) " "), \
                                120                 :                :      writeAttrNumberCols(str, node->fldname, len))
                                121                 :                : 
                                122                 :                : /* Write a variable-length array of Oid */
                                123                 :                : #define WRITE_OID_ARRAY(fldname, len) \
                                124                 :                :     (appendStringInfoString(str, " :" CppAsString(fldname) " "), \
                                125                 :                :      writeOidCols(str, node->fldname, len))
                                126                 :                : 
                                127                 :                : /* Write a variable-length array of Index */
                                128                 :                : #define WRITE_INDEX_ARRAY(fldname, len) \
                                129                 :                :     (appendStringInfoString(str, " :" CppAsString(fldname) " "), \
                                130                 :                :      writeIndexCols(str, node->fldname, len))
                                131                 :                : 
                                132                 :                : /* Write a variable-length array of int */
                                133                 :                : #define WRITE_INT_ARRAY(fldname, len) \
                                134                 :                :     (appendStringInfoString(str, " :" CppAsString(fldname) " "), \
                                135                 :                :      writeIntCols(str, node->fldname, len))
                                136                 :                : 
                                137                 :                : /* Write a variable-length array of bool */
                                138                 :                : #define WRITE_BOOL_ARRAY(fldname, len) \
                                139                 :                :     (appendStringInfoString(str, " :" CppAsString(fldname) " "), \
                                140                 :                :      writeBoolCols(str, node->fldname, len))
                                141                 :                : 
                                142                 :                : #define booltostr(x)  ((x) ? "true" : "false")
                                143                 :                : 
                                144                 :                : 
                                145                 :                : /*
                                146                 :                :  * outToken
                                147                 :                :  *    Convert an ordinary string (eg, an identifier) into a form that
                                148                 :                :  *    will be decoded back to a plain token by read.c's functions.
                                149                 :                :  *
                                150                 :                :  *    If a null string pointer is given, it is encoded as '<>'.
                                151                 :                :  *    An empty string is encoded as '""'.  To avoid ambiguity, input
                                152                 :                :  *    strings beginning with '<' or '"' receive a leading backslash.
                                153                 :                :  */
                                154                 :                : void
 3378 tgl@sss.pgh.pa.us         155                 :CBC     1073271 : outToken(StringInfo str, const char *s)
                                156                 :                : {
 1177 peter@eisentraut.org      157         [ +  + ]:        1073271 :     if (s == NULL)
                                158                 :                :     {
 4429 rhaas@postgresql.org      159                 :          45738 :         appendStringInfoString(str, "<>");
 9468 tgl@sss.pgh.pa.us         160                 :          45738 :         return;
                                161                 :                :     }
 1177 peter@eisentraut.org      162         [ -  + ]:        1027533 :     if (*s == '\0')
                                163                 :                :     {
 1177 peter@eisentraut.org      164                 :UBC           0 :         appendStringInfoString(str, "\"\"");
                                165                 :              0 :         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 */
 9468 tgl@sss.pgh.pa.us         174         [ +  + ]:CBC     1027533 :     if (*s == '<' ||
 3647 peter_e@gmx.net           175         [ +  - ]:        1027527 :         *s == '"' ||
 9144 tgl@sss.pgh.pa.us         176         [ +  - ]:        1027527 :         isdigit((unsigned char) *s) ||
 9108                           177   [ +  -  -  + ]:        1027527 :         ((*s == '+' || *s == '-') &&
 9108 tgl@sss.pgh.pa.us         178   [ #  #  #  # ]:UBC           0 :          (isdigit((unsigned char) s[1]) || s[1] == '.')))
 9468 tgl@sss.pgh.pa.us         179                 :CBC           6 :         appendStringInfoChar(str, '\\');
                                180         [ +  + ]:       10290311 :     while (*s)
                                181                 :                :     {
                                182                 :                :         /* These chars must be backslashed anywhere in the string */
                                183   [ +  +  +  -  :        9262778 :         if (*s == ' ' || *s == '\n' || *s == '\t' ||
                                              +  - ]
                                184   [ +  +  +  +  :        9262664 :             *s == '(' || *s == ')' || *s == '{' || *s == '}' ||
                                        +  -  +  - ]
                                185         [ -  + ]:        9262640 :             *s == '\\')
                                186                 :            138 :             appendStringInfoChar(str, '\\');
                                187                 :        9262778 :         appendStringInfoChar(str, *s++);
                                188                 :                :     }
                                189                 :                : }
                                190                 :                : 
                                191                 :                : /*
                                192                 :                :  * Convert one char.  Goes through outToken() so that special characters are
                                193                 :                :  * escaped.
                                194                 :                :  */
                                195                 :                : static void
 3100 peter_e@gmx.net           196                 :          38993 : outChar(StringInfo str, char c)
                                197                 :                : {
                                198                 :                :     char        in[2];
                                199                 :                : 
                                200                 :                :     /* Traditionally, we've represented \0 as <>, so keep doing that */
 1177 peter@eisentraut.org      201         [ +  + ]:          38993 :     if (c == '\0')
                                202                 :                :     {
                                203                 :           4886 :         appendStringInfoString(str, "<>");
                                204                 :           4886 :         return;
                                205                 :                :     }
                                206                 :                : 
 3100 peter_e@gmx.net           207                 :          34107 :     in[0] = c;
                                208                 :          34107 :     in[1] = '\0';
                                209                 :                : 
                                210                 :          34107 :     outToken(str, in);
                                211                 :                : }
                                212                 :                : 
                                213                 :                : /*
                                214                 :                :  * Convert a double value, attempting to ensure the value is preserved exactly.
                                215                 :                :  */
                                216                 :                : static void
 1177 peter@eisentraut.org      217                 :           5264 : outDouble(StringInfo str, double d)
                                218                 :                : {
                                219                 :                :     char        buf[DOUBLE_SHORTEST_DECIMAL_LEN];
                                220                 :                : 
                                221                 :           5264 :     double_to_shortest_decimal_buf(d, buf);
                                222                 :           5264 :     appendStringInfoString(str, buf);
                                223                 :           5264 : }
                                224                 :                : 
                                225                 :                : /*
                                226                 :                :  * common implementation for scalar-array-writing functions
                                227                 :                :  *
                                228                 :                :  * The data format is either "<>" for a NULL pointer or "(item item item)".
                                229                 :                :  * fmtstr must include a leading space, and the rest of it must produce
                                230                 :                :  * something that will be seen as a single simple token by pg_strtok().
                                231                 :                :  * convfunc can be empty, or the name of a conversion macro or function.
                                232                 :                :  */
                                233                 :                : #define WRITE_SCALAR_ARRAY(fnname, datatype, fmtstr, convfunc) \
                                234                 :                : static void \
                                235                 :                : fnname(StringInfo str, const datatype *arr, int len) \
                                236                 :                : { \
                                237                 :                :     if (arr != NULL) \
                                238                 :                :     { \
                                239                 :                :         appendStringInfoChar(str, '('); \
                                240                 :                :         for (int i = 0; i < len; i++) \
                                241                 :                :             appendStringInfo(str, fmtstr, convfunc(arr[i])); \
                                242                 :                :         appendStringInfoChar(str, ')'); \
                                243                 :                :     } \
                                244                 :                :     else \
                                245                 :                :         appendStringInfoString(str, "<>"); \
                                246                 :                : }
                                247                 :                : 
 1245 tgl@sss.pgh.pa.us         248   [ +  +  +  + ]:            630 : WRITE_SCALAR_ARRAY(writeAttrNumberCols, AttrNumber, " %d",)
                                249   [ +  +  +  + ]:           1791 : WRITE_SCALAR_ARRAY(writeOidCols, Oid, " %u",)
 1245 tgl@sss.pgh.pa.us         250   [ #  #  #  # ]:UBC           0 : WRITE_SCALAR_ARRAY(writeIndexCols, Index, " %u",)
 1245 tgl@sss.pgh.pa.us         251   [ +  -  +  + ]:CBC        1521 : WRITE_SCALAR_ARRAY(writeIntCols, int, " %d",)
                                252   [ +  -  -  +  :            185 : WRITE_SCALAR_ARRAY(writeBoolCols, bool, " %s", booltostr)
                                              +  + ]
                                253                 :                : 
                                254                 :                : /*
                                255                 :                :  * Print an array (not a List) of Node pointers.
                                256                 :                :  *
                                257                 :                :  * The decoration is identical to that of scalar arrays, but we can't
                                258                 :                :  * quite use appendStringInfo() in the loop.
                                259                 :                :  */
                                260                 :                : static void
 1245 tgl@sss.pgh.pa.us         261                 :UBC           0 : writeNodeArray(StringInfo str, const Node *const *arr, int len)
                                262                 :                : {
                                263         [ #  # ]:              0 :     if (arr != NULL)
                                264                 :                :     {
                                265                 :              0 :         appendStringInfoChar(str, '(');
                                266         [ #  # ]:              0 :         for (int i = 0; i < len; i++)
                                267                 :                :         {
                                268                 :              0 :             appendStringInfoChar(str, ' ');
                                269                 :              0 :             outNode(str, arr[i]);
                                270                 :                :         }
                                271                 :              0 :         appendStringInfoChar(str, ')');
                                272                 :                :     }
                                273                 :                :     else
                                274                 :              0 :         appendStringInfoString(str, "<>");
                                275                 :              0 : }
                                276                 :                : 
                                277                 :                : /*
                                278                 :                :  * Print a List.
                                279                 :                :  */
                                280                 :                : static void
 5123 peter_e@gmx.net           281                 :CBC      282291 : _outList(StringInfo str, const List *node)
                                282                 :                : {
                                283                 :                :     const ListCell *lc;
                                284                 :                : 
 9468 tgl@sss.pgh.pa.us         285                 :         282291 :     appendStringInfoChar(str, '(');
                                286                 :                : 
 7874 neilc@samurai.com         287         [ +  + ]:         282291 :     if (IsA(node, IntList))
                                288                 :          17348 :         appendStringInfoChar(str, 'i');
                                289         [ +  + ]:         264943 :     else if (IsA(node, OidList))
                                290                 :           6502 :         appendStringInfoChar(str, 'o');
 1261 alvherre@alvh.no-ip.      291         [ -  + ]:         258441 :     else if (IsA(node, XidList))
 1261 alvherre@alvh.no-ip.      292                 :UBC           0 :         appendStringInfoChar(str, 'x');
                                293                 :                : 
 7779 bruce@momjian.us          294   [ +  -  +  +  :CBC     2353528 :     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                 :                :          */
 7874 neilc@samurai.com         301         [ +  + ]:        2071237 :         if (IsA(node, List))
                                302                 :                :         {
 3539 andres@anarazel.de        303                 :        1654429 :             outNode(str, lfirst(lc));
 2346 tgl@sss.pgh.pa.us         304         [ +  + ]:        1654429 :             if (lnext(node, lc))
 7874 neilc@samurai.com         305                 :        1395988 :                 appendStringInfoChar(str, ' ');
                                306                 :                :         }
                                307         [ +  + ]:         416808 :         else if (IsA(node, IntList))
                                308                 :         391275 :             appendStringInfo(str, " %d", lfirst_int(lc));
                                309         [ +  - ]:          25533 :         else if (IsA(node, OidList))
                                310                 :          25533 :             appendStringInfo(str, " %u", lfirst_oid(lc));
 1261 alvherre@alvh.no-ip.      311         [ #  # ]:UBC           0 :         else if (IsA(node, XidList))
                                312                 :              0 :             appendStringInfo(str, " %u", lfirst_xid(lc));
                                313                 :                :         else
 7779 bruce@momjian.us          314         [ #  # ]:              0 :             elog(ERROR, "unrecognized list node type: %d",
                                315                 :                :                  (int) node->type);
                                316                 :                :     }
                                317                 :                : 
 9108 tgl@sss.pgh.pa.us         318                 :CBC      282291 :     appendStringInfoChar(str, ')');
                                319                 :         282291 : }
                                320                 :                : 
                                321                 :                : /*
                                322                 :                :  * outBitmapset -
                                323                 :                :  *     converts a bitmap set of integers
                                324                 :                :  *
                                325                 :                :  * Note: the output format is "(b int int ...)", similar to an integer List.
                                326                 :                :  *
                                327                 :                :  * We export this function for use by extensions that define extensible nodes.
                                328                 :                :  * That's somewhat historical, though, because calling outNode() will work.
                                329                 :                :  */
                                330                 :                : void
 3378                           331                 :         638108 : outBitmapset(StringInfo str, const Bitmapset *bms)
                                332                 :                : {
                                333                 :                :     int         x;
                                334                 :                : 
 8347                           335                 :         638108 :     appendStringInfoChar(str, '(');
 7892                           336                 :         638108 :     appendStringInfoChar(str, 'b');
 4036                           337                 :         638108 :     x = -1;
                                338         [ +  + ]:         811591 :     while ((x = bms_next_member(bms, x)) >= 0)
 8347                           339                 :         173483 :         appendStringInfo(str, " %d", x);
                                340                 :         638108 :     appendStringInfoChar(str, ')');
                                341                 :         638108 : }
                                342                 :                : 
                                343                 :                : /*
                                344                 :                :  * Print the value of a Datum given its type.
                                345                 :                :  */
                                346                 :                : void
 3539 andres@anarazel.de        347                 :          82914 : outDatum(StringInfo str, Datum value, int typlen, bool typbyval)
                                348                 :                : {
                                349                 :                :     Size        length;
                                350                 :                :     char       *s;
                                351                 :                : 
 8405 tgl@sss.pgh.pa.us         352                 :          82914 :     length = datumGetSize(value, typbyval, typlen);
                                353                 :                : 
                                354         [ +  + ]:          82914 :     if (typbyval)
                                355                 :                :     {
                                356                 :          53978 :         s = (char *) (&value);
    7 peter@eisentraut.org      357                 :GNC       53978 :         appendStringInfo(str, "%zu [ ", length);
   21                           358         [ +  + ]:         485802 :         for (Size i = 0; i < (Size) sizeof(Datum); i++)
 8405 tgl@sss.pgh.pa.us         359                 :CBC      431824 :             appendStringInfo(str, "%d ", (int) (s[i]));
 4429 rhaas@postgresql.org      360                 :          53978 :         appendStringInfoChar(str, ']');
                                361                 :                :     }
                                362                 :                :     else
                                363                 :                :     {
 8405 tgl@sss.pgh.pa.us         364                 :          28936 :         s = (char *) DatumGetPointer(value);
   83 peter@eisentraut.org      365         [ -  + ]:GNC       28936 :         if (!s)
 4429 rhaas@postgresql.org      366                 :UBC           0 :             appendStringInfoString(str, "0 [ ]");
                                367                 :                :         else
                                368                 :                :         {
    7 peter@eisentraut.org      369                 :GNC       28936 :             appendStringInfo(str, "%zu [ ", length);
   21                           370         [ +  + ]:        1034362 :             for (Size i = 0; i < length; i++)
 8405 tgl@sss.pgh.pa.us         371                 :CBC     1005426 :                 appendStringInfo(str, "%d ", (int) (s[i]));
 4429 rhaas@postgresql.org      372                 :          28936 :             appendStringInfoChar(str, ']');
                                373                 :                :         }
                                374                 :                :     }
10752 scrappy@hub.org           375                 :          82914 : }
                                376                 :                : 
                                377                 :                : 
                                378                 :                : #include "outfuncs.funcs.c"
                                379                 :                : 
                                380                 :                : 
                                381                 :                : /*
                                382                 :                :  * Support functions for nodes with custom_read_write attribute or
                                383                 :                :  * special_read_write attribute
                                384                 :                :  */
                                385                 :                : 
                                386                 :                : static void
 1256 peter@eisentraut.org      387                 :          95894 : _outConst(StringInfo str, const Const *node)
                                388                 :                : {
                                389                 :          95894 :     WRITE_NODE_TYPE("CONST");
                                390                 :                : 
                                391                 :          95894 :     WRITE_OID_FIELD(consttype);
                                392                 :          95894 :     WRITE_INT_FIELD(consttypmod);
                                393                 :          95894 :     WRITE_OID_FIELD(constcollid);
                                394                 :          95894 :     WRITE_INT_FIELD(constlen);
                                395         [ +  + ]:          95894 :     WRITE_BOOL_FIELD(constbyval);
                                396         [ +  + ]:          95894 :     WRITE_BOOL_FIELD(constisnull);
                                397         [ -  + ]:          95894 :     WRITE_LOCATION_FIELD(location);
                                398                 :                : 
                                399                 :          95894 :     appendStringInfoString(str, " :constvalue ");
                                400         [ +  + ]:          95894 :     if (node->constisnull)
                                401                 :          12980 :         appendStringInfoString(str, "<>");
                                402                 :                :     else
                                403                 :          82914 :         outDatum(str, node->constvalue, node->constlen, node->constbyval);
 8422 tgl@sss.pgh.pa.us         404                 :          95894 : }
                                405                 :                : 
                                406                 :                : static void
 1256 peter@eisentraut.org      407                 :          11695 : _outBoolExpr(StringInfo str, const BoolExpr *node)
                                408                 :                : {
                                409                 :          11695 :     char       *opstr = NULL;
                                410                 :                : 
                                411                 :          11695 :     WRITE_NODE_TYPE("BOOLEXPR");
                                412                 :                : 
                                413                 :                :     /* do-it-yourself enum representation */
                                414   [ +  +  +  - ]:          11695 :     switch (node->boolop)
                                415                 :                :     {
                                416                 :           7041 :         case AND_EXPR:
                                417                 :           7041 :             opstr = "and";
                                418                 :           7041 :             break;
                                419                 :           3136 :         case OR_EXPR:
                                420                 :           3136 :             opstr = "or";
                                421                 :           3136 :             break;
                                422                 :           1518 :         case NOT_EXPR:
                                423                 :           1518 :             opstr = "not";
                                424                 :           1518 :             break;
                                425                 :                :     }
                                426                 :          11695 :     appendStringInfoString(str, " :boolop ");
                                427                 :          11695 :     outToken(str, opstr);
                                428                 :                : 
                                429                 :          11695 :     WRITE_NODE_FIELD(args);
                                430         [ -  + ]:          11695 :     WRITE_LOCATION_FIELD(location);
 8422 tgl@sss.pgh.pa.us         431                 :          11695 : }
                                432                 :                : 
                                433                 :                : static void
 1256 peter@eisentraut.org      434                 :UBC           0 : _outForeignKeyOptInfo(StringInfo str, const ForeignKeyOptInfo *node)
                                435                 :                : {
                                436                 :              0 :     WRITE_NODE_TYPE("FOREIGNKEYOPTINFO");
                                437                 :                : 
                                438                 :              0 :     WRITE_UINT_FIELD(con_relid);
                                439                 :              0 :     WRITE_UINT_FIELD(ref_relid);
                                440                 :              0 :     WRITE_INT_FIELD(nkeys);
                                441                 :              0 :     WRITE_ATTRNUMBER_ARRAY(conkey, node->nkeys);
                                442                 :              0 :     WRITE_ATTRNUMBER_ARRAY(confkey, node->nkeys);
                                443                 :              0 :     WRITE_OID_ARRAY(conpfeqop, node->nkeys);
                                444                 :              0 :     WRITE_INT_FIELD(nmatched_ec);
                                445                 :              0 :     WRITE_INT_FIELD(nconst_ec);
                                446                 :              0 :     WRITE_INT_FIELD(nmatched_rcols);
                                447                 :              0 :     WRITE_INT_FIELD(nmatched_ri);
                                448                 :                :     /* for compactness, just print the number of matches per column: */
                                449                 :              0 :     appendStringInfoString(str, " :eclass");
   21 peter@eisentraut.org      450         [ #  # ]:UNC           0 :     for (int i = 0; i < node->nkeys; i++)
 1256 peter@eisentraut.org      451                 :UBC           0 :         appendStringInfo(str, " %d", (node->eclass[i] != NULL));
                                452                 :              0 :     appendStringInfoString(str, " :rinfos");
   21 peter@eisentraut.org      453         [ #  # ]:UNC           0 :     for (int i = 0; i < node->nkeys; i++)
 1256 peter@eisentraut.org      454                 :UBC           0 :         appendStringInfo(str, " %d", list_length(node->rinfos[i]));
 3254 andres@anarazel.de        455                 :              0 : }
                                456                 :                : 
                                457                 :                : static void
 1256 peter@eisentraut.org      458                 :              0 : _outEquivalenceClass(StringInfo str, const EquivalenceClass *node)
                                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         [ #  # ]:              0 :     while (node->ec_merged)
                                465                 :              0 :         node = node->ec_merged;
                                466                 :                : 
                                467                 :              0 :     WRITE_NODE_TYPE("EQUIVALENCECLASS");
                                468                 :                : 
                                469                 :              0 :     WRITE_NODE_FIELD(ec_opfamilies);
                                470                 :              0 :     WRITE_OID_FIELD(ec_collation);
  252 drowley@postgresql.o      471                 :              0 :     WRITE_INT_FIELD(ec_childmembers_size);
 1256 peter@eisentraut.org      472                 :              0 :     WRITE_NODE_FIELD(ec_members);
  252 drowley@postgresql.o      473                 :              0 :     WRITE_NODE_ARRAY(ec_childmembers, node->ec_childmembers_size);
 1256 peter@eisentraut.org      474                 :              0 :     WRITE_NODE_FIELD(ec_sources);
                                475                 :                :     /* Only ec_derives_list is written; hash is not serialized. */
  256 amitlan@postgresql.o      476                 :              0 :     WRITE_NODE_FIELD(ec_derives_list);
 1256 peter@eisentraut.org      477                 :              0 :     WRITE_BITMAPSET_FIELD(ec_relids);
                                478         [ #  # ]:              0 :     WRITE_BOOL_FIELD(ec_has_const);
                                479         [ #  # ]:              0 :     WRITE_BOOL_FIELD(ec_has_volatile);
                                480         [ #  # ]:              0 :     WRITE_BOOL_FIELD(ec_broken);
                                481                 :              0 :     WRITE_UINT_FIELD(ec_sortref);
                                482                 :              0 :     WRITE_UINT_FIELD(ec_min_security);
                                483                 :              0 :     WRITE_UINT_FIELD(ec_max_security);
 5911 tgl@sss.pgh.pa.us         484                 :              0 : }
                                485                 :                : 
                                486                 :                : static void
 1256 peter@eisentraut.org      487                 :              0 : _outExtensibleNode(StringInfo str, const ExtensibleNode *node)
                                488                 :                : {
                                489                 :                :     const ExtensibleNodeMethods *methods;
                                490                 :                : 
                                491                 :              0 :     methods = GetExtensibleNodeMethods(node->extnodename, false);
                                492                 :                : 
                                493                 :              0 :     WRITE_NODE_TYPE("EXTENSIBLENODE");
                                494                 :                : 
                                495                 :              0 :     WRITE_STRING_FIELD(extnodename);
                                496                 :                : 
                                497                 :                :     /* serialize the private fields */
                                498                 :              0 :     methods->nodeOut(str, node);
 5542 tgl@sss.pgh.pa.us         499                 :              0 : }
                                500                 :                : 
                                501                 :                : static void
 1256 peter@eisentraut.org      502                 :CBC       42753 : _outRangeTblEntry(StringInfo str, const RangeTblEntry *node)
                                503                 :                : {
                                504                 :          42753 :     WRITE_NODE_TYPE("RANGETBLENTRY");
                                505                 :                : 
                                506                 :          42753 :     WRITE_NODE_FIELD(alias);
                                507                 :          42753 :     WRITE_NODE_FIELD(eref);
                                508                 :          42753 :     WRITE_ENUM_FIELD(rtekind, RTEKind);
                                509                 :                : 
                                510   [ +  +  +  +  :          42753 :     switch (node->rtekind)
                                     +  +  +  -  +  
                                              +  - ]
                                511                 :                :     {
                                512                 :          26896 :         case RTE_RELATION:
                                513                 :          26896 :             WRITE_OID_FIELD(relid);
  649                           514         [ +  + ]:          26896 :             WRITE_BOOL_FIELD(inh);
 1256                           515                 :          26896 :             WRITE_CHAR_FIELD(relkind);
                                516                 :          26896 :             WRITE_INT_FIELD(rellockmode);
 1106 alvherre@alvh.no-ip.      517                 :          26896 :             WRITE_UINT_FIELD(perminfoindex);
  651 peter@eisentraut.org      518                 :          26896 :             WRITE_NODE_FIELD(tablesample);
 1256                           519                 :          26896 :             break;
                                520                 :           4895 :         case RTE_SUBQUERY:
                                521                 :           4895 :             WRITE_NODE_FIELD(subquery);
                                522         [ -  + ]:           4895 :             WRITE_BOOL_FIELD(security_barrier);
                                523                 :                :             /* we re-use these RELATION fields, too: */
 1063 tgl@sss.pgh.pa.us         524                 :           4895 :             WRITE_OID_FIELD(relid);
  649 peter@eisentraut.org      525         [ +  + ]:           4895 :             WRITE_BOOL_FIELD(inh);
  917 amitlan@postgresql.o      526                 :           4895 :             WRITE_CHAR_FIELD(relkind);
 1063 tgl@sss.pgh.pa.us         527                 :           4895 :             WRITE_INT_FIELD(rellockmode);
                                528                 :           4895 :             WRITE_UINT_FIELD(perminfoindex);
 1256 peter@eisentraut.org      529                 :           4895 :             break;
                                530                 :           7620 :         case RTE_JOIN:
                                531                 :           7620 :             WRITE_ENUM_FIELD(jointype, JoinType);
                                532                 :           7620 :             WRITE_INT_FIELD(joinmergedcols);
                                533                 :           7620 :             WRITE_NODE_FIELD(joinaliasvars);
                                534                 :           7620 :             WRITE_NODE_FIELD(joinleftcols);
                                535                 :           7620 :             WRITE_NODE_FIELD(joinrightcols);
                                536                 :           7620 :             WRITE_NODE_FIELD(join_using_alias);
                                537                 :           7620 :             break;
                                538                 :           2764 :         case RTE_FUNCTION:
                                539                 :           2764 :             WRITE_NODE_FIELD(functions);
                                540         [ +  + ]:           2764 :             WRITE_BOOL_FIELD(funcordinality);
                                541                 :           2764 :             break;
                                542                 :             41 :         case RTE_TABLEFUNC:
                                543                 :             41 :             WRITE_NODE_FIELD(tablefunc);
                                544                 :             41 :             break;
                                545                 :            178 :         case RTE_VALUES:
                                546                 :            178 :             WRITE_NODE_FIELD(values_lists);
                                547                 :            178 :             WRITE_NODE_FIELD(coltypes);
                                548                 :            178 :             WRITE_NODE_FIELD(coltypmods);
                                549                 :            178 :             WRITE_NODE_FIELD(colcollations);
                                550                 :            178 :             break;
                                551                 :             75 :         case RTE_CTE:
                                552                 :             75 :             WRITE_STRING_FIELD(ctename);
                                553                 :             75 :             WRITE_UINT_FIELD(ctelevelsup);
                                554         [ +  + ]:             75 :             WRITE_BOOL_FIELD(self_reference);
                                555                 :             75 :             WRITE_NODE_FIELD(coltypes);
                                556                 :             75 :             WRITE_NODE_FIELD(coltypmods);
                                557                 :             75 :             WRITE_NODE_FIELD(colcollations);
                                558                 :             75 :             break;
 1256 peter@eisentraut.org      559                 :LBC         (3) :         case RTE_NAMEDTUPLESTORE:
                                560                 :            (3) :             WRITE_STRING_FIELD(enrname);
 1177                           561                 :            (3) :             WRITE_FLOAT_FIELD(enrtuples);
 1256                           562                 :            (3) :             WRITE_NODE_FIELD(coltypes);
                                563                 :            (3) :             WRITE_NODE_FIELD(coltypmods);
                                564                 :            (3) :             WRITE_NODE_FIELD(colcollations);
                                565                 :                :             /* we re-use these RELATION fields, too: */
 1063 tgl@sss.pgh.pa.us         566                 :            (3) :             WRITE_OID_FIELD(relid);
 1256 peter@eisentraut.org      567                 :            (3) :             break;
 1256 peter@eisentraut.org      568                 :CBC          42 :         case RTE_RESULT:
                                569                 :                :             /* no extra fields */
                                570                 :             42 :             break;
  462 rguo@postgresql.org       571                 :            242 :         case RTE_GROUP:
                                572                 :            242 :             WRITE_NODE_FIELD(groupexprs);
                                573                 :            242 :             break;
 1256 peter@eisentraut.org      574                 :UBC           0 :         default:
                                575         [ #  # ]:              0 :             elog(ERROR, "unrecognized RTE kind: %d", (int) node->rtekind);
                                576                 :                :             break;
                                577                 :                :     }
                                578                 :                : 
 1256 peter@eisentraut.org      579         [ +  + ]:CBC       42753 :     WRITE_BOOL_FIELD(lateral);
                                580         [ +  + ]:          42753 :     WRITE_BOOL_FIELD(inFromCl);
                                581                 :          42753 :     WRITE_NODE_FIELD(securityQuals);
 7546 tgl@sss.pgh.pa.us         582                 :          42753 : }
                                583                 :                : 
                                584                 :                : static void
 1256 peter@eisentraut.org      585                 :UBC           0 : _outA_Expr(StringInfo str, const A_Expr *node)
                                586                 :                : {
                                587                 :              0 :     WRITE_NODE_TYPE("A_EXPR");
                                588                 :                : 
                                589   [ #  #  #  #  :              0 :     switch (node->kind)
                                     #  #  #  #  #  
                                     #  #  #  #  #  
                                                 # ]
                                590                 :                :     {
                                591                 :              0 :         case AEXPR_OP:
                                592                 :              0 :             WRITE_NODE_FIELD(name);
                                593                 :              0 :             break;
                                594                 :              0 :         case AEXPR_OP_ANY:
 1219                           595                 :              0 :             appendStringInfoString(str, " ANY");
 1179                           596                 :              0 :             WRITE_NODE_FIELD(name);
 1256                           597                 :              0 :             break;
                                598                 :              0 :         case AEXPR_OP_ALL:
 1219                           599                 :              0 :             appendStringInfoString(str, " ALL");
 1179                           600                 :              0 :             WRITE_NODE_FIELD(name);
 1256                           601                 :              0 :             break;
                                602                 :              0 :         case AEXPR_DISTINCT:
 1219                           603                 :              0 :             appendStringInfoString(str, " DISTINCT");
 1256                           604                 :              0 :             WRITE_NODE_FIELD(name);
                                605                 :              0 :             break;
                                606                 :              0 :         case AEXPR_NOT_DISTINCT:
 1219                           607                 :              0 :             appendStringInfoString(str, " NOT_DISTINCT");
 1256                           608                 :              0 :             WRITE_NODE_FIELD(name);
                                609                 :              0 :             break;
                                610                 :              0 :         case AEXPR_NULLIF:
 1219                           611                 :              0 :             appendStringInfoString(str, " NULLIF");
 1256                           612                 :              0 :             WRITE_NODE_FIELD(name);
                                613                 :              0 :             break;
                                614                 :              0 :         case AEXPR_IN:
 1219                           615                 :              0 :             appendStringInfoString(str, " IN");
 1256                           616                 :              0 :             WRITE_NODE_FIELD(name);
                                617                 :              0 :             break;
                                618                 :              0 :         case AEXPR_LIKE:
 1219                           619                 :              0 :             appendStringInfoString(str, " LIKE");
 1256                           620                 :              0 :             WRITE_NODE_FIELD(name);
                                621                 :              0 :             break;
                                622                 :              0 :         case AEXPR_ILIKE:
 1219                           623                 :              0 :             appendStringInfoString(str, " ILIKE");
 1256                           624                 :              0 :             WRITE_NODE_FIELD(name);
                                625                 :              0 :             break;
                                626                 :              0 :         case AEXPR_SIMILAR:
 1219                           627                 :              0 :             appendStringInfoString(str, " SIMILAR");
 1256                           628                 :              0 :             WRITE_NODE_FIELD(name);
                                629                 :              0 :             break;
                                630                 :              0 :         case AEXPR_BETWEEN:
 1219                           631                 :              0 :             appendStringInfoString(str, " BETWEEN");
 1256                           632                 :              0 :             WRITE_NODE_FIELD(name);
                                633                 :              0 :             break;
                                634                 :              0 :         case AEXPR_NOT_BETWEEN:
 1219                           635                 :              0 :             appendStringInfoString(str, " NOT_BETWEEN");
 1256                           636                 :              0 :             WRITE_NODE_FIELD(name);
                                637                 :              0 :             break;
                                638                 :              0 :         case AEXPR_BETWEEN_SYM:
 1219                           639                 :              0 :             appendStringInfoString(str, " BETWEEN_SYM");
 1256                           640                 :              0 :             WRITE_NODE_FIELD(name);
                                641                 :              0 :             break;
                                642                 :              0 :         case AEXPR_NOT_BETWEEN_SYM:
 1219                           643                 :              0 :             appendStringInfoString(str, " NOT_BETWEEN_SYM");
 1256                           644                 :              0 :             WRITE_NODE_FIELD(name);
                                645                 :              0 :             break;
                                646                 :              0 :         default:
 1179                           647         [ #  # ]:              0 :             elog(ERROR, "unrecognized A_Expr_Kind: %d", (int) node->kind);
                                648                 :                :             break;
                                649                 :                :     }
                                650                 :                : 
 1256                           651                 :              0 :     WRITE_NODE_FIELD(lexpr);
                                652                 :              0 :     WRITE_NODE_FIELD(rexpr);
  187 alvherre@kurilemu.de      653         [ #  # ]:              0 :     WRITE_LOCATION_FIELD(rexpr_list_start);
                                654         [ #  # ]:              0 :     WRITE_LOCATION_FIELD(rexpr_list_end);
 1256 peter@eisentraut.org      655         [ #  # ]:              0 :     WRITE_LOCATION_FIELD(location);
10752 scrappy@hub.org           656                 :              0 : }
                                657                 :                : 
                                658                 :                : static void
 1256 peter@eisentraut.org      659                 :              0 : _outInteger(StringInfo str, const Integer *node)
                                660                 :                : {
                                661                 :              0 :     appendStringInfo(str, "%d", node->ival);
10752 scrappy@hub.org           662                 :              0 : }
                                663                 :                : 
                                664                 :                : static void
 1256 peter@eisentraut.org      665                 :              0 : _outFloat(StringInfo str, const Float *node)
                                666                 :                : {
                                667                 :                :     /*
                                668                 :                :      * We assume the value is a valid numeric literal and so does not need
                                669                 :                :      * quoting.
                                670                 :                :      */
                                671                 :              0 :     appendStringInfoString(str, node->fval);
 3797 tgl@sss.pgh.pa.us         672                 :              0 : }
                                673                 :                : 
                                674                 :                : static void
 1256 peter@eisentraut.org      675                 :              0 : _outBoolean(StringInfo str, const Boolean *node)
                                676                 :                : {
                                677         [ #  # ]:              0 :     appendStringInfoString(str, node->boolval ? "true" : "false");
 5180 tgl@sss.pgh.pa.us         678                 :              0 : }
                                679                 :                : 
                                680                 :                : static void
 1256 peter@eisentraut.org      681                 :CBC      805762 : _outString(StringInfo str, const String *node)
                                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                 :                :      */
                                688                 :         805762 :     appendStringInfoChar(str, '"');
                                689         [ +  + ]:         805762 :     if (node->sval[0] != '\0')
                                690                 :         805684 :         outToken(str, node->sval);
                                691                 :         805762 :     appendStringInfoChar(str, '"');
10752 scrappy@hub.org           692                 :         805762 : }
                                693                 :                : 
                                694                 :                : static void
 1256 peter@eisentraut.org      695                 :UBC           0 : _outBitString(StringInfo str, const BitString *node)
                                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                 :                :      */
  672 tgl@sss.pgh.pa.us         702   [ #  #  #  # ]:              0 :     Assert(node->bsval[0] == 'b' || node->bsval[0] == 'x');
                                703                 :              0 :     outToken(str, node->bsval);
 7546                           704                 :              0 : }
                                705                 :                : 
                                706                 :                : static void
 1256 peter@eisentraut.org      707                 :              0 : _outA_Const(StringInfo str, const A_Const *node)
                                708                 :                : {
                                709                 :              0 :     WRITE_NODE_TYPE("A_CONST");
                                710                 :                : 
                                711         [ #  # ]:              0 :     if (node->isnull)
 1223                           712                 :              0 :         appendStringInfoString(str, " NULL");
                                713                 :                :     else
                                714                 :                :     {
 1256                           715                 :              0 :         appendStringInfoString(str, " :val ");
                                716                 :              0 :         outNode(str, &node->val);
                                717                 :                :     }
                                718         [ #  # ]:              0 :     WRITE_LOCATION_FIELD(location);
 7546 tgl@sss.pgh.pa.us         719                 :              0 : }
                                720                 :                : 
                                721                 :                : 
                                722                 :                : /*
                                723                 :                :  * outNode -
                                724                 :                :  *    converts a Node into ascii string and append it to 'str'
                                725                 :                :  */
                                726                 :                : void
 1256 peter@eisentraut.org      727                 :CBC     2873593 : outNode(StringInfo str, const void *obj)
                                728                 :                : {
                                729                 :                :     /* Guard against stack overflow due to overly complex expressions */
                                730                 :        2873593 :     check_stack_depth();
                                731                 :                : 
10327 bruce@momjian.us          732         [ +  + ]:        2873593 :     if (obj == NULL)
 4429 rhaas@postgresql.org      733                 :         577655 :         appendStringInfoString(str, "<>");
 1252 alvherre@alvh.no-ip.      734   [ +  +  +  +  :        2295938 :     else if (IsA(obj, List) || IsA(obj, IntList) || IsA(obj, OidList) ||
                                              +  + ]
                                735         [ -  + ]:        2013647 :              IsA(obj, XidList))
 7874 neilc@samurai.com         736                 :         282291 :         _outList(str, obj);
                                737                 :                :     /* nodeRead does not want to see { } around these! */
 1559 peter@eisentraut.org      738         [ -  + ]:        2013647 :     else if (IsA(obj, Integer))
 1559 peter@eisentraut.org      739                 :UBC           0 :         _outInteger(str, (Integer *) obj);
 1559 peter@eisentraut.org      740         [ -  + ]:CBC     2013647 :     else if (IsA(obj, Float))
 1559 peter@eisentraut.org      741                 :UBC           0 :         _outFloat(str, (Float *) obj);
 1432 peter@eisentraut.org      742         [ -  + ]:CBC     2013647 :     else if (IsA(obj, Boolean))
 1432 peter@eisentraut.org      743                 :UBC           0 :         _outBoolean(str, (Boolean *) obj);
 1559 peter@eisentraut.org      744         [ +  + ]:CBC     2013647 :     else if (IsA(obj, String))
                                745                 :         805762 :         _outString(str, (String *) obj);
                                746         [ -  + ]:        1207885 :     else if (IsA(obj, BitString))
 1559 peter@eisentraut.org      747                 :UBC           0 :         _outBitString(str, (BitString *) obj);
 1129 tgl@sss.pgh.pa.us         748         [ +  + ]:CBC     1207885 :     else if (IsA(obj, Bitmapset))
 1129 tgl@sss.pgh.pa.us         749                 :GBC          77 :         outBitmapset(str, (Bitmapset *) obj);
                                750                 :                :     else
                                751                 :                :     {
 9468 tgl@sss.pgh.pa.us         752                 :CBC     1207808 :         appendStringInfoChar(str, '{');
10327 bruce@momjian.us          753   [ +  -  +  -  :        1207808 :         switch (nodeTag(obj))
                                     +  +  +  +  +  
                                     +  -  +  +  +  
                                     +  +  +  +  +  
                                     +  +  +  -  +  
                                     +  +  +  +  -  
                                     +  +  +  +  +  
                                     +  +  +  +  +  
                                     +  +  +  +  +  
                                     +  +  +  +  +  
                                     +  +  +  +  +  
                                     +  +  -  -  +  
                                     -  +  +  +  +  
                                     +  +  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  +  +  -  
                                     -  +  +  +  +  
                                     -  +  +  +  +  
                                     -  -  -  +  +  
                                     +  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  +  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     +  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  -  -  -  
                                     -  -  +  +  +  
                                     -  +  -  -  -  
                                     -  +  -  +  +  
                                     +  +  -  +  -  
                                     +  -  -  -  -  
                                     -  -  -  +  +  
                                     +  +  -  +  +  
                                     -  -  +  -  +  
                                     -  -  +  -  -  
                                     +  -  +  +  +  
                                        +  -  -  -  
                                                 - ]
                                754                 :                :         {
                                755                 :                : #include "outfuncs.switch.c"
                                756                 :                : 
10326 bruce@momjian.us          757                 :UBC           0 :             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                 :                :                  */
 8183 tgl@sss.pgh.pa.us         763         [ #  # ]:              0 :                 elog(WARNING, "could not dump unrecognized node type: %d",
                                764                 :                :                      (int) nodeTag(obj));
10326 bruce@momjian.us          765                 :              0 :                 break;
                                766                 :                :         }
 9468 tgl@sss.pgh.pa.us         767                 :CBC     1207808 :         appendStringInfoChar(str, '}');
                                768                 :                :     }
10752 scrappy@hub.org           769                 :        2873593 : }
                                770                 :                : 
                                771                 :                : /*
                                772                 :                :  * nodeToString -
                                773                 :                :  *     returns the ascii representation of the Node as a palloc'd string
                                774                 :                :  *
                                775                 :                :  * write_loc_fields determines whether location fields are output with their
                                776                 :                :  * actual value rather than -1.  The actual value can be useful for debugging,
                                777                 :                :  * but for most uses, the actual value is not useful, since the original query
                                778                 :                :  * string is no longer available.
                                779                 :                :  */
                                780                 :                : static char *
  634 peter@eisentraut.org      781                 :          36306 : nodeToStringInternal(const void *obj, bool write_loc_fields)
                                782                 :                : {
                                783                 :                :     StringInfoData str;
                                784                 :                :     bool        save_write_location_fields;
                                785                 :                : 
                                786                 :          36306 :     save_write_location_fields = write_location_fields;
                                787                 :          36306 :     write_location_fields = write_loc_fields;
                                788                 :                : 
                                789                 :                :     /* see stringinfo.h for an explanation of this maneuver */
 9732 tgl@sss.pgh.pa.us         790                 :          36306 :     initStringInfo(&str);
 3539 andres@anarazel.de        791                 :          36306 :     outNode(&str, obj);
                                792                 :                : 
  634 peter@eisentraut.org      793                 :          36306 :     write_location_fields = save_write_location_fields;
                                794                 :                : 
 9732 tgl@sss.pgh.pa.us         795                 :          36306 :     return str.data;
                                796                 :                : }
                                797                 :                : 
                                798                 :                : /*
                                799                 :                :  * Externally visible entry points
                                800                 :                :  */
                                801                 :                : char *
  634 peter@eisentraut.org      802                 :          36306 : nodeToString(const void *obj)
                                803                 :                : {
                                804                 :          36306 :     return nodeToStringInternal(obj, false);
                                805                 :                : }
                                806                 :                : 
                                807                 :                : char *
  634 peter@eisentraut.org      808                 :UBC           0 : nodeToStringWithLocations(const void *obj)
                                809                 :                : {
                                810                 :              0 :     return nodeToStringInternal(obj, true);
                                811                 :                : }
                                812                 :                : 
                                813                 :                : 
                                814                 :                : /*
                                815                 :                :  * bmsToString -
                                816                 :                :  *     returns the ascii representation of the Bitmapset as a palloc'd string
                                817                 :                :  */
                                818                 :                : char *
 3378 tgl@sss.pgh.pa.us         819                 :              0 : bmsToString(const Bitmapset *bms)
                                820                 :                : {
                                821                 :                :     StringInfoData str;
                                822                 :                : 
                                823                 :                :     /* see stringinfo.h for an explanation of this maneuver */
                                824                 :              0 :     initStringInfo(&str);
                                825                 :              0 :     outBitmapset(&str, bms);
                                826                 :              0 :     return str.data;
                                827                 :                : }
        

Generated by: LCOV version 2.4-beta