PostgreSQL Source Code  git master
printsimple.c
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * printsimple.c
4  * Routines to print out tuples containing only a limited range of
5  * builtin types without catalog access. This is intended for
6  * backends that don't have catalog access because they are not bound
7  * to a specific database, such as some walsender processes. It
8  * doesn't handle standalone backends or protocol versions other than
9  * 3.0, because we don't need such handling for current applications.
10  *
11  * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
12  * Portions Copyright (c) 1994, Regents of the University of California
13  *
14  * IDENTIFICATION
15  * src/backend/access/common/printsimple.c
16  *
17  *-------------------------------------------------------------------------
18  */
19 #include "postgres.h"
20 
21 #include "access/printsimple.h"
22 #include "catalog/pg_type.h"
23 #include "libpq/pqformat.h"
24 #include "utils/builtins.h"
25 
26 /*
27  * At startup time, send a RowDescription message.
28  */
29 void
30 printsimple_startup(DestReceiver *self, int operation, TupleDesc tupdesc)
31 {
33  int i;
34 
35  pq_beginmessage(&buf, 'T'); /* RowDescription */
36  pq_sendint16(&buf, tupdesc->natts);
37 
38  for (i = 0; i < tupdesc->natts; ++i)
39  {
40  Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
41 
42  pq_sendstring(&buf, NameStr(attr->attname));
43  pq_sendint32(&buf, 0); /* table oid */
44  pq_sendint16(&buf, 0); /* attnum */
45  pq_sendint32(&buf, (int) attr->atttypid);
46  pq_sendint16(&buf, attr->attlen);
47  pq_sendint32(&buf, attr->atttypmod);
48  pq_sendint16(&buf, 0); /* format code */
49  }
50 
51  pq_endmessage(&buf);
52 }
53 
54 /*
55  * For each tuple, send a DataRow message.
56  */
57 bool
59 {
60  TupleDesc tupdesc = slot->tts_tupleDescriptor;
62  int i;
63 
64  /* Make sure the tuple is fully deconstructed */
65  slot_getallattrs(slot);
66 
67  /* Prepare and send message */
68  pq_beginmessage(&buf, 'D');
69  pq_sendint16(&buf, tupdesc->natts);
70 
71  for (i = 0; i < tupdesc->natts; ++i)
72  {
73  Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
74  Datum value;
75 
76  if (slot->tts_isnull[i])
77  {
78  pq_sendint32(&buf, -1);
79  continue;
80  }
81 
82  value = slot->tts_values[i];
83 
84  /*
85  * We can't call the regular type output functions here because we
86  * might not have catalog access. Instead, we must hard-wire
87  * knowledge of the required types.
88  */
89  switch (attr->atttypid)
90  {
91  case TEXTOID:
92  {
93  text *t = DatumGetTextPP(value);
94 
95  pq_sendcountedtext(&buf,
96  VARDATA_ANY(t),
98  false);
99  }
100  break;
101 
102  case INT4OID:
103  {
104  int32 num = DatumGetInt32(value);
105  char str[12]; /* sign, 10 digits and '\0' */
106 
107  pg_ltoa(num, str);
108  pq_sendcountedtext(&buf, str, strlen(str), false);
109  }
110  break;
111 
112  case INT8OID:
113  {
114  int64 num = DatumGetInt64(value);
115  char str[23]; /* sign, 21 digits and '\0' */
116 
117  pg_lltoa(num, str);
118  pq_sendcountedtext(&buf, str, strlen(str), false);
119  }
120  break;
121 
122  default:
123  elog(ERROR, "unsupported type OID: %u", attr->atttypid);
124  }
125  }
126 
127  pq_endmessage(&buf);
128 
129  return true;
130 }
static void pq_sendint16(StringInfo buf, uint16 i)
Definition: pqformat.h:137
#define VARDATA_ANY(PTR)
Definition: postgres.h:348
#define DatumGetInt32(X)
Definition: postgres.h:472
#define TupleDescAttr(tupdesc, i)
Definition: tupdesc.h:92
#define DatumGetTextPP(X)
Definition: fmgr.h:286
static struct @144 value
Datum * tts_values
Definition: tuptable.h:126
void pq_sendstring(StringInfo buf, const char *str)
Definition: pqformat.c:197
bool printsimple(TupleTableSlot *slot, DestReceiver *self)
Definition: printsimple.c:58
void pq_beginmessage(StringInfo buf, char msgtype)
Definition: pqformat.c:87
signed int int32
Definition: c.h:346
static void pq_sendint32(StringInfo buf, uint32 i)
Definition: pqformat.h:145
#define ERROR
Definition: elog.h:43
static void slot_getallattrs(TupleTableSlot *slot)
Definition: tuptable.h:355
#define DatumGetInt64(X)
Definition: postgres.h:607
static char * buf
Definition: pg_test_fsync.c:68
bool * tts_isnull
Definition: tuptable.h:128
FormData_pg_attribute * Form_pg_attribute
Definition: pg_attribute.h:200
void pq_sendcountedtext(StringInfo buf, const char *str, int slen, bool countincludesself)
Definition: pqformat.c:142
void printsimple_startup(DestReceiver *self, int operation, TupleDesc tupdesc)
Definition: printsimple.c:30
TupleDesc tts_tupleDescriptor
Definition: tuptable.h:124
uintptr_t Datum
Definition: postgres.h:367
void pg_lltoa(int64 value, char *a)
Definition: numutils.c:339
#define VARSIZE_ANY_EXHDR(PTR)
Definition: postgres.h:341
void pq_endmessage(StringInfo buf)
Definition: pqformat.c:298
#define elog(elevel,...)
Definition: elog.h:226
int i
#define NameStr(name)
Definition: c.h:609
Definition: c.h:549
void pg_ltoa(int32 value, char *a)
Definition: numutils.c:285