LCOV - code coverage report
Current view: top level - src/backend/nodes - outfuncs.c (source / functions) Coverage Total Hit
Test: Code coverage Lines: 41.1 % 900 370
Test Date: 2026-01-26 10:56:24 Functions: 56.7 % 30 17
Legend: Lines:     hit not hit
Branches: + taken - not taken # not executed
Branches: 34.2 % 576 197

             Branch data     Line data    Source code
       1                 :             : /*-------------------------------------------------------------------------
       2                 :             :  *
       3                 :             :  * outfuncs.c
       4                 :             :  *        Output functions for Postgres tree nodes.
       5                 :             :  *
       6                 :             :  * Portions Copyright (c) 1996-2026, 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                 :        3683 : #include "access/attnum.h"
      20                 :        3683 : #include "common/shortest_dec.h"
      21                 :             : #include "lib/stringinfo.h"
      22                 :           0 : #include "miscadmin.h"
      23                 :           0 : #include "nodes/bitmapset.h"
      24                 :             : #include "nodes/nodes.h"
      25                 :          13 : #include "nodes/pg_list.h"
      26                 :          13 : #include "utils/datum.h"
      27                 :             : 
      28                 :           0 : /* State flag that determines how nodeToStringInternal() should treat location fields */
      29                 :           0 : static bool write_location_fields = false;
      30                 :             : 
      31                 :       16362 : static void outChar(StringInfo str, char c);
      32                 :       16362 : static void outDouble(StringInfo str, double d);
      33                 :             : 
      34                 :        7448 : 
      35                 :        7448 : /*
      36                 :             :  * Macros to simplify output of different kinds of fields.  Use these
      37                 :         428 :  * wherever possible to reduce the chance for silly typos.  Note that these
      38                 :         428 :  * hard-wire conventions about the names of the local variables in an Out
      39                 :             :  * routine.
      40                 :         227 :  */
      41                 :         227 : 
      42                 :             : /* Write the label for the node type */
      43                 :           1 : #define WRITE_NODE_TYPE(nodelabel) \
      44                 :           1 :         appendStringInfoString(str, nodelabel)
      45                 :             : 
      46                 :          14 : /* Write an integer field (anything written as ":fldname %d") */
      47                 :          14 : #define WRITE_INT_FIELD(fldname) \
      48                 :             :         appendStringInfo(str, " :" CppAsString(fldname) " %d", node->fldname)
      49                 :           0 : 
      50                 :           0 : /* Write an unsigned integer field (anything written as ":fldname %u") */
      51                 :             : #define WRITE_UINT_FIELD(fldname) \
      52                 :           1 :         appendStringInfo(str, " :" CppAsString(fldname) " %u", node->fldname)
      53                 :           1 : 
      54                 :             : /* Write a signed integer field (anything written with INT64_FORMAT) */
      55                 :          62 : #define WRITE_INT64_FIELD(fldname) \
      56                 :          62 :         appendStringInfo(str, \
      57                 :             :                                          " :" CppAsString(fldname) " " INT64_FORMAT, \
      58                 :        1751 :                                          node->fldname)
      59                 :        1751 : 
      60                 :             : /* Write an unsigned integer field (anything written with UINT64_FORMAT) */
      61                 :           5 : #define WRITE_UINT64_FIELD(fldname) \
      62                 :           5 :         appendStringInfo(str, " :" CppAsString(fldname) " " UINT64_FORMAT, \
      63                 :             :                                          node->fldname)
      64                 :        2854 : 
      65                 :        2854 : /* Write an OID field (don't hard-wire assumption that OID is same as uint) */
      66                 :             : #define WRITE_OID_FIELD(fldname) \
      67                 :           2 :         appendStringInfo(str, " :" CppAsString(fldname) " %u", node->fldname)
      68                 :           2 : 
      69                 :             : /* Write a long-integer field */
      70                 :          40 : #define WRITE_LONG_FIELD(fldname) \
      71                 :          40 :         appendStringInfo(str, " :" CppAsString(fldname) " %ld", node->fldname)
      72                 :             : 
      73                 :         116 : /* Write a char field (ie, one ascii character) */
      74                 :         116 : #define WRITE_CHAR_FIELD(fldname) \
      75                 :             :         (appendStringInfo(str, " :" CppAsString(fldname) " "), \
      76                 :         354 :          outChar(str, node->fldname))
      77                 :         354 : 
      78                 :             : /* Write an enumerated-type field as an integer code */
      79                 :         141 : #define WRITE_ENUM_FIELD(fldname, enumtype) \
      80                 :         141 :         appendStringInfo(str, " :" CppAsString(fldname) " %d", \
      81                 :             :                                          (int) node->fldname)
      82                 :           3 : 
      83                 :           3 : /* Write a float field (actually, they're double) */
      84                 :             : #define WRITE_FLOAT_FIELD(fldname) \
      85                 :           0 :         (appendStringInfo(str, " :" CppAsString(fldname) " "), \
      86                 :           0 :          outDouble(str, node->fldname))
      87                 :             : 
      88                 :         192 : /* Write a boolean field */
      89                 :         192 : #define WRITE_BOOL_FIELD(fldname) \
      90                 :             :         appendStringInfo(str, " :" CppAsString(fldname) " %s", \
      91                 :          16 :                                          booltostr(node->fldname))
      92                 :          16 : 
      93                 :             : /* Write a character-string (possibly NULL) field */
      94                 :         217 : #define WRITE_STRING_FIELD(fldname) \
      95                 :         217 :         (appendStringInfoString(str, " :" CppAsString(fldname) " "), \
      96                 :             :          outToken(str, node->fldname))
      97                 :         155 : 
      98                 :         155 : /* Write a parse location field (actually same as INT case) */
      99                 :             : #define WRITE_LOCATION_FIELD(fldname) \
     100                 :           6 :         appendStringInfo(str, " :" CppAsString(fldname) " %d", write_location_fields ? node->fldname : -1)
     101                 :           6 : 
     102                 :             : /* Write a Node field */
     103                 :           0 : #define WRITE_NODE_FIELD(fldname) \
     104                 :           0 :         (appendStringInfoString(str, " :" CppAsString(fldname) " "), \
     105                 :             :          outNode(str, node->fldname))
     106                 :          15 : 
     107                 :          15 : /* Write a bitmapset field */
     108                 :             : #define WRITE_BITMAPSET_FIELD(fldname) \
     109                 :         151 :         (appendStringInfoString(str, " :" CppAsString(fldname) " "), \
     110                 :         151 :          outBitmapset(str, node->fldname))
     111                 :             : 
     112                 :         321 : /* Write a variable-length array (not a List) of Node pointers */
     113                 :         321 : #define WRITE_NODE_ARRAY(fldname, len) \
     114                 :             :         (appendStringInfoString(str, " :" CppAsString(fldname) " "), \
     115                 :         168 :          writeNodeArray(str, (const Node * const *) node->fldname, len))
     116                 :         168 : 
     117                 :             : /* Write a variable-length array of AttrNumber */
     118                 :         119 : #define WRITE_ATTRNUMBER_ARRAY(fldname, len) \
     119                 :         119 :         (appendStringInfoString(str, " :" CppAsString(fldname) " "), \
     120                 :             :          writeAttrNumberCols(str, node->fldname, len))
     121                 :          10 : 
     122                 :          10 : /* Write a variable-length array of Oid */
     123                 :             : #define WRITE_OID_ARRAY(fldname, len) \
     124                 :           3 :         (appendStringInfoString(str, " :" CppAsString(fldname) " "), \
     125                 :           3 :          writeOidCols(str, node->fldname, len))
     126                 :             : 
     127                 :          63 : /* Write a variable-length array of Index */
     128                 :          63 : #define WRITE_INDEX_ARRAY(fldname, len) \
     129                 :             :         (appendStringInfoString(str, " :" CppAsString(fldname) " "), \
     130                 :           2 :          writeIndexCols(str, node->fldname, len))
     131                 :           2 : 
     132                 :             : /* Write a variable-length array of int */
     133                 :          76 : #define WRITE_INT_ARRAY(fldname, len) \
     134                 :          76 :         (appendStringInfoString(str, " :" CppAsString(fldname) " "), \
     135                 :             :          writeIntCols(str, node->fldname, len))
     136                 :          12 : 
     137                 :          12 : /* Write a variable-length array of bool */
     138                 :             : #define WRITE_BOOL_ARRAY(fldname, len) \
     139                 :         185 :         (appendStringInfoString(str, " :" CppAsString(fldname) " "), \
     140                 :         185 :          writeBoolCols(str, node->fldname, len))
     141                 :             : 
     142                 :          70 : #define booltostr(x)  ((x) ? "true" : "false")
     143                 :          70 : 
     144                 :             : 
     145                 :          50 : /*
     146                 :          50 :  * outToken
     147                 :             :  *        Convert an ordinary string (eg, an identifier) into a form that
     148                 :           5 :  *        will be decoded back to a plain token by read.c's functions.
     149                 :           5 :  *
     150                 :             :  *        If a null string pointer is given, it is encoded as '<>'.
     151                 :           5 :  *        An empty string is encoded as '""'.  To avoid ambiguity, input
     152                 :           5 :  *        strings beginning with '<' or '"' receive a leading backslash.
     153                 :             :  */
     154                 :         115 : void
     155                 :       37920 : outToken(StringInfo str, const char *s)
     156                 :             : {
     157         [ +  + ]:       37870 :         if (s == NULL)
     158                 :          65 :         {
     159                 :        3626 :                 appendStringInfoString(str, "<>");
     160                 :        3649 :                 return;
     161                 :          23 :         }
     162         [ +  - ]:       34179 :         if (*s == '\0')
     163                 :          23 :         {
     164                 :          23 :                 appendStringInfoString(str, "\"\"");
     165                 :           0 :                 return;
     166                 :           5 :         }
     167                 :           5 : 
     168                 :             :         /*
     169                 :          76 :          * Look for characters or patterns that are treated specially by read.c
     170                 :          76 :          * (either in pg_strtok() or in nodeRead()), and therefore need a
     171                 :             :          * protective backslash.
     172                 :           1 :          */
     173                 :           1 :         /* These characters only need to be quoted at the start of the string */
     174         [ +  + ]:       34179 :         if (*s == '<' ||
     175         [ +  - ]:       34190 :                 *s == '"' ||
     176         [ +  - ]:       34190 :                 isdigit((unsigned char) *s) ||
     177   [ +  -  -  + ]:       34177 :                 ((*s == '+' || *s == '-') &&
     178         [ #  # ]:         653 :                  (isdigit((unsigned char) s[1]) || s[1] == '.')))
     179                 :         655 :                 appendStringInfoChar(str, '\\');
     180         [ +  + ]:      268781 :         while (*s)
     181                 :          83 :         {
     182                 :          83 :                 /* These chars must be backslashed anywhere in the string */
     183   [ +  +  +  -  :      234602 :                 if (*s == ' ' || *s == '\n' || *s == '\t' ||
                   +  - ]
     184   [ +  +  +  +  :      234570 :                         *s == '(' || *s == ')' || *s == '{' || *s == '}' ||
          +  -  +  -  -  
                      + ]
     185                 :      234562 :                         *s == '\\')
     186                 :          46 :                         appendStringInfoChar(str, '\\');
     187                 :      234602 :                 appendStringInfoChar(str, *s++);
     188                 :           0 :         }
     189                 :       37805 : }
     190                 :           0 : 
     191                 :           0 : /*
     192                 :             :  * Convert one char.  Goes through outToken() so that special characters are
     193                 :           2 :  * escaped.
     194                 :           2 :  */
     195                 :             : static void
     196                 :        3706 : outChar(StringInfo str, char c)
     197                 :           0 : {
     198                 :        3706 :         char            in[2];
     199                 :        5294 : 
     200                 :        5294 :         /* Traditionally, we've represented \0 as <>, so keep doing that */
     201         [ +  + ]:        3706 :         if (c == '\0')
     202                 :        1455 :         {
     203                 :        1670 :                 appendStringInfoString(str, "<>");
     204                 :         215 :                 return;
     205                 :         204 :         }
     206                 :         204 : 
     207                 :        3491 :         in[0] = c;
     208                 :        4667 :         in[1] = '\0';
     209                 :        1176 : 
     210                 :        3491 :         outToken(str, in);
     211         [ -  + ]:        3709 : }
     212                 :           3 : 
     213                 :             : /*
     214                 :        1182 :  * Convert a double value, attempting to ensure the value is preserved exactly.
     215                 :        1182 :  */
     216                 :             : static void
     217                 :        1725 : outDouble(StringInfo str, double d)
     218                 :           0 : {
     219                 :        1725 :         char            buf[DOUBLE_SHORTEST_DECIMAL_LEN];
     220                 :           0 : 
     221                 :        1725 :         double_to_shortest_decimal_buf(d, buf);
     222                 :        1725 :         appendStringInfoString(str, buf);
     223                 :        1725 : }
     224                 :           0 : 
     225                 :             : /*
     226                 :           0 :  * common implementation for scalar-array-writing functions
     227                 :           0 :  *
     228                 :             :  * The data format is either "<>" for a NULL pointer or "(item item item)".
     229                 :           0 :  * fmtstr must include a leading space, and the rest of it must produce
     230                 :           0 :  * 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                 :           0 :  */
     233                 :           0 : #define WRITE_SCALAR_ARRAY(fnname, datatype, fmtstr, convfunc) \
     234                 :             : static void \
     235                 :           0 : fnname(StringInfo str, const datatype *arr, int len) \
     236                 :           0 : { \
     237                 :             :         if (arr != NULL) \
     238                 :           0 :         { \
     239                 :           0 :                 appendStringInfoChar(str, '('); \
     240                 :             :                 for (int i = 0; i < len; i++) \
     241                 :           0 :                         appendStringInfo(str, fmtstr, convfunc(arr[i])); \
     242                 :           0 :                 appendStringInfoChar(str, ')'); \
     243                 :             :         } \
     244                 :           0 :         else \
     245                 :           0 :                 appendStringInfoString(str, "<>"); \
     246                 :             : }
     247                 :           0 : 
     248   [ +  +  +  + ]:         206 : WRITE_SCALAR_ARRAY(writeAttrNumberCols, AttrNumber, " %d",)
     249   [ +  +  +  + ]:         589 : WRITE_SCALAR_ARRAY(writeOidCols, Oid, " %u",)
     250   [ #  #  #  # ]:           0 : WRITE_SCALAR_ARRAY(writeIndexCols, Index, " %u",)
     251   [ +  -  +  + ]:         507 : WRITE_SCALAR_ARRAY(writeIntCols, int, " %d",)
     252   [ +  -  +  + ]:          61 : WRITE_SCALAR_ARRAY(writeBoolCols, bool, " %s", booltostr)
     253                 :           0 : 
     254                 :           0 : /*
     255                 :             :  * Print an array (not a List) of Node pointers.
     256                 :           0 :  *
     257                 :           0 :  * The decoration is identical to that of scalar arrays, but we can't
     258                 :             :  * quite use appendStringInfo() in the loop.
     259                 :           0 :  */
     260                 :           0 : static void
     261                 :           0 : writeNodeArray(StringInfo str, const Node *const *arr, int len)
     262                 :           0 : {
     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                 :           0 :                 }
     271                 :           0 :                 appendStringInfoChar(str, ')');
     272                 :           0 :         }
     273                 :             :         else
     274                 :           0 :                 appendStringInfoString(str, "<>");
     275                 :           0 : }
     276                 :             : 
     277                 :           0 : /*
     278                 :           0 :  * Print a List.
     279                 :             :  */
     280                 :           0 : static void
     281                 :       18612 : _outList(StringInfo str, const List *node)
     282                 :             : {
     283                 :       18612 :         const ListCell *lc;
     284                 :           0 : 
     285                 :       18612 :         appendStringInfoChar(str, '(');
     286                 :           0 : 
     287         [ +  + ]:       18612 :         if (IsA(node, IntList))
     288                 :         588 :                 appendStringInfoChar(str, 'i');
     289         [ +  + ]:       18024 :         else if (IsA(node, OidList))
     290                 :         680 :                 appendStringInfoChar(str, 'o');
     291         [ +  - ]:       17344 :         else if (IsA(node, XidList))
     292                 :           0 :                 appendStringInfoChar(str, 'x');
     293                 :           0 : 
     294   [ +  -  +  +  :       85449 :         foreach(lc, node)
                   +  + ]
     295                 :           0 :         {
     296                 :           0 :                 /*
     297                 :             :                  * For the sake of backward compatibility, we emit a slightly
     298                 :           0 :                  * different whitespace format for lists of nodes vs. other types of
     299                 :           0 :                  * lists. XXX: is this necessary?
     300                 :             :                  */
     301         [ +  + ]:       66837 :                 if (IsA(node, List))
     302                 :           0 :                 {
     303                 :       56652 :                         outNode(str, lfirst(lc));
     304         [ +  + ]:       56652 :                         if (lnext(node, lc))
     305                 :       39308 :                                 appendStringInfoChar(str, ' ');
     306                 :       56652 :                 }
     307         [ +  + ]:       11695 :                 else if (IsA(node, IntList))
     308                 :       10208 :                         appendStringInfo(str, " %d", lfirst_int(lc));
     309         [ +  - ]:        1487 :                 else if (IsA(node, OidList))
     310                 :        3401 :                         appendStringInfo(str, " %u", lfirst_oid(lc));
     311         [ #  # ]:        1914 :                 else if (IsA(node, XidList))
     312                 :           0 :                         appendStringInfo(str, " %u", lfirst_xid(lc));
     313                 :           0 :                 else
     314   [ #  #  #  # ]:           0 :                         elog(ERROR, "unrecognized list node type: %d",
     315                 :             :                                  (int) node->type);
     316                 :       66837 :         }
     317                 :           0 : 
     318                 :       18612 :         appendStringInfoChar(str, ')');
     319                 :       21087 : }
     320                 :        2475 : 
     321                 :             : /*
     322                 :        1553 :  * outBitmapset -
     323                 :        1553 :  *         converts a bitmap set of integers
     324                 :             :  *
     325                 :         126 :  * Note: the output format is "(b int int ...)", similar to an integer List.
     326                 :         126 :  *
     327                 :             :  * We export this function for use by extensions that define extensible nodes.
     328                 :           2 :  * That's somewhat historical, though, because calling outNode() will work.
     329                 :           2 :  */
     330                 :             : void
     331                 :       22771 : outBitmapset(StringInfo str, const Bitmapset *bms)
     332                 :           0 : {
     333                 :       22771 :         int                     x;
     334                 :         217 : 
     335                 :       22988 :         appendStringInfoChar(str, '(');
     336                 :       22771 :         appendStringInfoChar(str, 'b');
     337                 :       22774 :         x = -1;
     338         [ +  + ]:       29733 :         while ((x = bms_next_member(bms, x)) >= 0)
     339                 :        6959 :                 appendStringInfo(str, " %d", x);
     340                 :       22783 :         appendStringInfoChar(str, ')');
     341                 :       22783 : }
     342                 :             : 
     343                 :           3 : /*
     344                 :           3 :  * Print the value of a Datum given its type.
     345                 :             :  */
     346                 :           0 : void
     347                 :        7022 : outDatum(StringInfo str, Datum value, int typlen, bool typbyval)
     348                 :             : {
     349                 :        7022 :         Size            length;
     350                 :        7022 :         char       *s;
     351                 :             : 
     352                 :        7022 :         length = datumGetSize(value, typbyval, typlen);
     353                 :           0 : 
     354         [ +  + ]:        7022 :         if (typbyval)
     355                 :           1 :         {
     356                 :        5216 :                 s = (char *) (&value);
     357                 :        5215 :                 appendStringInfo(str, "%zu [ ", length);
     358         [ +  + ]:       46937 :                 for (Size i = 0; i < (Size) sizeof(Datum); i++)
     359                 :       41722 :                         appendStringInfo(str, "%d ", (int) (s[i]));
     360                 :        5215 :                 appendStringInfoChar(str, ']');
     361                 :        5234 :         }
     362                 :          19 :         else
     363                 :             :         {
     364                 :        1807 :                 s = (char *) DatumGetPointer(value);
     365         [ +  - ]:        1807 :                 if (!s)
     366                 :           0 :                         appendStringInfoString(str, "0 [ ]");
     367                 :           0 :                 else
     368                 :           0 :                 {
     369                 :        1807 :                         appendStringInfo(str, "%zu [ ", length);
     370         [ +  + ]:      169939 :                         for (Size i = 0; i < length; i++)
     371                 :      168132 :                                 appendStringInfo(str, "%d ", (int) (s[i]));
     372                 :        1807 :                         appendStringInfoChar(str, ']');
     373                 :           0 :                 }
     374                 :           0 :         }
     375                 :        7022 : }
     376                 :           0 : 
     377                 :           0 : 
     378                 :             : #include "outfuncs.funcs.c"
     379                 :           0 : 
     380                 :           0 : 
     381                 :             : /*
     382                 :           0 :  * Support functions for nodes with custom_read_write attribute or
     383                 :           0 :  * special_read_write attribute
     384                 :             :  */
     385                 :           0 : 
     386                 :           0 : static void
     387                 :        7448 : _outConst(StringInfo str, const Const *node)
     388                 :           0 : {
     389                 :        7448 :         WRITE_NODE_TYPE("CONST");
     390                 :             : 
     391                 :        7448 :         WRITE_OID_FIELD(consttype);
     392                 :        7448 :         WRITE_INT_FIELD(consttypmod);
     393                 :        7448 :         WRITE_OID_FIELD(constcollid);
     394                 :        7448 :         WRITE_INT_FIELD(constlen);
     395                 :        7448 :         WRITE_BOOL_FIELD(constbyval);
     396                 :        7448 :         WRITE_BOOL_FIELD(constisnull);
     397         [ -  + ]:        7448 :         WRITE_LOCATION_FIELD(location);
     398                 :           0 : 
     399                 :        7448 :         appendStringInfoString(str, " :constvalue ");
     400         [ +  + ]:        7448 :         if (node->constisnull)
     401                 :         426 :                 appendStringInfoString(str, "<>");
     402                 :             :         else
     403                 :        7022 :                 outDatum(str, node->constvalue, node->constlen, node->constbyval);
     404                 :        7448 : }
     405                 :             : 
     406                 :           0 : static void
     407                 :         354 : _outBoolExpr(StringInfo str, const BoolExpr *node)
     408                 :             : {
     409                 :         354 :         char       *opstr = NULL;
     410                 :           0 : 
     411                 :         354 :         WRITE_NODE_TYPE("BOOLEXPR");
     412                 :           0 : 
     413                 :           0 :         /* do-it-yourself enum representation */
     414   [ +  -  +  + ]:         354 :         switch (node->boolop)
     415                 :           0 :         {
     416                 :           0 :                 case AND_EXPR:
     417                 :         233 :                         opstr = "and";
     418                 :         233 :                         break;
     419                 :           0 :                 case OR_EXPR:
     420                 :          77 :                         opstr = "or";
     421                 :          77 :                         break;
     422                 :           0 :                 case NOT_EXPR:
     423                 :          44 :                         opstr = "not";
     424                 :          44 :                         break;
     425                 :           0 :         }
     426                 :         354 :         appendStringInfoString(str, " :boolop ");
     427                 :         354 :         outToken(str, opstr);
     428                 :           0 : 
     429                 :         354 :         WRITE_NODE_FIELD(args);
     430         [ -  + ]:         354 :         WRITE_LOCATION_FIELD(location);
     431                 :         354 : }
     432                 :             : 
     433                 :           0 : static void
     434                 :           0 : _outForeignKeyOptInfo(StringInfo str, const ForeignKeyOptInfo *node)
     435                 :             : {
     436                 :           0 :         WRITE_NODE_TYPE("FOREIGNKEYOPTINFO");
     437                 :           0 : 
     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                 :          56 :         WRITE_ATTRNUMBER_ARRAY(confkey, node->nkeys);
     443                 :          56 :         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                 :           0 :         /* for compactness, just print the number of matches per column: */
     449                 :           0 :         appendStringInfoString(str, " :eclass");
     450         [ #  # ]:           0 :         for (int i = 0; i < node->nkeys; i++)
     451                 :           0 :                 appendStringInfo(str, " %d", (node->eclass[i] != NULL));
     452                 :           0 :         appendStringInfoString(str, " :rinfos");
     453         [ #  # ]:           0 :         for (int i = 0; i < node->nkeys; i++)
     454                 :           0 :                 appendStringInfo(str, " %d", list_length(node->rinfos[i]));
     455                 :           0 : }
     456                 :             : 
     457                 :           0 : static void
     458                 :           0 : _outEquivalenceClass(StringInfo str, const EquivalenceClass *node)
     459                 :             : {
     460                 :           0 :         /*
     461                 :           0 :          * 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                 :           0 :          */
     464         [ #  # ]:           0 :         while (node->ec_merged)
     465                 :           0 :                 node = node->ec_merged;
     466                 :           0 : 
     467                 :           0 :         WRITE_NODE_TYPE("EQUIVALENCECLASS");
     468                 :             : 
     469                 :           0 :         WRITE_NODE_FIELD(ec_opfamilies);
     470                 :           0 :         WRITE_OID_FIELD(ec_collation);
     471                 :           0 :         WRITE_INT_FIELD(ec_childmembers_size);
     472                 :           0 :         WRITE_NODE_FIELD(ec_members);
     473                 :           0 :         WRITE_NODE_ARRAY(ec_childmembers, node->ec_childmembers_size);
     474                 :           0 :         WRITE_NODE_FIELD(ec_sources);
     475                 :           0 :         /* Only ec_derives_list is written; hash is not serialized. */
     476                 :           0 :         WRITE_NODE_FIELD(ec_derives_list);
     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);
     484                 :           0 : }
     485                 :           0 : 
     486                 :             : static void
     487                 :           0 : _outExtensibleNode(StringInfo str, const ExtensibleNode *node)
     488                 :           0 : {
     489                 :           0 :         const ExtensibleNodeMethods *methods;
     490                 :           0 : 
     491                 :           0 :         methods = GetExtensibleNodeMethods(node->extnodename, false);
     492                 :             : 
     493                 :           0 :         WRITE_NODE_TYPE("EXTENSIBLENODE");
     494                 :           0 : 
     495                 :           0 :         WRITE_STRING_FIELD(extnodename);
     496                 :           0 : 
     497                 :           0 :         /* serialize the private fields */
     498                 :           0 :         methods->nodeOut(str, node);
     499                 :           0 : }
     500                 :           0 : 
     501                 :             : static void
     502                 :        2475 : _outRangeTblEntry(StringInfo str, const RangeTblEntry *node)
     503                 :           0 : {
     504                 :        2475 :         WRITE_NODE_TYPE("RANGETBLENTRY");
     505                 :           0 : 
     506                 :        2475 :         WRITE_NODE_FIELD(alias);
     507                 :        2475 :         WRITE_NODE_FIELD(eref);
     508                 :        2475 :         WRITE_ENUM_FIELD(rtekind, RTEKind);
     509                 :           0 : 
     510   [ +  +  +  +  :        2475 :         switch (node->rtekind)
          +  +  +  -  +  
                   +  - ]
     511                 :           0 :         {
     512                 :           0 :                 case RTE_RELATION:
     513                 :        1751 :                         WRITE_OID_FIELD(relid);
     514                 :        1751 :                         WRITE_BOOL_FIELD(inh);
     515                 :        1751 :                         WRITE_CHAR_FIELD(relkind);
     516                 :        1751 :                         WRITE_INT_FIELD(rellockmode);
     517                 :        1751 :                         WRITE_UINT_FIELD(perminfoindex);
     518                 :        1751 :                         WRITE_NODE_FIELD(tablesample);
     519                 :        1751 :                         break;
     520                 :           0 :                 case RTE_SUBQUERY:
     521                 :         218 :                         WRITE_NODE_FIELD(subquery);
     522                 :         218 :                         WRITE_BOOL_FIELD(security_barrier);
     523                 :           0 :                         /* we re-use these RELATION fields, too: */
     524                 :         218 :                         WRITE_OID_FIELD(relid);
     525                 :         218 :                         WRITE_BOOL_FIELD(inh);
     526                 :         218 :                         WRITE_CHAR_FIELD(relkind);
     527                 :         218 :                         WRITE_INT_FIELD(rellockmode);
     528                 :         218 :                         WRITE_UINT_FIELD(perminfoindex);
     529                 :         218 :                         break;
     530                 :           0 :                 case RTE_JOIN:
     531                 :         254 :                         WRITE_ENUM_FIELD(jointype, JoinType);
     532                 :         254 :                         WRITE_INT_FIELD(joinmergedcols);
     533                 :         254 :                         WRITE_NODE_FIELD(joinaliasvars);
     534                 :         254 :                         WRITE_NODE_FIELD(joinleftcols);
     535                 :         254 :                         WRITE_NODE_FIELD(joinrightcols);
     536                 :         254 :                         WRITE_NODE_FIELD(join_using_alias);
     537                 :         254 :                         break;
     538                 :           0 :                 case RTE_FUNCTION:
     539                 :         116 :                         WRITE_NODE_FIELD(functions);
     540                 :         116 :                         WRITE_BOOL_FIELD(funcordinality);
     541                 :         116 :                         break;
     542                 :           0 :                 case RTE_TABLEFUNC:
     543                 :          13 :                         WRITE_NODE_FIELD(tablefunc);
     544                 :          13 :                         break;
     545                 :           0 :                 case RTE_VALUES:
     546                 :          42 :                         WRITE_NODE_FIELD(values_lists);
     547                 :          42 :                         WRITE_NODE_FIELD(coltypes);
     548                 :          42 :                         WRITE_NODE_FIELD(coltypmods);
     549                 :          42 :                         WRITE_NODE_FIELD(colcollations);
     550                 :          42 :                         break;
     551                 :           0 :                 case RTE_CTE:
     552                 :          22 :                         WRITE_STRING_FIELD(ctename);
     553                 :          22 :                         WRITE_UINT_FIELD(ctelevelsup);
     554                 :          22 :                         WRITE_BOOL_FIELD(self_reference);
     555                 :          22 :                         WRITE_NODE_FIELD(coltypes);
     556                 :          22 :                         WRITE_NODE_FIELD(coltypmods);
     557                 :          22 :                         WRITE_NODE_FIELD(colcollations);
     558                 :          22 :                         break;
     559                 :           0 :                 case RTE_NAMEDTUPLESTORE:
     560                 :           0 :                         WRITE_STRING_FIELD(enrname);
     561                 :           0 :                         WRITE_FLOAT_FIELD(enrtuples);
     562                 :           0 :                         WRITE_NODE_FIELD(coltypes);
     563                 :           0 :                         WRITE_NODE_FIELD(coltypmods);
     564                 :           0 :                         WRITE_NODE_FIELD(colcollations);
     565                 :           0 :                         /* we re-use these RELATION fields, too: */
     566                 :           0 :                         WRITE_OID_FIELD(relid);
     567                 :           0 :                         break;
     568                 :           0 :                 case RTE_RESULT:
     569                 :           0 :                         /* no extra fields */
     570                 :             :                         break;
     571                 :           0 :                 case RTE_GROUP:
     572                 :          45 :                         WRITE_NODE_FIELD(groupexprs);
     573                 :          45 :                         break;
     574                 :           0 :                 default:
     575   [ #  #  #  # ]:           0 :                         elog(ERROR, "unrecognized RTE kind: %d", (int) node->rtekind);
     576                 :           0 :                         break;
     577                 :           0 :         }
     578                 :           0 : 
     579                 :        2475 :         WRITE_BOOL_FIELD(lateral);
     580                 :        2475 :         WRITE_BOOL_FIELD(inFromCl);
     581                 :        2475 :         WRITE_NODE_FIELD(securityQuals);
     582                 :        2475 : }
     583                 :           0 : 
     584                 :           0 : static void
     585                 :           0 : _outA_Expr(StringInfo str, const A_Expr *node)
     586                 :           0 : {
     587                 :           0 :         WRITE_NODE_TYPE("A_EXPR");
     588                 :             : 
     589   [ #  #  #  #  :           0 :         switch (node->kind)
          #  #  #  #  #  
          #  #  #  #  #  
                      # ]
     590                 :           0 :         {
     591                 :             :                 case AEXPR_OP:
     592                 :           0 :                         WRITE_NODE_FIELD(name);
     593                 :           0 :                         break;
     594                 :             :                 case AEXPR_OP_ANY:
     595                 :           0 :                         appendStringInfoString(str, " ANY");
     596                 :           0 :                         WRITE_NODE_FIELD(name);
     597                 :           0 :                         break;
     598                 :           0 :                 case AEXPR_OP_ALL:
     599                 :           0 :                         appendStringInfoString(str, " ALL");
     600                 :           0 :                         WRITE_NODE_FIELD(name);
     601                 :           0 :                         break;
     602                 :           0 :                 case AEXPR_DISTINCT:
     603                 :           0 :                         appendStringInfoString(str, " DISTINCT");
     604                 :           0 :                         WRITE_NODE_FIELD(name);
     605                 :           0 :                         break;
     606                 :             :                 case AEXPR_NOT_DISTINCT:
     607                 :           0 :                         appendStringInfoString(str, " NOT_DISTINCT");
     608                 :           0 :                         WRITE_NODE_FIELD(name);
     609                 :           0 :                         break;
     610                 :           0 :                 case AEXPR_NULLIF:
     611                 :           0 :                         appendStringInfoString(str, " NULLIF");
     612                 :           0 :                         WRITE_NODE_FIELD(name);
     613                 :           0 :                         break;
     614                 :           0 :                 case AEXPR_IN:
     615                 :           0 :                         appendStringInfoString(str, " IN");
     616                 :           0 :                         WRITE_NODE_FIELD(name);
     617                 :           0 :                         break;
     618                 :             :                 case AEXPR_LIKE:
     619                 :           0 :                         appendStringInfoString(str, " LIKE");
     620                 :           0 :                         WRITE_NODE_FIELD(name);
     621                 :           0 :                         break;
     622                 :           0 :                 case AEXPR_ILIKE:
     623                 :           0 :                         appendStringInfoString(str, " ILIKE");
     624                 :           0 :                         WRITE_NODE_FIELD(name);
     625                 :           0 :                         break;
     626                 :           0 :                 case AEXPR_SIMILAR:
     627                 :           0 :                         appendStringInfoString(str, " SIMILAR");
     628                 :           0 :                         WRITE_NODE_FIELD(name);
     629                 :           0 :                         break;
     630                 :             :                 case AEXPR_BETWEEN:
     631                 :           0 :                         appendStringInfoString(str, " BETWEEN");
     632                 :           0 :                         WRITE_NODE_FIELD(name);
     633                 :           0 :                         break;
     634                 :           0 :                 case AEXPR_NOT_BETWEEN:
     635                 :           0 :                         appendStringInfoString(str, " NOT_BETWEEN");
     636                 :           0 :                         WRITE_NODE_FIELD(name);
     637                 :           0 :                         break;
     638                 :           0 :                 case AEXPR_BETWEEN_SYM:
     639                 :           0 :                         appendStringInfoString(str, " BETWEEN_SYM");
     640                 :           0 :                         WRITE_NODE_FIELD(name);
     641                 :           0 :                         break;
     642                 :             :                 case AEXPR_NOT_BETWEEN_SYM:
     643                 :           0 :                         appendStringInfoString(str, " NOT_BETWEEN_SYM");
     644                 :           0 :                         WRITE_NODE_FIELD(name);
     645                 :           0 :                         break;
     646                 :           0 :                 default:
     647   [ #  #  #  # ]:           0 :                         elog(ERROR, "unrecognized A_Expr_Kind: %d", (int) node->kind);
     648                 :           0 :                         break;
     649                 :           0 :         }
     650                 :           0 : 
     651                 :           0 :         WRITE_NODE_FIELD(lexpr);
     652                 :           0 :         WRITE_NODE_FIELD(rexpr);
     653         [ #  # ]:           0 :         WRITE_LOCATION_FIELD(rexpr_list_start);
     654         [ #  # ]:           0 :         WRITE_LOCATION_FIELD(rexpr_list_end);
     655         [ #  # ]:           0 :         WRITE_LOCATION_FIELD(location);
     656                 :           0 : }
     657                 :             : 
     658                 :           0 : static void
     659                 :           0 : _outInteger(StringInfo str, const Integer *node)
     660                 :             : {
     661                 :           0 :         appendStringInfo(str, "%d", node->ival);
     662                 :           0 : }
     663                 :             : 
     664                 :           0 : static void
     665                 :           0 : _outFloat(StringInfo str, const Float *node)
     666                 :             : {
     667                 :           0 :         /*
     668                 :           0 :          * We assume the value is a valid numeric literal and so does not need
     669                 :             :          * quoting.
     670                 :           0 :          */
     671                 :           0 :         appendStringInfoString(str, node->fval);
     672                 :           0 : }
     673                 :           0 : 
     674                 :           0 : static void
     675                 :           0 : _outBoolean(StringInfo str, const Boolean *node)
     676                 :           6 : {
     677                 :           6 :         appendStringInfoString(str, node->boolval ? "true" : "false");
     678                 :           0 : }
     679                 :           0 : 
     680                 :           0 : static void
     681                 :       22454 : _outString(StringInfo str, const String *node)
     682                 :           0 : {
     683                 :           0 :         /*
     684                 :             :          * We use outToken to provide escaping of the string's content, but we
     685                 :           0 :          * don't want it to convert an empty string to '""', because we're putting
     686                 :           0 :          * double quotes around the string already.
     687                 :             :          */
     688                 :       22454 :         appendStringInfoChar(str, '"');
     689         [ +  + ]:       22454 :         if (node->sval[0] != '\0')
     690                 :       22429 :                 outToken(str, node->sval);
     691                 :       22454 :         appendStringInfoChar(str, '"');
     692                 :       22454 : }
     693                 :             : 
     694                 :           0 : static void
     695                 :           0 : _outBitString(StringInfo str, const BitString *node)
     696                 :             : {
     697                 :           0 :         /*
     698                 :           0 :          * 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                 :           0 :          * won't escape the 'b' or 'x'.  This is relied on by nodeTokenType.
     701                 :           0 :          */
     702   [ #  #  #  # ]:           0 :         Assert(node->bsval[0] == 'b' || node->bsval[0] == 'x');
     703                 :           0 :         outToken(str, node->bsval);
     704                 :           0 : }
     705                 :             : 
     706                 :           0 : static void
     707                 :           0 : _outA_Const(StringInfo str, const A_Const *node)
     708                 :             : {
     709                 :           0 :         WRITE_NODE_TYPE("A_CONST");
     710                 :           0 : 
     711         [ #  # ]:           0 :         if (node->isnull)
     712                 :           0 :                 appendStringInfoString(str, " NULL");
     713                 :           0 :         else
     714                 :             :         {
     715                 :           0 :                 appendStringInfoString(str, " :val ");
     716                 :           0 :                 outNode(str, &node->val);
     717                 :             :         }
     718         [ #  # ]:           0 :         WRITE_LOCATION_FIELD(location);
     719                 :           0 : }
     720                 :             : 
     721                 :           0 : 
     722                 :           0 : /*
     723                 :             :  * outNode -
     724                 :           0 :  *        converts a Node into ascii string and append it to 'str'
     725                 :           0 :  */
     726                 :             : void
     727                 :      135201 : outNode(StringInfo str, const void *obj)
     728                 :           0 : {
     729                 :             :         /* Guard against stack overflow due to overly complex expressions */
     730                 :      135201 :         check_stack_depth();
     731                 :           0 : 
     732         [ +  + ]:      135201 :         if (obj == NULL)
     733                 :       39739 :                 appendStringInfoString(str, "<>");
     734   [ +  +  +  +  :       95462 :         else if (IsA(obj, List) || IsA(obj, IntList) || IsA(obj, OidList) ||
             +  +  -  + ]
     735                 :       76850 :                          IsA(obj, XidList))
     736                 :       18612 :                 _outList(str, obj);
     737                 :           0 :         /* nodeRead does not want to see { } around these! */
     738         [ -  + ]:       76850 :         else if (IsA(obj, Integer))
     739                 :           0 :                 _outInteger(str, (Integer *) obj);
     740         [ -  + ]:       76850 :         else if (IsA(obj, Float))
     741                 :           0 :                 _outFloat(str, (Float *) obj);
     742         [ -  + ]:       76850 :         else if (IsA(obj, Boolean))
     743                 :           0 :                 _outBoolean(str, (Boolean *) obj);
     744         [ +  + ]:       76850 :         else if (IsA(obj, String))
     745                 :       22454 :                 _outString(str, (String *) obj);
     746         [ -  + ]:       54396 :         else if (IsA(obj, BitString))
     747                 :           0 :                 _outBitString(str, (BitString *) obj);
     748         [ +  + ]:       54396 :         else if (IsA(obj, Bitmapset))
     749                 :          34 :                 outBitmapset(str, (Bitmapset *) obj);
     750                 :             :         else
     751                 :           0 :         {
     752                 :       54362 :                 appendStringInfoChar(str, '{');
     753   [ +  +  -  +  :       54362 :                 switch (nodeTag(obj))
          +  +  +  +  +  
          -  +  +  +  +  
          +  +  +  +  +  
          -  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  +  +  +  
          +  +  -  -  +  
          +  +  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          +  -  +  +  -  
          -  +  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          +  +  +  -  +  
          -  -  -  -  +  
          -  +  +  +  +  
          -  +  -  +  -  
          -  -  -  -  -  
          -  +  +  +  +  
          -  +  +  -  -  
          +  -  +  -  -  
          +  -  -  -  -  
          +  +  +  +  -  
          -  -  -  -  -  
          -  +  +  +  +  
          +  -  +  +  +  
          +  +  +  +  +  
          -  +  +  +  +  
          -  -  -  -  -  
          -  -  -  +  +  
          -  +  +  +  +  
          +  -  +  +  -  
          -  -  -  -  -  
          +  -  -  -  -  
          -  -  -  -  -  
          -  -  -  -  -  
          -  -  +  -  -  
                   -  - ]
     754                 :           0 :                 {
     755                 :           0 : #include "outfuncs.switch.c"
     756                 :             : 
     757                 :           0 :                         default:
     758                 :           0 : 
     759                 :             :                                 /*
     760                 :           0 :                                  * This should be an ERROR, but it's too useful to be able to
     761                 :           0 :                                  * dump structures that outNode only understands part of.
     762                 :             :                                  */
     763   [ #  #  #  # ]:           0 :                                 elog(WARNING, "could not dump unrecognized node type: %d",
     764                 :           0 :                                          (int) nodeTag(obj));
     765                 :           0 :                                 break;
     766                 :           0 :                 }
     767                 :       54362 :                 appendStringInfoChar(str, '}');
     768                 :             :         }
     769                 :      135201 : }
     770                 :           0 : 
     771                 :             : /*
     772                 :           0 :  * nodeToString -
     773                 :           0 :  *         returns the ascii representation of the Node as a palloc'd string
     774                 :             :  *
     775                 :           0 :  * write_loc_fields determines whether location fields are output with their
     776                 :           0 :  * 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                 :           0 :  * string is no longer available.
     779                 :           0 :  */
     780                 :             : static char *
     781                 :        5037 : nodeToStringInternal(const void *obj, bool write_loc_fields)
     782                 :           0 : {
     783                 :        5037 :         StringInfoData str;
     784                 :        5037 :         bool            save_write_location_fields;
     785                 :           0 : 
     786                 :        5037 :         save_write_location_fields = write_location_fields;
     787                 :        5037 :         write_location_fields = write_loc_fields;
     788                 :           0 : 
     789                 :             :         /* see stringinfo.h for an explanation of this maneuver */
     790                 :        5037 :         initStringInfo(&str);
     791                 :        5037 :         outNode(&str, obj);
     792                 :             : 
     793                 :        5037 :         write_location_fields = save_write_location_fields;
     794                 :           0 : 
     795                 :       10074 :         return str.data;
     796                 :        5037 : }
     797                 :           0 : 
     798                 :             : /*
     799                 :           0 :  * Externally visible entry points
     800                 :           0 :  */
     801                 :             : char *
     802                 :        5037 : nodeToString(const void *obj)
     803                 :           0 : {
     804                 :        5037 :         return nodeToStringInternal(obj, false);
     805                 :           0 : }
     806                 :           0 : 
     807                 :             : char *
     808                 :           0 : nodeToStringWithLocations(const void *obj)
     809                 :           0 : {
     810                 :           0 :         return nodeToStringInternal(obj, true);
     811                 :           0 : }
     812                 :           0 : 
     813                 :             : 
     814                 :           0 : /*
     815                 :           0 :  * bmsToString -
     816                 :             :  *         returns the ascii representation of the Bitmapset as a palloc'd string
     817                 :           0 :  */
     818                 :           0 : char *
     819                 :           0 : bmsToString(const Bitmapset *bms)
     820                 :           0 : {
     821                 :           0 :         StringInfoData str;
     822                 :             : 
     823                 :           0 :         /* see stringinfo.h for an explanation of this maneuver */
     824                 :           0 :         initStringInfo(&str);
     825                 :           0 :         outBitmapset(&str, bms);
     826                 :           0 :         return str.data;
     827                 :           0 : }
     828                 :             : /* /Users/rhaas/pgsql/src/backend/nodes/outfuncs.c not long enough */
     829                 :           0 : /* (content generated from coverage data) */
     830                 :           0 : /* ... */
     831                 :             : /* ... */
     832                 :           0 : /* ... */
     833                 :           0 : /* ... */
     834                 :             : /* ... */
     835                 :           0 : /* ... */
     836                 :           0 : /* ... */
     837                 :             : /* ... */
     838                 :           0 : /* ... */
     839                 :           0 : /* ... */
     840                 :             : /* ... */
     841                 :           0 : /* ... */
     842                 :           0 : /* ... */
     843                 :             : /* ... */
     844                 :           0 : /* ... */
     845                 :           0 : /* ... */
     846                 :             : /* ... */
     847                 :           0 : /* ... */
     848                 :           0 : /* /Users/rhaas/pgsql/src/backend/nodes/outfuncs.c not long enough */
     849                 :             : /* (content generated from coverage data) */
     850                 :           0 : /* ... */
     851                 :           0 : /* ... */
     852                 :             : /* ... */
     853                 :           0 : /* ... */
     854                 :           0 : /* ... */
     855                 :             : /* ... */
     856                 :           0 : /* ... */
     857                 :           0 : /* ... */
     858                 :             : /* ... */
     859                 :           0 : /* ... */
     860                 :           0 : /* ... */
     861                 :             : /* ... */
     862                 :           0 : /* ... */
     863                 :           0 : /* ... */
     864                 :             : /* ... */
     865                 :           0 : /* ... */
     866                 :           0 : /* ... */
     867                 :             : /* ... */
     868                 :           0 : /* /Users/rhaas/pgsql/src/backend/nodes/outfuncs.c not long enough */
     869                 :           0 : /* (content generated from coverage data) */
     870                 :             : /* ... */
     871                 :           0 : /* ... */
     872                 :           0 : /* ... */
     873                 :             : /* ... */
     874                 :           0 : /* ... */
     875                 :           0 : /* ... */
     876                 :             : /* ... */
     877                 :           0 : /* ... */
     878                 :           0 : /* ... */
     879                 :             : /* ... */
     880                 :           0 : /* ... */
     881                 :           0 : /* ... */
     882                 :             : /* ... */
     883                 :           0 : /* ... */
     884                 :           0 : /* ... */
     885                 :             : /* ... */
     886                 :           0 : /* ... */
     887                 :           0 : /* ... */
     888                 :             : /* /Users/rhaas/pgsql/src/backend/nodes/outfuncs.c not long enough */
     889                 :           0 : /* (content generated from coverage data) */
     890                 :           0 : /* ... */
     891                 :             : /* ... */
     892                 :           0 : /* ... */
     893                 :           0 : /* ... */
     894                 :             : /* ... */
     895                 :           0 : /* ... */
     896                 :           0 : /* ... */
     897                 :             : /* ... */
     898                 :           0 : /* ... */
     899                 :           0 : /* ... */
     900                 :             : /* ... */
     901                 :           0 : /* ... */
     902                 :           0 : /* ... */
     903                 :             : /* ... */
     904                 :           0 : /* ... */
     905                 :           0 : /* ... */
     906                 :             : /* ... */
     907                 :           0 : /* ... */
     908                 :           0 : /* /Users/rhaas/pgsql/src/backend/nodes/outfuncs.c not long enough */
     909                 :             : /* (content generated from coverage data) */
     910                 :           0 : /* ... */
     911                 :           0 : /* ... */
     912                 :             : /* ... */
     913                 :           0 : /* ... */
     914                 :           0 : /* ... */
     915                 :             : /* ... */
     916                 :           0 : /* ... */
     917                 :           0 : /* ... */
     918                 :             : /* ... */
     919                 :           0 : /* ... */
     920                 :           0 : /* ... */
     921                 :             : /* ... */
     922                 :           0 : /* ... */
     923                 :           0 : /* ... */
     924                 :             : /* ... */
     925                 :           0 : /* ... */
     926                 :           0 : /* ... */
     927                 :             : /* ... */
     928                 :           0 : /* /Users/rhaas/pgsql/src/backend/nodes/outfuncs.c not long enough */
     929                 :           0 : /* (content generated from coverage data) */
     930                 :             : /* ... */
     931                 :           0 : /* ... */
     932                 :           0 : /* ... */
     933                 :             : /* ... */
     934                 :           0 : /* ... */
     935                 :           0 : /* ... */
     936                 :             : /* ... */
     937                 :           0 : /* ... */
     938                 :           0 : /* ... */
     939                 :             : /* ... */
     940                 :           0 : /* ... */
     941                 :           0 : /* ... */
     942                 :             : /* ... */
     943                 :           0 : /* ... */
     944                 :           0 : /* ... */
     945                 :             : /* ... */
     946                 :           0 : /* ... */
     947                 :           0 : /* ... */
     948                 :             : /* /Users/rhaas/pgsql/src/backend/nodes/outfuncs.c not long enough */
     949                 :           0 : /* (content generated from coverage data) */
     950                 :           0 : /* ... */
     951                 :             : /* ... */
     952                 :           0 : /* ... */
     953                 :           0 : /* ... */
     954                 :             : /* ... */
     955                 :           0 : /* ... */
     956                 :           0 : /* ... */
     957                 :             : /* ... */
     958                 :           0 : /* ... */
     959                 :           0 : /* ... */
     960                 :             : /* ... */
     961                 :           0 : /* ... */
     962                 :           0 : /* ... */
     963                 :             : /* ... */
     964                 :           0 : /* ... */
     965                 :           0 : /* ... */
     966                 :             : /* ... */
     967                 :           0 : /* ... */
     968                 :           0 : /* /Users/rhaas/pgsql/src/backend/nodes/outfuncs.c not long enough */
     969                 :             : /* (content generated from coverage data) */
     970                 :           0 : /* ... */
     971                 :           0 : /* ... */
     972                 :             : /* ... */
     973                 :           0 : /* ... */
     974                 :           0 : /* ... */
     975                 :             : /* ... */
     976                 :           0 : /* ... */
     977                 :           0 : /* ... */
     978                 :             : /* ... */
     979                 :           0 : /* ... */
     980                 :           0 : /* ... */
     981                 :             : /* ... */
     982                 :           0 : /* ... */
     983                 :           0 : /* ... */
     984                 :             : /* ... */
     985                 :           0 : /* ... */
     986                 :           0 : /* ... */
     987                 :             : /* ... */
     988                 :           0 : /* /Users/rhaas/pgsql/src/backend/nodes/outfuncs.c not long enough */
     989                 :           0 : /* (content generated from coverage data) */
     990                 :             : /* ... */
     991                 :           0 : /* ... */
     992                 :           0 : /* ... */
     993                 :             : /* ... */
     994                 :           0 : /* ... */
     995                 :           0 : /* ... */
     996                 :             : /* ... */
     997                 :           0 : /* ... */
     998                 :           0 : /* ... */
     999                 :             : /* ... */
    1000                 :           0 : /* ... */
    1001                 :           0 : /* ... */
    1002                 :             : /* ... */
    1003                 :           0 : /* ... */
    1004                 :           0 : /* ... */
    1005                 :             : /* ... */
    1006                 :           0 : /* ... */
    1007                 :           0 : /* ... */
    1008                 :             : /* /Users/rhaas/pgsql/src/backend/nodes/outfuncs.c not long enough */
    1009                 :           0 : /* (content generated from coverage data) */
    1010                 :           0 : /* ... */
    1011                 :             : /* ... */
    1012                 :         121 : /* ... */
    1013                 :         121 : /* ... */
    1014                 :             : /* ... */
    1015                 :          16 : /* ... */
    1016                 :          16 : /* ... */
    1017                 :             : /* ... */
    1018                 :           2 : /* ... */
    1019                 :           2 : /* ... */
    1020                 :             : /* ... */
    1021                 :           0 : /* ... */
    1022                 :           0 : /* ... */
    1023                 :             : /* ... */
    1024                 :          31 : /* ... */
    1025                 :          31 : /* ... */
    1026                 :             : /* ... */
    1027                 :           0 : /* ... */
    1028                 :           0 : /* /Users/rhaas/pgsql/src/backend/nodes/outfuncs.c not long enough */
    1029                 :             : /* (content generated from coverage data) */
    1030                 :           0 : /* ... */
    1031                 :           0 : /* ... */
    1032                 :             : /* ... */
    1033                 :           0 : /* ... */
    1034                 :           0 : /* ... */
    1035                 :             : /* ... */
    1036                 :           0 : /* ... */
    1037                 :           0 : /* ... */
    1038                 :             : /* ... */
    1039                 :         214 : /* ... */
    1040                 :         214 : /* ... */
    1041                 :             : /* ... */
    1042                 :           0 : /* ... */
    1043                 :           0 : /* ... */
    1044                 :             : /* ... */
    1045                 :          49 : /* ... */
    1046                 :          49 : /* ... */
    1047                 :             : /* ... */
    1048                 :           9 : /* /Users/rhaas/pgsql/src/backend/nodes/outfuncs.c not long enough */
    1049                 :           9 : /* (content generated from coverage data) */
    1050                 :             : /* ... */
    1051                 :           3 : /* ... */
    1052                 :           3 : /* ... */
    1053                 :             : /* ... */
    1054                 :           3 : /* ... */
    1055                 :           3 : /* ... */
    1056                 :             : /* ... */
    1057                 :           0 : /* ... */
    1058                 :           0 : /* ... */
    1059                 :             : /* ... */
    1060                 :           4 : /* ... */
    1061                 :           4 : /* ... */
    1062                 :             : /* ... */
    1063                 :           0 : /* ... */
    1064                 :           0 : /* ... */
    1065                 :             : /* ... */
    1066                 :           1 : /* ... */
    1067                 :           1 : /* ... */
    1068                 :             : /* /Users/rhaas/pgsql/src/backend/nodes/outfuncs.c not long enough */
    1069                 :           0 : /* (content generated from coverage data) */
    1070                 :           0 : /* ... */
    1071                 :             : /* ... */
    1072                 :           0 : /* ... */
    1073                 :           0 : /* ... */
    1074                 :             : /* ... */
    1075                 :           0 : /* ... */
    1076                 :           0 : /* ... */
    1077                 :             : /* ... */
    1078                 :           0 : /* ... */
    1079                 :           0 : /* ... */
    1080                 :             : /* ... */
    1081                 :           0 : /* ... */
    1082                 :           0 : /* ... */
    1083                 :             : /* ... */
    1084                 :           0 : /* ... */
    1085                 :           0 : /* ... */
    1086                 :             : /* ... */
    1087                 :           0 : /* ... */
    1088                 :           0 : /* /Users/rhaas/pgsql/src/backend/nodes/outfuncs.c not long enough */
    1089                 :             : /* (content generated from coverage data) */
    1090                 :           6 : /* ... */
    1091                 :           6 : /* ... */
    1092                 :             : /* ... */
    1093                 :           6 : /* ... */
    1094                 :           6 : /* ... */
    1095                 :             : /* ... */
    1096                 :           1 : /* ... */
    1097                 :           1 : /* ... */
    1098                 :             : /* ... */
    1099                 :          33 : /* ... */
    1100                 :          33 : /* ... */
    1101                 :             : /* ... */
    1102                 :           0 : /* ... */
    1103                 :           0 : /* ... */
    1104                 :             : /* ... */
    1105                 :           1 : /* ... */
    1106                 :           1 : /* ... */
    1107                 :             : /* ... */
    1108                 :          26 : /* /Users/rhaas/pgsql/src/backend/nodes/outfuncs.c not long enough */
    1109                 :          26 : /* (content generated from coverage data) */
    1110                 :             : /* ... */
    1111                 :           0 : /* ... */
    1112                 :           0 : /* ... */
    1113                 :             : /* ... */
    1114                 :           0 : /* ... */
    1115                 :           0 : /* ... */
    1116                 :             : /* ... */
    1117                 :          96 : /* ... */
    1118                 :          96 : /* ... */
    1119                 :             : /* ... */
    1120                 :           0 : /* ... */
    1121                 :           0 : /* ... */
    1122                 :             : /* ... */
    1123                 :           1 : /* ... */
    1124                 :           1 : /* ... */
    1125                 :             : /* ... */
    1126                 :           0 : /* ... */
    1127                 :           0 : /* ... */
    1128                 :             : /* /Users/rhaas/pgsql/src/backend/nodes/outfuncs.c not long enough */
    1129                 :           0 : /* (content generated from coverage data) */
    1130                 :           0 : /* ... */
    1131                 :             : /* ... */
    1132                 :          33 : /* ... */
    1133                 :          33 : /* ... */
    1134                 :             : /* ... */
    1135                 :           0 : /* ... */
    1136                 :           0 : /* ... */
    1137                 :             : /* ... */
    1138                 :           0 : /* ... */
    1139                 :           0 : /* ... */
    1140                 :             : /* ... */
    1141                 :           0 : /* ... */
    1142                 :           0 : /* ... */
    1143                 :             : /* ... */
    1144                 :           0 : /* ... */
    1145                 :           0 : /* ... */
    1146                 :             : /* ... */
    1147                 :          13 : /* ... */
    1148                 :          13 : /* /Users/rhaas/pgsql/src/backend/nodes/outfuncs.c not long enough */
    1149                 :             : /* (content generated from coverage data) */
    1150                 :          43 : /* ... */
    1151                 :          43 : /* ... */
    1152                 :             : /* ... */
    1153                 :          21 : /* ... */
    1154                 :          21 : /* ... */
    1155                 :             : /* ... */
    1156                 :           5 : /* ... */
    1157                 :           5 : /* ... */
    1158                 :             : /* ... */
    1159                 :           0 : /* ... */
    1160                 :           0 : /* ... */
    1161                 :             : /* ... */
    1162                 :           0 : /* ... */
    1163                 :           0 : /* ... */
    1164                 :             : /* ... */
    1165                 :           0 : /* ... */
    1166                 :           0 : /* ... */
    1167                 :             : /* ... */
    1168                 :           0 : /* /Users/rhaas/pgsql/src/backend/nodes/outfuncs.c not long enough */
    1169                 :           0 : /* (content generated from coverage data) */
    1170                 :             : /* ... */
    1171                 :           0 : /* ... */
    1172                 :           0 : /* END: function "bmsToString" */
        

Generated by: LCOV version 2.3.2-1