PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
printtup.h File Reference
#include "utils/portal.h"
Include dependency graph for printtup.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

DestReceiverprinttup_create_DR (CommandDest dest)
 
void SetRemoteDestReceiverParams (DestReceiver *self, Portal portal)
 
void SendRowDescriptionMessage (StringInfo buf, TupleDesc typeinfo, List *targetlist, int16 *formats)
 
void debugStartup (DestReceiver *self, int operation, TupleDesc typeinfo)
 
bool debugtup (TupleTableSlot *slot, DestReceiver *self)
 
void spi_dest_startup (DestReceiver *self, int operation, TupleDesc typeinfo)
 
bool spi_printtup (TupleTableSlot *slot, DestReceiver *self)
 

Function Documentation

◆ debugStartup()

void debugStartup ( DestReceiver self,
int  operation,
TupleDesc  typeinfo 
)

Definition at line 444 of file printtup.c.

445{
446 int natts = typeinfo->natts;
447 int i;
448
449 /*
450 * show the return type of the tuples
451 */
452 for (i = 0; i < natts; ++i)
453 printatt((unsigned) i + 1, TupleDescAttr(typeinfo, i), NULL);
454 printf("\t----\n");
455}
int i
Definition: isn.c:72
#define printf(...)
Definition: port.h:244
static void printatt(unsigned attributeId, Form_pg_attribute attributeP, char *value)
Definition: printtup.c:423
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
Definition: tupdesc.h:152

References i, TupleDescData::natts, printatt(), printf, and TupleDescAttr().

◆ debugtup()

bool debugtup ( TupleTableSlot slot,
DestReceiver self 
)

Definition at line 462 of file printtup.c.

463{
464 TupleDesc typeinfo = slot->tts_tupleDescriptor;
465 int natts = typeinfo->natts;
466 int i;
467 Datum attr;
468 char *value;
469 bool isnull;
470 Oid typoutput;
471 bool typisvarlena;
472
473 for (i = 0; i < natts; ++i)
474 {
475 attr = slot_getattr(slot, i + 1, &isnull);
476 if (isnull)
477 continue;
478 getTypeOutputInfo(TupleDescAttr(typeinfo, i)->atttypid,
479 &typoutput, &typisvarlena);
480
481 value = OidOutputFunctionCall(typoutput, attr);
482
483 printatt((unsigned) i + 1, TupleDescAttr(typeinfo, i), value);
484 }
485 printf("\t----\n");
486
487 return true;
488}
char * OidOutputFunctionCall(Oid functionId, Datum val)
Definition: fmgr.c:1763
static struct @161 value
void getTypeOutputInfo(Oid type, Oid *typOutput, bool *typIsVarlena)
Definition: lsyscache.c:2907
uintptr_t Datum
Definition: postgres.h:64
unsigned int Oid
Definition: postgres_ext.h:31
TupleDesc tts_tupleDescriptor
Definition: tuptable.h:123
static Datum slot_getattr(TupleTableSlot *slot, int attnum, bool *isnull)
Definition: tuptable.h:395

References getTypeOutputInfo(), i, TupleDescData::natts, OidOutputFunctionCall(), printatt(), printf, slot_getattr(), TupleTableSlot::tts_tupleDescriptor, TupleDescAttr(), and value.

Referenced by print_slot().

◆ printtup_create_DR()

DestReceiver * printtup_create_DR ( CommandDest  dest)

Definition at line 71 of file printtup.c.

72{
73 DR_printtup *self = (DR_printtup *) palloc0(sizeof(DR_printtup));
74
75 self->pub.receiveSlot = printtup; /* might get changed later */
79 self->pub.mydest = dest;
80
81 /*
82 * Send T message automatically if DestRemote, but not if
83 * DestRemoteExecute
84 */
85 self->sendDescrip = (dest == DestRemote);
86
87 self->attrinfo = NULL;
88 self->nattrs = 0;
89 self->myinfo = NULL;
90 self->buf.data = NULL;
91 self->tmpcontext = NULL;
92
93 return (DestReceiver *) self;
94}
@ DestRemote
Definition: dest.h:89
void * palloc0(Size size)
Definition: mcxt.c:1347
static bool printtup(TupleTableSlot *slot, DestReceiver *self)
Definition: printtup.c:304
static void printtup_startup(DestReceiver *self, int operation, TupleDesc typeinfo)
Definition: printtup.c:111
static void printtup_destroy(DestReceiver *self)
Definition: printtup.c:413
static void printtup_shutdown(DestReceiver *self)
Definition: printtup.c:389
PrinttupAttrInfo * myinfo
Definition: printtup.c:61
StringInfoData buf
Definition: printtup.c:62
int nattrs
Definition: printtup.c:60
DestReceiver pub
Definition: printtup.c:56
bool sendDescrip
Definition: printtup.c:58
MemoryContext tmpcontext
Definition: printtup.c:63
TupleDesc attrinfo
Definition: printtup.c:59
void(* rStartup)(DestReceiver *self, int operation, TupleDesc typeinfo)
Definition: dest.h:121
void(* rShutdown)(DestReceiver *self)
Definition: dest.h:124
bool(* receiveSlot)(TupleTableSlot *slot, DestReceiver *self)
Definition: dest.h:118
void(* rDestroy)(DestReceiver *self)
Definition: dest.h:126
CommandDest mydest
Definition: dest.h:128

References DR_printtup::attrinfo, DR_printtup::buf, StringInfoData::data, generate_unaccent_rules::dest, DestRemote, _DestReceiver::mydest, DR_printtup::myinfo, DR_printtup::nattrs, palloc0(), printtup(), printtup_destroy(), printtup_shutdown(), printtup_startup(), DR_printtup::pub, _DestReceiver::rDestroy, _DestReceiver::receiveSlot, _DestReceiver::rShutdown, _DestReceiver::rStartup, DR_printtup::sendDescrip, and DR_printtup::tmpcontext.

Referenced by CreateDestReceiver().

◆ SendRowDescriptionMessage()

void SendRowDescriptionMessage ( StringInfo  buf,
TupleDesc  typeinfo,
List targetlist,
int16 formats 
)

Definition at line 166 of file printtup.c.

168{
169 int natts = typeinfo->natts;
170 int i;
171 ListCell *tlist_item = list_head(targetlist);
172
173 /* tuple descriptor message type */
175 /* # of attrs in tuples */
176 pq_sendint16(buf, natts);
177
178 /*
179 * Preallocate memory for the entire message to be sent. That allows to
180 * use the significantly faster inline pqformat.h functions and to avoid
181 * reallocations.
182 *
183 * Have to overestimate the size of the column-names, to account for
184 * character set overhead.
185 */
187 + sizeof(Oid) /* resorigtbl */
188 + sizeof(AttrNumber) /* resorigcol */
189 + sizeof(Oid) /* atttypid */
190 + sizeof(int16) /* attlen */
191 + sizeof(int32) /* attypmod */
192 + sizeof(int16) /* format */
193 ) * natts);
194
195 for (i = 0; i < natts; ++i)
196 {
197 Form_pg_attribute att = TupleDescAttr(typeinfo, i);
198 Oid atttypid = att->atttypid;
199 int32 atttypmod = att->atttypmod;
200 Oid resorigtbl;
201 AttrNumber resorigcol;
203
204 /*
205 * If column is a domain, send the base type and typmod instead.
206 * Lookup before sending any ints, for efficiency.
207 */
208 atttypid = getBaseTypeAndTypmod(atttypid, &atttypmod);
209
210 /* Do we have a non-resjunk tlist item? */
211 while (tlist_item &&
212 ((TargetEntry *) lfirst(tlist_item))->resjunk)
213 tlist_item = lnext(targetlist, tlist_item);
214 if (tlist_item)
215 {
216 TargetEntry *tle = (TargetEntry *) lfirst(tlist_item);
217
218 resorigtbl = tle->resorigtbl;
219 resorigcol = tle->resorigcol;
220 tlist_item = lnext(targetlist, tlist_item);
221 }
222 else
223 {
224 /* No info available, so send zeroes */
225 resorigtbl = 0;
226 resorigcol = 0;
227 }
228
229 if (formats)
230 format = formats[i];
231 else
232 format = 0;
233
234 pq_writestring(buf, NameStr(att->attname));
235 pq_writeint32(buf, resorigtbl);
236 pq_writeint16(buf, resorigcol);
237 pq_writeint32(buf, atttypid);
238 pq_writeint16(buf, att->attlen);
239 pq_writeint32(buf, atttypmod);
241 }
242
244}
int16 AttrNumber
Definition: attnum.h:21
#define NameStr(name)
Definition: c.h:700
int16_t int16
Definition: c.h:480
int32_t int32
Definition: c.h:481
Oid getBaseTypeAndTypmod(Oid typid, int32 *typmod)
Definition: lsyscache.c:2538
FormData_pg_attribute * Form_pg_attribute
Definition: pg_attribute.h:200
static char format
#define NAMEDATALEN
#define lfirst(lc)
Definition: pg_list.h:172
static ListCell * list_head(const List *l)
Definition: pg_list.h:128
static ListCell * lnext(const List *l, const ListCell *c)
Definition: pg_list.h:343
static char * buf
Definition: pg_test_fsync.c:72
#define MAX_CONVERSION_GROWTH
Definition: pg_wchar.h:302
void pq_beginmessage_reuse(StringInfo buf, char msgtype)
Definition: pqformat.c:109
void pq_endmessage_reuse(StringInfo buf)
Definition: pqformat.c:314
static void pq_writestring(StringInfoData *pg_restrict buf, const char *pg_restrict str)
Definition: pqformat.h:108
static void pq_writeint32(StringInfoData *pg_restrict buf, uint32 i)
Definition: pqformat.h:74
static void pq_sendint16(StringInfo buf, uint16 i)
Definition: pqformat.h:136
static void pq_writeint16(StringInfoData *pg_restrict buf, uint16 i)
Definition: pqformat.h:60
#define PqMsg_RowDescription
Definition: protocol.h:52
void enlargeStringInfo(StringInfo str, int needed)
Definition: stringinfo.c:286

References buf, enlargeStringInfo(), format, getBaseTypeAndTypmod(), i, lfirst, list_head(), lnext(), MAX_CONVERSION_GROWTH, NAMEDATALEN, NameStr, TupleDescData::natts, pq_beginmessage_reuse(), pq_endmessage_reuse(), pq_sendint16(), pq_writeint16(), pq_writeint32(), pq_writestring(), PqMsg_RowDescription, and TupleDescAttr().

Referenced by exec_describe_portal_message(), exec_describe_statement_message(), and printtup_startup().

◆ SetRemoteDestReceiverParams()

void SetRemoteDestReceiverParams ( DestReceiver self,
Portal  portal 
)

Definition at line 100 of file printtup.c.

101{
102 DR_printtup *myState = (DR_printtup *) self;
103
104 Assert(myState->pub.mydest == DestRemote ||
105 myState->pub.mydest == DestRemoteExecute);
106
107 myState->portal = portal;
108}
#define Assert(condition)
Definition: c.h:812
@ DestRemoteExecute
Definition: dest.h:90
Portal portal
Definition: printtup.c:57

References Assert, DestRemote, DestRemoteExecute, _DestReceiver::mydest, DR_printtup::portal, and DR_printtup::pub.

Referenced by exec_execute_message(), and exec_simple_query().

◆ spi_dest_startup()

void spi_dest_startup ( DestReceiver self,
int  operation,
TupleDesc  typeinfo 
)

Definition at line 2123 of file spi.c.

2124{
2125 SPITupleTable *tuptable;
2126 MemoryContext oldcxt;
2127 MemoryContext tuptabcxt;
2128
2129 if (_SPI_current == NULL)
2130 elog(ERROR, "spi_dest_startup called while not connected to SPI");
2131
2132 if (_SPI_current->tuptable != NULL)
2133 elog(ERROR, "improper call to spi_dest_startup");
2134
2135 /* We create the tuple table context as a child of procCxt */
2136
2137 oldcxt = _SPI_procmem(); /* switch to procedure memory context */
2138
2140 "SPI TupTable",
2142 MemoryContextSwitchTo(tuptabcxt);
2143
2144 _SPI_current->tuptable = tuptable = (SPITupleTable *)
2145 palloc0(sizeof(SPITupleTable));
2146 tuptable->tuptabcxt = tuptabcxt;
2147 tuptable->subid = GetCurrentSubTransactionId();
2148
2149 /*
2150 * The tuptable is now valid enough to be freed by AtEOSubXact_SPI, so put
2151 * it onto the SPI context's tuptables list. This will ensure it's not
2152 * leaked even in the unlikely event the following few lines fail.
2153 */
2155
2156 /* set up initial allocations */
2157 tuptable->alloced = 128;
2158 tuptable->vals = (HeapTuple *) palloc(tuptable->alloced * sizeof(HeapTuple));
2159 tuptable->numvals = 0;
2160 tuptable->tupdesc = CreateTupleDescCopy(typeinfo);
2161
2162 MemoryContextSwitchTo(oldcxt);
2163}
#define ERROR
Definition: elog.h:39
#define elog(elevel,...)
Definition: elog.h:225
static void slist_push_head(slist_head *head, slist_node *node)
Definition: ilist.h:1006
void * palloc(Size size)
Definition: mcxt.c:1317
MemoryContext CurrentMemoryContext
Definition: mcxt.c:143
#define AllocSetContextCreate
Definition: memutils.h:129
#define ALLOCSET_DEFAULT_SIZES
Definition: memutils.h:160
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition: palloc.h:124
static _SPI_connection * _SPI_current
Definition: spi.c:49
static MemoryContext _SPI_procmem(void)
Definition: spi.c:3064
uint64 alloced
Definition: spi.h:30
uint64 numvals
Definition: spi.h:27
TupleDesc tupdesc
Definition: spi.h:25
HeapTuple * vals
Definition: spi.h:26
MemoryContext tuptabcxt
Definition: spi.h:31
slist_node next
Definition: spi.h:32
SubTransactionId subid
Definition: spi.h:33
slist_head tuptables
Definition: spi_priv.h:32
SPITupleTable * tuptable
Definition: spi_priv.h:26
TupleDesc CreateTupleDescCopy(TupleDesc tupdesc)
Definition: tupdesc.c:235
SubTransactionId GetCurrentSubTransactionId(void)
Definition: xact.c:790

References _SPI_current, _SPI_procmem(), SPITupleTable::alloced, ALLOCSET_DEFAULT_SIZES, AllocSetContextCreate, CreateTupleDescCopy(), CurrentMemoryContext, elog, ERROR, GetCurrentSubTransactionId(), MemoryContextSwitchTo(), SPITupleTable::next, SPITupleTable::numvals, palloc(), palloc0(), slist_push_head(), SPITupleTable::subid, SPITupleTable::tupdesc, SPITupleTable::tuptabcxt, _SPI_connection::tuptable, _SPI_connection::tuptables, and SPITupleTable::vals.

◆ spi_printtup()

bool spi_printtup ( TupleTableSlot slot,
DestReceiver self 
)

Definition at line 2171 of file spi.c.

2172{
2173 SPITupleTable *tuptable;
2174 MemoryContext oldcxt;
2175
2176 if (_SPI_current == NULL)
2177 elog(ERROR, "spi_printtup called while not connected to SPI");
2178
2179 tuptable = _SPI_current->tuptable;
2180 if (tuptable == NULL)
2181 elog(ERROR, "improper call to spi_printtup");
2182
2183 oldcxt = MemoryContextSwitchTo(tuptable->tuptabcxt);
2184
2185 if (tuptable->numvals >= tuptable->alloced)
2186 {
2187 /* Double the size of the pointer array */
2188 uint64 newalloced = tuptable->alloced * 2;
2189
2190 tuptable->vals = (HeapTuple *) repalloc_huge(tuptable->vals,
2191 newalloced * sizeof(HeapTuple));
2192 tuptable->alloced = newalloced;
2193 }
2194
2195 tuptable->vals[tuptable->numvals] = ExecCopySlotHeapTuple(slot);
2196 (tuptable->numvals)++;
2197
2198 MemoryContextSwitchTo(oldcxt);
2199
2200 return true;
2201}
uint64_t uint64
Definition: c.h:486
void * repalloc_huge(void *pointer, Size size)
Definition: mcxt.c:1672
static HeapTuple ExecCopySlotHeapTuple(TupleTableSlot *slot)
Definition: tuptable.h:481

References _SPI_current, SPITupleTable::alloced, elog, ERROR, ExecCopySlotHeapTuple(), MemoryContextSwitchTo(), SPITupleTable::numvals, repalloc_huge(), SPITupleTable::tuptabcxt, _SPI_connection::tuptable, and SPITupleTable::vals.