Fix getDatumCopy(): don't use store_att_byval to copy into a Datum
authorTom Lane
Sun, 16 Jul 2006 00:54:22 +0000 (00:54 +0000)
committerTom Lane
Sun, 16 Jul 2006 00:54:22 +0000 (00:54 +0000)
variable (this accounts for regression failures on PPC64, and in fact
won't work on any big-endian machine).  Get rid of hardwired knowledge
about datum size rules; make it look just like datumCopy().

src/backend/access/gin/ginbulk.c

index 3a45356591082d90ea6c4a6f57295c87a2ffd727..c614b624c3a98506df93a6fd0ce94990a0e84c1c 100644 (file)
@@ -8,12 +8,15 @@
  * 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
@@ -66,37 +69,31 @@ ginInsertData(BuildAccumulator *accum, EntryAccumulator *entry, ItemPointer heap
    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;
 }
 
 /*