* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/access/gin/ginbulk.c,v 1.3 2006/07/14 14:52:16 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/access/gin/ginbulk.c,v 1.4 2006/07/16 00:54:22 tgl Exp $
*-------------------------------------------------------------------------
*/
#include "postgres.h"
+
#include "access/gin.h"
+#include "utils/datum.h"
+
#define DEF_NENTRY 2048
#define DEF_NPTR 4
entry->number++;
}
+/*
+ * This is basically the same as datumCopy(), but we duplicate some code
+ * to avoid computing the datum size twice.
+ */
static Datum
getDatumCopy(BuildAccumulator *accum, Datum value) {
Form_pg_attribute *att = accum->ginstate->tupdesc->attrs;
- Datum newvalue;
- int data_length = 0;
- void *ptr;
+ Datum res;
- if ( att[0]->attbyval ) {
- store_att_byval(&newvalue, value, att[0]->attlen);
- } else {
- /* pass-by-reference */
- if (att[0]->attlen == -1) {
- /* varlena */
- data_length = VARATT_SIZE(DatumGetPointer(value));
- } else if (att[0]->attlen == -2) {
- /* c-string */
- data_length = strlen(DatumGetCString(value)) + 1;
- } else {
- /* fixed-length pass-by-reference */
- Assert(att[0]->attlen > 0);
- data_length = att[0]->attlen;
- }
+ if (att[0]->attbyval)
+ res = value;
+ else
+ {
+ Size realSize;
+ char *s;
- ptr = palloc( data_length );
- memcpy(ptr, DatumGetPointer(value), data_length);
- newvalue = PointerGetDatum(ptr);
- }
+ realSize = datumGetSize(value, false, att[0]->attlen);
- accum->allocatedMemory+=data_length;
+ s = (char *) palloc(realSize);
+ memcpy(s, DatumGetPointer(value), realSize);
+ res = PointerGetDatum(s);
- return newvalue;
+ accum->allocatedMemory += realSize;
+ }
+ return res;
}
/*