81 #define TUPLE_QUEUE_MODE_CONTROL 'c'
82 #define TUPLE_QUEUE_MODE_DATA 'd'
92 Size nbytes,
char *data);
158 for (i = 0; i < remapinfo->
natts; ++
i)
166 if (oldcontext ==
NULL)
171 "tqueue temporary context",
183 if (oldcontext !=
NULL)
266 if (remapinfo !=
NULL)
283 for (i = 0; i < tupledesc->
natts; ++
i)
322 &elem_values, &elem_nulls, &num_elems);
325 for (i = 0; i < num_elems; ++
i)
327 tqueueWalk(tqueue, remapclass, elem_values[i]);
352 elog(
ERROR,
"type %u is not a range type",
typeid);
416 for (i = 0; i < tupledesc->
natts; ++
i)
476 self->handle = handle;
477 self->tmpcontext =
NULL;
478 self->recordhtab =
NULL;
480 self->remapinfo =
NULL;
493 reader->
queue = handle;
565 reader->
mode = ((
char *) data)[0];
616 if (remapinfo ==
NULL)
626 for (i = 0; i < tupledesc->
natts; ++
i)
661 elog(
ERROR,
"unknown remap class: %d", (
int) remapclass);
694 &elem_values, &elem_nulls, &num_elems);
697 for (i = 0; i < num_elems; ++
i)
705 typeid, typlen, typbyval, typalign);
729 elog(
ERROR,
"type %u is not a range type",
typeid);
782 elog(
ERROR,
"found unrecognized remote typmod %d", typmod);
832 memcpy(&remotetypmod, &buf[rc],
sizeof(
int));
836 memcpy(&natts, &buf[rc],
sizeof(
int));
840 memcpy(&hasoid, &buf[rc],
sizeof(
bool));
846 for (i = 0; i < natts; ++
i)
877 elog(
ERROR,
"duplicate message for typmod %d",
880 elog(
DEBUG3,
"mapping remote typmod %d to local typmod %d",
900 for (i = 0; i < tupledesc->
natts; ++
i)
904 if (attr->attisdropped)
962 elog(
ERROR,
"cache lookup failed for type %u",
typeid);
968 typeid = typ->typbasetype;
979 if (
OidIsValid(typ->typelem) && typ->typlen == -1)
981 typeid = typ->typelem;
HeapTuple heap_copytuple(HeapTuple tuple)
void hash_destroy(HTAB *hashp)
static void tqueueDestroyReceiver(DestReceiver *self)
static struct cvec * range(struct vars *v, celt a, celt b, int cases)
void DestroyTupleQueueReader(TupleQueueReader *reader)
void MemoryContextDelete(MemoryContext context)
#define HeapTupleHeaderSetTypeId(tup, typeid)
#define TYPECACHE_RANGE_INFO
#define RangeTypeGetDatum(X)
static void tqueueStartupReceiver(DestReceiver *self, int operation, TupleDesc typeinfo)
static HeapTuple TupleQueueHandleDataMessage(TupleQueueReader *reader, Size nbytes, HeapTupleHeader data)
TupleDesc lookup_rowtype_tupdesc(Oid type_id, int32 typmod)
#define RangeTypeGetOid(r)
Datum lower(PG_FUNCTION_ARGS)
#define TYPTYPE_COMPOSITE
void get_typlenbyvalalign(Oid typid, int16 *typlen, bool *typbyval, char *typalign)
#define PointerGetDatum(X)
static HeapTuple TupleQueueRemapTuple(TupleQueueReader *reader, TupleDesc tupledesc, RemapInfo *remapinfo, HeapTuple tuple)
Form_pg_attribute * attrs
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
#define DatumGetRangeType(X)
MemoryContext CurTransactionContext
HeapTuple TupleQueueReaderNext(TupleQueueReader *reader, bool nowait, bool *done)
static Datum TupleQueueRemapArray(TupleQueueReader *reader, Datum value)
void MemoryContextReset(MemoryContext context)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, Datum *values, bool *isnull)
Datum upper(PG_FUNCTION_ARGS)
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
FormData_pg_type * Form_pg_type
TupleDesc CreateTupleDesc(int natts, bool hasoid, Form_pg_attribute *attrs)
static RemapInfo * BuildRemapInfo(TupleDesc tupledesc)
#define OidIsValid(objectId)
#define DatumGetHeapTupleHeader(X)
#define ALLOCSET_DEFAULT_MINSIZE
#define SearchSysCache1(cacheId, key1)
#define HeapTupleHeaderSetDatumLength(tup, len)
void shm_mq_detach(shm_mq *mq)
struct RecordTypemodMap RecordTypemodMap
#define HeapTupleHeaderGetTypMod(tup)
void pfree(void *pointer)
static Datum TupleQueueRemapRange(TupleQueueReader *reader, Datum value)
#define ObjectIdGetDatum(X)
static Datum TupleQueueRemapRecord(TupleQueueReader *reader, Datum value)
static void tqueueWalk(TQueueDestReceiver *tqueue, RemapClass walktype, Datum value)
TupleDesc BlessTupleDesc(TupleDesc tupdesc)
static void tqueueWalkArray(TQueueDestReceiver *tqueue, Datum value)
void check_stack_depth(void)
static Datum TupleQueueRemap(TupleQueueReader *reader, RemapClass remapclass, Datum value)
FormData_pg_attribute * Form_pg_attribute
static void tqueueWalkRange(TQueueDestReceiver *tqueue, Datum value)
RangeType * range_serialize(TypeCacheEntry *typcache, RangeBound *lower, RangeBound *upper, bool empty)
void slot_getallattrs(TupleTableSlot *slot)
MemoryContext TopMemoryContext
struct TypeCacheEntry * rngelemtype
void initStringInfo(StringInfo str)
void range_deserialize(TypeCacheEntry *typcache, RangeType *range, RangeBound *lower, RangeBound *upper, bool *empty)
TupleDesc tts_tupleDescriptor
MemoryContext AllocSetContextCreate(MemoryContext parent, const char *name, Size minContextSize, Size initBlockSize, Size maxBlockSize)
void * palloc0(Size size)
static void tqueueReceiveSlot(TupleTableSlot *slot, DestReceiver *self)
HTAB * hash_create(const char *tabname, long nelem, HASHCTL *info, int flags)
void ReleaseSysCache(HeapTuple tuple)
#define HeapTupleHeaderSetTypMod(tup, typmod)
#define HeapTupleHeaderGetTypeId(tup)
void * MemoryContextAllocZero(MemoryContext context, Size size)
TypeCacheEntry * lookup_type_cache(Oid type_id, int flags)
#define HeapTupleIsValid(tuple)
#define Assert(condition)
void DecrTupleDescRefCount(TupleDesc tupdesc)
shm_mq_result shm_mq_send(shm_mq_handle *mqh, Size nbytes, const void *data, bool nowait)
static void tqueueShutdownReceiver(DestReceiver *self)
shm_mq * shm_mq_get_queue(shm_mq_handle *mqh)
HeapTuple ExecMaterializeSlot(TupleTableSlot *slot)
RemapClass mapping[FLEXIBLE_ARRAY_MEMBER]
void heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc, Datum *values, bool *isnull)
void deconstruct_array(ArrayType *array, Oid elmtype, int elmlen, bool elmbyval, char elmalign, Datum **elemsp, bool **nullsp, int *nelemsp)
#define TUPLE_QUEUE_MODE_CONTROL
static Datum values[MAXATTR]
static void TupleQueueHandleControlMessage(TupleQueueReader *reader, Size nbytes, char *data)
#define ItemPointerSetInvalid(pointer)
Datum HeapTupleHeaderGetDatum(HeapTupleHeader tuple)
static void tqueueWalkRecord(TQueueDestReceiver *tqueue, Datum value)
static void tqueueSendTypmodInfo(TQueueDestReceiver *tqueue, int typmod, TupleDesc tupledesc)
#define ALLOCSET_DEFAULT_INITSIZE
TupleQueueReader * CreateTupleQueueReader(shm_mq_handle *handle, TupleDesc tupledesc)
#define TUPLE_QUEUE_MODE_DATA
#define ALLOCSET_DEFAULT_MAXSIZE
DestReceiver * CreateTupleQueueDestReceiver(shm_mq_handle *handle)
ArrayType * construct_md_array(Datum *elems, bool *nulls, int ndims, int *dims, int *lbs, Oid elmtype, int elmlen, bool elmbyval, char elmalign)
shm_mq_result shm_mq_receive(shm_mq_handle *mqh, Size *nbytesp, void **datap, bool nowait)
Oid get_range_subtype(Oid rangeOid)
void appendBinaryStringInfo(StringInfo str, const char *data, int datalen)
#define offsetof(type, field)
static RemapClass GetRemapClass(Oid typeid)
#define HeapTupleHeaderGetDatumLength(tup)
#define DatumGetArrayTypeP(X)