]> granicus.if.org Git - postgresql/commitdiff
TOAST
authorJan Wieck <JanWieck@Yahoo.com>
Mon, 3 Jul 2000 23:10:14 +0000 (23:10 +0000)
committerJan Wieck <JanWieck@Yahoo.com>
Mon, 3 Jul 2000 23:10:14 +0000 (23:10 +0000)
    WARNING: This is actually broken - we have self-deadlocks
         due to concurrent changes in buffer management.
 Vadim and me are working on it.

Jan

43 files changed:
src/backend/access/common/heaptuple.c
src/backend/access/common/tupdesc.c
src/backend/access/gist/gist.c
src/backend/access/heap/heapam.c
src/backend/access/heap/tuptoaster.c
src/backend/bootstrap/bootstrap.c
src/backend/catalog/heap.c
src/backend/catalog/pg_type.c
src/backend/commands/command.c
src/backend/commands/define.c
src/backend/libpq/be-fsstubs.c
src/backend/parser/gram.y
src/backend/parser/keywords.c
src/backend/tcop/fastpath.c
src/backend/tcop/utility.c
src/backend/utils/adt/arrayfuncs.c
src/backend/utils/adt/cash.c
src/backend/utils/adt/char.c
src/backend/utils/adt/float.c
src/backend/utils/adt/formatting.c
src/backend/utils/adt/int.c
src/backend/utils/adt/int8.c
src/backend/utils/adt/lztext.c
src/backend/utils/adt/mac.c
src/backend/utils/adt/nabstime.c
src/backend/utils/adt/network.c
src/backend/utils/adt/oid.c
src/backend/utils/adt/oracle_compat.c
src/backend/utils/adt/pg_lzcompress.c
src/backend/utils/adt/regproc.c
src/backend/utils/adt/ruleutils.c
src/backend/utils/adt/timestamp.c
src/backend/utils/adt/varbit.c
src/backend/utils/adt/varchar.c
src/backend/utils/adt/varlena.c
src/backend/utils/adt/version.c
src/include/access/tuptoaster.h
src/include/catalog/pg_attribute.h
src/include/catalog/pg_class.h
src/include/catalog/pg_type.h
src/include/commands/command.h
src/include/postgres.h
src/include/utils/lztext.h

index f93bf34db90aa8a8ed85b3a32e63433feb8c97d9..319cfff7ca39f71d1f5c34bdec059b9e1f46bff2 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/access/common/heaptuple.c,v 1.63 2000/07/02 22:00:24 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/access/common/heaptuple.c,v 1.64 2000/07/03 23:09:10 wieck Exp $
  *
  * NOTES
  *       The old interface functions have been converted to macros
@@ -119,7 +119,11 @@ DataFill(char *data,
                {
                        case -1:
                                *infomask |= HEAP_HASVARLENA;
-                               data_length = VARSIZE(DatumGetPointer(value[i]));
+                               if (VARATT_IS_EXTERNAL(value[i]))
+                                       *infomask |= HEAP_HASEXTERNAL;
+                               if (VARATT_IS_COMPRESSED(value[i]))
+                                       *infomask |= HEAP_HASCOMPRESSED;
+                               data_length = VARATT_SIZE(DatumGetPointer(value[i]));
                                memmove(data, DatumGetPointer(value[i]), data_length);
                                break;
                        case sizeof(char):
@@ -816,7 +820,7 @@ heap_freetuple(HeapTuple htup)
        if (htup->t_data != NULL)
                if (htup->t_datamcxt != NULL && (char *) (htup->t_data) !=
                        ((char *) htup + HEAPTUPLESIZE))
-                       elog(NOTICE, "TELL Jan Wieck: heap_freetuple() found separate t_data");
+                       pfree(htup->t_data);
 
        pfree(htup);
 }
index 433bbe6b06baa38fdae12dc23da8e3f3f9a37d37..c878c50e0af58523fecfc0aaa74d7e74d4290399 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/access/common/tupdesc.c,v 1.65 2000/05/30 00:49:38 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/access/common/tupdesc.c,v 1.66 2000/07/03 23:09:10 wieck Exp $
  *
  * NOTES
  *       some of the executor utility code such as "ExecTypeFromTL" should be
@@ -434,23 +434,16 @@ TupleDescInitEntry(TupleDesc desc,
 
                att->attlen = typeLen(t);
                att->attbyval = typeByVal(t);
-               att->attstorage = 'p';
        }
        else
        {
                att->attlen = typeForm->typlen;
                att->attbyval = typeForm->typbyval;
 /*
- * This will enable ALL variable size attributes of user
- * relations for automatic move off into "secondary" relation.
- * Jan
+ * Default to the types storage
  */
 #ifdef TUPLE_TOASTER_ACTIVE
-#ifdef TUPLE_TOASTER_ALL_TYPES
-               att->attstorage = (att->attlen == -1) ? 'e' : 'p';
-#else
-               att->attstorage = 'p';
-#endif
+               att->attstorage = typeForm->typstorage;
 #else
                att->attstorage = 'p';
 #endif
index 4bf737dcd3678a3dab98fff9ffa8d8c3f2734960..794685da2e12c6ea7aac72295b15a02fc80400eb 100644 (file)
@@ -6,7 +6,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/access/gist/gist.c,v 1.59 2000/06/17 23:41:12 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/access/gist/gist.c,v 1.60 2000/07/03 23:09:11 wieck Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -546,7 +546,7 @@ gistAdjustKeys(Relation r,
        oldud += sizeof(IndexTupleData);
 
        evec = (bytea *) palloc(2 * sizeof(GISTENTRY) + VARHDRSZ);
-       VARSIZE(evec) = 2 * sizeof(GISTENTRY) + VARHDRSZ;
+       VARATT_SIZEP(evec) = 2 * sizeof(GISTENTRY) + VARHDRSZ;
 
        /* insert decompressed oldud into entry vector */
        gistdentryinit(giststate, &((GISTENTRY *) VARDATA(evec))[0],
@@ -741,7 +741,7 @@ gistSplit(Relation r,
        else
                decompvec[maxoff + 1] = FALSE;
 
-       VARSIZE(entryvec) = (maxoff + 2) * sizeof(GISTENTRY) + VARHDRSZ;
+       VARATT_SIZEP(entryvec) = (maxoff + 2) * sizeof(GISTENTRY) + VARHDRSZ;
 
        /* now let the user-defined picksplit function set up the split vector */
        FunctionCall2(&giststate->picksplitFn,
index 9f3a7ac7140b0539ae4e64a13adc25b613b2b48b..1ece416e874ed8e83e145c8e4d43698fa107fce6 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.75 2000/07/03 02:54:15 vadim Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.76 2000/07/03 23:09:16 wieck Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -1299,6 +1299,17 @@ heap_insert(Relation relation, HeapTuple tup)
        tup->t_data->t_infomask &= ~(HEAP_XACT_MASK);
        tup->t_data->t_infomask |= HEAP_XMAX_INVALID;
 
+#ifdef TUPLE_TOASTER_ACTIVE
+       /* ----------
+        * If the new tuple is too big for storage or contains already
+        * toasted attributes from some other relation, invoke the toaster.
+        * ----------
+        */
+    if (HeapTupleHasExtended(tup) ||
+                               (MAXALIGN(tup->t_len) > (MaxTupleSize / 4)))
+               heap_tuple_toast_attrs(relation, tup, NULL);
+#endif
+
        /* Find buffer for this tuple */
        buffer = RelationGetBufferForTuple(relation, tup->t_len, InvalidBuffer);
 
@@ -1328,8 +1339,8 @@ heap_insert(Relation relation, HeapTuple tup)
        }
 #endif
 
-       LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
        WriteBuffer(buffer);
+       LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
 
        if (IsSystemRelationName(RelationGetRelationName(relation)))
                RelationMark4RollbackHeapTuple(relation, tup);
@@ -1441,6 +1452,16 @@ l1:
        tp.t_data->t_infomask &= ~(HEAP_XMAX_COMMITTED |
                                                         HEAP_XMAX_INVALID | HEAP_MARKED_FOR_UPDATE);
 
+#ifdef TUPLE_TOASTER_ACTIVE
+       /* ----------
+        * If the relation has toastable attributes, we need to delete
+        * no longer needed items there too.
+        * ----------
+        */
+       if (HeapTupleHasExtended(&tp))
+               heap_tuple_toast_attrs(relation, NULL, &(tp));
+#endif
+
        LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
 
        /* invalidate caches */
@@ -1559,6 +1580,19 @@ l2:
        oldtup.t_data->t_infomask &= ~(HEAP_XMAX_COMMITTED |
                                                         HEAP_XMAX_INVALID | HEAP_MARKED_FOR_UPDATE);
 
+#ifdef TUPLE_TOASTER_ACTIVE
+       /* ----------
+        * If this relation is enabled for toasting, let the toaster
+        * delete not any longer needed entries and create new ones to
+        * make the new tuple fit again.
+        * ----------
+        */
+       if (HeapTupleHasExtended(&oldtup) || 
+                       HeapTupleHasExtended(newtup) ||
+                       (MAXALIGN(newtup->t_len) > (MaxTupleSize / 4)))
+               heap_tuple_toast_attrs(relation, newtup, &oldtup);
+#endif
+
        /* record address of new tuple in t_ctid of old one */
        oldtup.t_data->t_ctid = newtup->t_self;
 
index 0af5db0cafde7b8038fbe11439aec1e5bc8ab599..3221ed5b134afc493dd7701622a04a05a9b9397b 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/access/heap/tuptoaster.c,v 1.4 2000/05/30 00:49:39 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/access/heap/tuptoaster.c,v 1.5 2000/07/03 23:09:19 wieck Exp $
  *
  *
  * INTERFACE ROUTINES
  *                     Try to make a given tuple fit into one page by compressing
  *                     or moving off attributes
  *
+ *             heap_tuple_untoast_attr -
+ *                     Fetch back a given value from the "secondary" relation
+ *
  *-------------------------------------------------------------------------
  */
 
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
 #include "postgres.h"
 
+#include "access/heapam.h"
+#include "access/genam.h"
+#include "access/tuptoaster.h"
+#include "catalog/catalog.h"
+#include "utils/rel.h"
+#include "utils/builtins.h"
+#include "utils/fmgroids.h"
+#include "utils/pg_lzcompress.h"
 
 
 #ifdef TUPLE_TOASTER_ACTIVE
+#undef TOAST_DEBUG
+
+static void                    toast_delete(Relation rel, HeapTuple oldtup);
+static void                    toast_delete_datum(Relation rel, Datum value);
+static void                    toast_insert_or_update(Relation rel, HeapTuple newtup,
+                                                               HeapTuple oldtup);
+static Datum           toast_compress_datum(Datum value);
+static Datum           toast_save_datum(Relation rel, Oid mainoid, int16 attno, Datum value);
+                                                               
+static varattrib   *toast_fetch_datum(varattrib *attr);
+
 
+/* ----------
+ * heap_tuple_toast_attrs -
+ *
+ *     This is the central public entry point for toasting from heapam.
+ *
+ *     Calls the appropriate event specific action.
+ * ----------
+ */
 void
 heap_tuple_toast_attrs(Relation rel, HeapTuple newtup, HeapTuple oldtup)
 {
+       if (newtup == NULL)
+               toast_delete(rel, oldtup);
+       else
+               toast_insert_or_update(rel, newtup, oldtup);
+}
+
+
+/* ----------
+ * heap_tuple_untoast_attr -
+ *
+ *     Public entry point to get back a toasted value from compression
+ *     or external storage.
+ * ----------
+ */
+varattrib *
+heap_tuple_untoast_attr(varattrib *attr)
+{
+       varattrib       *result;
+
+       if (VARATT_IS_EXTERNAL(attr))
+       {
+               if (VARATT_IS_COMPRESSED(attr))
+               {
+                       /* ----------
+                        * This is an external stored compressed value
+                        * Fetch it from the toast heap and decompress.
+                        * ----------
+                        */
+                       varattrib *tmp;
+
+                       tmp = toast_fetch_datum(attr);
+                       result = (varattrib *)palloc(attr->va_content.va_external.va_rawsize
+                                                               + VARHDRSZ);
+                       VARATT_SIZEP(result) = attr->va_content.va_external.va_rawsize
+                                                               + VARHDRSZ;
+                       pglz_decompress((PGLZ_Header *)tmp, VARATT_DATA(result));
+
+                       pfree(tmp);
+               }
+               else
+               {
+                       /* ----------
+                        * This is an external stored plain value
+                        * ----------
+                        */
+                       result = toast_fetch_datum(attr);
+               }
+       }
+       else if (VARATT_IS_COMPRESSED(attr))
+       {
+               /* ----------
+                * This is a compressed value inside of the main tuple
+                * ----------
+                */
+               result = (varattrib *)palloc(attr->va_content.va_compressed.va_rawsize
+                                                       + VARHDRSZ);
+               VARATT_SIZEP(result) = attr->va_content.va_compressed.va_rawsize
+                                                       + VARHDRSZ;
+               pglz_decompress((PGLZ_Header *)attr, VARATT_DATA(result));
+       }
+       else
+               /* ----------
+                * This is a plain value inside of the main tuple - why am I called?
+                * ----------
+                */
+               return attr;
+
+       return result;
+}
+
+
+/* ----------
+ * toast_delete -
+ *
+ *     Cascaded delete toast-entries on DELETE
+ * ----------
+ */
+static void
+toast_delete(Relation rel, HeapTuple oldtup)
+{
+       TupleDesc                       tupleDesc;
+       Form_pg_attribute  *att;
+       int                                     numAttrs;
+       int                                     i;
+       Datum                           value;
+       bool                            isnull;
+
+       /* ----------
+        * Get the tuple descriptor, the number of and attribute
+        * descriptors.
+        * ----------
+        */
+       tupleDesc       = rel->rd_att;
+       numAttrs        = tupleDesc->natts;
+       att                     = tupleDesc->attrs;
+
+       /* ----------
+        * Check for external stored attributes and delete them
+        * from the secondary relation.
+        * ----------
+        */
+       for (i = 0; i < numAttrs; i++)
+       {
+               value = heap_getattr(oldtup, i + 1, tupleDesc, &isnull);
+               if (!isnull && att[i]->attlen == -1)
+                       if (VARATT_IS_EXTERNAL(value))
+                               toast_delete_datum(rel, value);
+       }
+}
+
+
+/* ----------
+ * toast_insert_or_update -
+ *
+ *     Delete no more used toast-entries and create new ones to
+ *     make the new tuple fit on INSERT or UPDATE
+ * ----------
+ */
+static void
+toast_insert_or_update(Relation rel, HeapTuple newtup, HeapTuple oldtup)
+{
+       TupleDesc                       tupleDesc;
+       Form_pg_attribute  *att;
+       int                                     numAttrs;
+       int                                     i;
+       bool                            old_isnull;
+       bool                            new_isnull;
+
+       bool                            need_change = false;
+       bool                            need_free   = false;
+       bool                            need_delold = false;
+       bool                            has_nulls   = false;
+
+       Size                            maxDataLen;
+
+       char                            toast_action[MaxHeapAttributeNumber];
+       char                            toast_nulls[MaxHeapAttributeNumber];
+       Datum                           toast_values[MaxHeapAttributeNumber];
+       int32                           toast_sizes[MaxHeapAttributeNumber];
+       bool                            toast_free[MaxHeapAttributeNumber];
+       bool                            toast_delold[MaxHeapAttributeNumber];
+
+       /* ----------
+        * Get the tuple descriptor, the number of and attribute
+        * descriptors and the location of the tuple values.
+        * ----------
+        */
+       tupleDesc       = rel->rd_att;
+       numAttrs        = tupleDesc->natts;
+       att                     = tupleDesc->attrs;
+
+       /* ----------
+        * Then collect information about the values given
+        * ----------
+        */
+       memset(toast_action, ' ', numAttrs * sizeof(char));
+       memset(toast_nulls,  ' ', numAttrs * sizeof(char));
+       memset(toast_free,   0,   numAttrs * sizeof(bool));
+       memset(toast_delold, 0,   numAttrs * sizeof(bool));
+       for (i = 0; i < numAttrs; i++)
+       {
+               varattrib          *old_value;
+               varattrib          *new_value;
+
+               if (oldtup != NULL)
+               {
+                       /* ----------
+                        * For UPDATE get the old and new values of this attribute
+                        * ----------
+                        */
+                       old_value = (varattrib *)DatumGetPointer(
+                                               heap_getattr(oldtup, i + 1, tupleDesc, &old_isnull));
+                       toast_values[i] = 
+                                               heap_getattr(newtup, i + 1, tupleDesc, &new_isnull);
+                       new_value = (varattrib *)DatumGetPointer(toast_values[i]);
+
+                       /* ----------
+                        * If the old value is an external stored one, check if it
+                        * has changed so we have to detele it later.
+                        * ----------
+                        */
+                       if (!old_isnull && att[i]->attlen == -1 && 
+                                               VARATT_IS_EXTERNAL(old_value))
+                       {
+                               if (new_isnull || !VARATT_IS_EXTERNAL(new_value) ||
+                                               old_value->va_content.va_external.va_rowid !=
+                                               new_value->va_content.va_external.va_rowid ||
+                                               old_value->va_content.va_external.va_attno !=
+                                               new_value->va_content.va_external.va_attno)
+                               {
+                                       /* ----------
+                                        * The old external store value isn't needed any
+                                        * more after the update
+                                        * ----------
+                                        */
+                                       toast_delold[i] = true;
+                                       need_delold = true;
+                               }
+                               else
+                               {
+                                       /* ----------
+                                        * This attribute isn't changed by this update
+                                        * so we reuse the original reference to the old
+                                        * value in the new tuple.
+                                        * ----------
+                                        */
+                                       toast_action[i] = 'p';
+                                       toast_sizes[i] = VARATT_SIZE(toast_values[i]);
+                                       continue;
+                               }
+                       }
+               }
+               else
+               {
+                       /* ----------
+                        * For INSERT simply get the new value
+                        * ----------
+                        */
+                       toast_values[i] = 
+                                               heap_getattr(newtup, i + 1, tupleDesc, &new_isnull);
+               }
+
+               /* ----------
+                * Handle NULL attributes
+                * ----------
+                */
+               if (new_isnull)
+               {
+                       toast_action[i] = 'p';
+                       toast_nulls[i] = 'n';
+                       has_nulls = true;
+                       continue;
+               }
+
+               /* ----------
+                * Now look at varsize attributes
+                * ----------
+                */
+               if (att[i]->attlen == -1)
+               {
+                       /* ----------
+                        * If the tables attribute say's PLAIN allways, we
+                        * do so below.
+                        * ----------
+                        */
+                       if (att[i]->attstorage == 'p')
+                               toast_action[i] = 'p';
+
+                       /* ----------
+                        * We're running for UPDATE, so any TOASTed value we find
+                        * still in the tuple must be someone elses we cannot reuse.
+                        * Expand it to plain and eventually toast it again below.
+                        * ----------
+                        */
+                       if (VARATT_IS_EXTENDED(DatumGetPointer(toast_values[i])))
+                       {
+                               toast_values[i] = PointerGetDatum(heap_tuple_untoast_attr(
+                                       (varattrib *)DatumGetPointer(toast_values[i])));
+                               toast_free[i] = true;
+                               need_change = true;
+                               need_free = true;
+                       }
+
+                       /* ----------
+                        * Remember the size of this attribute
+                        * ----------
+                        */
+                       toast_sizes[i]  = VARATT_SIZE(DatumGetPointer(toast_values[i]));
+               }
+               else
+               {
+                       /* ----------
+                        * Not a variable size attribute, plain storage allways
+                        * ----------
+                        */
+                       toast_action[i] = 'p';
+                       toast_sizes[i]  = att[i]->attlen;
+               }
+       }
+
+       /* ----------
+        * Compress and/or save external until data fits
+        *
+        *      1: Inline compress attributes with attstorage 'x'
+        *      2: Store attributes with attstorage 'x' or 'e' external
+        *  3: Inline compress attributes with attstorage 'm'
+        *      4: Store attributes with attstorage 'm' external
+        * ----------
+        */
+       maxDataLen = offsetof(HeapTupleHeaderData, t_bits);
+       if (has_nulls)
+               maxDataLen += BITMAPLEN(numAttrs);
+       maxDataLen = (MaxTupleSize / 4) - MAXALIGN(maxDataLen);
+
+       /* ----------
+        * Look for attributes with attstorage 'x' to compress
+        * ----------
+        */
+       while (MAXALIGN(ComputeDataSize(tupleDesc, toast_values, toast_nulls)) >
+                               maxDataLen)
+       {
+               int             biggest_attno = -1;
+               int32   biggest_size  = MAXALIGN(sizeof(varattrib));
+               Datum   old_value;
+
+               /* ----------
+                * Search for the biggest yet uncompressed internal attribute
+                * ----------
+                */
+               for (i = 0; i < numAttrs; i++)
+               {
+                       if (toast_action[i] == 'p')
+                               continue;
+                       if (VARATT_IS_EXTENDED(toast_values[i]))
+                               continue;
+                       if (att[i]->attstorage != 'x')
+                               continue;
+                       if (toast_sizes[i] > biggest_size)
+                       {
+                               biggest_attno = i;
+                               biggest_size  = toast_sizes[i];
+                       }
+               }
+
+               if (biggest_attno < 0)
+                       break;
+
+               /* ----------
+                * Compress it inline
+                * ----------
+                */
+               i                                       = biggest_attno;
+               old_value                       = toast_values[i];
+
+               toast_values[i]         = toast_compress_datum(toast_values[i]);
+                                                                       
+               if (toast_free[i])
+                       pfree(DatumGetPointer(old_value));
+
+               toast_free[i]           = true;
+               toast_sizes[i]          = VARATT_SIZE(toast_values[i]);
+
+               need_change = true;
+               need_free   = true;
+       }
+
+       /* ----------
+        * Second we look for attributes of attstorage 'x' or 'e' that
+        * are still inline.
+        * ----------
+        */
+       while (MAXALIGN(ComputeDataSize(tupleDesc, toast_values, toast_nulls)) >
+                               maxDataLen && rel->rd_rel->reltoastrelid != InvalidOid)
+       {
+               int             biggest_attno = -1;
+               int32   biggest_size  = MAXALIGN(sizeof(varattrib));
+               Datum   old_value;
+
+               /* ----------
+                * Search for the biggest yet inlined attribute with
+                * attstorage = 'x' or 'e'
+                * ----------
+                */
+               for (i = 0; i < numAttrs; i++)
+               {
+                       if (toast_action[i] == 'p')
+                               continue;
+                       if (VARATT_IS_EXTERNAL(toast_values[i]))
+                               continue;
+                       if (att[i]->attstorage != 'x' && att[i]->attstorage != 'e')
+                               continue;
+                       if (toast_sizes[i] > biggest_size)
+                       {
+                               biggest_attno = i;
+                               biggest_size  = toast_sizes[i];
+                       }
+               }
+
+               if (biggest_attno < 0)
+                       break;
+
+               /* ----------
+                * Store this external
+                * ----------
+                */
+               i                                       = biggest_attno;
+               old_value                       = toast_values[i];
+               toast_action[i]         = 'p';
+               toast_values[i]         = toast_save_datum(rel,
+                                                                       newtup->t_data->t_oid,
+                                                                       i + 1,
+                                                                       toast_values[i]);
+               if (toast_free[i])
+                       pfree(DatumGetPointer(old_value));
+
+               toast_free[i]           = true;
+               toast_sizes[i]          = VARATT_SIZE(toast_values[i]);
+
+               need_change = true;
+               need_free   = true;
+       }
+
+       /* ----------
+        * Round 3 - this time we take attributes with storage
+        * 'm' into compression
+        * ----------
+        */
+       while (MAXALIGN(ComputeDataSize(tupleDesc, toast_values, toast_nulls)) >
+                               maxDataLen)
+       {
+               int             biggest_attno = -1;
+               int32   biggest_size  = MAXALIGN(sizeof(varattrib));
+               Datum   old_value;
+
+               /* ----------
+                * Search for the biggest yet uncompressed internal attribute
+                * ----------
+                */
+               for (i = 0; i < numAttrs; i++)
+               {
+                       if (toast_action[i] == 'p')
+                               continue;
+                       if (VARATT_IS_EXTENDED(toast_values[i]))
+                               continue;
+                       if (att[i]->attstorage != 'm')
+                               continue;
+                       if (toast_sizes[i] > biggest_size)
+                       {
+                               biggest_attno = i;
+                               biggest_size  = toast_sizes[i];
+                       }
+               }
+
+               if (biggest_attno < 0)
+                       break;
+
+               /* ----------
+                * Compress it inline
+                * ----------
+                */
+               i                                       = biggest_attno;
+               old_value                       = toast_values[i];
+
+               toast_values[i]         = toast_compress_datum(toast_values[i]);
+                                                                       
+               if (toast_free[i])
+                       pfree(DatumGetPointer(old_value));
+
+               toast_free[i]           = true;
+               toast_sizes[i]          = VARATT_SIZE(toast_values[i]);
+
+               need_change = true;
+               need_free   = true;
+       }
+
+       /* ----------
+        * Finally we store attributes of type 'm' external
+        * ----------
+        */
+       while (MAXALIGN(ComputeDataSize(tupleDesc, toast_values, toast_nulls)) >
+                               maxDataLen && rel->rd_rel->reltoastrelid != InvalidOid)
+       {
+               int             biggest_attno = -1;
+               int32   biggest_size  = MAXALIGN(sizeof(varattrib));
+               Datum   old_value;
+
+               /* ----------
+                * Search for the biggest yet inlined attribute with
+                * attstorage = 'x' or 'e'
+                * ----------
+                */
+               for (i = 0; i < numAttrs; i++)
+               {
+                       if (toast_action[i] == 'p')
+                               continue;
+                       if (VARATT_IS_EXTERNAL(toast_values[i]))
+                               continue;
+                       if (att[i]->attstorage != 'm')
+                               continue;
+                       if (toast_sizes[i] > biggest_size)
+                       {
+                               biggest_attno = i;
+                               biggest_size  = toast_sizes[i];
+                       }
+               }
+
+               if (biggest_attno < 0)
+                       break;
+
+               /* ----------
+                * Store this external
+                * ----------
+                */
+               i                                       = biggest_attno;
+               old_value                       = toast_values[i];
+               toast_action[i]         = 'p';
+               toast_values[i]         = toast_save_datum(rel,
+                                                                       newtup->t_data->t_oid,
+                                                                       i + 1,
+                                                                       toast_values[i]);
+               if (toast_free[i])
+                       pfree(DatumGetPointer(old_value));
+
+               toast_free[i]           = true;
+               toast_sizes[i]          = VARATT_SIZE(toast_values[i]);
+
+               need_change = true;
+               need_free   = true;
+       }
+
+       /* ----------
+        * In the case we toasted any values, we need to build
+        * a new heap tuple with the changed values.
+        * ----------
+        */
+       if (need_change)
+       {
+               char               *new_data;
+               int32                   new_len;
+               MemoryContext   oldcxt;
+               HeapTupleHeader olddata;
+
+               /* ----------
+                * Calculate the new size of the tuple
+                * ----------
+                */
+               new_len = offsetof(HeapTupleHeaderData, t_bits);
+               if (has_nulls)
+                       new_len += BITMAPLEN(numAttrs);
+               new_len = MAXALIGN(new_len);
+               new_len += ComputeDataSize(tupleDesc, toast_values, toast_nulls);
+
+               /* ----------
+                * Remember the old memory location of the tuple (for below),
+                * switch to the memory context of the HeapTuple structure
+                * and allocate the new tuple.
+                * ----------
+                */
+               olddata = newtup->t_data;
+               oldcxt = MemoryContextSwitchTo(newtup->t_datamcxt);
+               new_data = palloc(new_len);
+
+               /* ----------
+                * Put the tuple header and the changed values into place
+                * ----------
+                */
+               memcpy(new_data, newtup->t_data, newtup->t_data->t_hoff);
+               newtup->t_data = (HeapTupleHeader)new_data;
+               newtup->t_len = new_len;
+
+               DataFill((char *)(MAXALIGN((long)new_data +
+                                               offsetof(HeapTupleHeaderData, t_bits) + 
+                                               ((has_nulls) ? BITMAPLEN(numAttrs) : 0))),
+                               tupleDesc,
+                               toast_values,
+                               toast_nulls,
+                               &(newtup->t_data->t_infomask),
+                               HeapTupleNoNulls(newtup) ? NULL : new_data);
+
+               /* ----------
+                * In the case we modified a previously modified tuple again,
+                * free the memory from the previous run
+                * ----------
+                */
+               if ((char *)olddata != ((char *)newtup + HEAPTUPLESIZE))
+                       pfree(olddata);
+
+               /* ----------
+                * Switch back to the old memory context
+                * ----------
+                */
+               MemoryContextSwitchTo(oldcxt);
+       }
+
+
+       /* ----------
+        * Free allocated temp values
+        * ----------
+        */
+       if (need_free)
+               for (i = 0; i < numAttrs; i++)
+                       if (toast_free[i])
+                               pfree(DatumGetPointer(toast_values[i]));
+
+       /* ----------
+        * Delete external values from the old tuple
+        * ----------
+        */
+       if (need_delold)
+               for (i = 0; i < numAttrs; i++)
+                       if (toast_delold[i])
+                               toast_delete_datum(rel,
+                                       heap_getattr(oldtup, i + 1, tupleDesc, &old_isnull));
+
+       return;
+}
+
+
+/* ----------
+ * toast_compress_datum -
+ *
+ *     Create a compressed version of a datum
+ * ----------
+ */
+static Datum
+toast_compress_datum(Datum value)
+{
+       varattrib          *tmp;
+
+       tmp = (varattrib *)palloc(sizeof(PGLZ_Header) + VARATT_SIZE(value));
+       pglz_compress(VARATT_DATA(value), VARATT_SIZE(value) - VARHDRSZ,
+                               (PGLZ_Header *)tmp,
+                               PGLZ_strategy_default);
+       VARATT_SIZEP(tmp) |= VARATT_FLAG_COMPRESSED;
+
+       return PointerGetDatum(tmp);
+}
+
+
+/* ----------
+ * toast_save_datum -
+ *
+ *     Save one single datum into the secondary relation and return
+ *     a varattrib reference for it.
+ * ----------
+ */
+static Datum
+toast_save_datum(Relation rel, Oid mainoid, int16 attno, Datum value)
+{
+       Relation                        toastrel;
+       Relation                        toastidx;
+       HeapTuple                       toasttup;
+       InsertIndexResult       idxres;
+       TupleDesc                       toasttupDesc;
+       Datum                           t_values[3];
+       char                            t_nulls[4];
+       varattrib                  *result;
+       char                            chunk_data[MaxTupleSize];
+       int32                           chunk_size;
+       int32                           chunk_seq = 0;
+       char                       *data_p;
+       int32                           data_todo;
+
+       /* ----------
+        * Create the varattrib reference
+        * ----------
+        */
+       result = (varattrib *)palloc(sizeof(varattrib));
+
+       result->va_header       = sizeof(varattrib) | VARATT_FLAG_EXTERNAL;
+       if (VARATT_IS_COMPRESSED(value))
+       {
+               result->va_header |= VARATT_FLAG_COMPRESSED;
+               result->va_content.va_external.va_rawsize = 
+                                       ((varattrib *)value)->va_content.va_compressed.va_rawsize;
+       }
+       else
+               result->va_content.va_external.va_rawsize = VARATT_SIZE(value);
+                                       
+       result->va_content.va_external.va_extsize               = 
+                                       VARATT_SIZE(value) - VARHDRSZ;
+       result->va_content.va_external.va_valueid               = newoid();
+       result->va_content.va_external.va_toastrelid    = 
+                                       rel->rd_rel->reltoastrelid;
+       result->va_content.va_external.va_toastidxid    = 
+                                       rel->rd_rel->reltoastidxid;
+       result->va_content.va_external.va_rowid                 = mainoid;
+       result->va_content.va_external.va_attno                 = attno;
+
+       /* ----------
+        * Initialize constant parts of the tuple data
+        * ----------
+        */
+       t_values[0] = ObjectIdGetDatum(result->va_content.va_external.va_valueid);
+       t_values[2] = PointerGetDatum(chunk_data);
+       t_nulls[0] = ' ';
+       t_nulls[1] = ' ';
+       t_nulls[2] = ' ';
+       t_nulls[3] = '\0';
+
+       /* ----------
+        * Get the data to process
+        * ----------
+        */
+       data_p          = VARATT_DATA(value);
+       data_todo       = VARATT_SIZE(value) - VARHDRSZ;
+
+       /* ----------
+        * Open the toast relation
+        * ----------
+        */
+       toastrel = heap_open(rel->rd_rel->reltoastrelid, RowExclusiveLock);
+       if (toastrel == NULL)
+               elog(ERROR, "Failed to open secondary relation of %s",
+                                       nameout(&(rel->rd_rel->relname)));
+       toasttupDesc = toastrel->rd_att;
+       toastidx = index_open(rel->rd_rel->reltoastidxid);
+       if (toastidx == NULL)
+               elog(ERROR, "Failed to open index for secondary relation of %s",
+                                       nameout(&(rel->rd_rel->relname)));
+       
+       /* ----------
+        * Split up the item into chunks 
+        * ----------
+        */
+       while (data_todo > 0)
+       {
+               /* ----------
+                * Calculate the size of this chunk
+                * ----------
+                */
+               chunk_size = (TOAST_MAX_CHUNK_SIZE < data_todo) ? 
+                                               TOAST_MAX_CHUNK_SIZE : data_todo;
+
+               /* ----------
+                * Build a tuple
+                * ----------
+                */
+               t_values[1] = (Datum)(chunk_seq++);
+               VARATT_SIZEP(chunk_data) = chunk_size + VARHDRSZ;
+               memcpy(VARATT_DATA(chunk_data), data_p, chunk_size);
+               toasttup = heap_formtuple(toasttupDesc, t_values, t_nulls);
+               if (!HeapTupleIsValid(toasttup))
+                       elog(ERROR, "Failed to build TOAST tuple");
+
+               /* ----------
+                * Store it and create the index entry
+                * ----------
+                */
+               heap_insert(toastrel, toasttup);
+               idxres = index_insert(toastidx, t_values, t_nulls,
+                                               &(toasttup->t_self),
+                                               toastrel);
+               if (idxres == NULL)
+                       elog(ERROR, "Failed to insert index entry for TOAST tuple");
+
+               /* ----------
+                * Free memory
+                * ----------
+                */
+               heap_freetuple(toasttup);
+               pfree(idxres);
+
+               /* ----------
+                * Move on to next chunk
+                * ----------
+                */
+               data_todo -= chunk_size;
+               data_p += chunk_size;
+       }
+
+       /* ----------
+        * Done - close toast relation and return the reference
+        * ----------
+        */
+       index_close(toastidx);
+       heap_close(toastrel, RowExclusiveLock);
+
+       return PointerGetDatum(result);
+}
+
+
+/* ----------
+ * toast_delete_datum -
+ *
+ *     Delete a single external stored value.
+ * ----------
+ */
+static void
+toast_delete_datum(Relation rel, Datum value)
+{
+       register varattrib         *attr = (varattrib *)value;
+       Relation                                toastrel;
+       Relation                                toastidx;
+       ScanKeyData                             toastkey;
+       IndexScanDesc                   toastscan;
+       HeapTupleData                   toasttup;
+       RetrieveIndexResult             indexRes;
+       Buffer                                  buffer;
+
+       if (!VARATT_IS_EXTERNAL(attr))
+               return;
+
+       /* ----------
+        * Open the toast relation and it's index
+        * ----------
+        */
+       toastrel        = heap_open(attr->va_content.va_external.va_toastrelid,
+                                       RowExclusiveLock);
+       if (toastrel == NULL)
+               elog(ERROR, "Failed to open secondary relation at TOAST fetch");
+       toastidx = index_open(attr->va_content.va_external.va_toastidxid);
+       if (toastidx == NULL)
+               elog(ERROR, "Failed to open index of secondary relation at TOAST fetch");
+
+       /* ----------
+        * Setup a scan key to fetch from the index by va_valueid
+        * ----------
+        */
+       ScanKeyEntryInitialize(&toastkey,
+                                       (bits16) 0, 
+                                       (AttrNumber) 1, 
+                                       (RegProcedure) F_OIDEQ, 
+                                       ObjectIdGetDatum(attr->va_content.va_external.va_valueid));
+
+       /* ----------
+        * Read the chunks by index
+        * ----------
+        */
+       toastscan = index_beginscan(toastidx, false, 1, &toastkey);
+       while ((indexRes = index_getnext(toastscan, ForwardScanDirection)) != NULL)
+       {
+               toasttup.t_self = indexRes->heap_iptr;
+               heap_fetch(toastrel, SnapshotAny, &toasttup, &buffer);
+               pfree(indexRes);
+
+               if (!toasttup.t_data)
+                       continue;
+
+               /* ----------
+                * Have a chunk, delete it
+                * ----------
+                */
+               heap_delete(toastrel, &toasttup.t_self, NULL);
+
+               ReleaseBuffer(buffer);
+       }
+
+       /* ----------
+        * End scan and close relations
+        * ----------
+        */
+       index_endscan(toastscan);
+       index_close(toastidx);
+       heap_close(toastrel, RowExclusiveLock);
+
        return;
 }
 
 
-varattrib  *
-heap_tuple_untoast_attr(varattrib * attr)
+/* ----------
+ * toast_fetch_datum -
+ *
+ *     Reconstruct an in memory varattrib from the chunks saved
+ *     in the toast relation
+ * ----------
+ */
+static varattrib *
+toast_fetch_datum(varattrib *attr)
 {
-       elog(ERROR, "heap_tuple_untoast_attr() called");
+       Relation                                toastrel;
+       Relation                                toastidx;
+       ScanKeyData                             toastkey;
+       IndexScanDesc                   toastscan;
+       HeapTupleData                   toasttup;
+       HeapTuple                               ttup;
+       TupleDesc                               toasttupDesc;
+       RetrieveIndexResult             indexRes;
+       Buffer                                  buffer;
+
+       varattrib                          *result;
+       int32                                   ressize;
+       int32                                   residx;
+       int                                             numchunks;
+       Datum                                   chunk;
+       bool                                    isnull;
+
+       ressize = attr->va_content.va_external.va_extsize;
+    numchunks = (ressize / TOAST_MAX_CHUNK_SIZE) + 1;
+
+       result = (varattrib *)palloc(ressize + VARHDRSZ);
+       VARATT_SIZEP(result) = ressize + VARHDRSZ;
+       if (VARATT_IS_COMPRESSED(attr))
+               VARATT_SIZEP(result) |= VARATT_FLAG_COMPRESSED;
+
+       /* ----------
+        * Open the toast relation and it's index
+        * ----------
+        */
+       toastrel        = heap_open(attr->va_content.va_external.va_toastrelid,
+                                       AccessShareLock);
+       if (toastrel == NULL)
+               elog(ERROR, "Failed to open secondary relation at TOAST fetch");
+       toasttupDesc = toastrel->rd_att;
+       toastidx = index_open(attr->va_content.va_external.va_toastidxid);
+       if (toastidx == NULL)
+               elog(ERROR, "Failed to open index of secondary relation at TOAST fetch");
+
+       /* ----------
+        * Setup a scan key to fetch from the index by va_valueid
+        * ----------
+        */
+       ScanKeyEntryInitialize(&toastkey,
+                                       (bits16) 0, 
+                                       (AttrNumber) 1, 
+                                       (RegProcedure) F_OIDEQ, 
+                                       ObjectIdGetDatum(attr->va_content.va_external.va_valueid));
+
+       /* ----------
+        * Read the chunks by index
+        * ----------
+        */
+       toastscan = index_beginscan(toastidx, false, 1, &toastkey);
+       while ((indexRes = index_getnext(toastscan, ForwardScanDirection)) != NULL)
+       {
+               toasttup.t_self = indexRes->heap_iptr;
+               heap_fetch(toastrel, SnapshotAny, &toasttup, &buffer);
+               pfree(indexRes);
+
+               if (!toasttup.t_data)
+                       continue;
+               ttup = &toasttup;
+
+               /* ----------
+                * Have a chunk, extract the sequence number and the data
+                * ----------
+                */
+               residx = (int32)heap_getattr(ttup, 2, toasttupDesc, &isnull);
+               chunk = heap_getattr(ttup, 3, toasttupDesc, &isnull);
+
+               /* ----------
+                * Copy the data into our result
+                * ----------
+                */
+               memcpy(((char *)VARATT_DATA(result)) + residx * TOAST_MAX_CHUNK_SIZE,
+                                       VARATT_DATA(chunk),
+                                       VARATT_SIZE(chunk) - VARHDRSZ);
+
+               ReleaseBuffer(buffer);
+       }
+
+       /* ----------
+        * End scan and close relations
+        * ----------
+        */
+       index_endscan(toastscan);
+       index_close(toastidx);
+       heap_close(toastrel, AccessShareLock);
+
+       return result;
 }
 
 
index 854b68e00d24a094c4542564d5cfa58ddb51e2b7..1c52d098a1aaa559cdf68ab6e30df2c20e2caac3 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.89 2000/07/03 20:48:27 petere Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.90 2000/07/03 23:09:23 wieck Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -571,7 +571,7 @@ DefineAttr(char *name, char *type, int attnum)
                attrtypes[attnum]->attnum = 1 + attnum; /* fillatt */
                attlen = attrtypes[attnum]->attlen = Ap->am_typ.typlen;
                attrtypes[attnum]->attbyval = Ap->am_typ.typbyval;
-               attrtypes[attnum]->attstorage = 'p';
+               attrtypes[attnum]->attstorage = Ap->am_typ.typstorage;;
                attrtypes[attnum]->attalign = Ap->am_typ.typalign;
        }
        else
index 721297680edabd2289c8d84318736606a1d72e2c..2187b8db4439037a7be86fac91c9d6dba604dc29 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.136 2000/07/02 22:00:34 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.137 2000/07/03 23:09:27 wieck Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -730,7 +730,8 @@ AddNewRelationType(char *typeName, Oid new_rel_oid)
                                                          NULL,         /* array element type - irrelevent */
                                                          "-",          /* default type value */
                                                          (bool) 1, /* passed by value */
-                                                         'i');         /* default alignment */
+                                                         'i',          /* default alignment */
+                                                         'p');         /* Not TOASTable */
 }
 
 /* --------------------------------
@@ -1423,6 +1424,7 @@ heap_drop_with_catalog(const char *relname)
        Relation        rel;
        Oid                     rid;
        bool            istemp = (get_temp_rel_by_username(relname) != NULL);
+       bool            has_toasttable;
 
        /* ----------------
         *      Open and lock the relation.
@@ -1520,6 +1522,11 @@ heap_drop_with_catalog(const char *relname)
                smgrunlink(DEFAULT_SMGR, rel);
        rel->rd_unlinked = true;
 
+       /*
+        * Remember if there is a toast relation for below
+        */
+       has_toasttable = rel->rd_rel->reltoastrelid != InvalidOid;
+
        /*
         * Close relcache entry, but *keep* AccessExclusiveLock on the
         * relation until transaction commit.  This ensures no one else will
@@ -1535,6 +1542,20 @@ heap_drop_with_catalog(const char *relname)
 
        if (istemp)
                remove_temp_relation(rid);
+
+       if (has_toasttable)
+       {
+               char    toast_relname[NAMEDATALEN];
+               bool    old_allow;
+
+               old_allow = allowSystemTableMods;
+               allowSystemTableMods = true;
+
+               sprintf(toast_relname, "pg_toast_%d", rid);
+               heap_drop_with_catalog(toast_relname);
+
+               allowSystemTableMods = old_allow;
+       }
 }
 
 
index bf706d5146ccb874bbf118f8d60b04553c1db7f4..bd34ee0a20061917308b6b2b68267636be0e7050 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.52 2000/06/13 07:34:52 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.53 2000/07/03 23:09:28 wieck Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -186,7 +186,8 @@ TypeShellMakeWithOpenRelation(Relation pg_type_desc, char *typeName)
        values[i++] = (Datum) InvalidOid;       /* 12 */
        values[i++] = (Datum) InvalidOid;       /* 13 */
        values[i++] = (Datum) InvalidOid;       /* 14 */
-       values[i++] = (Datum) 'i';      /* 15 */
+       values[i++] = (Datum) 'p';                      /* 15 */
+       values[i++] = (Datum) 'i';                      /* 16 */
 
        /*
         * ... and fill typdefault with a bogus value
@@ -287,7 +288,8 @@ TypeCreate(char *typeName,
                   char *elementTypeName,
                   char *defaultTypeValue,              /* internal rep */
                   bool passedByValue,
-                  char alignment)
+                  char alignment,
+                  char storage)
 {
        int                     i,
                                j;
@@ -448,11 +450,17 @@ TypeCreate(char *typeName,
         */
        values[i++] = (Datum) alignment;        /* 15 */
 
+       /* ----------------
+        *      set default storage for TOAST
+        * ----------------
+        */
+       values[i++] = (Datum) storage; /* 16 */
+
        /* ----------------
         *      initialize the default value for this type.
         * ----------------
         */
-       values[i] = (Datum) textin(PointerIsValid(defaultTypeValue)     /* 16 */
+       values[i] = (Datum) textin(PointerIsValid(defaultTypeValue)     /* 17 */
                                                           ? defaultTypeValue : "-"); /* XXX default
                                                                                                                   * typdefault */
 
index d0bd89fdfd2efbb67c041dfe7bcd9c243555c62b..595c09dc4ec88859ed8519c7e4e374b075b3ed42 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.81 2000/06/28 03:31:28 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.82 2000/07/03 23:09:33 wieck Exp $
  *
  * NOTES
  *       The PerformAddAttribute() code, like most of the relation
@@ -35,6 +35,7 @@
 #include "catalog/pg_index.h"
 #include "parser/parse.h"
 #endif  /* _DROP_COLUMN_HACK__ */
+#include "access/genam.h"
 
 
 /* --------------------------------
@@ -438,7 +439,7 @@ AlterTableAddColumn(const char *relationName,
                attribute->attbyval = tform->typbyval;
                attribute->attnelems = attnelems;
                attribute->attisset = (bool) (tform->typtype == 'c');
-               attribute->attstorage = 'p';
+               attribute->attstorage = tform->typstorage;
                attribute->attalign = tform->typalign;
                attribute->attnotnull = false;
                attribute->atthasdef = (colDef->raw_default != NULL ||
@@ -1170,6 +1171,159 @@ AlterTableDropConstraint(const char *relationName,
 
 
 
+/*
+ * ALTER TABLE CREATE TOAST TABLE
+ */
+void
+AlterTableCreateToastTable(const char *relationName)
+{
+       Relation                        rel;
+       Oid                                     myrelid;
+       HeapTuple                       reltup;
+       TupleDesc                       tupdesc;
+       Form_pg_attribute  *att;
+       Relation                        class_rel;
+       Relation                        ridescs[Num_pg_class_indices];
+       Oid                                     toast_relid = 2;
+       Oid                                     toast_idxid = 2;
+       bool                            has_toastable_attrs = false;
+       bool                            old_allow;
+       int                                     i;
+
+       char                            toast_relname[NAMEDATALEN];
+       char                            toast_idxname[NAMEDATALEN];
+       char                            tmp_query[1024];
+       Relation                        toast_rel;
+
+       /*
+        * permissions checking.  this would normally be done in utility.c,
+        * but this particular routine is recursive.
+        *
+        * normally, only the owner of a class can change its schema.
+        */
+/*
+       if (!allowSystemTableMods && IsSystemRelationName(relationName))
+               elog(ERROR, "ALTER TABLE: relation \"%s\" is a system catalog",
+                        relationName);
+*/
+#ifndef NO_SECURITY
+       if (!pg_ownercheck(UserName, relationName, RELNAME))
+               elog(ERROR, "ALTER TABLE: permission denied");
+#endif
+
+       /*
+        * Grab an exclusive lock on the target table, which we will NOT
+        * release until end of transaction.
+        */
+       rel = heap_openr(relationName, RowExclusiveLock);
+       myrelid = RelationGetRelid(rel);
+
+       /*
+        * Check if there are any toastable attributes on the table
+        */
+       tupdesc = rel->rd_att;
+       att = tupdesc->attrs;
+       for (i = 0; i < tupdesc->natts; i++)
+       {
+               if (att[i]->attstorage != 'p')
+               {
+                       has_toastable_attrs = true;
+                       break;
+               }
+       }
+
+       if (!has_toastable_attrs)
+               elog(ERROR, "ALTER TABLE: relation \"%s\" has no toastable attributes",
+                               relationName);
+
+       /*
+        * Get the pg_class tuple for the relation
+        */
+       reltup = SearchSysCacheTuple(RELNAME,
+                                                                        PointerGetDatum(relationName),
+                                                                        0, 0, 0);
+
+       if (!HeapTupleIsValid(reltup))
+               elog(ERROR, "ALTER TABLE: relation \"%s\" not found",
+                        relationName);
+
+       /*
+        * XXX is the following check sufficient?
+        */
+       if (((Form_pg_class) GETSTRUCT(reltup))->relkind != RELKIND_RELATION)
+       {
+               elog(ERROR, "ALTER TABLE: relation \"%s\" is not a table",
+                               relationName);
+       }
+
+       if (((Form_pg_class) GETSTRUCT(reltup))->reltoastrelid != InvalidOid)
+               elog(ERROR, "ALTER TABLE: relation \"%s\" already has a toast table",
+                               relationName);
+
+       /*
+        * Create the toast table and it's index
+        * This is bad and ugly, because we need to override
+        * allowSystemTableMods in order to keep the toast
+        * table- and index-name out of the users namespace.
+        */
+       sprintf(toast_relname, "pg_toast_%d", myrelid);
+       sprintf(toast_idxname, "pg_toast_%d_idx", myrelid);
+
+       old_allow = allowSystemTableMods;
+       allowSystemTableMods = true;
+
+       sprintf(tmp_query, "create table \"%s\" (chunk_id oid, chunk_seq int4, chunk_data text)",
+                       toast_relname);
+       pg_exec_query_dest(tmp_query, None, CurrentMemoryContext);
+
+       sprintf(tmp_query, "create index \"%s\" on \"%s\" (chunk_id)",
+                       toast_idxname, toast_relname);
+       pg_exec_query_dest(tmp_query, None, CurrentMemoryContext);
+
+       allowSystemTableMods = old_allow;
+
+       /*
+        * Get the OIDs of the newly created objects
+        */
+       toast_rel = heap_openr(toast_relname, NoLock);
+       toast_relid = RelationGetRelid(toast_rel);
+       heap_close(toast_rel, NoLock);
+       toast_rel = index_openr(toast_idxname);
+       toast_idxid = RelationGetRelid(toast_rel);
+       index_close(toast_rel);
+
+       /*
+        * Get the pg_class tuple for the relation
+        */
+       class_rel = heap_openr(RelationRelationName, RowExclusiveLock);
+
+       reltup = SearchSysCacheTupleCopy(RELNAME,
+                                                                        PointerGetDatum(relationName),
+                                                                        0, 0, 0);
+       if (!HeapTupleIsValid(reltup))
+               elog(ERROR, "ALTER TABLE: relation \"%s\" not found",
+                        relationName);
+
+       /*
+        * Store the toast table- and index-Oid's in the relation tuple
+        */
+       ((Form_pg_class) GETSTRUCT(reltup))->reltoastrelid = toast_relid;
+       ((Form_pg_class) GETSTRUCT(reltup))->reltoastidxid = toast_idxid;
+       heap_update(class_rel, &reltup->t_self, reltup, NULL);
+
+       /* keep catalog indices current */
+       CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, ridescs);
+       CatalogIndexInsert(ridescs, Num_pg_class_indices, rel, reltup);
+       CatalogCloseIndices(Num_pg_class_indices, ridescs);
+
+       heap_freetuple(reltup);
+
+       heap_close(rel, NoLock);
+       heap_close(class_rel, NoLock);
+}
+
+
+
 /*
  *
  * LOCK TABLE
index da8728721756d8728cd5b864880b7f5d810ad2aa..d3da6cc2b27202e766ebd934835fc527372fbc0d 100644 (file)
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/commands/define.c,v 1.43 2000/05/28 17:55:55 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/commands/define.c,v 1.44 2000/07/03 23:09:33 wieck Exp $
  *
  * DESCRIPTION
  *       The "DefineFoo" routines take the parse tree and pick out the
@@ -597,6 +597,7 @@ DefineType(char *typeName, List *parameters)
        char       *shadow_type;
        List       *pl;
        char            alignment = 'i';/* default alignment */
+       char            storage = 'p'; /* default storage in TOAST */
 
        /*
         * Type names can only be 15 characters long, so that the shadow type
@@ -650,6 +651,24 @@ DefineType(char *typeName, List *parameters)
                                         a);
                        }
                }
+               else if (!strcasecmp(defel->defname, "storage"))
+               {
+                       char       *a = defGetString(defel);
+
+                       if (!strcasecmp(a, "plain"))
+                               storage = 'p';
+                       else if (!strcasecmp(a, "external"))
+                               storage = 'e';
+                       else if (!strcasecmp(a, "extended"))
+                               storage = 'x';
+                       else if (!strcasecmp(a, "main"))
+                               storage = 'm';
+                       else
+                       {
+                               elog(ERROR, "DefineType: \"%s\" storage not recognized",
+                                        a);
+                       }
+               }
                else
                {
                        elog(NOTICE, "DefineType: attribute \"%s\" not recognized",
@@ -665,6 +684,9 @@ DefineType(char *typeName, List *parameters)
        if (outputName == NULL)
                elog(ERROR, "Define: \"output\" unspecified");
 
+       if (internalLength != -1 && storage != 'p')
+               elog(ERROR, "Define: fixed size types must have storage PLAIN");
+
        /* ----------------
         *      now have TypeCreate do all the real work.
         * ----------------
@@ -682,7 +704,8 @@ DefineType(char *typeName, List *parameters)
                           elemName,            /* element type name */
                           defaultValue,        /* default type value */
                           byValue,                     /* passed by value */
-                          alignment);
+                          alignment,
+                          storage);            /* TOAST strategy */
 
        /* ----------------
         *      When we create a true type (as opposed to a complex type)
@@ -704,7 +727,8 @@ DefineType(char *typeName, List *parameters)
                           typeName,            /* element type name */
                           defaultValue,        /* default type value */
                           false,                       /* never passed by value */
-                          alignment);
+                          alignment,
+                          'p');                        /* ARRAY doesn't support TOAST yet */
 
        pfree(shadow_type);
 }
index 75f6562a8f6c7062d89ac6b41f56867243554470..91769120f959edfa2a3972e0d0c75e8b119c2d85 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/libpq/be-fsstubs.c,v 1.47 2000/06/28 03:31:41 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/libpq/be-fsstubs.c,v 1.48 2000/07/03 23:09:37 wieck Exp $
  *
  * NOTES
  *       This should be moved to a more appropriate place.  It is here
@@ -331,7 +331,7 @@ loread(PG_FUNCTION_ARGS)
 
        retval = (struct varlena *) palloc(VARHDRSZ + len);
        totalread = lo_read(fd, VARDATA(retval), len);
-       VARSIZE(retval) = totalread + VARHDRSZ;
+       VARATT_SIZEP(retval) = totalread + VARHDRSZ;
 
        PG_RETURN_POINTER(retval);
 }
index b17185e4639efd8bf8386f5e0fccbba2d366c249..98a00acb8fc0df88d39346a558167afe67d981d9 100644 (file)
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.174 2000/06/22 22:31:18 petere Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.175 2000/07/03 23:09:41 wieck Exp $
  *
  * HISTORY
  *       AUTHOR                        DATE                    MAJOR EVENT
@@ -350,7 +350,7 @@ static void doNegateFloat(Value *v);
                OFFSET, OIDS, OPERATOR, PASSWORD, PROCEDURAL,
                REINDEX, RENAME, RESET, RETURNS, ROW, RULE,
                SEQUENCE, SERIAL, SETOF, SHARE, SHOW, START, STATEMENT, STDIN, STDOUT, SYSID,
-               TEMP, TRUNCATE, TRUSTED, 
+               TEMP, TOAST, TRUNCATE, TRUSTED, 
                UNLISTEN, UNTIL, VACUUM, VALID, VERBOSE, VERSION
 
 /* Special keywords, not in the query language - see the "lex" file */
@@ -931,6 +931,14 @@ AlterTableStmt:
                                        n->behavior = $8;
                                        $$ = (Node *)n;
                                }
+/* ALTER TABLE <name> CREATE TOAST TABLE */
+               | ALTER TABLE relation_name CREATE TOAST TABLE
+                               {
+                                       AlterTableStmt *n = makeNode(AlterTableStmt);
+                                       n->subtype = 'E';
+                                       n->relname = $3;
+                                       $$ = (Node *)n;
+                               }
                ;
 
 alter_column_action:
@@ -5460,6 +5468,7 @@ TokenId:  ABSOLUTE                                                { $$ = "absolute"; }
                | TEMPORARY                                             { $$ = "temporary"; }
                | TIMEZONE_HOUR                                 { $$ = "timezone_hour"; }
                | TIMEZONE_MINUTE                               { $$ = "timezone_minute"; }
+               | TOAST                                                 { $$ = "toast"; }
                | TRIGGER                                               { $$ = "trigger"; }
                | TRUNCATE                                              { $$ = "truncate"; }
                | TRUSTED                                               { $$ = "trusted"; }
index 76428b969c54ede44a2c39127cb5fb75dc1213ac..982ca9116dc481a1eeec5fad34380c6bcfae404a 100644 (file)
@@ -9,9 +9,9 @@
  *
  * IDENTIFICATION
 <<<<<<< keywords.c
- *       $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.77 2000/06/12 19:40:41 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.78 2000/07/03 23:09:43 wieck Exp $
 =======
- *       $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.77 2000/06/12 19:40:41 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.78 2000/07/03 23:09:43 wieck Exp $
 >>>>>>> 1.73
  *
  *-------------------------------------------------------------------------
@@ -245,6 +245,7 @@ static ScanKeyword ScanKeywords[] = {
        {"timezone_hour", TIMEZONE_HOUR},
        {"timezone_minute", TIMEZONE_MINUTE},
        {"to", TO},
+       {"toast", TOAST},
        {"trailing", TRAILING},
        {"transaction", TRANSACTION},
        {"trigger", TRIGGER},
index cbba1223555731e93243bfe1d07f5c625a042b8c..fd30bd58ac555ce04a75719a9be659041b1df76a 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/tcop/fastpath.c,v 1.42 2000/06/15 04:10:18 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/tcop/fastpath.c,v 1.43 2000/07/03 23:09:46 wieck Exp $
  *
  * NOTES
  *       This cruft is the server side of PQfn.
@@ -349,7 +349,7 @@ HandleFunctionRequest()
                                p = palloc(argsize + VARHDRSZ + 1);     /* Added +1 to solve
                                                                                                         * memory leak - Peter
                                                                                                         * 98 Jan 6 */
-                               VARSIZE(p) = argsize + VARHDRSZ;
+                               VARATT_SIZEP(p) = argsize + VARHDRSZ;
                                if (pq_getbytes(VARDATA(p), argsize))
                                        return EOF;
                        }
index 2459b6507cdbb29f82340051232b31b0a6cd3723..17c77da8504b93190c7bb58a43dc548efc5fde10 100644 (file)
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.89 2000/06/04 01:44:33 petere Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.90 2000/07/03 23:09:46 wieck Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -360,6 +360,9 @@ ProcessUtility(Node *parsetree,
                                        case 'X':       /* DROP CONSTRAINT */
                                                AlterTableDropConstraint(stmt->relname, stmt->inh, stmt->name, stmt->behavior);
                                                break;
+                                       case 'E':       /* CREATE TOAST TABLE */
+                                               AlterTableCreateToastTable(stmt->relname);
+                                               break;
                                        default:        /* oops */
                                                elog(ERROR, "T_AlterTableStmt: unknown subtype");
                                                break;
index fe96d77f43a780ee015659428a657992adb33659..3fc0061304251770df9fd82d6bba92121130f100 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/adt/arrayfuncs.c,v 1.59 2000/06/14 18:17:42 petere Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/adt/arrayfuncs.c,v 1.60 2000/07/03 23:09:50 wieck Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -813,7 +813,7 @@ array_dims(PG_FUNCTION_ARGS)
                sprintf(p, "[%d:%d]", lb[i], dimv[i] + lb[i] - 1);
                p += strlen(p);
        }
-       VARSIZE(result) = strlen(VARDATA(result)) + VARHDRSZ;
+       VARATT_SIZEP(result) = strlen(VARDATA(result)) + VARHDRSZ;
 
        PG_RETURN_TEXT_P(result);
 }
@@ -1151,7 +1151,7 @@ array_set(ArrayType *array,
                                                          Int32GetDatum(SEEK_SET))) < 0)
                        return array;
                v = (struct varlena *) palloc(elmlen + VARHDRSZ);
-               VARSIZE(v) = elmlen + VARHDRSZ;
+               VARATT_SIZEP(v) = elmlen + VARHDRSZ;
                ArrayCastAndSet(dataValue, elmbyval, elmlen, VARDATA(v));
 #ifdef LOARRAY
                if (DatumGetInt32(DirectFunctionCall2(lowrite,
index 484b8e8f94283ad5457d795c11247a82c068ef92..09237e5275512a956322f376c26b69609a64f863 100644 (file)
@@ -9,7 +9,7 @@
  * workings can be found in the book "Software Solutions in C" by
  * Dale Schumacher, Academic Press, ISBN: 0-12-632360-7.
  *
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/cash.c,v 1.40 2000/06/15 03:32:28 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/cash.c,v 1.41 2000/07/03 23:09:50 wieck Exp $
  */
 
 #include <limits.h>
@@ -730,7 +730,7 @@ cash_words_out(Cash *value)
 
        /* make a text type for output */
        result = (text *) palloc(strlen(buf) + VARHDRSZ);
-       VARSIZE(result) = strlen(buf) + VARHDRSZ;
+       VARATT_SIZEP(result) = strlen(buf) + VARHDRSZ;
        memcpy(VARDATA(result), buf, strlen(buf));
 
        return result;
index 04e40406f8bfa01fe4c4869dcb12a63bb99d3bbe..b2c3080ca3c833f71655b5ea05b043dc7e2b93ff 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/adt/char.c,v 1.28 2000/06/05 07:28:51 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/adt/char.c,v 1.29 2000/07/03 23:09:50 wieck Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -162,7 +162,7 @@ char_text(PG_FUNCTION_ARGS)
        char            arg1 = PG_GETARG_CHAR(0);
        text       *result = palloc(VARHDRSZ + 1);
 
-       VARSIZE(result) = VARHDRSZ + 1;
+       VARATT_SIZEP(result) = VARHDRSZ + 1;
        *(VARDATA(result)) = arg1;
 
        PG_RETURN_TEXT_P(result);
index f8c3a3f1560892588870622032cc8282a49a8775..f618a10eb8ecce6e3e6b0896866d439c49e9bcb6 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.61 2000/06/14 18:17:42 petere Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.62 2000/07/03 23:09:50 wieck Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -953,7 +953,7 @@ float8_text(float64 num)
 
        result = palloc(len);
 
-       VARSIZE(result) = len;
+       VARATT_SIZEP(result) = len;
        memmove(VARDATA(result), str, (len - VARHDRSZ));
 
        pfree(str);
@@ -998,7 +998,7 @@ float4_text(float32 num)
 
        result = palloc(len);
 
-       VARSIZE(result) = len;
+       VARATT_SIZEP(result) = len;
        memmove(VARDATA(result), str, (len - VARHDRSZ));
 
        pfree(str);
index 2d1ae16c5eb452c739f25d6a5af7a4fcff5156d7..cf7d3618426a004de6ffdd12eaf640828ef5affc 100644 (file)
@@ -1,7 +1,7 @@
 /* -----------------------------------------------------------------------
  * formatting.c
  *
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.17 2000/07/03 16:01:30 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.18 2000/07/03 23:09:50 wieck Exp $
  *
  *
  *      Portions Copyright (c) 1999-2000, PostgreSQL, Inc
@@ -2526,7 +2526,7 @@ timestamp_to_char(PG_FUNCTION_ARGS)
        result = (text *) palloc(len + 1 + VARHDRSZ);
 
        strcpy(VARDATA(result), VARDATA(result_tmp));
-       VARSIZE(result) = len + VARHDRSZ;
+       VARATT_SIZEP(result) = len + VARHDRSZ;
        pfree(result_tmp);
 
        PG_RETURN_TEXT_P(result);
@@ -3987,7 +3987,7 @@ do { \
        result          = (text *) palloc( len + 1 + VARHDRSZ);         \
                                                                        \
        strcpy( VARDATA(result), VARDATA(result_tmp));                  \
-       VARSIZE(result) = len + VARHDRSZ;                               \
+       VARATT_SIZEP(result) = len + VARHDRSZ;                          \
        pfree(result_tmp);                                              \
 } while(0)
 
index b5f66f1118835f3849902cda87c3bc131887be69..7029ca73b893b7a3b0138fe8a591ee8563365576 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/adt/int.c,v 1.38 2000/06/14 18:17:44 petere Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/adt/int.c,v 1.39 2000/07/03 23:09:52 wieck Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -263,7 +263,7 @@ int2_text(PG_FUNCTION_ARGS)
        text       *result = (text *) palloc(7+VARHDRSZ); /* sign,5 digits, '\0' */
 
        itoa((int) arg1, VARDATA(result));
-       VARSIZE(result) = strlen(VARDATA(result)) + VARHDRSZ;
+       VARATT_SIZEP(result) = strlen(VARDATA(result)) + VARHDRSZ;
        PG_RETURN_TEXT_P(result);
 }
 
@@ -294,7 +294,7 @@ int4_text(PG_FUNCTION_ARGS)
        text       *result = (text *) palloc(12+VARHDRSZ); /* sign,10 digits,'\0' */
 
        ltoa(arg1, VARDATA(result));
-       VARSIZE(result) = strlen(VARDATA(result)) + VARHDRSZ;
+       VARATT_SIZEP(result) = strlen(VARDATA(result)) + VARHDRSZ;
        PG_RETURN_TEXT_P(result);
 }
 
index ea29ffaff55f60d8c4d87880c9e40b3bb5e6671c..63c0938461269633b52609511c23b608331c5233 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/adt/int8.c,v 1.21 2000/06/14 18:17:44 petere Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/adt/int8.c,v 1.22 2000/07/03 23:09:52 wieck Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -581,7 +581,7 @@ int8_text(PG_FUNCTION_ARGS)
 
        result = (text *) palloc(VARHDRSZ + len);
 
-       VARSIZE(result) = len + VARHDRSZ;
+       VARATT_SIZEP(result) = len + VARHDRSZ;
        memcpy(VARDATA(result), s, len);
 
        pfree(s);
index 4442d00351f35db8f9e2f0cba76d7936c7fe6852..412445e727f10153409ef676ca72d5386dc0f70d 100644 (file)
@@ -1,7 +1,7 @@
 /* ----------
  * lztext.c -
  *
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/lztext.c,v 1.7 2000/05/30 00:49:53 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/lztext.c,v 1.8 2000/07/03 23:09:52 wieck Exp $
  *
  *     Text type with internal LZ compressed representation. Uses the
  *     standard PostgreSQL compression method.
@@ -34,8 +34,6 @@ lztextin(char *str)
 {
        lztext     *result;
        int32           rawsize;
-       lztext     *tmp;
-       int                     tmp_size;
 
        /* ----------
         * Handle NULL
@@ -44,35 +42,11 @@ lztextin(char *str)
        if (str == NULL)
                return NULL;
 
-       /* ----------
-        * Determine input size and maximum output Datum size
-        * ----------
-        */
        rawsize = strlen(str);
-       tmp_size = PGLZ_MAX_OUTPUT(rawsize);
-
-       /* ----------
-        * Allocate a temporary result and compress into it
-        * ----------
-        */
-       tmp = (lztext *) palloc(tmp_size);
-       pglz_compress(str, rawsize, tmp, NULL);
+       result  = (lztext *)palloc(VARHDRSZ + rawsize);
 
-       /* ----------
-        * If we miss less than 25% bytes at the end of the temp value,
-        * so be it. Therefore we save a palloc()/memcpy()/pfree()
-        * sequence.
-        * ----------
-        */
-       if (tmp_size - tmp->varsize < 256 ||
-               tmp_size - tmp->varsize < tmp_size / 4)
-               result = tmp;
-       else
-       {
-               result = (lztext *) palloc(tmp->varsize);
-               memcpy(result, tmp, tmp->varsize);
-               pfree(tmp);
-       }
+       VARATT_SIZEP(result) = VARHDRSZ + rawsize;
+       memcpy(VARATT_DATA(result), str, rawsize);
 
        return result;
 }
@@ -88,6 +62,8 @@ char *
 lztextout(lztext *lz)
 {
        char       *result;
+       void       *tmp;
+       int32           rawsize;
 
        /* ----------
         * Handle NULL
@@ -101,25 +77,15 @@ lztextout(lztext *lz)
                return result;
        }
 
-       /* ----------
-        * Allocate the result string - the required size is remembered
-        * in the lztext header so we don't need a temporary buffer or
-        * have to diddle with realloc's.
-        * ----------
-        */
-       result = (char *) palloc(PGLZ_RAW_SIZE(lz) + 1);
+       VARATT_GETPLAIN(lz, tmp);
 
-       /* ----------
-        * Decompress and add terminating ZERO
-        * ----------
-        */
-       pglz_decompress(lz, result);
-       result[lz->rawsize] = '\0';
+       rawsize = VARATT_SIZE(tmp) - VARHDRSZ;
+       result  = (char *)palloc(rawsize + 1);
+       memcpy(result, VARATT_DATA(tmp), rawsize);
+       result[rawsize] = '\0';
+
+       VARATT_FREE(lz, tmp);
 
-       /* ----------
-        * Return the result
-        * ----------
-        */
        return result;
 }
 
@@ -167,7 +133,13 @@ lztextlen(lztext *lz)
         * without multibyte support, it's the remembered rawsize
         * ----------
         */
-       return PGLZ_RAW_SIZE(lz);
+       if (!VARATT_IS_EXTENDED(lz))
+           return VARATT_SIZE(lz) - VARHDRSZ;
+
+    if (VARATT_IS_EXTERNAL(lz))
+           return lz->va_content.va_external.va_rawsize;
+
+       return lz->va_content.va_compressed.va_rawsize;
 #endif
 }
 
@@ -189,11 +161,10 @@ lztextoctetlen(lztext *lz)
        if (lz == NULL)
                return 0;
 
-       /* ----------
-        * Return the varsize minus the VARSIZE field itself.
-        * ----------
-        */
-       return VARSIZE(lz) - VARHDRSZ;
+       if (!VARATT_IS_EXTERNAL(lz))
+           return VARATT_SIZE(lz) - VARHDRSZ;
+
+       return lz->va_content.va_external.va_extsize;
 }
 
 
@@ -208,9 +179,6 @@ text_lztext(text *txt)
 {
        lztext     *result;
        int32           rawsize;
-       lztext     *tmp;
-       int                     tmp_size;
-       char       *str;
 
        /* ----------
         * Handle NULL
@@ -220,35 +188,13 @@ text_lztext(text *txt)
                return NULL;
 
        /* ----------
-        * Determine input size and eventually tuple size
+        * Copy the entire attribute
         * ----------
         */
        rawsize = VARSIZE(txt) - VARHDRSZ;
-       str = VARDATA(txt);
-       tmp_size = PGLZ_MAX_OUTPUT(rawsize);
-
-       /* ----------
-        * Allocate a temporary result and compress into it
-        * ----------
-        */
-       tmp = (lztext *) palloc(tmp_size);
-       pglz_compress(str, rawsize, tmp, NULL);
-
-       /* ----------
-        * If we miss less than 25% bytes at the end of the temp value,
-        * so be it. Therefore we save a palloc()/memcpy()/pfree()
-        * sequence.
-        * ----------
-        */
-       if (tmp_size - tmp->varsize < 256 ||
-               tmp_size - tmp->varsize < tmp_size / 4)
-               result = tmp;
-       else
-       {
-               result = (lztext *) palloc(tmp->varsize);
-               memcpy(result, tmp, tmp->varsize);
-               pfree(tmp);
-       }
+       result  = (lztext *)palloc(rawsize + VARHDRSZ);
+       VARATT_SIZEP(result) = rawsize + VARHDRSZ;
+       memcpy(VARATT_DATA(result), VARATT_DATA(txt), rawsize);
 
        return result;
 }
@@ -264,6 +210,8 @@ text *
 lztext_text(lztext *lz)
 {
        text       *result;
+       lztext     *tmp;
+       int32           rawsize;
 
        /* ----------
         * Handle NULL
@@ -272,19 +220,14 @@ lztext_text(lztext *lz)
        if (lz == NULL)
                return NULL;
 
-       /* ----------
-        * Allocate and initialize the text result
-        * ----------
-        */
-       result = (text *) palloc(PGLZ_RAW_SIZE(lz) + VARHDRSZ + 1);
-       VARSIZE(result) = lz->rawsize + VARHDRSZ;
+       VARATT_GETPLAIN(lz, tmp);
+       
+       rawsize = VARATT_SIZE(tmp) - VARHDRSZ;
+       result  = (text *)palloc(rawsize + VARHDRSZ);
+       VARATT_SIZEP(result) = rawsize + VARHDRSZ;
+       memcpy(VARATT_DATA(result), VARATT_DATA(tmp), rawsize);
 
-       /* ----------
-        * Decompress directly into the text data area.
-        * ----------
-        */
-       VARDATA(result)[lz->rawsize] = 0;
-       pglz_decompress(lz, VARDATA(result));
+       VARATT_FREE(lz, tmp);
 
        return result;
 }
@@ -322,43 +265,32 @@ lztext_cmp(lztext *lz1, lztext *lz2)
 
 #else                                                  /* !USE_LOCALE */
 
-       PGLZ_DecompState ds1;
-       PGLZ_DecompState ds2;
-       int                     c1;
-       int                     c2;
-       int32           result = (int32) 0;
+       int             result;
+       char   *p1 = NULL;
+       char   *p2 = NULL;
+       int             size1;
+       int             size2;
 
        if (lz1 == NULL || lz2 == NULL)
-               return (int32) 0;
-
-       pglz_decomp_init(&ds1, lz1);
-       pglz_decomp_init(&ds2, lz2);
-
-       for (;;)
-       {
-               c1 = pglz_decomp_getchar(&ds1);
-               c2 = pglz_decomp_getchar(&ds2);
-
-               if (c1 == EOF)
-               {
-                       if (c2 != EOF)
-                               result = (int32) -1;
-                       break;
-               }
-               else
-               {
-                       if (c2 == EOF)
-                               result = (int32) 1;
-               }
-               if (c1 != c2)
-               {
-                       result = (int32) (c1 - c2);
-                       break;
-               }
-       }
+               return 0;
 
-       pglz_decomp_end(&ds1);
-       pglz_decomp_end(&ds2);
+       VARATT_GETPLAIN(lz1, p1);
+       VARATT_GETPLAIN(lz2, p2);
+
+    size1 = VARATT_SIZE(p1) - VARHDRSZ;
+    size2 = VARATT_SIZE(p2) - VARHDRSZ;
+    result = memcmp(VARATT_DATA(p1), VARATT_DATA(p2),
+                (size1 < size2) ? size1 : size2);
+    if (result == 0)
+    {
+        if (size1 > size2)
+            result = 1;
+        else if (size1 < size2)
+            result = -1;
+    }
+
+    VARATT_FREE(lz2, p2);
+    VARATT_FREE(lz1, p1);
 
        return result;
 
index 02fc1863b60055b6fbfb14d01da1ca93457a5fe4..9d880a4aa69a1586d6cab1d433efc0891c77662b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *     PostgreSQL type definitions for MAC addresses.
  *
- *     $Id: mac.c,v 1.14 1999/12/16 01:30:49 momjian Exp $
+ *     $Id: mac.c,v 1.15 2000/07/03 23:09:52 wieck Exp $
  */
 
 
@@ -314,14 +314,14 @@ macaddr_manuf(macaddr *addr)
        {
                result = palloc(VARHDRSZ + 1);
                memset(result, 0, VARHDRSZ + 1);
-               VARSIZE(result) = VARHDRSZ + 1;
+               VARATT_SIZEP(result) = VARHDRSZ + 1;
        }
        else
        {
                length = strlen(manuf->name) + 1;
                result = palloc(length + VARHDRSZ);
                memset(result, 0, length + VARHDRSZ);
-               VARSIZE(result) = length + VARHDRSZ;
+               VARATT_SIZEP(result) = length + VARHDRSZ;
                memcpy(VARDATA(result), manuf->name, length);
        }
        return result;
index 9a666ebd7088ee0bb7f4bb2cff0bf4819ccbf004..720517c953651db32d8a36ab98da59a8b5849154 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/adt/nabstime.c,v 1.70 2000/06/27 18:08:49 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/adt/nabstime.c,v 1.71 2000/07/03 23:09:52 wieck Exp $
  *
  * NOTES
  *
@@ -1945,7 +1945,7 @@ timeofday(PG_FUNCTION_ARGS)
 
        len = VARHDRSZ + strlen(buf);
        result = (text *) palloc(len);
-       VARSIZE(result) = len;
+       VARATT_SIZEP(result) = len;
        memcpy(VARDATA(result), buf, strlen(buf));
        PG_RETURN_TEXT_P(result);
 }
index 7e1a9ead6664840788bd7bb61ecc307f24cf8d24..a5127ece26f4cd537ad53dc0c78fbd0545125fc1 100644 (file)
@@ -3,7 +3,7 @@
  *     is for IP V4 CIDR notation, but prepared for V6: just
  *     add the necessary bits where the comments indicate.
  *
- *     $Id: network.c,v 1.21 2000/04/12 17:15:50 momjian Exp $
+ *     $Id: network.c,v 1.22 2000/07/03 23:09:52 wieck Exp $
  *     Jon Postel RIP 16 Oct 1998
  */
 
@@ -61,7 +61,7 @@ network_in(char *src, int type)
                /* Go for an IPV6 address here, before faulting out: */
                elog(ERROR, "could not parse \"%s\"", src);
 
-       VARSIZE(dst) = VARHDRSZ
+       VARATT_SIZEP(dst) = VARHDRSZ
                + ((char *) &ip_v4addr(dst) - (char *) VARDATA(dst))
                + ip_addrsize(dst);
        ip_bits(dst) = bits;
@@ -346,7 +346,7 @@ network_host(inet *ip)
        if (ret == NULL)
                elog(ERROR, "unable to allocate memory in network_host()");
 
-       VARSIZE(ret) = len;
+       VARATT_SIZEP(ret) = len;
        strcpy(VARDATA(ret), tmp);
        return (ret);
 }
@@ -396,7 +396,7 @@ network_broadcast(inet *ip)
        if (ret == NULL)
                elog(ERROR, "unable to allocate memory in network_broadcast()");
 
-       VARSIZE(ret) = len;
+       VARATT_SIZEP(ret) = len;
        strcpy(VARDATA(ret), tmp);
        return (ret);
 }
@@ -429,7 +429,7 @@ network_network(inet *ip)
        if (ret == NULL)
                elog(ERROR, "unable to allocate memory in network_network()");
 
-       VARSIZE(ret) = len;
+       VARATT_SIZEP(ret) = len;
        strcpy(VARDATA(ret), tmp);
        return (ret);
 }
@@ -466,7 +466,7 @@ network_netmask(inet *ip)
        if (ret == NULL)
                elog(ERROR, "unable to allocate memory in network_netmask()");
 
-       VARSIZE(ret) = len;
+       VARATT_SIZEP(ret) = len;
        strcpy(VARDATA(ret), tmp);
        return (ret);
 }
index 156237862b18f79f91e869ce7d98604f083ff2e7..a51eadfc5ef5969ee70cf0224b34731f6c338e27 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/adt/oid.c,v 1.36 2000/06/14 18:17:45 petere Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/adt/oid.c,v 1.37 2000/07/03 23:09:52 wieck Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -231,7 +231,7 @@ oid_text(PG_FUNCTION_ARGS)
 
        result = (text *) palloc(len);
 
-       VARSIZE(result) = len;
+       VARATT_SIZEP(result) = len;
        memcpy(VARDATA(result), str, (len - VARHDRSZ));
        pfree(str);
 
index 4455c04c55651a37e0abf70151a02d31aaf4b355..5f0b1fa776a3062e6bd423345cef42413d317eef 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *     Edmund Mergl <E.Mergl@bawue.de>
  *
- *     $Id: oracle_compat.c,v 1.25 2000/06/13 07:35:07 tgl Exp $
+ *     $Id: oracle_compat.c,v 1.26 2000/07/03 23:09:52 wieck Exp $
  *
  */
 
@@ -37,7 +37,7 @@ lower(text *string)
                return string;
 
        ret = (text *) palloc(VARSIZE(string));
-       VARSIZE(ret) = VARSIZE(string);
+       VARATT_SIZEP(ret) = VARSIZE(string);
 
        ptr = VARDATA(string);
        ptr_ret = VARDATA(ret);
@@ -75,7 +75,7 @@ upper(text *string)
                return string;
 
        ret = (text *) palloc(VARSIZE(string));
-       VARSIZE(ret) = VARSIZE(string);
+       VARATT_SIZEP(ret) = VARSIZE(string);
 
        ptr = VARDATA(string);
        ptr_ret = VARDATA(ret);
@@ -115,7 +115,7 @@ initcap(text *string)
                return string;
 
        ret = (text *) palloc(VARSIZE(string));
-       VARSIZE(ret) = VARSIZE(string);
+       VARATT_SIZEP(ret) = VARSIZE(string);
 
        ptr = VARDATA(string);
        ptr_ret = VARDATA(ret);
@@ -169,7 +169,7 @@ lpad(PG_FUNCTION_ARGS)
                PG_RETURN_TEXT_P(string1);
 
        ret = (text *) palloc(VARHDRSZ + len);
-       VARSIZE(ret) = VARHDRSZ + len;
+       VARATT_SIZEP(ret) = VARHDRSZ + len;
 
        ptr2 = VARDATA(string2);
        ptr_ret = VARDATA(ret);
@@ -224,7 +224,7 @@ rpad(PG_FUNCTION_ARGS)
                PG_RETURN_TEXT_P(string1);
 
        ret = (text *) palloc(VARHDRSZ + len);
-       VARSIZE(ret) = VARHDRSZ + len;
+       VARATT_SIZEP(ret) = VARHDRSZ + len;
 
        n = VARSIZE(string1) - VARHDRSZ;
        ptr1 = VARDATA(string1);
@@ -316,7 +316,7 @@ btrim(text *string, text *set)
        ++m;
 
        ret = (text *) palloc(VARHDRSZ + m);
-       VARSIZE(ret) = VARHDRSZ + m;
+       VARATT_SIZEP(ret) = VARHDRSZ + m;
        memcpy(VARDATA(ret), ptr, m);
 
        return ret;
@@ -374,7 +374,7 @@ ltrim(text *string, text *set)
        ++m;
 
        ret = (text *) palloc(VARHDRSZ + m);
-       VARSIZE(ret) = VARHDRSZ + m;
+       VARATT_SIZEP(ret) = VARHDRSZ + m;
 
        memcpy(VARDATA(ret), ptr, m);
 
@@ -434,7 +434,7 @@ rtrim(text *string, text *set)
        ++m;
 
        ret = (text *) palloc(VARHDRSZ + m);
-       VARSIZE(ret) = VARHDRSZ + m;
+       VARATT_SIZEP(ret) = VARHDRSZ + m;
 #ifdef NOT_USED
        memcpy(VARDATA(ret), ptr - VARSIZE(ret) + m, m);
 #endif
@@ -528,7 +528,7 @@ translate(text *string, text *from, text *to)
                }
        }
 
-       VARSIZE(result) = retlen + VARHDRSZ;
+       VARATT_SIZEP(result) = retlen + VARHDRSZ;
 
        /*
         * There may be some wasted space in the result if deletions occurred,
@@ -560,7 +560,7 @@ ichar(PG_FUNCTION_ARGS)
        text       *result;
 
        result = (text *) palloc(VARHDRSZ + 1);
-       VARSIZE(result) = VARHDRSZ + 1;
+       VARATT_SIZEP(result) = VARHDRSZ + 1;
        *VARDATA(result) = (char) cvalue;
 
        PG_RETURN_TEXT_P(result);
@@ -586,7 +586,7 @@ repeat(PG_FUNCTION_ARGS)
 
        result = (text *) palloc(tlen);
 
-       VARSIZE(result) = tlen;
+       VARATT_SIZEP(result) = tlen;
        cp = VARDATA(result);
        for (i = 0; i < count; i++)
        {
index f4e6ac5be37dbd3a89d5540f991ba1d46d61446e..493b4e6446582aaf3cc230a4b4afc006779941e1 100644 (file)
@@ -1,7 +1,7 @@
 /* ----------
  * pg_lzcompress.c -
  *
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/pg_lzcompress.c,v 1.5 2000/05/30 00:49:53 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/pg_lzcompress.c,v 1.6 2000/07/03 23:09:52 wieck Exp $
  *
  *             This is an implementation of LZ compression for PostgreSQL.
  *             It uses a simple history table and generates 2-3 byte tags
@@ -582,11 +582,15 @@ pglz_compress(char *source, int slen, PGLZ_Header *dest, PGLZ_Strategy *strategy
         * ----------
         */
        if (do_compress)
-               return (dest->varsize = result_size + sizeof(PGLZ_Header));
+       {
+               dest->varsize = result_size + sizeof(PGLZ_Header);
+               return VARATT_SIZE(dest);
+       }
        else
        {
                memcpy(((char *) dest) + sizeof(PGLZ_Header), source, slen);
-               return (dest->varsize = slen + sizeof(PGLZ_Header));
+               dest->varsize = slen + sizeof(PGLZ_Header);
+               return VARATT_SIZE(dest);
        }
 }
 
@@ -609,10 +613,10 @@ pglz_decompress(PGLZ_Header *source, char *dest)
        int32           off;
 
        dp = ((unsigned char *) source) + sizeof(PGLZ_Header);
-       dend = ((unsigned char *) source) + source->varsize;
+       dend = ((unsigned char *) source) + VARATT_SIZE(source);
        bp = (unsigned char *) dest;
 
-       if (source->varsize == source->rawsize + sizeof(PGLZ_Header))
+       if (VARATT_SIZE(source) == source->rawsize + sizeof(PGLZ_Header))
        {
                memcpy(dest, dp, source->rawsize);
                return source->rawsize;
index c5fbeadff6a3f565d8df5d951c0f9f867226f444..6660d15f1d6a3a72a21cb39301cd6a03a5306bbb 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/adt/regproc.c,v 1.56 2000/06/05 07:28:52 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/adt/regproc.c,v 1.57 2000/07/03 23:09:52 wieck Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -282,7 +282,7 @@ oidvectortypes(PG_FUNCTION_ARGS)
                else
                        strcat(VARDATA(result), "- ");
        }
-       VARSIZE(result) = strlen(VARDATA(result)) + VARHDRSZ;
+       VARATT_SIZEP(result) = strlen(VARDATA(result)) + VARHDRSZ;
        PG_RETURN_TEXT_P(result);
 }
 
index 5b2a2ea0163af414074802a3f0824ddfe394592d..5bd339a5cc988415b25e7793ef35eb9510f7e603 100644 (file)
@@ -3,7 +3,7 @@
  *                       out of its tuple
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.54 2000/06/13 07:35:08 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.55 2000/07/03 23:09:52 wieck Exp $
  *
  *       This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -181,7 +181,7 @@ pg_get_ruledef(NameData *rname)
                if (SPI_finish() != SPI_OK_FINISH)
                        elog(ERROR, "get_ruledef: SPI_finish() failed");
                ruledef = SPI_palloc(VARHDRSZ + 1);
-               VARSIZE(ruledef) = VARHDRSZ + 1;
+               VARATT_SIZEP(ruledef) = VARHDRSZ + 1;
                VARDATA(ruledef)[0] = '-';
                return ruledef;
        }
@@ -197,7 +197,7 @@ pg_get_ruledef(NameData *rname)
        make_ruledef(&buf, ruletup, rulettc);
        len = buf.len + VARHDRSZ;
        ruledef = SPI_palloc(len);
-       VARSIZE(ruledef) = len;
+       VARATT_SIZEP(ruledef) = len;
        memcpy(VARDATA(ruledef), buf.data, buf.len);
        pfree(buf.data);
 
@@ -296,7 +296,7 @@ pg_get_viewdef(NameData *rname)
        }
        len = buf.len + VARHDRSZ;
        ruledef = SPI_palloc(len);
-       VARSIZE(ruledef) = len;
+       VARATT_SIZEP(ruledef) = len;
        memcpy(VARDATA(ruledef), buf.data, buf.len);
        pfree(buf.data);
 
@@ -530,7 +530,7 @@ pg_get_indexdef(PG_FUNCTION_ARGS)
         */
        len = buf.len + VARHDRSZ;
        indexdef = SPI_palloc(len);
-       VARSIZE(indexdef) = len;
+       VARATT_SIZEP(indexdef) = len;
        memcpy(VARDATA(indexdef), buf.data, buf.len);
        pfree(buf.data);
        pfree(keybuf.data);
index 71549bb9256cbd7fde18fe3c8ef015f263375676..4b3f498a2af665f5f5f9d60a500810fa24f454a6 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v 1.30 2000/06/19 03:54:27 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v 1.31 2000/07/03 23:09:53 wieck Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1375,7 +1375,7 @@ timestamp_text(PG_FUNCTION_ARGS)
 
        result = palloc(len);
 
-       VARSIZE(result) = len;
+       VARATT_SIZEP(result) = len;
        memmove(VARDATA(result), str, (len - VARHDRSZ));
 
        pfree(str);
@@ -1430,7 +1430,7 @@ interval_text(PG_FUNCTION_ARGS)
 
        result = palloc(len);
 
-       VARSIZE(result) = len;
+       VARATT_SIZEP(result) = len;
        memmove(VARDATA(result), str, (len - VARHDRSZ));
 
        pfree(str);
@@ -2101,7 +2101,7 @@ timestamp_zone(PG_FUNCTION_ARGS)
 
                result = palloc(len);
 
-               VARSIZE(result) = len;
+               VARATT_SIZEP(result) = len;
                memmove(VARDATA(result), buf, (len - VARHDRSZ));
        }
        else
index 3e4abe828bb0405bf1c4186b102fea449d58badf..b5d2e18e104ca106baddbd5f7f6be9c0d5a74592 100644 (file)
@@ -4,7 +4,7 @@
  *       Functions for the built-in type bit() and varying bit().
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/adt/varbit.c,v 1.3 2000/06/15 03:32:29 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/adt/varbit.c,v 1.4 2000/07/03 23:09:53 wieck Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -122,7 +122,7 @@ zpbit_in(char *s, int dummy, int32 atttypmod)
        result = (bits8 *) palloc(len);
        /* set to 0 so that *r is always initialised and strin is zero-padded */
        memset(result, 0, len);
-       VARSIZE(result) = len;
+       VARATT_SIZEP(result) = len;
        VARBITLEN(result) = atttypmod;
 
        /*
@@ -353,7 +353,7 @@ varbit_in(char *s, int dummy, int32 atttypmod)
        result = (bits8 *) palloc(len);
        /* set to 0 so that *r is always initialised and strin is zero-padded */
        memset(result, 0, len);
-       VARSIZE(result) = len;
+       VARATT_SIZEP(result) = len;
        VARBITLEN(result) = bitlen;
 
        /*
@@ -561,7 +561,7 @@ bitcat(bits8 *arg1, bits8 *arg2)
        bytelen = VARBITDATALEN(bitlen1 + bitlen2);
 
        result = (bits8 *) palloc(bytelen * sizeof(bits8));
-       VARSIZE(result) = bytelen;
+       VARATT_SIZEP(result) = bytelen;
        VARBITLEN(result) = bitlen1 + bitlen2;
        /* Copy the first bitstring in */
        memcpy(VARBITS(result), VARBITS(arg1), VARBITBYTES(arg1));
@@ -625,7 +625,7 @@ bitsubstr(bits8 *arg, int32 s, int32 l)
                len = VARBITDATALEN(0);
                result = (bits8 *) palloc(len);
                VARBITLEN(result) = 0;
-               VARSIZE(result) = len;
+               VARATT_SIZEP(result) = len;
        }
        else
        {
@@ -638,7 +638,7 @@ bitsubstr(bits8 *arg, int32 s, int32 l)
                len = VARBITDATALEN(rbitlen);
                result = (bits8 *) palloc(len);
                VARBITLEN(result) = rbitlen;
-               VARSIZE(result) = len;
+               VARATT_SIZEP(result) = len;
                len -= VARHDRSZ + VARBITHDRSZ;
                /* Are we copying from a byte boundary? */
                if ((s1 - 1) % BITSPERBYTE == 0)
@@ -691,7 +691,7 @@ bitand(bits8 *arg1, bits8 *arg2)
 
        len = Min(VARSIZE(arg1), VARSIZE(arg2));
        result = (bits8 *) palloc(len);
-       VARSIZE(result) = len;
+       VARATT_SIZEP(result) = len;
        VARBITLEN(result) = Min(VARBITLEN(arg1), VARBITLEN(arg2));
 
        p1 = (bits8 *) VARBITS(arg1);
@@ -725,7 +725,7 @@ bitor(bits8 *arg1, bits8 *arg2)
 
        len = Min(VARSIZE(arg1), VARSIZE(arg2));
        result = (bits8 *) palloc(len);
-       VARSIZE(result) = len;
+       VARATT_SIZEP(result) = len;
        VARBITLEN(result) = Min(VARBITLEN(arg1), VARBITLEN(arg2));
 
        p1 = (bits8 *) VARBITS(arg1);
@@ -761,7 +761,7 @@ bitxor(bits8 *arg1, bits8 *arg2)
 
        len = Min(VARSIZE(arg1), VARSIZE(arg2));
        result = (bits8 *) palloc(len);
-       VARSIZE(result) = len;
+       VARATT_SIZEP(result) = len;
        VARBITLEN(result) = Min(VARBITLEN(arg1), VARBITLEN(arg2));
 
        p1 = (bits8 *) VARBITS(arg1);
@@ -792,7 +792,7 @@ bitnot(bits8 *arg)
                return (bool) 0;
 
        result = (bits8 *) palloc(VARSIZE(arg));
-       VARSIZE(result) = VARSIZE(arg);
+       VARATT_SIZEP(result) = VARSIZE(arg);
        VARBITLEN(result) = VARBITLEN(arg);
 
        p = (bits8 *) VARBITS(arg);
@@ -828,7 +828,7 @@ bitshiftleft(bits8 *arg, int shft)
                return bitshiftright(arg, -shft);
 
        result = (bits8 *) palloc(VARSIZE(arg));
-       VARSIZE(result) = VARSIZE(arg);
+       VARATT_SIZEP(result) = VARSIZE(arg);
        VARBITLEN(result) = VARBITLEN(arg);
        r = (bits8 *) VARBITS(result);
 
@@ -879,7 +879,7 @@ bitshiftright(bits8 *arg, int shft)
                return bitshiftleft(arg, -shft);
 
        result = (bits8 *) palloc(VARSIZE(arg));
-       VARSIZE(result) = VARSIZE(arg);
+       VARATT_SIZEP(result) = VARSIZE(arg);
        VARBITLEN(result) = VARBITLEN(arg);
        r = (bits8 *) VARBITS(result);
 
index 53c6ec41677eea47326366eef1b1b2c3cab97e54..6f17cb589ae60f59a8b19c50a59299ae0ebca655 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.66 2000/06/19 03:54:28 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.67 2000/07/03 23:09:53 wieck Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -88,7 +88,7 @@ bpcharin(PG_FUNCTION_ARGS)
                len = atttypmod - VARHDRSZ;
 
        result = (BpChar *) palloc(atttypmod);
-       VARSIZE(result) = atttypmod;
+       VARATT_SIZEP(result) = atttypmod;
        r = VARDATA(result);
        for (i = 0; i < len; i++, r++, s++)
        {
@@ -154,7 +154,7 @@ bpchar(PG_FUNCTION_ARGS)
 #endif
 
        result = (BpChar *) palloc(len);
-       VARSIZE(result) = len;
+       VARATT_SIZEP(result) = len;
        r = VARDATA(result);
 
 #ifdef MULTIBYTE
@@ -248,7 +248,7 @@ char_bpchar(PG_FUNCTION_ARGS)
 
        result = (BpChar *) palloc(VARHDRSZ + 1);
 
-       VARSIZE(result) = VARHDRSZ + 1;
+       VARATT_SIZEP(result) = VARHDRSZ + 1;
        *(VARDATA(result)) = c;
 
        PG_RETURN_BPCHAR_P(result);
@@ -317,7 +317,7 @@ name_bpchar(NameData *s)
 
        result = (char *) palloc(VARHDRSZ + len);
        strncpy(VARDATA(result), NameStr(*s), len);
-       VARSIZE(result) = len + VARHDRSZ;
+       VARATT_SIZEP(result) = len + VARHDRSZ;
 
        return result;
 }      /* name_bpchar() */
@@ -348,7 +348,7 @@ varcharin(PG_FUNCTION_ARGS)
                len = atttypmod;                /* clip the string at max length */
 
        result = (VarChar *) palloc(len);
-       VARSIZE(result) = len;
+       VARATT_SIZEP(result) = len;
        memcpy(VARDATA(result), s, len - VARHDRSZ);
 
 #ifdef CYR_RECODE
@@ -407,7 +407,7 @@ varchar(PG_FUNCTION_ARGS)
 #endif
 
        result = (VarChar *) palloc(slen);
-       VARSIZE(result) = slen;
+       VARATT_SIZEP(result) = slen;
        memcpy(VARDATA(result), VARDATA(s), len);
 
        PG_RETURN_VARCHAR_P(result);
index fedd29f0c3e51c19011f0f62d0f01f7d5e6c1547..114bcff29a4ab914cfacb5d68794808ee0c7d3bf 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.60 2000/06/14 18:17:45 petere Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.61 2000/07/03 23:09:54 wieck Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -157,7 +157,7 @@ textin(char *inputText)
 
        len = strlen(inputText) + VARHDRSZ;
        result = (text *) palloc(len);
-       VARSIZE(result) = len;
+       VARATT_SIZEP(result) = len;
 
        memmove(VARDATA(result), inputText, len - VARHDRSZ);
 
@@ -288,7 +288,7 @@ textcat(text *t1, text *t2)
        result = palloc(len);
 
        /* Set size of result string... */
-       VARSIZE(result) = len;
+       VARATT_SIZEP(result) = len;
 
        /* Fill data field of result string... */
        ptr = VARDATA(result);
@@ -374,7 +374,7 @@ text_substr(PG_FUNCTION_ARGS)
 #endif
 
        ret = (text *) palloc(VARHDRSZ + n);
-       VARSIZE(ret) = VARHDRSZ + n;
+       VARATT_SIZEP(ret) = VARHDRSZ + n;
 
        memcpy(VARDATA(ret), VARDATA(string) + m, n);
 
@@ -842,7 +842,7 @@ name_text(NameData *s)
 
        result = palloc(VARHDRSZ + len);
        strncpy(VARDATA(result), NameStr(*s), len);
-       VARSIZE(result) = len + VARHDRSZ;
+       VARATT_SIZEP(result) = len + VARHDRSZ;
 
        return result;
 }      /* name_text() */
index 4914acc8e3512df179293fcdc22ee7bb12c6b23b..0cf0b7859e8b90f2d2f48601e011827dfbcf5d32 100644 (file)
@@ -5,7 +5,7 @@
  *
  * IDENTIFICATION
  *
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/version.c,v 1.10 2000/07/02 15:20:51 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/version.c,v 1.11 2000/07/03 23:09:54 wieck Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -22,7 +22,7 @@ version(void)
        int                     n = strlen(PG_VERSION_STR) + VARHDRSZ;
        text       *ret = (text *) palloc(n);
 
-       VARSIZE(ret) = n;
+       VARATT_SIZEP(ret) = n;
        memcpy(VARDATA(ret), PG_VERSION_STR, strlen(PG_VERSION_STR));
 
        return ret;
index 9c4f1a505785a55aad244f786855d1f0c9765b88..024bb1de91439116192f7e711dbed53aae877805 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 2000, PostgreSQL Development Team
  *
- * $Id: tuptoaster.h,v 1.2 2000/04/12 17:16:26 momjian Exp $
+ * $Id: tuptoaster.h,v 1.3 2000/07/03 23:09:58 wieck Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include "utils/rel.h"
 
 
+#define        TOAST_MAX_CHUNK_SIZE    ((MaxTupleSize -                                                        \
+                               MAXALIGN(                                                                                               \
+                                       MAXALIGN(offsetof(HeapTupleHeaderData, t_bits)) +       \
+                                       MAXALIGN(sizeof(Oid)) +                                                         \
+                                       MAXALIGN(sizeof(int32)) +                                                       \
+                                       MAXALIGN(VARHDRSZ))) / 4)
+
+
 extern void heap_tuple_toast_attrs(Relation rel,
-                                          HeapTuple newtup, HeapTuple oldtup);
+                               HeapTuple newtup, HeapTuple oldtup);
 
 extern varattrib *heap_tuple_untoast_attr(varattrib * attr);
 
+extern void heap_create_toast_table(Oid new_reloid,
+                               TupleDesc new_tupdesc, bool istemp);
+                               
+
 #endif  /* TUPLE_TOASTER_ACTIVE */
 
 
index 899b2496420617d2516523ab025e4606ca0aa0e7..925328e2bd9b564d11c626dd633759fd8d83597c 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_attribute.h,v 1.60 2000/07/02 22:01:08 momjian Exp $
+ * $Id: pg_attribute.h,v 1.61 2000/07/03 23:10:05 wieck Exp $
  *
  * NOTES
  *       the genbki.sh script reads this file and generates .bki
@@ -243,7 +243,8 @@ typedef FormData_pg_attribute *Form_pg_attribute;
 { 1247, {"typreceive"},    24, 0,      4, 13, 0, -1, -1, '\001', 'p', '\0', 'i', '\0', '\0' }, \
 { 1247, {"typsend"},      24, 0,       4, 14, 0, -1, -1, '\001', 'p', '\0', 'i', '\0', '\0' }, \
 { 1247, {"typalign"},     18, 0,       1, 15, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \
-{ 1247, {"typdefault"},    25, 0,  -1, 16, 0, -1, -1, '\0'     , 'p', '\0', 'i', '\0', '\0' }
+{ 1247, {"typstorage"},           18, 0,       1, 16, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \
+{ 1247, {"typdefault"},    25, 0,  -1, 17, 0, -1, -1, '\0'     , 'p', '\0', 'i', '\0', '\0' }
 
 DATA(insert OID = 0 ( 1247 typname                     19 0 NAMEDATALEN   1 0 -1 -1 f p f i f f));
 DATA(insert OID = 0 ( 1247 typowner                    23 0  4   2 0 -1 -1 t p f i f f));
@@ -260,7 +261,8 @@ DATA(insert OID = 0 ( 1247 typoutput                24 0  4  12 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1247 typreceive          24 0  4  13 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1247 typsend                     24 0  4  14 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1247 typalign                    18 0  1  15 0 -1 -1 t p f c f f));
-DATA(insert OID = 0 ( 1247 typdefault          25 0 -1  16 0 -1 -1 f p f i f f));
+DATA(insert OID = 0 ( 1247 typstorage          18 0  1  16 0 -1 -1 t p f c f f));
+DATA(insert OID = 0 ( 1247 typdefault          25 0 -1  17 0 -1 -1 f p f i f f));
 DATA(insert OID = 0 ( 1247 ctid                                27 0  6  -1 0 -1 -1 f p f i f f));
 DATA(insert OID = 0 ( 1247 oid                         26 0  4  -2 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1247 xmin                                28 0  4  -3 0 -1 -1 t p f i f f));
@@ -423,20 +425,21 @@ DATA(insert OID = 0 ( 1249 tableoid                       26 0  4  -7 0 -1 -1 t p f i f f));
 { 1259, {"relam"},                26, 0,       4,      4, 0, -1, -1, '\001', 'p', '\0', 'i', '\0', '\0' }, \
 { 1259, {"relpages"},     23, 0,       4,      5, 0, -1, -1, '\001', 'p', '\0', 'i', '\0', '\0' }, \
 { 1259, {"reltuples"},    23, 0,       4,      6, 0, -1, -1, '\001', 'p', '\0', 'i', '\0', '\0' }, \
-{ 1259, {"rellongrelid"},  26, 0,      4,      7, 0, -1, -1, '\001', 'p', '\0', 'i', '\0', '\0' }, \
-{ 1259, {"relhasindex"},   16, 0,      1,      8, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \
-{ 1259, {"relisshared"},   16, 0,      1,      9, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \
-{ 1259, {"relkind"},      18, 0,       1, 10, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \
-{ 1259, {"relnatts"},     21, 0,       2, 11, 0, -1, -1, '\001', 'p', '\0', 's', '\0', '\0' }, \
-{ 1259, {"relchecks"},    21, 0,       2, 12, 0, -1, -1, '\001', 'p', '\0', 's', '\0', '\0' }, \
-{ 1259, {"reltriggers"},   21, 0,      2, 13, 0, -1, -1, '\001', 'p', '\0', 's', '\0', '\0' }, \
-{ 1259, {"relukeys"},     21, 0,       2, 14, 0, -1, -1, '\001', 'p', '\0', 's', '\0', '\0' }, \
-{ 1259, {"relfkeys"},     21, 0,       2, 15, 0, -1, -1, '\001', 'p', '\0', 's', '\0', '\0' }, \
-{ 1259, {"relrefs"},      21, 0,       2, 16, 0, -1, -1, '\001', 'p', '\0', 's', '\0', '\0' }, \
-{ 1259, {"relhaspkey"},    16, 0,      1, 17, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \
-{ 1259, {"relhasrules"},   16, 0,      1, 18, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \
-{ 1259, {"relhassubclass"},16, 0,      1, 19, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \
-{ 1259, {"relacl"},             1034, 0,  -1, 20, 0, -1, -1,   '\0', 'p', '\0', 'i', '\0', '\0' }
+{ 1259, {"reltoastrelid"}, 26, 0,      4,      7, 0, -1, -1, '\001', 'p', '\0', 'i', '\0', '\0' }, \
+{ 1259, {"reltoastidxid"}, 26, 0,      4,      8, 0, -1, -1, '\001', 'p', '\0', 'i', '\0', '\0' }, \
+{ 1259, {"relhasindex"},   16, 0,      1,      9, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \
+{ 1259, {"relisshared"},   16, 0,      1, 10, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \
+{ 1259, {"relkind"},      18, 0,       1, 11, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \
+{ 1259, {"relnatts"},     21, 0,       2, 12, 0, -1, -1, '\001', 'p', '\0', 's', '\0', '\0' }, \
+{ 1259, {"relchecks"},    21, 0,       2, 13, 0, -1, -1, '\001', 'p', '\0', 's', '\0', '\0' }, \
+{ 1259, {"reltriggers"},   21, 0,      2, 14, 0, -1, -1, '\001', 'p', '\0', 's', '\0', '\0' }, \
+{ 1259, {"relukeys"},     21, 0,       2, 15, 0, -1, -1, '\001', 'p', '\0', 's', '\0', '\0' }, \
+{ 1259, {"relfkeys"},     21, 0,       2, 16, 0, -1, -1, '\001', 'p', '\0', 's', '\0', '\0' }, \
+{ 1259, {"relrefs"},      21, 0,       2, 17, 0, -1, -1, '\001', 'p', '\0', 's', '\0', '\0' }, \
+{ 1259, {"relhaspkey"},    16, 0,      1, 18, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \
+{ 1259, {"relhasrules"},   16, 0,      1, 19, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \
+{ 1259, {"relhassubclass"},16, 0,      1, 20, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \
+{ 1259, {"relacl"},             1034, 0,  -1, 21, 0, -1, -1,   '\0', 'p', '\0', 'i', '\0', '\0' }
 
 DATA(insert OID = 0 ( 1259 relname                     19 0 NAMEDATALEN   1 0 -1 -1 f p f i f f));
 DATA(insert OID = 0 ( 1259 reltype                     26 0  4   2 0 -1 -1 t p f i f f));
@@ -444,20 +447,21 @@ DATA(insert OID = 0 ( 1259 relowner                       23 0  4   3 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1259 relam                       26 0  4   4 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1259 relpages                    23 0  4   5 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1259 reltuples           23 0  4   6 0 -1 -1 t p f i f f));
-DATA(insert OID = 0 ( 1259 rellongrelid                26 0  4   7 0 -1 -1 t p f i f f));
-DATA(insert OID = 0 ( 1259 relhasindex         16 0  1   8 0 -1 -1 t p f c f f));
-DATA(insert OID = 0 ( 1259 relisshared         16 0  1   9 0 -1 -1 t p f c f f));
-DATA(insert OID = 0 ( 1259 relkind                     18 0  1  10 0 -1 -1 t p f c f f));
-DATA(insert OID = 0 ( 1259 relnatts                    21 0  2  11 0 -1 -1 t p f s f f));
-DATA(insert OID = 0 ( 1259 relchecks           21 0  2  12 0 -1 -1 t p f s f f));
-DATA(insert OID = 0 ( 1259 reltriggers         21 0  2  13 0 -1 -1 t p f s f f));
-DATA(insert OID = 0 ( 1259 relukeys                    21 0  2  14 0 -1 -1 t p f s f f));
-DATA(insert OID = 0 ( 1259 relfkeys                    21 0  2  15 0 -1 -1 t p f s f f));
-DATA(insert OID = 0 ( 1259 relrefs                     21 0  2  16 0 -1 -1 t p f s f f));
-DATA(insert OID = 0 ( 1259 relhaspkey          16 0  1  17 0 -1 -1 t p f c f f));
-DATA(insert OID = 0 ( 1259 relhasrules         16 0  1  18 0 -1 -1 t p f c f f));
-DATA(insert OID = 0 ( 1259 relhassubclass      16 0  1   19 0 -1 -1 t p f c f f));
-DATA(insert OID = 0 ( 1259 relacl                1034 0 -1  20 0 -1 -1 f p f i f f));
+DATA(insert OID = 0 ( 1259 reltoastrelid       26 0  4   7 0 -1 -1 t p f i f f));
+DATA(insert OID = 0 ( 1259 reltoastidxid       26 0  4   8 0 -1 -1 t p f i f f));
+DATA(insert OID = 0 ( 1259 relhasindex         16 0  1   9 0 -1 -1 t p f c f f));
+DATA(insert OID = 0 ( 1259 relisshared         16 0  1  10 0 -1 -1 t p f c f f));
+DATA(insert OID = 0 ( 1259 relkind                     18 0  1  11 0 -1 -1 t p f c f f));
+DATA(insert OID = 0 ( 1259 relnatts                    21 0  2  12 0 -1 -1 t p f s f f));
+DATA(insert OID = 0 ( 1259 relchecks           21 0  2  13 0 -1 -1 t p f s f f));
+DATA(insert OID = 0 ( 1259 reltriggers         21 0  2  14 0 -1 -1 t p f s f f));
+DATA(insert OID = 0 ( 1259 relukeys                    21 0  2  15 0 -1 -1 t p f s f f));
+DATA(insert OID = 0 ( 1259 relfkeys                    21 0  2  16 0 -1 -1 t p f s f f));
+DATA(insert OID = 0 ( 1259 relrefs                     21 0  2  17 0 -1 -1 t p f s f f));
+DATA(insert OID = 0 ( 1259 relhaspkey          16 0  1  18 0 -1 -1 t p f c f f));
+DATA(insert OID = 0 ( 1259 relhasrules         16 0  1  19 0 -1 -1 t p f c f f));
+DATA(insert OID = 0 ( 1259 relhassubclass      16 0  1  20 0 -1 -1 t p f c f f));
+DATA(insert OID = 0 ( 1259 relacl                1034 0 -1  21 0 -1 -1 f p f i f f));
 DATA(insert OID = 0 ( 1259 ctid                                27 0  6  -1 0 -1 -1 f p f i f f));
 DATA(insert OID = 0 ( 1259 oid                         26 0  4  -2 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1259 xmin                                28 0  4  -3 0 -1 -1 t p f i f f));
index 27444959602e382b29b52b45be4b774b2dd57361..1ea5b7b7792f96781d0518a788f8eaf4af420a65 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_class.h,v 1.38 2000/06/17 04:56:31 tgl Exp $
+ * $Id: pg_class.h,v 1.39 2000/07/03 23:10:05 wieck Exp $
  *
  * NOTES
  *       the genbki.sh script reads this file and generates .bki
@@ -52,7 +52,8 @@ CATALOG(pg_class) BOOTSTRAP
        Oid                     relam;
        int4            relpages;
        int4            reltuples;
-       Oid                     rellongrelid;
+       Oid                     reltoastrelid;
+       Oid                     reltoastidxid;
        bool            relhasindex;
        bool            relisshared;
        char            relkind;
@@ -98,59 +99,60 @@ typedef FormData_pg_class *Form_pg_class;
  *             relacl field.
  * ----------------
  */
-#define Natts_pg_class_fixed                   19
-#define Natts_pg_class                                 20
+#define Natts_pg_class_fixed                   20
+#define Natts_pg_class                                 21
 #define Anum_pg_class_relname                  1
 #define Anum_pg_class_reltype                  2
 #define Anum_pg_class_relowner                 3
 #define Anum_pg_class_relam                            4
 #define Anum_pg_class_relpages                 5
 #define Anum_pg_class_reltuples                        6
-#define Anum_pg_class_rellongrelid             7
-#define Anum_pg_class_relhasindex              8
-#define Anum_pg_class_relisshared              9
-#define Anum_pg_class_relkind                  10
-#define Anum_pg_class_relnatts                 11
-#define Anum_pg_class_relchecks                        12
-#define Anum_pg_class_reltriggers              13
-#define Anum_pg_class_relukeys                 14
-#define Anum_pg_class_relfkeys                 15
-#define Anum_pg_class_relrefs                  16
-#define Anum_pg_class_relhaspkey               17
-#define Anum_pg_class_relhasrules              18
-#define Anum_pg_class_relhassubclass   19
-#define Anum_pg_class_relacl                   20
+#define Anum_pg_class_reltoastrelid            7
+#define Anum_pg_class_reltoastidxid            8
+#define Anum_pg_class_relhasindex              9
+#define Anum_pg_class_relisshared              10
+#define Anum_pg_class_relkind                  11
+#define Anum_pg_class_relnatts                 12
+#define Anum_pg_class_relchecks                        13
+#define Anum_pg_class_reltriggers              14
+#define Anum_pg_class_relukeys                 15
+#define Anum_pg_class_relfkeys                 16
+#define Anum_pg_class_relrefs                  17
+#define Anum_pg_class_relhaspkey               18
+#define Anum_pg_class_relhasrules              19
+#define Anum_pg_class_relhassubclass   20
+#define Anum_pg_class_relacl                   21
 
 /* ----------------
  *             initial contents of pg_class
  * ----------------
  */
 
-DATA(insert OID = 1247 (  pg_type 71             PGUID 0 0 0 0 f f r 16 0 0 0 0 0 f f f _null_ ));
+DATA(insert OID = 1247 (  pg_type 71             PGUID 0 0 0 0 0 f f r 17 0 0 0 0 0 f f f _null_ ));
 DESCR("");
-DATA(insert OID = 1249 (  pg_attribute 75        PGUID 0 0 0 0 f f r 15 0 0 0 0 0 f f f _null_ ));
+DATA(insert OID = 1249 (  pg_attribute 75        PGUID 0 0 0 0 f f r 15 0 0 0 0 0 f f f _null_ ));
 DESCR("");
-DATA(insert OID = 1255 (  pg_proc 81             PGUID 0 0 0 0 f f r 17 0 0 0 0 0 f f f _null_ ));
+DATA(insert OID = 1255 (  pg_proc 81             PGUID 0 0 0 0 f f r 17 0 0 0 0 0 f f f _null_ ));
 DESCR("");
-DATA(insert OID = 1259 (  pg_class 83            PGUID 0 0 0 0 f f r 20 0 0 0 0 0 f f f _null_ ));
+DATA(insert OID = 1259 (  pg_class 83            PGUID 0 0 0 0 0 f f r 21 0 0 0 0 0 f f f _null_ ));
 DESCR("");
-DATA(insert OID = 1260 (  pg_shadow 86           PGUID 0 0 0 0 f t r 8  0 0 0 0 0 f f f _null_ ));
+DATA(insert OID = 1260 (  pg_shadow 86           PGUID 0 0 0 0 f t r 8  0 0 0 0 0 f f f _null_ ));
 DESCR("");
-DATA(insert OID = 1261 (  pg_group 87            PGUID 0 0 0 0 f t r 3  0 0 0 0 0 f f f _null_ ));
+DATA(insert OID = 1261 (  pg_group 87            PGUID 0 0 0 0 f t r 3  0 0 0 0 0 f f f _null_ ));
 DESCR("");
-DATA(insert OID = 1262 (  pg_database 88         PGUID 0 0 0 0 f t r 4  0 0 0 0 0 f f f _null_ ));
+DATA(insert OID = 1262 (  pg_database 88         PGUID 0 0 0 0 f t r 4  0 0 0 0 0 f f f _null_ ));
 DESCR("");
-DATA(insert OID = 1264 (  pg_variable 90         PGUID 0 0 0 0 f t s 1  0 0 0 0 0 f f f _null_ ));
+DATA(insert OID = 1264 (  pg_variable 90         PGUID 0 0 0 0 f t s 1  0 0 0 0 0 f f f _null_ ));
 DESCR("");
-DATA(insert OID = 1269 (  pg_log  99             PGUID 0 0 0 0 f t s 1  0 0 0 0 0 f f f _null_ ));
+DATA(insert OID = 1269 (  pg_log  99             PGUID 0 0 0 0 f t s 1  0 0 0 0 0 f f f _null_ ));
 DESCR("");
-DATA(insert OID = 376  (  pg_xactlock  0         PGUID 0 0 0 0 f t s 1  0 0 0 0 0 f f f _null_ ));
+DATA(insert OID = 376  (  pg_xactlock  0         PGUID 0 0 0 0 f t s 1  0 0 0 0 0 f f f _null_ ));
 DESCR("");
-DATA(insert OID = 1215 (  pg_attrdef 109         PGUID 0 0 0 0 t t r 4  0 0 0 0 0 f f f _null_ ));
+DATA(insert OID = 1215 (  pg_attrdef 109         PGUID 0 0 0 0 t t r 4  0 0 0 0 0 f f f _null_ ));
 DESCR("");
-DATA(insert OID = 1216 (  pg_relcheck 110        PGUID 0 0 0 0 t t r 4  0 0 0 0 0 f f f _null_ ));
+DATA(insert OID = 1216 (  pg_relcheck 110        PGUID 0 0 0 0 t t r 4  0 0 0 0 0 f f f _null_ ));
 DESCR("");
-DATA(insert OID = 1219 (  pg_trigger 111         PGUID 0 0 0 0 t t r 13  0 0 0 0 0 f f f _null_ ));
+DATA(insert OID = 1219 (  pg_trigger 111         PGUID 0 0 0 0 t t r 13  0 0 0 0 0 f f f _null_ ));
 DESCR("");
 
 #define RelOid_pg_type                 1247
@@ -175,6 +177,6 @@ DESCR("");
 #define                  RELKIND_SPECIAL                 's'           /* special (non-heap) */
 #define                  RELKIND_SEQUENCE                'S'           /* SEQUENCE relation */
 #define                  RELKIND_UNCATALOGED     'u'           /* temporary heap */
-#define                  RELKIND_LONGVALUE               'v'           /* moved off huge values */
+#define                  RELKIND_TOASTVALUE      't'           /* moved off huge values */
 
 #endif  /* PG_CLASS_H */
index ce9ba3b474aa54878dd89e13e939703a74c8fc49..b7a41b6a72da3cdc3a10eb5550c0c3044682af30 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_type.h,v 1.89 2000/06/05 07:29:01 tgl Exp $
+ * $Id: pg_type.h,v 1.90 2000/07/03 23:10:05 wieck Exp $
  *
  * NOTES
  *       the genbki.sh script reads this file and generates .bki
@@ -106,6 +106,18 @@ CATALOG(pg_type) BOOTSTRAP
         * compiler will lay out the field in a struct representing a table row.
         * ----------------
         */
+       char            typstorage;
+
+       /* ----------------
+        * typstorage tells if the type is prepared for toasting and what
+        * the default strategy for attributes of this type should be.
+        *
+        * 'p' PLAIN      type not prepared for toasting
+        * 'e' EXTERNAL   external storage possible, don't try to compress
+        * 'x' EXTENDED   try to compress and store external if required
+        * 'm' MAIN       like 'x' but try to keep in main tuple
+        * ----------------
+        */
        text            typdefault;             /* VARIABLE LENGTH FIELD */
 } FormData_pg_type;
 
@@ -120,7 +132,7 @@ typedef FormData_pg_type *Form_pg_type;
  *             compiler constants for pg_type
  * ----------------
  */
-#define Natts_pg_type                                  16
+#define Natts_pg_type                                  17
 #define Anum_pg_type_typname                   1
 #define Anum_pg_type_typowner                  2
 #define Anum_pg_type_typlen                            3
@@ -136,7 +148,8 @@ typedef FormData_pg_type *Form_pg_type;
 #define Anum_pg_type_typreceive                        13
 #define Anum_pg_type_typsend                   14
 #define Anum_pg_type_typalign                  15
-#define Anum_pg_type_typdefault                        16
+#define Anum_pg_type_typstorage                        16
+#define Anum_pg_type_typdefault                        17
 
 /* ----------------
  *             initial contents of pg_type
@@ -151,88 +164,88 @@ typedef FormData_pg_type *Form_pg_type;
 */
 
 /* OIDS 1 - 99 */
-DATA(insert OID = 16 ( bool       PGUID  1   1 t b t \054 0   0 boolin boolout boolin boolout c _null_ ));
+DATA(insert OID = 16 ( bool       PGUID  1   1 t b t \054 0   0 boolin boolout boolin boolout c _null_ ));
 DESCR("boolean, 'true'/'false'");
 #define BOOLOID                        16
 
-DATA(insert OID = 17 ( bytea      PGUID -1  -1 f b t \054 0  18 byteain byteaout byteain byteaout i _null_ ));
+DATA(insert OID = 17 ( bytea      PGUID -1  -1 f b t \054 0  18 byteain byteaout byteain byteaout i _null_ ));
 DESCR("variable-length string, binary values escaped");
 #define BYTEAOID               17
 
-DATA(insert OID = 18 ( char       PGUID  1   1 t b t \054 0   0 charin charout charin charout c _null_ ));
+DATA(insert OID = 18 ( char       PGUID  1   1 t b t \054 0   0 charin charout charin charout c _null_ ));
 DESCR("single character");
 #define CHAROID                        18
 
-DATA(insert OID = 19 ( name       PGUID NAMEDATALEN NAMEDATALEN  f b t \054 0  18 namein nameout namein nameout i _null_ ));
+DATA(insert OID = 19 ( name       PGUID NAMEDATALEN NAMEDATALEN  f b t \054 0  18 namein nameout namein nameout i _null_ ));
 DESCR("31-character type for storing system identifiers");
 #define NAMEOID                        19
 
-DATA(insert OID = 20 ( int8       PGUID  8  20 f b t \054 0   0 int8in int8out int8in int8out d _null_ ));
+DATA(insert OID = 20 ( int8       PGUID  8  20 f b t \054 0   0 int8in int8out int8in int8out d _null_ ));
 DESCR("~18 digit integer, 8-byte storage");
 #define INT8OID                        20
 
-DATA(insert OID = 21 ( int2       PGUID  2   5 t b t \054 0   0 int2in int2out int2in int2out s _null_ ));
+DATA(insert OID = 21 ( int2       PGUID  2   5 t b t \054 0   0 int2in int2out int2in int2out s _null_ ));
 DESCR("-32 thousand to 32 thousand, 2-byte storage");
 #define INT2OID                        21
 
-DATA(insert OID = 22 ( int2vector PGUID INDEX_MAX_KEYS*2 -1 f b t \054 0  21 int2vectorin int2vectorout int2vectorin int2vectorout i _null_ ));
+DATA(insert OID = 22 ( int2vector PGUID INDEX_MAX_KEYS*2 -1 f b t \054 0  21 int2vectorin int2vectorout int2vectorin int2vectorout i _null_ ));
 DESCR("array of INDEX_MAX_KEYS int2 integers, used in system tables");
 #define INT2VECTOROID  22
 
-DATA(insert OID = 23 ( int4       PGUID  4  10 t b t \054 0   0 int4in int4out int4in int4out i _null_ ));
+DATA(insert OID = 23 ( int4       PGUID  4  10 t b t \054 0   0 int4in int4out int4in int4out i _null_ ));
 DESCR("-2 billion to 2 billion integer, 4-byte storage");
 #define INT4OID                        23
 
-DATA(insert OID = 24 ( regproc    PGUID  4  16 t b t \054 0   0 regprocin regprocout regprocin regprocout i _null_ ));
+DATA(insert OID = 24 ( regproc    PGUID  4  16 t b t \054 0   0 regprocin regprocout regprocin regprocout i _null_ ));
 DESCR("registered procedure");
 #define REGPROCOID             24
 
-DATA(insert OID = 25 ( text       PGUID -1  -1 f b t \054 0  18 textin textout textin textout i _null_ ));
+DATA(insert OID = 25 ( text       PGUID -1  -1 f b t \054 0  18 textin textout textin textout i _null_ ));
 DESCR("variable-length string, no limit specified");
 #define TEXTOID                        25
 
-DATA(insert OID = 26 ( oid                PGUID  4  10 t b t \054 0   0 oidin oidout oidin oidout i _null_ ));
+DATA(insert OID = 26 ( oid                PGUID  4  10 t b t \054 0   0 oidin oidout oidin oidout i _null_ ));
 DESCR("object identifier(oid), maximum 4 billion");
 #define OIDOID                 26
 
-DATA(insert OID = 27 ( tid                PGUID  6  19 f b t \054 0   0 tidin tidout tidin tidout i _null_ ));
+DATA(insert OID = 27 ( tid                PGUID  6  19 f b t \054 0   0 tidin tidout tidin tidout i _null_ ));
 DESCR("(Block, offset), physical location of tuple");
 #define TIDOID         27
 
-DATA(insert OID = 28 ( xid                PGUID  4  12 t b t \054 0   0 xidin xidout xidin xidout i _null_ ));
+DATA(insert OID = 28 ( xid                PGUID  4  12 t b t \054 0   0 xidin xidout xidin xidout i _null_ ));
 DESCR("transaction id");
 #define XIDOID 28
 
-DATA(insert OID = 29 ( cid                PGUID  4  10 t b t \054 0   0 cidin cidout cidin cidout i _null_ ));
+DATA(insert OID = 29 ( cid                PGUID  4  10 t b t \054 0   0 cidin cidout cidin cidout i _null_ ));
 DESCR("command identifier type, sequence in transaction id");
 #define CIDOID 29
 
-DATA(insert OID = 30 ( oidvector  PGUID INDEX_MAX_KEYS*4 -1 f b t \054 0  26 oidvectorin oidvectorout oidvectorin oidvectorout i _null_ ));
+DATA(insert OID = 30 ( oidvector  PGUID INDEX_MAX_KEYS*4 -1 f b t \054 0  26 oidvectorin oidvectorout oidvectorin oidvectorout i _null_ ));
 DESCR("array of INDEX_MAX_KEYS oids, used in system tables");
 #define OIDVECTOROID   30
 
-DATA(insert OID = 32 ( SET                PGUID -1  -1 f b t \054 0   0 textin textout textin textout i _null_ ));
+DATA(insert OID = 32 ( SET                PGUID -1  -1 f b t \054 0   0 textin textout textin textout i _null_ ));
 DESCR("set of tuples");
 
-DATA(insert OID = 71 ( pg_type          PGUID 4 4 t c t \054 1247 0 int4in int4out int4in int4out i _null_));
-DATA(insert OID = 75 ( pg_attribute PGUID 4 4 t c t \054 1249 0 int4in int4out int4in int4out i _null_));
-DATA(insert OID = 81 ( pg_proc          PGUID 4 4 t c t \054 1255 0 int4in int4out int4in int4out i _null_));
-DATA(insert OID = 83 ( pg_class         PGUID 4 4 t c t \054 1259 0 int4in int4out int4in int4out i _null_));
-DATA(insert OID = 86 ( pg_shadow        PGUID 4 4 t c t \054 1260 0 int4in int4out int4in int4out i _null_));
-DATA(insert OID = 87 ( pg_group         PGUID 4 4 t c t \054 1261 0 int4in int4out int4in int4out i _null_));
-DATA(insert OID = 88 ( pg_database  PGUID 4 4 t c t \054 1262 0 int4in int4out int4in int4out i _null_));
-DATA(insert OID = 90 ( pg_variable  PGUID 4 4 t c t \054 1264 0 int4in int4out int4in int4out i _null_));
-DATA(insert OID = 99 ( pg_log           PGUID 4 4 t c t \054 1269 0 int4in int4out int4in int4out i _null_));
+DATA(insert OID = 71 ( pg_type          PGUID 4 4 t c t \054 1247 0 int4in int4out int4in int4out i _null_));
+DATA(insert OID = 75 ( pg_attribute PGUID 4 4 t c t \054 1249 0 int4in int4out int4in int4out i _null_));
+DATA(insert OID = 81 ( pg_proc          PGUID 4 4 t c t \054 1255 0 int4in int4out int4in int4out i _null_));
+DATA(insert OID = 83 ( pg_class         PGUID 4 4 t c t \054 1259 0 int4in int4out int4in int4out i _null_));
+DATA(insert OID = 86 ( pg_shadow        PGUID 4 4 t c t \054 1260 0 int4in int4out int4in int4out i _null_));
+DATA(insert OID = 87 ( pg_group         PGUID 4 4 t c t \054 1261 0 int4in int4out int4in int4out i _null_));
+DATA(insert OID = 88 ( pg_database  PGUID 4 4 t c t \054 1262 0 int4in int4out int4in int4out i _null_));
+DATA(insert OID = 90 ( pg_variable  PGUID 4 4 t c t \054 1264 0 int4in int4out int4in int4out i _null_));
+DATA(insert OID = 99 ( pg_log           PGUID 4 4 t c t \054 1269 0 int4in int4out int4in int4out i _null_));
 
 /* OIDS 100 - 199 */
 
-DATA(insert OID = 109 (  pg_attrdef  PGUID 4 4 t c t \054 1215 0 int4in int4out int4in int4out i _null_));
-DATA(insert OID = 110 (  pg_relcheck PGUID 4 4 t c t \054 1216 0 int4in int4out int4in int4out i _null_));
-DATA(insert OID = 111 (  pg_trigger  PGUID 4 4 t c t \054 1219 0 int4in int4out int4in int4out i _null_));
+DATA(insert OID = 109 (  pg_attrdef  PGUID 4 4 t c t \054 1215 0 int4in int4out int4in int4out i _null_));
+DATA(insert OID = 110 (  pg_relcheck PGUID 4 4 t c t \054 1216 0 int4in int4out int4in int4out i _null_));
+DATA(insert OID = 111 (  pg_trigger  PGUID 4 4 t c t \054 1219 0 int4in int4out int4in int4out i _null_));
 
 /* OIDS 200 - 299 */
 
-DATA(insert OID = 210 (  smgr     PGUID 2      12 t b t \054 0 0 smgrin smgrout smgrin smgrout s _null_ ));
+DATA(insert OID = 210 (  smgr     PGUID 2      12 t b t \054 0 0 smgrin smgrout smgrin smgrout s _null_ ));
 DESCR("storage manager");
 
 /* OIDS 300 - 399 */
@@ -242,163 +255,163 @@ DESCR("storage manager");
 /* OIDS 500 - 599 */
 
 /* OIDS 600 - 699 */
-DATA(insert OID = 600 (  point    PGUID 16  24 f b t \054 0 701 point_in point_out point_in point_out d _null_ ));
+DATA(insert OID = 600 (  point    PGUID 16  24 f b t \054 0 701 point_in point_out point_in point_out d _null_ ));
 DESCR("geometric point '(x, y)'");
 #define POINTOID               600
-DATA(insert OID = 601 (  lseg     PGUID 32  48 f b t \054 0 600 lseg_in lseg_out lseg_in lseg_out d _null_ ));
+DATA(insert OID = 601 (  lseg     PGUID 32  48 f b t \054 0 600 lseg_in lseg_out lseg_in lseg_out d _null_ ));
 DESCR("geometric line segment '(pt1,pt2)'");
 #define LSEGOID                        601
-DATA(insert OID = 602 (  path     PGUID -1  -1 f b t \054 0 600 path_in path_out path_in path_out d _null_ ));
+DATA(insert OID = 602 (  path     PGUID -1  -1 f b t \054 0 600 path_in path_out path_in path_out d _null_ ));
 DESCR("geometric path '(pt1,...)'");
 #define PATHOID                        602
-DATA(insert OID = 603 (  box      PGUID 32 100 f b t \073 0 600 box_in box_out box_in box_out d _null_ ));
+DATA(insert OID = 603 (  box      PGUID 32 100 f b t \073 0 600 box_in box_out box_in box_out d _null_ ));
 DESCR("geometric box '(lower left,upper right)'");
 #define BOXOID                 603
-DATA(insert OID = 604 (  polygon   PGUID -1  -1 f b t \054 0   0 poly_in poly_out poly_in poly_out d _null_ ));
+DATA(insert OID = 604 (  polygon   PGUID -1  -1 f b t \054 0   0 poly_in poly_out poly_in poly_out d _null_ ));
 DESCR("geometric polygon '(pt1,...)'");
 #define POLYGONOID             604
-DATA(insert OID = 605 (  filename  PGUID 256 -1 f b t \054 0  18 filename_in filename_out filename_in filename_out i _null_ ));
+DATA(insert OID = 605 (  filename  PGUID 256 -1 f b t \054 0  18 filename_in filename_out filename_in filename_out i _null_ ));
 DESCR("filename used in system tables");
 
-DATA(insert OID = 628 (  line     PGUID 32  48 f b t \054 0 701 line_in line_out line_in line_out d _null_ ));
+DATA(insert OID = 628 (  line     PGUID 32  48 f b t \054 0 701 line_in line_out line_in line_out d _null_ ));
 DESCR("geometric line '(pt1,pt2)'");
 #define LINEOID                        628
-DATA(insert OID = 629 (  _line    PGUID  -1 -1 f b t \054 0 628 array_in array_out array_in array_out d _null_ ));
+DATA(insert OID = 629 (  _line    PGUID  -1 -1 f b t \054 0 628 array_in array_out array_in array_out d _null_ ));
 DESCR("");
 
 /* OIDS 700 - 799 */
 
-DATA(insert OID = 700 (  float4    PGUID  4  12 f b t \054 0   0 float4in float4out float4in float4out i _null_ ));
+DATA(insert OID = 700 (  float4    PGUID  4  12 f b t \054 0   0 float4in float4out float4in float4out i _null_ ));
 DESCR("single-precision floating point number, 4-byte storage");
 #define FLOAT4OID 700
-DATA(insert OID = 701 (  float8    PGUID  8  24 f b t \054 0   0 float8in float8out float8in float8out d _null_ ));
+DATA(insert OID = 701 (  float8    PGUID  8  24 f b t \054 0   0 float8in float8out float8in float8out d _null_ ));
 DESCR("double-precision floating point number, 8-byte storage");
 #define FLOAT8OID 701
-DATA(insert OID = 702 (  abstime   PGUID  4  20 t b t \054 0   0 nabstimein nabstimeout nabstimein nabstimeout i _null_ ));
+DATA(insert OID = 702 (  abstime   PGUID  4  20 t b t \054 0   0 nabstimein nabstimeout nabstimein nabstimeout i _null_ ));
 DESCR("absolute, limited-range date and time (Unix system time)");
 #define ABSTIMEOID             702
-DATA(insert OID = 703 (  reltime   PGUID  4  20 t b t \054 0   0 reltimein reltimeout reltimein reltimeout i _null_ ));
+DATA(insert OID = 703 (  reltime   PGUID  4  20 t b t \054 0   0 reltimein reltimeout reltimein reltimeout i _null_ ));
 DESCR("relative, limited-range time interval (Unix delta time)");
 #define RELTIMEOID             703
-DATA(insert OID = 704 (  tinterval PGUID 12  47 f b t \054 0   0 tintervalin tintervalout tintervalin tintervalout i _null_ ));
+DATA(insert OID = 704 (  tinterval PGUID 12  47 f b t \054 0   0 tintervalin tintervalout tintervalin tintervalout i _null_ ));
 DESCR("(abstime,abstime), time interval");
 #define TINTERVALOID   704
-DATA(insert OID = 705 (  unknown   PGUID -1  -1 f b t \054 0   18 textin textout textin textout i _null_ ));
+DATA(insert OID = 705 (  unknown   PGUID -1  -1 f b t \054 0   18 textin textout textin textout i _null_ ));
 DESCR("");
 #define UNKNOWNOID             705
 
-DATA(insert OID = 718 (  circle    PGUID  24 47 f b t \054 0   0 circle_in circle_out circle_in circle_out d _null_ ));
+DATA(insert OID = 718 (  circle    PGUID  24 47 f b t \054 0   0 circle_in circle_out circle_in circle_out d _null_ ));
 DESCR("geometric circle '(center,radius)'");
 #define CIRCLEOID              718
-DATA(insert OID = 719 (  _circle   PGUID  -1 -1 f b t \054 0  718 array_in array_out array_in array_out d _null_ ));
-DATA(insert OID = 790 (  money    PGUID   4 24 f b t \054 0    0 cash_in cash_out cash_in cash_out i _null_ ));
+DATA(insert OID = 719 (  _circle   PGUID  -1 -1 f b t \054 0  718 array_in array_out array_in array_out d _null_ ));
+DATA(insert OID = 790 (  money    PGUID   4 24 f b t \054 0    0 cash_in cash_out cash_in cash_out i _null_ ));
 DESCR("$d,ddd.cc, money");
 #define CASHOID 790
-DATA(insert OID = 791 (  _money    PGUID  -1 -1 f b t \054 0  790 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 791 (  _money    PGUID  -1 -1 f b t \054 0  790 array_in array_out array_in array_out i _null_ ));
 
 /* OIDS 800 - 899 */
-DATA(insert OID = 829 ( macaddr    PGUID  6 -1 f b t \054 0 0 macaddr_in macaddr_out macaddr_in macaddr_out i _null_ ));
+DATA(insert OID = 829 ( macaddr    PGUID  6 -1 f b t \054 0 0 macaddr_in macaddr_out macaddr_in macaddr_out i _null_ ));
 DESCR("XX:XX:XX:XX:XX, MAC address");
-DATA(insert OID = 869 ( inet      PGUID  -1 -1 f b t \054 0 0 inet_in inet_out inet_in inet_out i _null_ ));
+DATA(insert OID = 869 ( inet      PGUID  -1 -1 f b t \054 0 0 inet_in inet_out inet_in inet_out i _null_ ));
 DESCR("IP address/netmask, host address, netmask optional");
 #define INETOID 869
-DATA(insert OID = 650 ( cidr      PGUID  -1 -1 f b t \054 0 0 cidr_in cidr_out cidr_in cidr_out i _null_ ));
+DATA(insert OID = 650 ( cidr      PGUID  -1 -1 f b t \054 0 0 cidr_in cidr_out cidr_in cidr_out i _null_ ));
 DESCR("network IP address/netmask, network address");
 #define CIDROID 650
 
 /* OIDS 900 - 999 */
 
 /* OIDS 1000 - 1099 */
-DATA(insert OID = 1000 (  _bool                 PGUID -1  -1 f b t \054 0      16 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1001 (  _bytea        PGUID -1  -1 f b t \054 0      17 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1002 (  _char                 PGUID -1  -1 f b t \054 0      18 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1003 (  _name                 PGUID -1  -1 f b t \054 0      19 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1005 (  _int2                 PGUID -1  -1 f b t \054 0      21 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1006 (  _int2vector PGUID -1 -1 f b t \054 0 22 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1007 (  _int4                 PGUID -1  -1 f b t \054 0      23 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1008 (  _regproc      PGUID -1  -1 f b t \054 0      24 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1009 (  _text                 PGUID -1  -1 f b t \054 0      25 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1028 (  _oid          PGUID -1  -1 f b t \054 0      26 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1010 (  _tid          PGUID -1  -1 f b t \054 0      27 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1011 (  _xid          PGUID -1  -1 f b t \054 0      28 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1012 (  _cid          PGUID -1  -1 f b t \054 0      29 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1013 (  _oidvector PGUID -1  -1 f b t \054 0 30 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1014 (  _bpchar       PGUID -1  -1 f b t \054 0 1042 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1015 (  _varchar      PGUID -1  -1 f b t \054 0 1043 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1016 (  _int8                 PGUID -1  -1 f b t \054 0      20 array_in array_out array_in array_out d _null_ ));
-DATA(insert OID = 1017 (  _point        PGUID -1  -1 f b t \054 0 600 array_in array_out array_in array_out d _null_ ));
-DATA(insert OID = 1018 (  _lseg                 PGUID -1  -1 f b t \054 0 601 array_in array_out array_in array_out d _null_ ));
-DATA(insert OID = 1019 (  _path                 PGUID -1  -1 f b t \054 0 602 array_in array_out array_in array_out d _null_ ));
-DATA(insert OID = 1020 (  _box          PGUID -1  -1 f b t \073 0 603 array_in array_out array_in array_out d _null_ ));
-DATA(insert OID = 1021 (  _float4       PGUID -1  -1 f b t \054 0 700 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1022 (  _float8       PGUID -1  -1 f b t \054 0 701 array_in array_out array_in array_out d _null_ ));
-DATA(insert OID = 1023 (  _abstime      PGUID -1  -1 f b t \054 0 702 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1024 (  _reltime      PGUID -1  -1 f b t \054 0 703 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1025 (  _tinterval PGUID -1  -1 f b t \054 0 704 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1026 (  _filename  PGUID -1  -1 f b t \054 0 605 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1027 (  _polygon      PGUID -1  -1 f b t \054 0 604 array_in array_out array_in array_out d _null_ ));
+DATA(insert OID = 1000 (  _bool                 PGUID -1  -1 f b t \054 0      16 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1001 (  _bytea        PGUID -1  -1 f b t \054 0      17 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1002 (  _char                 PGUID -1  -1 f b t \054 0      18 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1003 (  _name                 PGUID -1  -1 f b t \054 0      19 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1005 (  _int2                 PGUID -1  -1 f b t \054 0      21 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1006 (  _int2vector PGUID -1 -1 f b t \054 0 22 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1007 (  _int4                 PGUID -1  -1 f b t \054 0      23 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1008 (  _regproc      PGUID -1  -1 f b t \054 0      24 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1009 (  _text                 PGUID -1  -1 f b t \054 0      25 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1028 (  _oid          PGUID -1  -1 f b t \054 0      26 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1010 (  _tid          PGUID -1  -1 f b t \054 0      27 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1011 (  _xid          PGUID -1  -1 f b t \054 0      28 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1012 (  _cid          PGUID -1  -1 f b t \054 0      29 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1013 (  _oidvector PGUID -1  -1 f b t \054 0 30 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1014 (  _bpchar       PGUID -1  -1 f b t \054 0 1042 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1015 (  _varchar      PGUID -1  -1 f b t \054 0 1043 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1016 (  _int8                 PGUID -1  -1 f b t \054 0      20 array_in array_out array_in array_out d _null_ ));
+DATA(insert OID = 1017 (  _point        PGUID -1  -1 f b t \054 0 600 array_in array_out array_in array_out d _null_ ));
+DATA(insert OID = 1018 (  _lseg                 PGUID -1  -1 f b t \054 0 601 array_in array_out array_in array_out d _null_ ));
+DATA(insert OID = 1019 (  _path                 PGUID -1  -1 f b t \054 0 602 array_in array_out array_in array_out d _null_ ));
+DATA(insert OID = 1020 (  _box          PGUID -1  -1 f b t \073 0 603 array_in array_out array_in array_out d _null_ ));
+DATA(insert OID = 1021 (  _float4       PGUID -1  -1 f b t \054 0 700 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1022 (  _float8       PGUID -1  -1 f b t \054 0 701 array_in array_out array_in array_out d _null_ ));
+DATA(insert OID = 1023 (  _abstime      PGUID -1  -1 f b t \054 0 702 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1024 (  _reltime      PGUID -1  -1 f b t \054 0 703 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1025 (  _tinterval PGUID -1  -1 f b t \054 0 704 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1026 (  _filename  PGUID -1  -1 f b t \054 0 605 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1027 (  _polygon      PGUID -1  -1 f b t \054 0 604 array_in array_out array_in array_out d _null_ ));
 /*
  *     Note: the size of aclitem needs to match sizeof(AclItem) in acl.h.
  *     Thanks to some padding, this will be 8 on all platforms.
  *     We also have an Assert to make sure.
  */
 #define ACLITEMSIZE 8
-DATA(insert OID = 1033 (  aclitem       PGUID 8   -1 f b t \054 0 0 aclitemin aclitemout aclitemin aclitemout i _null_ ));
+DATA(insert OID = 1033 (  aclitem       PGUID 8   -1 f b t \054 0 0 aclitemin aclitemout aclitemin aclitemout i _null_ ));
 DESCR("access control list");
-DATA(insert OID = 1034 (  _aclitem      PGUID -1 -1 f b t \054 0 1033 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1040 (  _macaddr      PGUID -1 -1 f b t \054 0  829 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1041 (  _inet    PGUID -1 -1 f b t \054 0  869 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 651  (  _cidr    PGUID -1 -1 f b t \054 0  650 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1042 ( bpchar                 PGUID -1  -1 f b t \054 0      18 bpcharin bpcharout bpcharin bpcharout i _null_ ));
+DATA(insert OID = 1034 (  _aclitem      PGUID -1 -1 f b t \054 0 1033 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1040 (  _macaddr      PGUID -1 -1 f b t \054 0  829 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1041 (  _inet    PGUID -1 -1 f b t \054 0  869 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 651  (  _cidr    PGUID -1 -1 f b t \054 0  650 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1042 ( bpchar                 PGUID -1  -1 f b t \054 0      18 bpcharin bpcharout bpcharin bpcharout i _null_ ));
 DESCR("char(length), blank-padded string, fixed storage length");
 #define BPCHAROID              1042
-DATA(insert OID = 1043 ( varchar        PGUID -1  -1 f b t \054 0      18 varcharin varcharout varcharin varcharout i _null_ ));
+DATA(insert OID = 1043 ( varchar        PGUID -1  -1 f b t \054 0      18 varcharin varcharout varcharin varcharout i _null_ ));
 DESCR("varchar(length), non-blank-padded string, variable storage length");
 #define VARCHAROID             1043
 
-DATA(insert OID = 1082 ( date           PGUID  4  10 t b t \054 0      0 date_in date_out date_in date_out i _null_ ));
+DATA(insert OID = 1082 ( date           PGUID  4  10 t b t \054 0      0 date_in date_out date_in date_out i _null_ ));
 DESCR("ANSI SQL date");
 #define DATEOID                        1082
-DATA(insert OID = 1083 ( time           PGUID  8  16 f b t \054 0      0 time_in time_out time_in time_out d _null_ ));
+DATA(insert OID = 1083 ( time           PGUID  8  16 f b t \054 0      0 time_in time_out time_in time_out d _null_ ));
 DESCR("hh:mm:ss, ANSI SQL time");
 #define TIMEOID                        1083
 
 /* OIDS 1100 - 1199 */
-DATA(insert OID = 1182 ( _date          PGUID  -1 -1 f b t \054 0      1082 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1183 ( _time          PGUID  -1 -1 f b t \054 0      1083 array_in array_out array_in array_out d _null_ ));
-DATA(insert OID = 1184 ( timestamp      PGUID  8  47 f b t \054 0      0 timestamp_in timestamp_out timestamp_in timestamp_out d _null_ ));
+DATA(insert OID = 1182 ( _date          PGUID  -1 -1 f b t \054 0      1082 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1183 ( _time          PGUID  -1 -1 f b t \054 0      1083 array_in array_out array_in array_out d _null_ ));
+DATA(insert OID = 1184 ( timestamp      PGUID  8  47 f b t \054 0      0 timestamp_in timestamp_out timestamp_in timestamp_out d _null_ ));
 DESCR("date and time");
 #define TIMESTAMPOID   1184
-DATA(insert OID = 1185 ( _timestamp  PGUID     -1 -1 f b t \054 0      1184 array_in array_out array_in array_out d _null_ ));
-DATA(insert OID = 1186 ( interval       PGUID 12  47 f b t \054 0      0 interval_in interval_out interval_in interval_out d _null_ ));
+DATA(insert OID = 1185 ( _timestamp  PGUID     -1 -1 f b t \054 0      1184 array_in array_out array_in array_out d _null_ ));
+DATA(insert OID = 1186 ( interval       PGUID 12  47 f b t \054 0      0 interval_in interval_out interval_in interval_out d _null_ ));
 DESCR("@ <number> <units>, time interval");
 #define INTERVALOID            1186
-DATA(insert OID = 1187 ( _interval      PGUID  -1 -1 f b t \054 0      1186 array_in array_out array_in array_out d _null_ ));
+DATA(insert OID = 1187 ( _interval      PGUID  -1 -1 f b t \054 0      1186 array_in array_out array_in array_out d _null_ ));
 
 /* OIDS 1200 - 1299 */
-DATA(insert OID = 1231 (  _numeric      PGUID -1  -1 f b t \054 0      1700 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1266 ( timetz                 PGUID 12  22 f b t \054 0      0 timetz_in timetz_out timetz_in timetz_out d _null_ ));
+DATA(insert OID = 1231 (  _numeric      PGUID -1  -1 f b t \054 0      1700 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1266 ( timetz                 PGUID 12  22 f b t \054 0      0 timetz_in timetz_out timetz_in timetz_out d _null_ ));
 DESCR("hh:mm:ss, ANSI SQL time");
 #define TIMETZOID              1266
-DATA(insert OID = 1270 ( _timetz        PGUID  -1 -1 f b t \054 0      1266 array_in array_out array_in array_out d _null_ ));
+DATA(insert OID = 1270 ( _timetz        PGUID  -1 -1 f b t \054 0      1266 array_in array_out array_in array_out d _null_ ));
 
 /* OIDS 1500 - 1599 */
-DATA(insert OID = 1560 ( bit            PGUID -1  -1 f b t \054 0      0 zpbit_in zpbit_out zpbit_in zpbit_out i _null_ ));
+DATA(insert OID = 1560 ( bit            PGUID -1  -1 f b t \054 0      0 zpbit_in zpbit_out zpbit_in zpbit_out i _null_ ));
 DESCR("fixed-length bit string");
 #define ZPBITOID        1560
-DATA(insert OID = 1561 ( _bit           PGUID  -1 -1 f b t \054 0      1560 array_in array_out array_in array_out i _null_ ));
-DATA(insert OID = 1562 ( varbit                 PGUID -1  -1 f b t \054 0      0 varbit_in varbit_out varbit_in varbit_out i _null_ ));
+DATA(insert OID = 1561 ( _bit           PGUID  -1 -1 f b t \054 0      1560 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1562 ( varbit                 PGUID -1  -1 f b t \054 0      0 varbit_in varbit_out varbit_in varbit_out i _null_ ));
 DESCR("fixed-length bit string");
 #define VARBITOID        1562
-DATA(insert OID = 1563 ( _varbit        PGUID  -1 -1 f b t \054 0      1562 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1563 ( _varbit        PGUID  -1 -1 f b t \054 0      1562 array_in array_out array_in array_out i _null_ ));
 
 /* OIDS 1600 - 1699 */
-DATA(insert OID = 1625 ( lztext                 PGUID -1  -1 f b t \054 0      0 lztextin lztextout lztextin lztextout i _null_ ));
+DATA(insert OID = 1625 ( lztext                 PGUID -1  -1 f b t \054 0      0 lztextin lztextout lztextin lztextout i _null_ ));
 DESCR("variable-length string, stored compressed");
 #define LZTEXTOID        1625
 
 /* OIDS 1700 - 1799 */
-DATA(insert OID = 1700 ( numeric          PGUID -1  -1 f b t \054 0  0 numeric_in numeric_out numeric_in numeric_out i _null_ ));
+DATA(insert OID = 1700 ( numeric          PGUID -1  -1 f b t \054 0  0 numeric_in numeric_out numeric_in numeric_out i _null_ ));
 DESCR("numeric(precision, decimal), arbitrary precision number");
 #define NUMERICOID             1700
 
@@ -421,7 +434,8 @@ extern Oid TypeCreate(char *typeName,
                   char *sendProcedure,
                   char *elementTypeName,
                   char *defaultTypeValue,
-                  bool passedByValue, char alignment);
+                  bool passedByValue, char alignment,
+                  char storage);
 extern void TypeRename(const char *oldTypeName, const char *newTypeName);
 extern char *makeArrayTypeName(char *typeName);
 
index 8cb31889fa06eb8260eef5e41950e49f0d93512a..e870126355754f38a8228b4e5748bd75b09f9d39 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: command.h,v 1.19 2000/06/28 03:32:57 tgl Exp $
+ * $Id: command.h,v 1.20 2000/07/03 23:10:10 wieck Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -58,6 +58,8 @@ extern void AlterTableDropConstraint(const char *relationName,
                                                 bool inh, const char *constrName,
                                                 int behavior);
 
+extern void AlterTableCreateToastTable(const char *relationName);
+
 /*
  * LOCK
  */
index a4a7fda1109f93b54fa69640c55b814d2afa97e0..f11e28ed9f927f1a5a46d6541ad5a7ab19bb5027 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1995, Regents of the University of California
  *
- * $Id: postgres.h,v 1.42 2000/06/28 03:32:56 tgl Exp $
+ * $Id: postgres.h,v 1.43 2000/07/03 23:09:56 wieck Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -71,8 +71,12 @@ struct varlena
        char            vl_dat[1];
 };
 
+#define TUPLE_TOASTER_ACTIVE
+
+#ifndef TUPLE_TOASTER_ACTIVE
 #define VARSIZE(PTR)   (((struct varlena *)(PTR))->vl_len)
 #define VARDATA(PTR)   (((struct varlena *)(PTR))->vl_dat)
+#endif
 #define VARHDRSZ               ((int32) sizeof(int32))
 
 /*
@@ -89,8 +93,6 @@ typedef struct varlena VarChar;       /* var-length char, ie SQL varchar(n) */
  * Proposed new layout for variable length attributes
  * DO NOT USE YET - Jan
  */
-#undef TUPLE_TOASTER_ACTIVE
-#undef TUPLE_TOASTER_ALL_TYPES
 
 #ifdef TUPLE_TOASTER_ACTIVE
 typedef struct varattrib
@@ -102,14 +104,17 @@ typedef struct varattrib
                struct
                {
                        int32           va_rawsize;             /* Plain data size */
+                       char            va_data[1];             /* Compressed data */
                }                       va_compressed;          /* Compressed stored attribute */
 
                struct
                {
                        int32           va_rawsize;             /* Plain data size */
+                       int32           va_extsize;             /* External saved size */
                        Oid                     va_valueid;             /* Unique identifier of value */
-                       Oid                     va_longrelid;   /* RelID where to find chunks */
-                       Oid                     va_rowid;               /* Main tables row Oid */
+                       Oid                     va_toastrelid;  /* RelID where to find chunks */
+                       Oid                     va_toastidxid;  /* Main tables row Oid */
+                       Oid                     va_rowid;               /* Referencing row Oid */
                        int16           va_attno;               /* Main tables attno */
                }                       va_external;/* External stored attribute */
 
@@ -117,14 +122,18 @@ typedef struct varattrib
        }                       va_content;
 }                      varattrib;
 
-#define VARATT_FLAG_EXTERNAL   0x8000
-#define VARATT_FLAG_COMPRESSED 0x4000
-#define VARATT_MASK_FLAGS              0xc000
-#define VARATT_MASK_SIZE               0x3fff
+#define VARATT_FLAG_EXTERNAL   0x80000000
+#define VARATT_FLAG_COMPRESSED 0x40000000
+#define VARATT_MASK_FLAGS              0xc0000000
+#define VARATT_MASK_SIZE               0x3fffffff
 
 #define VARATT_SIZEP(_PTR)     (((varattrib *)(_PTR))->va_header)
 #define VARATT_SIZE(PTR)       (VARATT_SIZEP(PTR) & VARATT_MASK_SIZE)
 #define VARATT_DATA(PTR)       (((varattrib *)(PTR))->va_content.va_data)
+#define VARATT_CDATA(PTR)      (((varattrib *)(PTR))->va_content.va_compressed.va_data)
+
+#define VARSIZE(__PTR)         VARATT_SIZE(__PTR)
+#define VARDATA(__PTR)         VARATT_DATA(__PTR)
 
 #define VARATT_IS_EXTENDED(PTR)                \
                                ((VARATT_SIZEP(PTR) & VARATT_MASK_FLAGS) != 0)
@@ -142,12 +151,12 @@ typedef struct varattrib
 extern varattrib *heap_tuple_untoast_attr(varattrib * attr);
 
 #define VARATT_GETPLAIN(_ARG,_VAR) {                                                           \
-                               if (VARATTR_IS_EXTENDED(_ARG))                                          \
+                               if (VARATT_IS_EXTENDED(_ARG))                                           \
                                        (_VAR) = (void *)heap_tuple_untoast_attr(_ARG); \
                                else                                                                                            \
-                                       (_VAR) = (_ARG);                                                                \
+                                       (_VAR) = (void *)(_ARG);                                                \
                        }
-#define VARATT_FREE(_ARG,VAR) do {                                                                     \
+#define VARATT_FREE(_ARG,_VAR) do {                                                                    \
                                if ((void *)(_VAR) != (void *)(_ARG))                           \
                                        pfree((void *)(_VAR));                                                  \
                        } while (0)
index 8936ffb133d04e94432ee95f9e1213ab6444a693..be57c7478b7c3c0fb01c56d4dff379306921254f 100644 (file)
@@ -1,7 +1,7 @@
 /* ----------
  * lztext.h
  *
- * $Header: /cvsroot/pgsql/src/include/utils/Attic/lztext.h,v 1.3 2000/04/12 17:16:55 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/include/utils/Attic/lztext.h,v 1.4 2000/07/03 23:10:14 wieck Exp $
  *
  *     Definitions for the lztext compressed data type
  * ----------
 #ifndef _LZTEXT_H_
 #define _LZTEXT_H_
 
-#include "utils/pg_lzcompress.h"
-
-
 /* ----------
- * The internal storage format of an LZ compressed text field
+ * The internal storage format of an LZ compressed text field is varattrib
  * ----------
  */
-typedef PGLZ_Header lztext;
+typedef varattrib lztext;
 
 #endif  /* _LZTEXT_H_ */