Commit 57d8080a authored by Jan Wieck's avatar Jan Wieck

TOAST

    WARNING: This is actually broken - we have self-deadlocks
	         due to concurrent changes in buffer management.
			 Vadim and me are working on it.

Jan
parent ef5bea51
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* *
* *
* IDENTIFICATION * 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 * NOTES
* The old interface functions have been converted to macros * The old interface functions have been converted to macros
...@@ -119,7 +119,11 @@ DataFill(char *data, ...@@ -119,7 +119,11 @@ DataFill(char *data,
{ {
case -1: case -1:
*infomask |= HEAP_HASVARLENA; *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); memmove(data, DatumGetPointer(value[i]), data_length);
break; break;
case sizeof(char): case sizeof(char):
...@@ -816,7 +820,7 @@ heap_freetuple(HeapTuple htup) ...@@ -816,7 +820,7 @@ heap_freetuple(HeapTuple htup)
if (htup->t_data != NULL) if (htup->t_data != NULL)
if (htup->t_datamcxt != NULL && (char *) (htup->t_data) != if (htup->t_datamcxt != NULL && (char *) (htup->t_data) !=
((char *) htup + HEAPTUPLESIZE)) ((char *) htup + HEAPTUPLESIZE))
elog(NOTICE, "TELL Jan Wieck: heap_freetuple() found separate t_data"); pfree(htup->t_data);
pfree(htup); pfree(htup);
} }
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 * NOTES
* some of the executor utility code such as "ExecTypeFromTL" should be * some of the executor utility code such as "ExecTypeFromTL" should be
...@@ -434,23 +434,16 @@ TupleDescInitEntry(TupleDesc desc, ...@@ -434,23 +434,16 @@ TupleDescInitEntry(TupleDesc desc,
att->attlen = typeLen(t); att->attlen = typeLen(t);
att->attbyval = typeByVal(t); att->attbyval = typeByVal(t);
att->attstorage = 'p';
} }
else else
{ {
att->attlen = typeForm->typlen; att->attlen = typeForm->typlen;
att->attbyval = typeForm->typbyval; att->attbyval = typeForm->typbyval;
/* /*
* This will enable ALL variable size attributes of user * Default to the types storage
* relations for automatic move off into "secondary" relation.
* Jan
*/ */
#ifdef TUPLE_TOASTER_ACTIVE #ifdef TUPLE_TOASTER_ACTIVE
#ifdef TUPLE_TOASTER_ALL_TYPES att->attstorage = typeForm->typstorage;
att->attstorage = (att->attlen == -1) ? 'e' : 'p';
#else
att->attstorage = 'p';
#endif
#else #else
att->attstorage = 'p'; att->attstorage = 'p';
#endif #endif
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* *
* IDENTIFICATION * 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, ...@@ -546,7 +546,7 @@ gistAdjustKeys(Relation r,
oldud += sizeof(IndexTupleData); oldud += sizeof(IndexTupleData);
evec = (bytea *) palloc(2 * sizeof(GISTENTRY) + VARHDRSZ); 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 */ /* insert decompressed oldud into entry vector */
gistdentryinit(giststate, &((GISTENTRY *) VARDATA(evec))[0], gistdentryinit(giststate, &((GISTENTRY *) VARDATA(evec))[0],
...@@ -741,7 +741,7 @@ gistSplit(Relation r, ...@@ -741,7 +741,7 @@ gistSplit(Relation r,
else else
decompvec[maxoff + 1] = FALSE; 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 */ /* now let the user-defined picksplit function set up the split vector */
FunctionCall2(&giststate->picksplitFn, FunctionCall2(&giststate->picksplitFn,
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 * INTERFACE ROUTINES
...@@ -1299,6 +1299,17 @@ heap_insert(Relation relation, HeapTuple tup) ...@@ -1299,6 +1299,17 @@ heap_insert(Relation relation, HeapTuple tup)
tup->t_data->t_infomask &= ~(HEAP_XACT_MASK); tup->t_data->t_infomask &= ~(HEAP_XACT_MASK);
tup->t_data->t_infomask |= HEAP_XMAX_INVALID; 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 */ /* Find buffer for this tuple */
buffer = RelationGetBufferForTuple(relation, tup->t_len, InvalidBuffer); buffer = RelationGetBufferForTuple(relation, tup->t_len, InvalidBuffer);
...@@ -1328,8 +1339,8 @@ heap_insert(Relation relation, HeapTuple tup) ...@@ -1328,8 +1339,8 @@ heap_insert(Relation relation, HeapTuple tup)
} }
#endif #endif
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
WriteBuffer(buffer); WriteBuffer(buffer);
LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
if (IsSystemRelationName(RelationGetRelationName(relation))) if (IsSystemRelationName(RelationGetRelationName(relation)))
RelationMark4RollbackHeapTuple(relation, tup); RelationMark4RollbackHeapTuple(relation, tup);
...@@ -1441,6 +1452,16 @@ l1: ...@@ -1441,6 +1452,16 @@ l1:
tp.t_data->t_infomask &= ~(HEAP_XMAX_COMMITTED | tp.t_data->t_infomask &= ~(HEAP_XMAX_COMMITTED |
HEAP_XMAX_INVALID | HEAP_MARKED_FOR_UPDATE); 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); LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
/* invalidate caches */ /* invalidate caches */
...@@ -1559,6 +1580,19 @@ l2: ...@@ -1559,6 +1580,19 @@ l2:
oldtup.t_data->t_infomask &= ~(HEAP_XMAX_COMMITTED | oldtup.t_data->t_infomask &= ~(HEAP_XMAX_COMMITTED |
HEAP_XMAX_INVALID | HEAP_MARKED_FOR_UPDATE); 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 */ /* record address of new tuple in t_ctid of old one */
oldtup.t_data->t_ctid = newtup->t_self; oldtup.t_data->t_ctid = newtup->t_self;
......
This diff is collapsed.
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * 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) ...@@ -571,7 +571,7 @@ DefineAttr(char *name, char *type, int attnum)
attrtypes[attnum]->attnum = 1 + attnum; /* fillatt */ attrtypes[attnum]->attnum = 1 + attnum; /* fillatt */
attlen = attrtypes[attnum]->attlen = Ap->am_typ.typlen; attlen = attrtypes[attnum]->attlen = Ap->am_typ.typlen;
attrtypes[attnum]->attbyval = Ap->am_typ.typbyval; 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; attrtypes[attnum]->attalign = Ap->am_typ.typalign;
} }
else else
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 * INTERFACE ROUTINES
...@@ -730,7 +730,8 @@ AddNewRelationType(char *typeName, Oid new_rel_oid) ...@@ -730,7 +730,8 @@ AddNewRelationType(char *typeName, Oid new_rel_oid)
NULL, /* array element type - irrelevent */ NULL, /* array element type - irrelevent */
"-", /* default type value */ "-", /* default type value */
(bool) 1, /* passed by 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) ...@@ -1423,6 +1424,7 @@ heap_drop_with_catalog(const char *relname)
Relation rel; Relation rel;
Oid rid; Oid rid;
bool istemp = (get_temp_rel_by_username(relname) != NULL); bool istemp = (get_temp_rel_by_username(relname) != NULL);
bool has_toasttable;
/* ---------------- /* ----------------
* Open and lock the relation. * Open and lock the relation.
...@@ -1520,6 +1522,11 @@ heap_drop_with_catalog(const char *relname) ...@@ -1520,6 +1522,11 @@ heap_drop_with_catalog(const char *relname)
smgrunlink(DEFAULT_SMGR, rel); smgrunlink(DEFAULT_SMGR, rel);
rel->rd_unlinked = true; 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 * Close relcache entry, but *keep* AccessExclusiveLock on the
* relation until transaction commit. This ensures no one else will * relation until transaction commit. This ensures no one else will
...@@ -1535,6 +1542,20 @@ heap_drop_with_catalog(const char *relname) ...@@ -1535,6 +1542,20 @@ heap_drop_with_catalog(const char *relname)
if (istemp) if (istemp)
remove_temp_relation(rid); 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;
}
} }
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -186,7 +186,8 @@ TypeShellMakeWithOpenRelation(Relation pg_type_desc, char *typeName)
values[i++] = (Datum) InvalidOid; /* 12 */ values[i++] = (Datum) InvalidOid; /* 12 */
values[i++] = (Datum) InvalidOid; /* 13 */ values[i++] = (Datum) InvalidOid; /* 13 */
values[i++] = (Datum) InvalidOid; /* 14 */ 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 * ... and fill typdefault with a bogus value
...@@ -287,7 +288,8 @@ TypeCreate(char *typeName, ...@@ -287,7 +288,8 @@ TypeCreate(char *typeName,
char *elementTypeName, char *elementTypeName,
char *defaultTypeValue, /* internal rep */ char *defaultTypeValue, /* internal rep */
bool passedByValue, bool passedByValue,
char alignment) char alignment,
char storage)
{ {
int i, int i,
j; j;
...@@ -448,11 +450,17 @@ TypeCreate(char *typeName, ...@@ -448,11 +450,17 @@ TypeCreate(char *typeName,
*/ */
values[i++] = (Datum) alignment; /* 15 */ values[i++] = (Datum) alignment; /* 15 */
/* ----------------
* set default storage for TOAST
* ----------------
*/
values[i++] = (Datum) storage; /* 16 */
/* ---------------- /* ----------------
* initialize the default value for this type. * initialize the default value for this type.
* ---------------- * ----------------
*/ */
values[i] = (Datum) textin(PointerIsValid(defaultTypeValue) /* 16 */ values[i] = (Datum) textin(PointerIsValid(defaultTypeValue) /* 17 */
? defaultTypeValue : "-"); /* XXX default ? defaultTypeValue : "-"); /* XXX default
* typdefault */ * typdefault */
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 * NOTES
* The PerformAddAttribute() code, like most of the relation * The PerformAddAttribute() code, like most of the relation
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include "catalog/pg_index.h" #include "catalog/pg_index.h"
#include "parser/parse.h" #include "parser/parse.h"
#endif /* _DROP_COLUMN_HACK__ */ #endif /* _DROP_COLUMN_HACK__ */
#include "access/genam.h"
/* -------------------------------- /* --------------------------------
...@@ -438,7 +439,7 @@ AlterTableAddColumn(const char *relationName, ...@@ -438,7 +439,7 @@ AlterTableAddColumn(const char *relationName,
attribute->attbyval = tform->typbyval; attribute->attbyval = tform->typbyval;
attribute->attnelems = attnelems; attribute->attnelems = attnelems;
attribute->attisset = (bool) (tform->typtype == 'c'); attribute->attisset = (bool) (tform->typtype == 'c');
attribute->attstorage = 'p'; attribute->attstorage = tform->typstorage;
attribute->attalign = tform->typalign; attribute->attalign = tform->typalign;
attribute->attnotnull = false; attribute->attnotnull = false;
attribute->atthasdef = (colDef->raw_default != NULL || attribute->atthasdef = (colDef->raw_default != NULL ||
...@@ -1170,6 +1171,159 @@ AlterTableDropConstraint(const char *relationName, ...@@ -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 * LOCK TABLE
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * 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 * DESCRIPTION
* The "DefineFoo" routines take the parse tree and pick out the * The "DefineFoo" routines take the parse tree and pick out the
...@@ -597,6 +597,7 @@ DefineType(char *typeName, List *parameters) ...@@ -597,6 +597,7 @@ DefineType(char *typeName, List *parameters)
char *shadow_type; char *shadow_type;
List *pl; List *pl;
char alignment = 'i';/* default alignment */ 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 * Type names can only be 15 characters long, so that the shadow type
...@@ -650,6 +651,24 @@ DefineType(char *typeName, List *parameters) ...@@ -650,6 +651,24 @@ DefineType(char *typeName, List *parameters)
a); 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 else
{ {
elog(NOTICE, "DefineType: attribute \"%s\" not recognized", elog(NOTICE, "DefineType: attribute \"%s\" not recognized",
...@@ -665,6 +684,9 @@ DefineType(char *typeName, List *parameters) ...@@ -665,6 +684,9 @@ DefineType(char *typeName, List *parameters)
if (outputName == NULL) if (outputName == NULL)
elog(ERROR, "Define: \"output\" unspecified"); 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. * now have TypeCreate do all the real work.
* ---------------- * ----------------
...@@ -682,7 +704,8 @@ DefineType(char *typeName, List *parameters) ...@@ -682,7 +704,8 @@ DefineType(char *typeName, List *parameters)
elemName, /* element type name */ elemName, /* element type name */
defaultValue, /* default type value */ defaultValue, /* default type value */
byValue, /* passed by value */ byValue, /* passed by value */
alignment); alignment,
storage); /* TOAST strategy */
/* ---------------- /* ----------------
* When we create a true type (as opposed to a complex type) * When we create a true type (as opposed to a complex type)
...@@ -704,7 +727,8 @@ DefineType(char *typeName, List *parameters) ...@@ -704,7 +727,8 @@ DefineType(char *typeName, List *parameters)
typeName, /* element type name */ typeName, /* element type name */
defaultValue, /* default type value */ defaultValue, /* default type value */
false, /* never passed by value */ false, /* never passed by value */
alignment); alignment,
'p'); /* ARRAY doesn't support TOAST yet */
pfree(shadow_type); pfree(shadow_type);
} }
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 * NOTES
* This should be moved to a more appropriate place. It is here * This should be moved to a more appropriate place. It is here
...@@ -331,7 +331,7 @@ loread(PG_FUNCTION_ARGS) ...@@ -331,7 +331,7 @@ loread(PG_FUNCTION_ARGS)
retval = (struct varlena *) palloc(VARHDRSZ + len); retval = (struct varlena *) palloc(VARHDRSZ + len);
totalread = lo_read(fd, VARDATA(retval), len); totalread = lo_read(fd, VARDATA(retval), len);
VARSIZE(retval) = totalread + VARHDRSZ; VARATT_SIZEP(retval) = totalread + VARHDRSZ;
PG_RETURN_POINTER(retval); PG_RETURN_POINTER(retval);
} }
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
* *
* *
* IDENTIFICATION * 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 * HISTORY
* AUTHOR DATE MAJOR EVENT * AUTHOR DATE MAJOR EVENT
...@@ -350,7 +350,7 @@ static void doNegateFloat(Value *v); ...@@ -350,7 +350,7 @@ static void doNegateFloat(Value *v);
OFFSET, OIDS, OPERATOR, PASSWORD, PROCEDURAL, OFFSET, OIDS, OPERATOR, PASSWORD, PROCEDURAL,
REINDEX, RENAME, RESET, RETURNS, ROW, RULE, REINDEX, RENAME, RESET, RETURNS, ROW, RULE,
SEQUENCE, SERIAL, SETOF, SHARE, SHOW, START, STATEMENT, STDIN, STDOUT, SYSID, SEQUENCE, SERIAL, SETOF, SHARE, SHOW, START, STATEMENT, STDIN, STDOUT, SYSID,
TEMP, TRUNCATE, TRUSTED, TEMP, TOAST, TRUNCATE, TRUSTED,
UNLISTEN, UNTIL, VACUUM, VALID, VERBOSE, VERSION UNLISTEN, UNTIL, VACUUM, VALID, VERBOSE, VERSION
/* Special keywords, not in the query language - see the "lex" file */ /* Special keywords, not in the query language - see the "lex" file */
...@@ -931,6 +931,14 @@ AlterTableStmt: ...@@ -931,6 +931,14 @@ AlterTableStmt:
n->behavior = $8; n->behavior = $8;
$$ = (Node *)n; $$ = (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: alter_column_action:
...@@ -5460,6 +5468,7 @@ TokenId: ABSOLUTE { $$ = "absolute"; } ...@@ -5460,6 +5468,7 @@ TokenId: ABSOLUTE { $$ = "absolute"; }
| TEMPORARY { $$ = "temporary"; } | TEMPORARY { $$ = "temporary"; }
| TIMEZONE_HOUR { $$ = "timezone_hour"; } | TIMEZONE_HOUR { $$ = "timezone_hour"; }
| TIMEZONE_MINUTE { $$ = "timezone_minute"; } | TIMEZONE_MINUTE { $$ = "timezone_minute"; }
| TOAST { $$ = "toast"; }
| TRIGGER { $$ = "trigger"; } | TRIGGER { $$ = "trigger"; }
| TRUNCATE { $$ = "truncate"; } | TRUNCATE { $$ = "truncate"; }
| TRUSTED { $$ = "trusted"; } | TRUSTED { $$ = "trusted"; }
......
...@@ -9,9 +9,9 @@ ...@@ -9,9 +9,9 @@
* *
* IDENTIFICATION * IDENTIFICATION
<<<<<<< keywords.c <<<<<<< 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 >>>>>>> 1.73
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
...@@ -245,6 +245,7 @@ static ScanKeyword ScanKeywords[] = { ...@@ -245,6 +245,7 @@ static ScanKeyword ScanKeywords[] = {
{"timezone_hour", TIMEZONE_HOUR}, {"timezone_hour", TIMEZONE_HOUR},
{"timezone_minute", TIMEZONE_MINUTE}, {"timezone_minute", TIMEZONE_MINUTE},
{"to", TO}, {"to", TO},
{"toast", TOAST},
{"trailing", TRAILING}, {"trailing", TRAILING},
{"transaction", TRANSACTION}, {"transaction", TRANSACTION},
{"trigger", TRIGGER}, {"trigger", TRIGGER},
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 * NOTES
* This cruft is the server side of PQfn. * This cruft is the server side of PQfn.
...@@ -349,7 +349,7 @@ HandleFunctionRequest() ...@@ -349,7 +349,7 @@ HandleFunctionRequest()
p = palloc(argsize + VARHDRSZ + 1); /* Added +1 to solve p = palloc(argsize + VARHDRSZ + 1); /* Added +1 to solve
* memory leak - Peter * memory leak - Peter
* 98 Jan 6 */ * 98 Jan 6 */
VARSIZE(p) = argsize + VARHDRSZ; VARATT_SIZEP(p) = argsize + VARHDRSZ;
if (pq_getbytes(VARDATA(p), argsize)) if (pq_getbytes(VARDATA(p), argsize))
return EOF; return EOF;
} }
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * 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, ...@@ -360,6 +360,9 @@ ProcessUtility(Node *parsetree,
case 'X': /* DROP CONSTRAINT */ case 'X': /* DROP CONSTRAINT */
AlterTableDropConstraint(stmt->relname, stmt->inh, stmt->name, stmt->behavior); AlterTableDropConstraint(stmt->relname, stmt->inh, stmt->name, stmt->behavior);
break; break;
case 'E': /* CREATE TOAST TABLE */
AlterTableCreateToastTable(stmt->relname);
break;
default: /* oops */ default: /* oops */
elog(ERROR, "T_AlterTableStmt: unknown subtype"); elog(ERROR, "T_AlterTableStmt: unknown subtype");
break; break;
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -813,7 +813,7 @@ array_dims(PG_FUNCTION_ARGS)
sprintf(p, "[%d:%d]", lb[i], dimv[i] + lb[i] - 1); sprintf(p, "[%d:%d]", lb[i], dimv[i] + lb[i] - 1);
p += strlen(p); p += strlen(p);
} }
VARSIZE(result) = strlen(VARDATA(result)) + VARHDRSZ; VARATT_SIZEP(result) = strlen(VARDATA(result)) + VARHDRSZ;
PG_RETURN_TEXT_P(result); PG_RETURN_TEXT_P(result);
} }
...@@ -1151,7 +1151,7 @@ array_set(ArrayType *array, ...@@ -1151,7 +1151,7 @@ array_set(ArrayType *array,
Int32GetDatum(SEEK_SET))) < 0) Int32GetDatum(SEEK_SET))) < 0)
return array; return array;
v = (struct varlena *) palloc(elmlen + VARHDRSZ); v = (struct varlena *) palloc(elmlen + VARHDRSZ);
VARSIZE(v) = elmlen + VARHDRSZ; VARATT_SIZEP(v) = elmlen + VARHDRSZ;
ArrayCastAndSet(dataValue, elmbyval, elmlen, VARDATA(v)); ArrayCastAndSet(dataValue, elmbyval, elmlen, VARDATA(v));
#ifdef LOARRAY #ifdef LOARRAY
if (DatumGetInt32(DirectFunctionCall2(lowrite, if (DatumGetInt32(DirectFunctionCall2(lowrite,
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* workings can be found in the book "Software Solutions in C" by * workings can be found in the book "Software Solutions in C" by
* Dale Schumacher, Academic Press, ISBN: 0-12-632360-7. * 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> #include <limits.h>
...@@ -730,7 +730,7 @@ cash_words_out(Cash *value) ...@@ -730,7 +730,7 @@ cash_words_out(Cash *value)
/* make a text type for output */ /* make a text type for output */
result = (text *) palloc(strlen(buf) + VARHDRSZ); result = (text *) palloc(strlen(buf) + VARHDRSZ);
VARSIZE(result) = strlen(buf) + VARHDRSZ; VARATT_SIZEP(result) = strlen(buf) + VARHDRSZ;
memcpy(VARDATA(result), buf, strlen(buf)); memcpy(VARDATA(result), buf, strlen(buf));
return result; return result;
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -162,7 +162,7 @@ char_text(PG_FUNCTION_ARGS)
char arg1 = PG_GETARG_CHAR(0); char arg1 = PG_GETARG_CHAR(0);
text *result = palloc(VARHDRSZ + 1); text *result = palloc(VARHDRSZ + 1);
VARSIZE(result) = VARHDRSZ + 1; VARATT_SIZEP(result) = VARHDRSZ + 1;
*(VARDATA(result)) = arg1; *(VARDATA(result)) = arg1;
PG_RETURN_TEXT_P(result); PG_RETURN_TEXT_P(result);
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -953,7 +953,7 @@ float8_text(float64 num)
result = palloc(len); result = palloc(len);
VARSIZE(result) = len; VARATT_SIZEP(result) = len;
memmove(VARDATA(result), str, (len - VARHDRSZ)); memmove(VARDATA(result), str, (len - VARHDRSZ));
pfree(str); pfree(str);
...@@ -998,7 +998,7 @@ float4_text(float32 num) ...@@ -998,7 +998,7 @@ float4_text(float32 num)
result = palloc(len); result = palloc(len);
VARSIZE(result) = len; VARATT_SIZEP(result) = len;
memmove(VARDATA(result), str, (len - VARHDRSZ)); memmove(VARDATA(result), str, (len - VARHDRSZ));
pfree(str); pfree(str);
......
/* ----------------------------------------------------------------------- /* -----------------------------------------------------------------------
* formatting.c * 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 * Portions Copyright (c) 1999-2000, PostgreSQL, Inc
...@@ -2526,7 +2526,7 @@ timestamp_to_char(PG_FUNCTION_ARGS) ...@@ -2526,7 +2526,7 @@ timestamp_to_char(PG_FUNCTION_ARGS)
result = (text *) palloc(len + 1 + VARHDRSZ); result = (text *) palloc(len + 1 + VARHDRSZ);
strcpy(VARDATA(result), VARDATA(result_tmp)); strcpy(VARDATA(result), VARDATA(result_tmp));
VARSIZE(result) = len + VARHDRSZ; VARATT_SIZEP(result) = len + VARHDRSZ;
pfree(result_tmp); pfree(result_tmp);
PG_RETURN_TEXT_P(result); PG_RETURN_TEXT_P(result);
...@@ -3987,7 +3987,7 @@ do { \ ...@@ -3987,7 +3987,7 @@ do { \
result = (text *) palloc( len + 1 + VARHDRSZ); \ result = (text *) palloc( len + 1 + VARHDRSZ); \
\ \
strcpy( VARDATA(result), VARDATA(result_tmp)); \ strcpy( VARDATA(result), VARDATA(result_tmp)); \
VARSIZE(result) = len + VARHDRSZ; \ VARATT_SIZEP(result) = len + VARHDRSZ; \
pfree(result_tmp); \ pfree(result_tmp); \
} while(0) } while(0)
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -263,7 +263,7 @@ int2_text(PG_FUNCTION_ARGS)
text *result = (text *) palloc(7+VARHDRSZ); /* sign,5 digits, '\0' */ text *result = (text *) palloc(7+VARHDRSZ); /* sign,5 digits, '\0' */
itoa((int) arg1, VARDATA(result)); itoa((int) arg1, VARDATA(result));
VARSIZE(result) = strlen(VARDATA(result)) + VARHDRSZ; VARATT_SIZEP(result) = strlen(VARDATA(result)) + VARHDRSZ;
PG_RETURN_TEXT_P(result); PG_RETURN_TEXT_P(result);
} }
...@@ -294,7 +294,7 @@ int4_text(PG_FUNCTION_ARGS) ...@@ -294,7 +294,7 @@ int4_text(PG_FUNCTION_ARGS)
text *result = (text *) palloc(12+VARHDRSZ); /* sign,10 digits,'\0' */ text *result = (text *) palloc(12+VARHDRSZ); /* sign,10 digits,'\0' */
ltoa(arg1, VARDATA(result)); ltoa(arg1, VARDATA(result));
VARSIZE(result) = strlen(VARDATA(result)) + VARHDRSZ; VARATT_SIZEP(result) = strlen(VARDATA(result)) + VARHDRSZ;
PG_RETURN_TEXT_P(result); PG_RETURN_TEXT_P(result);
} }
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * 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) ...@@ -581,7 +581,7 @@ int8_text(PG_FUNCTION_ARGS)
result = (text *) palloc(VARHDRSZ + len); result = (text *) palloc(VARHDRSZ + len);
VARSIZE(result) = len + VARHDRSZ; VARATT_SIZEP(result) = len + VARHDRSZ;
memcpy(VARDATA(result), s, len); memcpy(VARDATA(result), s, len);
pfree(s); pfree(s);
......
/* ---------- /* ----------
* lztext.c - * 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 * Text type with internal LZ compressed representation. Uses the
* standard PostgreSQL compression method. * standard PostgreSQL compression method.
...@@ -34,8 +34,6 @@ lztextin(char *str) ...@@ -34,8 +34,6 @@ lztextin(char *str)
{ {
lztext *result; lztext *result;
int32 rawsize; int32 rawsize;
lztext *tmp;
int tmp_size;
/* ---------- /* ----------
* Handle NULL * Handle NULL
...@@ -44,35 +42,11 @@ lztextin(char *str) ...@@ -44,35 +42,11 @@ lztextin(char *str)
if (str == NULL) if (str == NULL)
return NULL; return NULL;
/* ----------
* Determine input size and maximum output Datum size
* ----------
*/
rawsize = strlen(str); rawsize = strlen(str);
tmp_size = PGLZ_MAX_OUTPUT(rawsize); result = (lztext *)palloc(VARHDRSZ + rawsize);
/* ----------
* Allocate a temporary result and compress into it
* ----------
*/
tmp = (lztext *) palloc(tmp_size);
pglz_compress(str, rawsize, tmp, NULL);
/* ---------- VARATT_SIZEP(result) = VARHDRSZ + rawsize;
* If we miss less than 25% bytes at the end of the temp value, memcpy(VARATT_DATA(result), str, rawsize);
* 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);
}
return result; return result;
} }
...@@ -88,6 +62,8 @@ char * ...@@ -88,6 +62,8 @@ char *
lztextout(lztext *lz) lztextout(lztext *lz)
{ {
char *result; char *result;
void *tmp;
int32 rawsize;
/* ---------- /* ----------
* Handle NULL * Handle NULL
...@@ -101,25 +77,15 @@ lztextout(lztext *lz) ...@@ -101,25 +77,15 @@ lztextout(lztext *lz)
return result; return result;
} }
/* ---------- VARATT_GETPLAIN(lz, tmp);
* 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);
/* ---------- rawsize = VARATT_SIZE(tmp) - VARHDRSZ;
* Decompress and add terminating ZERO result = (char *)palloc(rawsize + 1);
* ---------- memcpy(result, VARATT_DATA(tmp), rawsize);
*/ result[rawsize] = '\0';
pglz_decompress(lz, result);
result[lz->rawsize] = '\0'; VARATT_FREE(lz, tmp);
/* ----------
* Return the result
* ----------
*/
return result; return result;
} }
...@@ -167,7 +133,13 @@ lztextlen(lztext *lz) ...@@ -167,7 +133,13 @@ lztextlen(lztext *lz)
* without multibyte support, it's the remembered rawsize * 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 #endif
} }
...@@ -189,11 +161,10 @@ lztextoctetlen(lztext *lz) ...@@ -189,11 +161,10 @@ lztextoctetlen(lztext *lz)
if (lz == NULL) if (lz == NULL)
return 0; return 0;
/* ---------- if (!VARATT_IS_EXTERNAL(lz))
* Return the varsize minus the VARSIZE field itself. return VARATT_SIZE(lz) - VARHDRSZ;
* ----------
*/ return lz->va_content.va_external.va_extsize;
return VARSIZE(lz) - VARHDRSZ;
} }
...@@ -208,9 +179,6 @@ text_lztext(text *txt) ...@@ -208,9 +179,6 @@ text_lztext(text *txt)
{ {
lztext *result; lztext *result;
int32 rawsize; int32 rawsize;
lztext *tmp;
int tmp_size;
char *str;
/* ---------- /* ----------
* Handle NULL * Handle NULL
...@@ -220,35 +188,13 @@ text_lztext(text *txt) ...@@ -220,35 +188,13 @@ text_lztext(text *txt)
return NULL; return NULL;
/* ---------- /* ----------
* Determine input size and eventually tuple size * Copy the entire attribute
* ---------- * ----------
*/ */
rawsize = VARSIZE(txt) - VARHDRSZ; rawsize = VARSIZE(txt) - VARHDRSZ;
str = VARDATA(txt); result = (lztext *)palloc(rawsize + VARHDRSZ);
tmp_size = PGLZ_MAX_OUTPUT(rawsize); VARATT_SIZEP(result) = rawsize + VARHDRSZ;
memcpy(VARATT_DATA(result), VARATT_DATA(txt), 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);
}
return result; return result;
} }
...@@ -264,6 +210,8 @@ text * ...@@ -264,6 +210,8 @@ text *
lztext_text(lztext *lz) lztext_text(lztext *lz)
{ {
text *result; text *result;
lztext *tmp;
int32 rawsize;
/* ---------- /* ----------
* Handle NULL * Handle NULL
...@@ -272,19 +220,14 @@ lztext_text(lztext *lz) ...@@ -272,19 +220,14 @@ lztext_text(lztext *lz)
if (lz == NULL) if (lz == NULL)
return NULL; return NULL;
/* ---------- VARATT_GETPLAIN(lz, tmp);
* Allocate and initialize the text result
* ---------- rawsize = VARATT_SIZE(tmp) - VARHDRSZ;
*/ result = (text *)palloc(rawsize + VARHDRSZ);
result = (text *) palloc(PGLZ_RAW_SIZE(lz) + VARHDRSZ + 1); VARATT_SIZEP(result) = rawsize + VARHDRSZ;
VARSIZE(result) = lz->rawsize + VARHDRSZ; memcpy(VARATT_DATA(result), VARATT_DATA(tmp), rawsize);
/* ---------- VARATT_FREE(lz, tmp);
* Decompress directly into the text data area.
* ----------
*/
VARDATA(result)[lz->rawsize] = 0;
pglz_decompress(lz, VARDATA(result));
return result; return result;
} }
...@@ -322,43 +265,32 @@ lztext_cmp(lztext *lz1, lztext *lz2) ...@@ -322,43 +265,32 @@ lztext_cmp(lztext *lz1, lztext *lz2)
#else /* !USE_LOCALE */ #else /* !USE_LOCALE */
PGLZ_DecompState ds1; int result;
PGLZ_DecompState ds2; char *p1 = NULL;
int c1; char *p2 = NULL;
int c2; int size1;
int32 result = (int32) 0; int size2;
if (lz1 == NULL || lz2 == NULL) if (lz1 == NULL || lz2 == NULL)
return (int32) 0; return 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;
}
}
pglz_decomp_end(&ds1); VARATT_GETPLAIN(lz1, p1);
pglz_decomp_end(&ds2); 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; return result;
......
/* /*
* PostgreSQL type definitions for MAC addresses. * 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) ...@@ -314,14 +314,14 @@ macaddr_manuf(macaddr *addr)
{ {
result = palloc(VARHDRSZ + 1); result = palloc(VARHDRSZ + 1);
memset(result, 0, VARHDRSZ + 1); memset(result, 0, VARHDRSZ + 1);
VARSIZE(result) = VARHDRSZ + 1; VARATT_SIZEP(result) = VARHDRSZ + 1;
} }
else else
{ {
length = strlen(manuf->name) + 1; length = strlen(manuf->name) + 1;
result = palloc(length + VARHDRSZ); result = palloc(length + VARHDRSZ);
memset(result, 0, length + VARHDRSZ); memset(result, 0, length + VARHDRSZ);
VARSIZE(result) = length + VARHDRSZ; VARATT_SIZEP(result) = length + VARHDRSZ;
memcpy(VARDATA(result), manuf->name, length); memcpy(VARDATA(result), manuf->name, length);
} }
return result; return result;
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* *
* *
* IDENTIFICATION * 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 * NOTES
* *
...@@ -1945,7 +1945,7 @@ timeofday(PG_FUNCTION_ARGS) ...@@ -1945,7 +1945,7 @@ timeofday(PG_FUNCTION_ARGS)
len = VARHDRSZ + strlen(buf); len = VARHDRSZ + strlen(buf);
result = (text *) palloc(len); result = (text *) palloc(len);
VARSIZE(result) = len; VARATT_SIZEP(result) = len;
memcpy(VARDATA(result), buf, strlen(buf)); memcpy(VARDATA(result), buf, strlen(buf));
PG_RETURN_TEXT_P(result); PG_RETURN_TEXT_P(result);
} }
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* is for IP V4 CIDR notation, but prepared for V6: just * is for IP V4 CIDR notation, but prepared for V6: just
* add the necessary bits where the comments indicate. * 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 * Jon Postel RIP 16 Oct 1998
*/ */
...@@ -61,7 +61,7 @@ network_in(char *src, int type) ...@@ -61,7 +61,7 @@ network_in(char *src, int type)
/* Go for an IPV6 address here, before faulting out: */ /* Go for an IPV6 address here, before faulting out: */
elog(ERROR, "could not parse \"%s\"", src); elog(ERROR, "could not parse \"%s\"", src);
VARSIZE(dst) = VARHDRSZ VARATT_SIZEP(dst) = VARHDRSZ
+ ((char *) &ip_v4addr(dst) - (char *) VARDATA(dst)) + ((char *) &ip_v4addr(dst) - (char *) VARDATA(dst))
+ ip_addrsize(dst); + ip_addrsize(dst);
ip_bits(dst) = bits; ip_bits(dst) = bits;
...@@ -346,7 +346,7 @@ network_host(inet *ip) ...@@ -346,7 +346,7 @@ network_host(inet *ip)
if (ret == NULL) if (ret == NULL)
elog(ERROR, "unable to allocate memory in network_host()"); elog(ERROR, "unable to allocate memory in network_host()");
VARSIZE(ret) = len; VARATT_SIZEP(ret) = len;
strcpy(VARDATA(ret), tmp); strcpy(VARDATA(ret), tmp);
return (ret); return (ret);
} }
...@@ -396,7 +396,7 @@ network_broadcast(inet *ip) ...@@ -396,7 +396,7 @@ network_broadcast(inet *ip)
if (ret == NULL) if (ret == NULL)
elog(ERROR, "unable to allocate memory in network_broadcast()"); elog(ERROR, "unable to allocate memory in network_broadcast()");
VARSIZE(ret) = len; VARATT_SIZEP(ret) = len;
strcpy(VARDATA(ret), tmp); strcpy(VARDATA(ret), tmp);
return (ret); return (ret);
} }
...@@ -429,7 +429,7 @@ network_network(inet *ip) ...@@ -429,7 +429,7 @@ network_network(inet *ip)
if (ret == NULL) if (ret == NULL)
elog(ERROR, "unable to allocate memory in network_network()"); elog(ERROR, "unable to allocate memory in network_network()");
VARSIZE(ret) = len; VARATT_SIZEP(ret) = len;
strcpy(VARDATA(ret), tmp); strcpy(VARDATA(ret), tmp);
return (ret); return (ret);
} }
...@@ -466,7 +466,7 @@ network_netmask(inet *ip) ...@@ -466,7 +466,7 @@ network_netmask(inet *ip)
if (ret == NULL) if (ret == NULL)
elog(ERROR, "unable to allocate memory in network_netmask()"); elog(ERROR, "unable to allocate memory in network_netmask()");
VARSIZE(ret) = len; VARATT_SIZEP(ret) = len;
strcpy(VARDATA(ret), tmp); strcpy(VARDATA(ret), tmp);
return (ret); return (ret);
} }
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -231,7 +231,7 @@ oid_text(PG_FUNCTION_ARGS)
result = (text *) palloc(len); result = (text *) palloc(len);
VARSIZE(result) = len; VARATT_SIZEP(result) = len;
memcpy(VARDATA(result), str, (len - VARHDRSZ)); memcpy(VARDATA(result), str, (len - VARHDRSZ));
pfree(str); pfree(str);
......
/* /*
* Edmund Mergl <E.Mergl@bawue.de> * 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) ...@@ -37,7 +37,7 @@ lower(text *string)
return string; return string;
ret = (text *) palloc(VARSIZE(string)); ret = (text *) palloc(VARSIZE(string));
VARSIZE(ret) = VARSIZE(string); VARATT_SIZEP(ret) = VARSIZE(string);
ptr = VARDATA(string); ptr = VARDATA(string);
ptr_ret = VARDATA(ret); ptr_ret = VARDATA(ret);
...@@ -75,7 +75,7 @@ upper(text *string) ...@@ -75,7 +75,7 @@ upper(text *string)
return string; return string;
ret = (text *) palloc(VARSIZE(string)); ret = (text *) palloc(VARSIZE(string));
VARSIZE(ret) = VARSIZE(string); VARATT_SIZEP(ret) = VARSIZE(string);
ptr = VARDATA(string); ptr = VARDATA(string);
ptr_ret = VARDATA(ret); ptr_ret = VARDATA(ret);
...@@ -115,7 +115,7 @@ initcap(text *string) ...@@ -115,7 +115,7 @@ initcap(text *string)
return string; return string;
ret = (text *) palloc(VARSIZE(string)); ret = (text *) palloc(VARSIZE(string));
VARSIZE(ret) = VARSIZE(string); VARATT_SIZEP(ret) = VARSIZE(string);
ptr = VARDATA(string); ptr = VARDATA(string);
ptr_ret = VARDATA(ret); ptr_ret = VARDATA(ret);
...@@ -169,7 +169,7 @@ lpad(PG_FUNCTION_ARGS) ...@@ -169,7 +169,7 @@ lpad(PG_FUNCTION_ARGS)
PG_RETURN_TEXT_P(string1); PG_RETURN_TEXT_P(string1);
ret = (text *) palloc(VARHDRSZ + len); ret = (text *) palloc(VARHDRSZ + len);
VARSIZE(ret) = VARHDRSZ + len; VARATT_SIZEP(ret) = VARHDRSZ + len;
ptr2 = VARDATA(string2); ptr2 = VARDATA(string2);
ptr_ret = VARDATA(ret); ptr_ret = VARDATA(ret);
...@@ -224,7 +224,7 @@ rpad(PG_FUNCTION_ARGS) ...@@ -224,7 +224,7 @@ rpad(PG_FUNCTION_ARGS)
PG_RETURN_TEXT_P(string1); PG_RETURN_TEXT_P(string1);
ret = (text *) palloc(VARHDRSZ + len); ret = (text *) palloc(VARHDRSZ + len);
VARSIZE(ret) = VARHDRSZ + len; VARATT_SIZEP(ret) = VARHDRSZ + len;
n = VARSIZE(string1) - VARHDRSZ; n = VARSIZE(string1) - VARHDRSZ;
ptr1 = VARDATA(string1); ptr1 = VARDATA(string1);
...@@ -316,7 +316,7 @@ btrim(text *string, text *set) ...@@ -316,7 +316,7 @@ btrim(text *string, text *set)
++m; ++m;
ret = (text *) palloc(VARHDRSZ + m); ret = (text *) palloc(VARHDRSZ + m);
VARSIZE(ret) = VARHDRSZ + m; VARATT_SIZEP(ret) = VARHDRSZ + m;
memcpy(VARDATA(ret), ptr, m); memcpy(VARDATA(ret), ptr, m);
return ret; return ret;
...@@ -374,7 +374,7 @@ ltrim(text *string, text *set) ...@@ -374,7 +374,7 @@ ltrim(text *string, text *set)
++m; ++m;
ret = (text *) palloc(VARHDRSZ + m); ret = (text *) palloc(VARHDRSZ + m);
VARSIZE(ret) = VARHDRSZ + m; VARATT_SIZEP(ret) = VARHDRSZ + m;
memcpy(VARDATA(ret), ptr, m); memcpy(VARDATA(ret), ptr, m);
...@@ -434,7 +434,7 @@ rtrim(text *string, text *set) ...@@ -434,7 +434,7 @@ rtrim(text *string, text *set)
++m; ++m;
ret = (text *) palloc(VARHDRSZ + m); ret = (text *) palloc(VARHDRSZ + m);
VARSIZE(ret) = VARHDRSZ + m; VARATT_SIZEP(ret) = VARHDRSZ + m;
#ifdef NOT_USED #ifdef NOT_USED
memcpy(VARDATA(ret), ptr - VARSIZE(ret) + m, m); memcpy(VARDATA(ret), ptr - VARSIZE(ret) + m, m);
#endif #endif
...@@ -528,7 +528,7 @@ translate(text *string, text *from, text *to) ...@@ -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, * There may be some wasted space in the result if deletions occurred,
...@@ -560,7 +560,7 @@ ichar(PG_FUNCTION_ARGS) ...@@ -560,7 +560,7 @@ ichar(PG_FUNCTION_ARGS)
text *result; text *result;
result = (text *) palloc(VARHDRSZ + 1); result = (text *) palloc(VARHDRSZ + 1);
VARSIZE(result) = VARHDRSZ + 1; VARATT_SIZEP(result) = VARHDRSZ + 1;
*VARDATA(result) = (char) cvalue; *VARDATA(result) = (char) cvalue;
PG_RETURN_TEXT_P(result); PG_RETURN_TEXT_P(result);
...@@ -586,7 +586,7 @@ repeat(PG_FUNCTION_ARGS) ...@@ -586,7 +586,7 @@ repeat(PG_FUNCTION_ARGS)
result = (text *) palloc(tlen); result = (text *) palloc(tlen);
VARSIZE(result) = tlen; VARATT_SIZEP(result) = tlen;
cp = VARDATA(result); cp = VARDATA(result);
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
{ {
......
/* ---------- /* ----------
* pg_lzcompress.c - * 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. * This is an implementation of LZ compression for PostgreSQL.
* It uses a simple history table and generates 2-3 byte tags * 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 ...@@ -582,11 +582,15 @@ pglz_compress(char *source, int slen, PGLZ_Header *dest, PGLZ_Strategy *strategy
* ---------- * ----------
*/ */
if (do_compress) if (do_compress)
return (dest->varsize = result_size + sizeof(PGLZ_Header)); {
dest->varsize = result_size + sizeof(PGLZ_Header);
return VARATT_SIZE(dest);
}
else else
{ {
memcpy(((char *) dest) + sizeof(PGLZ_Header), source, slen); 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) ...@@ -609,10 +613,10 @@ pglz_decompress(PGLZ_Header *source, char *dest)
int32 off; int32 off;
dp = ((unsigned char *) source) + sizeof(PGLZ_Header); dp = ((unsigned char *) source) + sizeof(PGLZ_Header);
dend = ((unsigned char *) source) + source->varsize; dend = ((unsigned char *) source) + VARATT_SIZE(source);
bp = (unsigned char *) dest; 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); memcpy(dest, dp, source->rawsize);
return source->rawsize; return source->rawsize;
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -282,7 +282,7 @@ oidvectortypes(PG_FUNCTION_ARGS)
else else
strcat(VARDATA(result), "- "); strcat(VARDATA(result), "- ");
} }
VARSIZE(result) = strlen(VARDATA(result)) + VARHDRSZ; VARATT_SIZEP(result) = strlen(VARDATA(result)) + VARHDRSZ;
PG_RETURN_TEXT_P(result); PG_RETURN_TEXT_P(result);
} }
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* out of its tuple * out of its tuple
* *
* IDENTIFICATION * 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. * This software is copyrighted by Jan Wieck - Hamburg.
* *
...@@ -181,7 +181,7 @@ pg_get_ruledef(NameData *rname) ...@@ -181,7 +181,7 @@ pg_get_ruledef(NameData *rname)
if (SPI_finish() != SPI_OK_FINISH) if (SPI_finish() != SPI_OK_FINISH)
elog(ERROR, "get_ruledef: SPI_finish() failed"); elog(ERROR, "get_ruledef: SPI_finish() failed");
ruledef = SPI_palloc(VARHDRSZ + 1); ruledef = SPI_palloc(VARHDRSZ + 1);
VARSIZE(ruledef) = VARHDRSZ + 1; VARATT_SIZEP(ruledef) = VARHDRSZ + 1;
VARDATA(ruledef)[0] = '-'; VARDATA(ruledef)[0] = '-';
return ruledef; return ruledef;
} }
...@@ -197,7 +197,7 @@ pg_get_ruledef(NameData *rname) ...@@ -197,7 +197,7 @@ pg_get_ruledef(NameData *rname)
make_ruledef(&buf, ruletup, rulettc); make_ruledef(&buf, ruletup, rulettc);
len = buf.len + VARHDRSZ; len = buf.len + VARHDRSZ;
ruledef = SPI_palloc(len); ruledef = SPI_palloc(len);
VARSIZE(ruledef) = len; VARATT_SIZEP(ruledef) = len;
memcpy(VARDATA(ruledef), buf.data, buf.len); memcpy(VARDATA(ruledef), buf.data, buf.len);
pfree(buf.data); pfree(buf.data);
...@@ -296,7 +296,7 @@ pg_get_viewdef(NameData *rname) ...@@ -296,7 +296,7 @@ pg_get_viewdef(NameData *rname)
} }
len = buf.len + VARHDRSZ; len = buf.len + VARHDRSZ;
ruledef = SPI_palloc(len); ruledef = SPI_palloc(len);
VARSIZE(ruledef) = len; VARATT_SIZEP(ruledef) = len;
memcpy(VARDATA(ruledef), buf.data, buf.len); memcpy(VARDATA(ruledef), buf.data, buf.len);
pfree(buf.data); pfree(buf.data);
...@@ -530,7 +530,7 @@ pg_get_indexdef(PG_FUNCTION_ARGS) ...@@ -530,7 +530,7 @@ pg_get_indexdef(PG_FUNCTION_ARGS)
*/ */
len = buf.len + VARHDRSZ; len = buf.len + VARHDRSZ;
indexdef = SPI_palloc(len); indexdef = SPI_palloc(len);
VARSIZE(indexdef) = len; VARATT_SIZEP(indexdef) = len;
memcpy(VARDATA(indexdef), buf.data, buf.len); memcpy(VARDATA(indexdef), buf.data, buf.len);
pfree(buf.data); pfree(buf.data);
pfree(keybuf.data); pfree(keybuf.data);
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -1375,7 +1375,7 @@ timestamp_text(PG_FUNCTION_ARGS)
result = palloc(len); result = palloc(len);
VARSIZE(result) = len; VARATT_SIZEP(result) = len;
memmove(VARDATA(result), str, (len - VARHDRSZ)); memmove(VARDATA(result), str, (len - VARHDRSZ));
pfree(str); pfree(str);
...@@ -1430,7 +1430,7 @@ interval_text(PG_FUNCTION_ARGS) ...@@ -1430,7 +1430,7 @@ interval_text(PG_FUNCTION_ARGS)
result = palloc(len); result = palloc(len);
VARSIZE(result) = len; VARATT_SIZEP(result) = len;
memmove(VARDATA(result), str, (len - VARHDRSZ)); memmove(VARDATA(result), str, (len - VARHDRSZ));
pfree(str); pfree(str);
...@@ -2101,7 +2101,7 @@ timestamp_zone(PG_FUNCTION_ARGS) ...@@ -2101,7 +2101,7 @@ timestamp_zone(PG_FUNCTION_ARGS)
result = palloc(len); result = palloc(len);
VARSIZE(result) = len; VARATT_SIZEP(result) = len;
memmove(VARDATA(result), buf, (len - VARHDRSZ)); memmove(VARDATA(result), buf, (len - VARHDRSZ));
} }
else else
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* Functions for the built-in type bit() and varying bit(). * Functions for the built-in type bit() and varying bit().
* *
* IDENTIFICATION * 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) ...@@ -122,7 +122,7 @@ zpbit_in(char *s, int dummy, int32 atttypmod)
result = (bits8 *) palloc(len); result = (bits8 *) palloc(len);
/* set to 0 so that *r is always initialised and strin is zero-padded */ /* set to 0 so that *r is always initialised and strin is zero-padded */
memset(result, 0, len); memset(result, 0, len);
VARSIZE(result) = len; VARATT_SIZEP(result) = len;
VARBITLEN(result) = atttypmod; VARBITLEN(result) = atttypmod;
/* /*
...@@ -353,7 +353,7 @@ varbit_in(char *s, int dummy, int32 atttypmod) ...@@ -353,7 +353,7 @@ varbit_in(char *s, int dummy, int32 atttypmod)
result = (bits8 *) palloc(len); result = (bits8 *) palloc(len);
/* set to 0 so that *r is always initialised and strin is zero-padded */ /* set to 0 so that *r is always initialised and strin is zero-padded */
memset(result, 0, len); memset(result, 0, len);
VARSIZE(result) = len; VARATT_SIZEP(result) = len;
VARBITLEN(result) = bitlen; VARBITLEN(result) = bitlen;
/* /*
...@@ -561,7 +561,7 @@ bitcat(bits8 *arg1, bits8 *arg2) ...@@ -561,7 +561,7 @@ bitcat(bits8 *arg1, bits8 *arg2)
bytelen = VARBITDATALEN(bitlen1 + bitlen2); bytelen = VARBITDATALEN(bitlen1 + bitlen2);
result = (bits8 *) palloc(bytelen * sizeof(bits8)); result = (bits8 *) palloc(bytelen * sizeof(bits8));
VARSIZE(result) = bytelen; VARATT_SIZEP(result) = bytelen;
VARBITLEN(result) = bitlen1 + bitlen2; VARBITLEN(result) = bitlen1 + bitlen2;
/* Copy the first bitstring in */ /* Copy the first bitstring in */
memcpy(VARBITS(result), VARBITS(arg1), VARBITBYTES(arg1)); memcpy(VARBITS(result), VARBITS(arg1), VARBITBYTES(arg1));
...@@ -625,7 +625,7 @@ bitsubstr(bits8 *arg, int32 s, int32 l) ...@@ -625,7 +625,7 @@ bitsubstr(bits8 *arg, int32 s, int32 l)
len = VARBITDATALEN(0); len = VARBITDATALEN(0);
result = (bits8 *) palloc(len); result = (bits8 *) palloc(len);
VARBITLEN(result) = 0; VARBITLEN(result) = 0;
VARSIZE(result) = len; VARATT_SIZEP(result) = len;
} }
else else
{ {
...@@ -638,7 +638,7 @@ bitsubstr(bits8 *arg, int32 s, int32 l) ...@@ -638,7 +638,7 @@ bitsubstr(bits8 *arg, int32 s, int32 l)
len = VARBITDATALEN(rbitlen); len = VARBITDATALEN(rbitlen);
result = (bits8 *) palloc(len); result = (bits8 *) palloc(len);
VARBITLEN(result) = rbitlen; VARBITLEN(result) = rbitlen;
VARSIZE(result) = len; VARATT_SIZEP(result) = len;
len -= VARHDRSZ + VARBITHDRSZ; len -= VARHDRSZ + VARBITHDRSZ;
/* Are we copying from a byte boundary? */ /* Are we copying from a byte boundary? */
if ((s1 - 1) % BITSPERBYTE == 0) if ((s1 - 1) % BITSPERBYTE == 0)
...@@ -691,7 +691,7 @@ bitand(bits8 *arg1, bits8 *arg2) ...@@ -691,7 +691,7 @@ bitand(bits8 *arg1, bits8 *arg2)
len = Min(VARSIZE(arg1), VARSIZE(arg2)); len = Min(VARSIZE(arg1), VARSIZE(arg2));
result = (bits8 *) palloc(len); result = (bits8 *) palloc(len);
VARSIZE(result) = len; VARATT_SIZEP(result) = len;
VARBITLEN(result) = Min(VARBITLEN(arg1), VARBITLEN(arg2)); VARBITLEN(result) = Min(VARBITLEN(arg1), VARBITLEN(arg2));
p1 = (bits8 *) VARBITS(arg1); p1 = (bits8 *) VARBITS(arg1);
...@@ -725,7 +725,7 @@ bitor(bits8 *arg1, bits8 *arg2) ...@@ -725,7 +725,7 @@ bitor(bits8 *arg1, bits8 *arg2)
len = Min(VARSIZE(arg1), VARSIZE(arg2)); len = Min(VARSIZE(arg1), VARSIZE(arg2));
result = (bits8 *) palloc(len); result = (bits8 *) palloc(len);
VARSIZE(result) = len; VARATT_SIZEP(result) = len;
VARBITLEN(result) = Min(VARBITLEN(arg1), VARBITLEN(arg2)); VARBITLEN(result) = Min(VARBITLEN(arg1), VARBITLEN(arg2));
p1 = (bits8 *) VARBITS(arg1); p1 = (bits8 *) VARBITS(arg1);
...@@ -761,7 +761,7 @@ bitxor(bits8 *arg1, bits8 *arg2) ...@@ -761,7 +761,7 @@ bitxor(bits8 *arg1, bits8 *arg2)
len = Min(VARSIZE(arg1), VARSIZE(arg2)); len = Min(VARSIZE(arg1), VARSIZE(arg2));
result = (bits8 *) palloc(len); result = (bits8 *) palloc(len);
VARSIZE(result) = len; VARATT_SIZEP(result) = len;
VARBITLEN(result) = Min(VARBITLEN(arg1), VARBITLEN(arg2)); VARBITLEN(result) = Min(VARBITLEN(arg1), VARBITLEN(arg2));
p1 = (bits8 *) VARBITS(arg1); p1 = (bits8 *) VARBITS(arg1);
...@@ -792,7 +792,7 @@ bitnot(bits8 *arg) ...@@ -792,7 +792,7 @@ bitnot(bits8 *arg)
return (bool) 0; return (bool) 0;
result = (bits8 *) palloc(VARSIZE(arg)); result = (bits8 *) palloc(VARSIZE(arg));
VARSIZE(result) = VARSIZE(arg); VARATT_SIZEP(result) = VARSIZE(arg);
VARBITLEN(result) = VARBITLEN(arg); VARBITLEN(result) = VARBITLEN(arg);
p = (bits8 *) VARBITS(arg); p = (bits8 *) VARBITS(arg);
...@@ -828,7 +828,7 @@ bitshiftleft(bits8 *arg, int shft) ...@@ -828,7 +828,7 @@ bitshiftleft(bits8 *arg, int shft)
return bitshiftright(arg, -shft); return bitshiftright(arg, -shft);
result = (bits8 *) palloc(VARSIZE(arg)); result = (bits8 *) palloc(VARSIZE(arg));
VARSIZE(result) = VARSIZE(arg); VARATT_SIZEP(result) = VARSIZE(arg);
VARBITLEN(result) = VARBITLEN(arg); VARBITLEN(result) = VARBITLEN(arg);
r = (bits8 *) VARBITS(result); r = (bits8 *) VARBITS(result);
...@@ -879,7 +879,7 @@ bitshiftright(bits8 *arg, int shft) ...@@ -879,7 +879,7 @@ bitshiftright(bits8 *arg, int shft)
return bitshiftleft(arg, -shft); return bitshiftleft(arg, -shft);
result = (bits8 *) palloc(VARSIZE(arg)); result = (bits8 *) palloc(VARSIZE(arg));
VARSIZE(result) = VARSIZE(arg); VARATT_SIZEP(result) = VARSIZE(arg);
VARBITLEN(result) = VARBITLEN(arg); VARBITLEN(result) = VARBITLEN(arg);
r = (bits8 *) VARBITS(result); r = (bits8 *) VARBITS(result);
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -88,7 +88,7 @@ bpcharin(PG_FUNCTION_ARGS)
len = atttypmod - VARHDRSZ; len = atttypmod - VARHDRSZ;
result = (BpChar *) palloc(atttypmod); result = (BpChar *) palloc(atttypmod);
VARSIZE(result) = atttypmod; VARATT_SIZEP(result) = atttypmod;
r = VARDATA(result); r = VARDATA(result);
for (i = 0; i < len; i++, r++, s++) for (i = 0; i < len; i++, r++, s++)
{ {
...@@ -154,7 +154,7 @@ bpchar(PG_FUNCTION_ARGS) ...@@ -154,7 +154,7 @@ bpchar(PG_FUNCTION_ARGS)
#endif #endif
result = (BpChar *) palloc(len); result = (BpChar *) palloc(len);
VARSIZE(result) = len; VARATT_SIZEP(result) = len;
r = VARDATA(result); r = VARDATA(result);
#ifdef MULTIBYTE #ifdef MULTIBYTE
...@@ -248,7 +248,7 @@ char_bpchar(PG_FUNCTION_ARGS) ...@@ -248,7 +248,7 @@ char_bpchar(PG_FUNCTION_ARGS)
result = (BpChar *) palloc(VARHDRSZ + 1); result = (BpChar *) palloc(VARHDRSZ + 1);
VARSIZE(result) = VARHDRSZ + 1; VARATT_SIZEP(result) = VARHDRSZ + 1;
*(VARDATA(result)) = c; *(VARDATA(result)) = c;
PG_RETURN_BPCHAR_P(result); PG_RETURN_BPCHAR_P(result);
...@@ -317,7 +317,7 @@ name_bpchar(NameData *s) ...@@ -317,7 +317,7 @@ name_bpchar(NameData *s)
result = (char *) palloc(VARHDRSZ + len); result = (char *) palloc(VARHDRSZ + len);
strncpy(VARDATA(result), NameStr(*s), len); strncpy(VARDATA(result), NameStr(*s), len);
VARSIZE(result) = len + VARHDRSZ; VARATT_SIZEP(result) = len + VARHDRSZ;
return result; return result;
} /* name_bpchar() */ } /* name_bpchar() */
...@@ -348,7 +348,7 @@ varcharin(PG_FUNCTION_ARGS) ...@@ -348,7 +348,7 @@ varcharin(PG_FUNCTION_ARGS)
len = atttypmod; /* clip the string at max length */ len = atttypmod; /* clip the string at max length */
result = (VarChar *) palloc(len); result = (VarChar *) palloc(len);
VARSIZE(result) = len; VARATT_SIZEP(result) = len;
memcpy(VARDATA(result), s, len - VARHDRSZ); memcpy(VARDATA(result), s, len - VARHDRSZ);
#ifdef CYR_RECODE #ifdef CYR_RECODE
...@@ -407,7 +407,7 @@ varchar(PG_FUNCTION_ARGS) ...@@ -407,7 +407,7 @@ varchar(PG_FUNCTION_ARGS)
#endif #endif
result = (VarChar *) palloc(slen); result = (VarChar *) palloc(slen);
VARSIZE(result) = slen; VARATT_SIZEP(result) = slen;
memcpy(VARDATA(result), VARDATA(s), len); memcpy(VARDATA(result), VARDATA(s), len);
PG_RETURN_VARCHAR_P(result); PG_RETURN_VARCHAR_P(result);
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -157,7 +157,7 @@ textin(char *inputText)
len = strlen(inputText) + VARHDRSZ; len = strlen(inputText) + VARHDRSZ;
result = (text *) palloc(len); result = (text *) palloc(len);
VARSIZE(result) = len; VARATT_SIZEP(result) = len;
memmove(VARDATA(result), inputText, len - VARHDRSZ); memmove(VARDATA(result), inputText, len - VARHDRSZ);
...@@ -288,7 +288,7 @@ textcat(text *t1, text *t2) ...@@ -288,7 +288,7 @@ textcat(text *t1, text *t2)
result = palloc(len); result = palloc(len);
/* Set size of result string... */ /* Set size of result string... */
VARSIZE(result) = len; VARATT_SIZEP(result) = len;
/* Fill data field of result string... */ /* Fill data field of result string... */
ptr = VARDATA(result); ptr = VARDATA(result);
...@@ -374,7 +374,7 @@ text_substr(PG_FUNCTION_ARGS) ...@@ -374,7 +374,7 @@ text_substr(PG_FUNCTION_ARGS)
#endif #endif
ret = (text *) palloc(VARHDRSZ + n); ret = (text *) palloc(VARHDRSZ + n);
VARSIZE(ret) = VARHDRSZ + n; VARATT_SIZEP(ret) = VARHDRSZ + n;
memcpy(VARDATA(ret), VARDATA(string) + m, n); memcpy(VARDATA(ret), VARDATA(string) + m, n);
...@@ -842,7 +842,7 @@ name_text(NameData *s) ...@@ -842,7 +842,7 @@ name_text(NameData *s)
result = palloc(VARHDRSZ + len); result = palloc(VARHDRSZ + len);
strncpy(VARDATA(result), NameStr(*s), len); strncpy(VARDATA(result), NameStr(*s), len);
VARSIZE(result) = len + VARHDRSZ; VARATT_SIZEP(result) = len + VARHDRSZ;
return result; return result;
} /* name_text() */ } /* name_text() */
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* *
* IDENTIFICATION * 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) ...@@ -22,7 +22,7 @@ version(void)
int n = strlen(PG_VERSION_STR) + VARHDRSZ; int n = strlen(PG_VERSION_STR) + VARHDRSZ;
text *ret = (text *) palloc(n); text *ret = (text *) palloc(n);
VARSIZE(ret) = n; VARATT_SIZEP(ret) = n;
memcpy(VARDATA(ret), PG_VERSION_STR, strlen(PG_VERSION_STR)); memcpy(VARDATA(ret), PG_VERSION_STR, strlen(PG_VERSION_STR));
return ret; return ret;
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Copyright (c) 2000, PostgreSQL Development Team * 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 $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -22,11 +22,23 @@ ...@@ -22,11 +22,23 @@
#include "utils/rel.h" #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, 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 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 */ #endif /* TUPLE_TOASTER_ACTIVE */
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California * 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 * NOTES
* the genbki.sh script reads this file and generates .bki * the genbki.sh script reads this file and generates .bki
...@@ -243,7 +243,8 @@ typedef FormData_pg_attribute *Form_pg_attribute; ...@@ -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, {"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, {"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, {"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 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)); 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)); ...@@ -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 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 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 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 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 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)); 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)); ...@@ -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, {"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, {"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, {"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, {"reltoastrelid"}, 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, {"reltoastidxid"}, 26, 0, 4, 8, 0, -1, -1, '\001', 'p', '\0', 'i', '\0', '\0' }, \
{ 1259, {"relisshared"}, 16, 0, 1, 9, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \ { 1259, {"relhasindex"}, 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, {"relisshared"}, 16, 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, {"relkind"}, 18, 0, 1, 11, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \
{ 1259, {"relchecks"}, 21, 0, 2, 12, 0, -1, -1, '\001', 'p', '\0', 's', '\0', '\0' }, \ { 1259, {"relnatts"}, 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, {"relchecks"}, 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, {"reltriggers"}, 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, {"relukeys"}, 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, {"relfkeys"}, 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, {"relrefs"}, 21, 0, 2, 17, 0, -1, -1, '\001', 'p', '\0', 's', '\0', '\0' }, \
{ 1259, {"relhasrules"}, 16, 0, 1, 18, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \ { 1259, {"relhaspkey"}, 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, {"relhasrules"}, 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, {"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 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)); 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)); ...@@ -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 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 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 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 reltoastrelid 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 reltoastidxid 26 0 4 8 0 -1 -1 t p f i 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 relhasindex 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 relisshared 16 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 relkind 18 0 1 11 0 -1 -1 t p f c 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 relnatts 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 relchecks 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 reltriggers 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 relukeys 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 relfkeys 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 relrefs 21 0 2 17 0 -1 -1 t p f s 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 relhaspkey 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 relhasrules 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 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 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 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)); DATA(insert OID = 0 ( 1259 xmin 28 0 4 -3 0 -1 -1 t p f i f f));
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California * 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 * NOTES
* the genbki.sh script reads this file and generates .bki * the genbki.sh script reads this file and generates .bki
...@@ -52,7 +52,8 @@ CATALOG(pg_class) BOOTSTRAP ...@@ -52,7 +52,8 @@ CATALOG(pg_class) BOOTSTRAP
Oid relam; Oid relam;
int4 relpages; int4 relpages;
int4 reltuples; int4 reltuples;
Oid rellongrelid; Oid reltoastrelid;
Oid reltoastidxid;
bool relhasindex; bool relhasindex;
bool relisshared; bool relisshared;
char relkind; char relkind;
...@@ -98,59 +99,60 @@ typedef FormData_pg_class *Form_pg_class; ...@@ -98,59 +99,60 @@ typedef FormData_pg_class *Form_pg_class;
* relacl field. * relacl field.
* ---------------- * ----------------
*/ */
#define Natts_pg_class_fixed 19 #define Natts_pg_class_fixed 20
#define Natts_pg_class 20 #define Natts_pg_class 21
#define Anum_pg_class_relname 1 #define Anum_pg_class_relname 1
#define Anum_pg_class_reltype 2 #define Anum_pg_class_reltype 2
#define Anum_pg_class_relowner 3 #define Anum_pg_class_relowner 3
#define Anum_pg_class_relam 4 #define Anum_pg_class_relam 4
#define Anum_pg_class_relpages 5 #define Anum_pg_class_relpages 5
#define Anum_pg_class_reltuples 6 #define Anum_pg_class_reltuples 6
#define Anum_pg_class_rellongrelid 7 #define Anum_pg_class_reltoastrelid 7
#define Anum_pg_class_relhasindex 8 #define Anum_pg_class_reltoastidxid 8
#define Anum_pg_class_relisshared 9 #define Anum_pg_class_relhasindex 9
#define Anum_pg_class_relkind 10 #define Anum_pg_class_relisshared 10
#define Anum_pg_class_relnatts 11 #define Anum_pg_class_relkind 11
#define Anum_pg_class_relchecks 12 #define Anum_pg_class_relnatts 12
#define Anum_pg_class_reltriggers 13 #define Anum_pg_class_relchecks 13
#define Anum_pg_class_relukeys 14 #define Anum_pg_class_reltriggers 14
#define Anum_pg_class_relfkeys 15 #define Anum_pg_class_relukeys 15
#define Anum_pg_class_relrefs 16 #define Anum_pg_class_relfkeys 16
#define Anum_pg_class_relhaspkey 17 #define Anum_pg_class_relrefs 17
#define Anum_pg_class_relhasrules 18 #define Anum_pg_class_relhaspkey 18
#define Anum_pg_class_relhassubclass 19 #define Anum_pg_class_relhasrules 19
#define Anum_pg_class_relacl 20 #define Anum_pg_class_relhassubclass 20
#define Anum_pg_class_relacl 21
/* ---------------- /* ----------------
* initial contents of pg_class * 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(""); 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 0 f f r 15 0 0 0 0 0 f f f _null_ ));
DESCR(""); 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 0 f f r 17 0 0 0 0 0 f f f _null_ ));
DESCR(""); 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(""); 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 0 f t r 8 0 0 0 0 0 f f f _null_ ));
DESCR(""); 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 0 f t r 3 0 0 0 0 0 f f f _null_ ));
DESCR(""); 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 0 f t r 4 0 0 0 0 0 f f f _null_ ));
DESCR(""); 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 0 f t s 1 0 0 0 0 0 f f f _null_ ));
DESCR(""); 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 0 f t s 1 0 0 0 0 0 f f f _null_ ));
DESCR(""); 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 0 f t s 1 0 0 0 0 0 f f f _null_ ));
DESCR(""); 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 0 t t r 4 0 0 0 0 0 f f f _null_ ));
DESCR(""); 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 0 t t r 4 0 0 0 0 0 f f f _null_ ));
DESCR(""); 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 0 t t r 13 0 0 0 0 0 f f f _null_ ));
DESCR(""); DESCR("");
#define RelOid_pg_type 1247 #define RelOid_pg_type 1247
...@@ -175,6 +177,6 @@ DESCR(""); ...@@ -175,6 +177,6 @@ DESCR("");
#define RELKIND_SPECIAL 's' /* special (non-heap) */ #define RELKIND_SPECIAL 's' /* special (non-heap) */
#define RELKIND_SEQUENCE 'S' /* SEQUENCE relation */ #define RELKIND_SEQUENCE 'S' /* SEQUENCE relation */
#define RELKIND_UNCATALOGED 'u' /* temporary heap */ #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 */ #endif /* PG_CLASS_H */
This diff is collapsed.
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California * 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, ...@@ -58,6 +58,8 @@ extern void AlterTableDropConstraint(const char *relationName,
bool inh, const char *constrName, bool inh, const char *constrName,
int behavior); int behavior);
extern void AlterTableCreateToastTable(const char *relationName);
/* /*
* LOCK * LOCK
*/ */
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1995, Regents of the University of California * 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 ...@@ -71,8 +71,12 @@ struct varlena
char vl_dat[1]; char vl_dat[1];
}; };
#define TUPLE_TOASTER_ACTIVE
#ifndef TUPLE_TOASTER_ACTIVE
#define VARSIZE(PTR) (((struct varlena *)(PTR))->vl_len) #define VARSIZE(PTR) (((struct varlena *)(PTR))->vl_len)
#define VARDATA(PTR) (((struct varlena *)(PTR))->vl_dat) #define VARDATA(PTR) (((struct varlena *)(PTR))->vl_dat)
#endif
#define VARHDRSZ ((int32) sizeof(int32)) #define VARHDRSZ ((int32) sizeof(int32))
/* /*
...@@ -89,8 +93,6 @@ typedef struct varlena VarChar; /* var-length char, ie SQL varchar(n) */ ...@@ -89,8 +93,6 @@ typedef struct varlena VarChar; /* var-length char, ie SQL varchar(n) */
* Proposed new layout for variable length attributes * Proposed new layout for variable length attributes
* DO NOT USE YET - Jan * DO NOT USE YET - Jan
*/ */
#undef TUPLE_TOASTER_ACTIVE
#undef TUPLE_TOASTER_ALL_TYPES
#ifdef TUPLE_TOASTER_ACTIVE #ifdef TUPLE_TOASTER_ACTIVE
typedef struct varattrib typedef struct varattrib
...@@ -102,14 +104,17 @@ typedef struct varattrib ...@@ -102,14 +104,17 @@ typedef struct varattrib
struct struct
{ {
int32 va_rawsize; /* Plain data size */ int32 va_rawsize; /* Plain data size */
char va_data[1]; /* Compressed data */
} va_compressed; /* Compressed stored attribute */ } va_compressed; /* Compressed stored attribute */
struct struct
{ {
int32 va_rawsize; /* Plain data size */ int32 va_rawsize; /* Plain data size */
int32 va_extsize; /* External saved size */
Oid va_valueid; /* Unique identifier of value */ Oid va_valueid; /* Unique identifier of value */
Oid va_longrelid; /* RelID where to find chunks */ Oid va_toastrelid; /* RelID where to find chunks */
Oid va_rowid; /* Main tables row Oid */ Oid va_toastidxid; /* Main tables row Oid */
Oid va_rowid; /* Referencing row Oid */
int16 va_attno; /* Main tables attno */ int16 va_attno; /* Main tables attno */
} va_external;/* External stored attribute */ } va_external;/* External stored attribute */
...@@ -117,14 +122,18 @@ typedef struct varattrib ...@@ -117,14 +122,18 @@ typedef struct varattrib
} va_content; } va_content;
} varattrib; } varattrib;
#define VARATT_FLAG_EXTERNAL 0x8000 #define VARATT_FLAG_EXTERNAL 0x80000000
#define VARATT_FLAG_COMPRESSED 0x4000 #define VARATT_FLAG_COMPRESSED 0x40000000
#define VARATT_MASK_FLAGS 0xc000 #define VARATT_MASK_FLAGS 0xc0000000
#define VARATT_MASK_SIZE 0x3fff #define VARATT_MASK_SIZE 0x3fffffff
#define VARATT_SIZEP(_PTR) (((varattrib *)(_PTR))->va_header) #define VARATT_SIZEP(_PTR) (((varattrib *)(_PTR))->va_header)
#define VARATT_SIZE(PTR) (VARATT_SIZEP(PTR) & VARATT_MASK_SIZE) #define VARATT_SIZE(PTR) (VARATT_SIZEP(PTR) & VARATT_MASK_SIZE)
#define VARATT_DATA(PTR) (((varattrib *)(PTR))->va_content.va_data) #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) \ #define VARATT_IS_EXTENDED(PTR) \
((VARATT_SIZEP(PTR) & VARATT_MASK_FLAGS) != 0) ((VARATT_SIZEP(PTR) & VARATT_MASK_FLAGS) != 0)
...@@ -142,12 +151,12 @@ typedef struct varattrib ...@@ -142,12 +151,12 @@ typedef struct varattrib
extern varattrib *heap_tuple_untoast_attr(varattrib * attr); extern varattrib *heap_tuple_untoast_attr(varattrib * attr);
#define VARATT_GETPLAIN(_ARG,_VAR) { \ #define VARATT_GETPLAIN(_ARG,_VAR) { \
if (VARATTR_IS_EXTENDED(_ARG)) \ if (VARATT_IS_EXTENDED(_ARG)) \
(_VAR) = (void *)heap_tuple_untoast_attr(_ARG); \ (_VAR) = (void *)heap_tuple_untoast_attr(_ARG); \
else \ else \
(_VAR) = (_ARG); \ (_VAR) = (void *)(_ARG); \
} }
#define VARATT_FREE(_ARG,VAR) do { \ #define VARATT_FREE(_ARG,_VAR) do { \
if ((void *)(_VAR) != (void *)(_ARG)) \ if ((void *)(_VAR) != (void *)(_ARG)) \
pfree((void *)(_VAR)); \ pfree((void *)(_VAR)); \
} while (0) } while (0)
......
/* ---------- /* ----------
* lztext.h * 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 * Definitions for the lztext compressed data type
* ---------- * ----------
...@@ -10,13 +10,10 @@ ...@@ -10,13 +10,10 @@
#ifndef _LZTEXT_H_ #ifndef _LZTEXT_H_
#define _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_ */ #endif /* _LZTEXT_H_ */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment