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-2025, 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 "libpq/protocol.h"
25#include "utils/builtins.h"
26
27/*
28 * At startup time, send a RowDescription message.
29 */
30void
31printsimple_startup(DestReceiver *self, int operation, TupleDesc tupdesc)
32{
34 int i;
35
37 pq_sendint16(&buf, tupdesc->natts);
38
39 for (i = 0; i < tupdesc->natts; ++i)
40 {
41 Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
42
43 pq_sendstring(&buf, NameStr(attr->attname));
44 pq_sendint32(&buf, 0); /* table oid */
45 pq_sendint16(&buf, 0); /* attnum */
46 pq_sendint32(&buf, (int) attr->atttypid);
47 pq_sendint16(&buf, attr->attlen);
48 pq_sendint32(&buf, attr->atttypmod);
49 pq_sendint16(&buf, 0); /* format code */
50 }
51
53}
54
55/*
56 * For each tuple, send a DataRow message.
57 */
58bool
60{
61 TupleDesc tupdesc = slot->tts_tupleDescriptor;
63 int i;
64
65 /* Make sure the tuple is fully deconstructed */
66 slot_getallattrs(slot);
67
68 /* Prepare and send message */
70 pq_sendint16(&buf, tupdesc->natts);
71
72 for (i = 0; i < tupdesc->natts; ++i)
73 {
74 Form_pg_attribute attr = TupleDescAttr(tupdesc, i);
76
77 if (slot->tts_isnull[i])
78 {
79 pq_sendint32(&buf, -1);
80 continue;
81 }
82
83 value = slot->tts_values[i];
84
85 /*
86 * We can't call the regular type output functions here because we
87 * might not have catalog access. Instead, we must hard-wire
88 * knowledge of the required types.
89 */
90 switch (attr->atttypid)
91 {
92 case TEXTOID:
93 {
95
97 VARDATA_ANY(t),
99 }
100 break;
101
102 case INT4OID:
103 {
105 char str[12]; /* sign, 10 digits and '\0' */
106 int len;
107
108 len = pg_ltoa(num, str);
110 }
111 break;
112
113 case INT8OID:
114 {
116 char str[MAXINT8LEN + 1];
117 int len;
118
119 len = pg_lltoa(num, str);
121 }
122 break;
123
124 case OIDOID:
125 {
127 char str[10]; /* 10 digits */
128 int len;
129
130 len = pg_ultoa_n(num, str);
132 }
133 break;
134
135 default:
136 elog(ERROR, "unsupported type OID: %u", attr->atttypid);
137 }
138 }
139
141
142 return true;
143}
#define MAXINT8LEN
Definition: builtins.h:22
#define NameStr(name)
Definition: c.h:703
int64_t int64
Definition: c.h:485
int32_t int32
Definition: c.h:484
#define ERROR
Definition: elog.h:39
#define elog(elevel,...)
Definition: elog.h:225
#define DatumGetTextPP(X)
Definition: fmgr.h:292
const char * str
static struct @162 value
int i
Definition: isn.c:72
int pg_ltoa(int32 value, char *a)
Definition: numutils.c:1120
int pg_lltoa(int64 value, char *a)
Definition: numutils.c:1227
int pg_ultoa_n(uint32 value, char *a)
Definition: numutils.c:1055
FormData_pg_attribute * Form_pg_attribute
Definition: pg_attribute.h:200
const void size_t len
static char * buf
Definition: pg_test_fsync.c:72
static int64 DatumGetInt64(Datum X)
Definition: postgres.h:390
uintptr_t Datum
Definition: postgres.h:69
static Datum ObjectIdGetDatum(Oid X)
Definition: postgres.h:257
static int32 DatumGetInt32(Datum X)
Definition: postgres.h:207
unsigned int Oid
Definition: postgres_ext.h:32
void pq_sendstring(StringInfo buf, const char *str)
Definition: pqformat.c:195
void pq_endmessage(StringInfo buf)
Definition: pqformat.c:296
void pq_beginmessage(StringInfo buf, char msgtype)
Definition: pqformat.c:88
void pq_sendcountedtext(StringInfo buf, const char *str, int slen)
Definition: pqformat.c:142
static void pq_sendint32(StringInfo buf, uint32 i)
Definition: pqformat.h:144
static void pq_sendint16(StringInfo buf, uint16 i)
Definition: pqformat.h:136
void printsimple_startup(DestReceiver *self, int operation, TupleDesc tupdesc)
Definition: printsimple.c:31
bool printsimple(TupleTableSlot *slot, DestReceiver *self)
Definition: printsimple.c:59
#define PqMsg_RowDescription
Definition: protocol.h:52
#define PqMsg_DataRow
Definition: protocol.h:43
TupleDesc tts_tupleDescriptor
Definition: tuptable.h:123
bool * tts_isnull
Definition: tuptable.h:127
Datum * tts_values
Definition: tuptable.h:125
Definition: c.h:644
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
Definition: tupdesc.h:154
static void slot_getallattrs(TupleTableSlot *slot)
Definition: tuptable.h:368
#define VARDATA_ANY(PTR)
Definition: varatt.h:324
#define VARSIZE_ANY_EXHDR(PTR)
Definition: varatt.h:317