diff --git a/contrib/hstore/hstore.h b/contrib/hstore/hstore.h
index 20ae203416a38abbbe0a9082e9185365c8578387..a601906764b0be30794a67b922f5acbbc64c7173 100644
--- a/contrib/hstore/hstore.h
+++ b/contrib/hstore/hstore.h
@@ -2,6 +2,7 @@
 #define __HSTORE_H__
 
 #include "postgres.h"
+
 #include "funcapi.h"
 #include "access/gist.h"
 #include "access/itup.h"
@@ -23,12 +24,12 @@ typedef struct
 
 typedef struct
 {
-	int4		len;
+	int32		vl_len_;		/* varlena header (do not touch directly!) */
 	int4		size;
 	char		data[1];
 }	HStore;
 
-#define HSHRDSIZE	(2*sizeof(int4))
+#define HSHRDSIZE	(VARHDRSZ + sizeof(int4))
 #define CALCDATASIZE(x, lenstr) ( (x) * sizeof(HEntry) + HSHRDSIZE + (lenstr) )
 #define ARRPTR(x)		( (HEntry*) ( (char*)(x) + HSHRDSIZE ) )
 #define STRPTR(x)		( (char*)(x) + HSHRDSIZE + ( sizeof(HEntry) * ((HStore*)x)->size ) )
diff --git a/contrib/hstore/hstore_gist.c b/contrib/hstore/hstore_gist.c
index 4220a5541d193f09bbbfe552e0d8671f6d3f746e..c3923dacf253e48785d072d42c5ae5c8bab6f5cb 100644
--- a/contrib/hstore/hstore_gist.c
+++ b/contrib/hstore/hstore_gist.c
@@ -2,7 +2,6 @@
 
 #include "access/gist.h"
 #include "access/itup.h"
-/*#include "access/rtree.h"*/
 #include "crc32.h"
 
 /* bigint defines */
@@ -38,7 +37,7 @@ typedef char *BITVECP;
 
 typedef struct
 {
-	int4		len;
+	int32		vl_len_;		/* varlena header (do not touch directly!) */
 	int4		flag;
 	char		data[1];
 }	GISTTYPE;
@@ -47,7 +46,7 @@ typedef struct
 
 #define ISALLTRUE(x)	( ((GISTTYPE*)x)->flag & ALLISTRUE )
 
-#define GTHDRSIZE		( sizeof(int4)*2  )
+#define GTHDRSIZE		(VARHDRSZ + sizeof(int4))
 #define CALCGTSIZE(flag) ( GTHDRSIZE+(((flag) & ALLISTRUE) ? 0 : SIGLEN) )
 
 #define GETSIGN(x)		( (BITVECP)( (char*)x+GTHDRSIZE ) )
@@ -112,14 +111,13 @@ ghstore_compress(PG_FUNCTION_ARGS)
 
 	if (entry->leafkey)
 	{
-		GISTTYPE   *res = (GISTTYPE *) palloc(CALCGTSIZE(0));
+		GISTTYPE   *res = (GISTTYPE *) palloc0(CALCGTSIZE(0));
 		HStore	   *toastedval = (HStore *) DatumGetPointer(entry->key);
 		HStore	   *val = (HStore *) DatumGetPointer(PG_DETOAST_DATUM(entry->key));
 		HEntry	   *ptr = ARRPTR(val);
 		char	   *words = STRPTR(val);
 
-		memset(res, 0, CALCGTSIZE(0));
-		res->len = CALCGTSIZE(0);
+		SET_VARSIZE(res, CALCGTSIZE(0));
 
 		while (ptr - ARRPTR(val) < val->size)
 		{
@@ -156,7 +154,7 @@ ghstore_compress(PG_FUNCTION_ARGS)
 		);
 
 		res = (GISTTYPE *) palloc(CALCGTSIZE(ALLISTRUE));
-		res->len = CALCGTSIZE(ALLISTRUE);
+		SET_VARSIZE(res, CALCGTSIZE(ALLISTRUE));
 		res->flag = ALLISTRUE;
 
 		retval = (GISTENTRY *) palloc(sizeof(GISTENTRY));
@@ -286,10 +284,11 @@ ghstore_union(PG_FUNCTION_ARGS)
 
 	len = CALCGTSIZE(flag);
 	result = (GISTTYPE *) palloc(len);
-	*size = result->len = len;
+	SET_VARSIZE(result, len);
 	result->flag = flag;
 	if (!ISALLTRUE(result))
 		memcpy((void *) GETSIGN(result), (void *) base, sizeof(BITVEC));
+	*size = len;
 
 	PG_RETURN_POINTER(result);
 }
@@ -383,13 +382,13 @@ ghstore_picksplit(PG_FUNCTION_ARGS)
 	if (ISALLTRUE(GETENTRY(entryvec, seed_1)))
 	{
 		datum_l = (GISTTYPE *) palloc(GTHDRSIZE);
-		datum_l->len = GTHDRSIZE;
+		SET_VARSIZE(datum_l, GTHDRSIZE);
 		datum_l->flag = ALLISTRUE;
 	}
 	else
 	{
 		datum_l = (GISTTYPE *) palloc(GTHDRSIZE + SIGLEN);
-		datum_l->len = GTHDRSIZE + SIGLEN;
+		SET_VARSIZE(datum_l, GTHDRSIZE + SIGLEN);
 		datum_l->flag = 0;
 		memcpy((void *) GETSIGN(datum_l), (void *) GETSIGN(GETENTRY(entryvec, seed_1)), sizeof(BITVEC))
 			;
@@ -397,13 +396,13 @@ ghstore_picksplit(PG_FUNCTION_ARGS)
 	if (ISALLTRUE(GETENTRY(entryvec, seed_2)))
 	{
 		datum_r = (GISTTYPE *) palloc(GTHDRSIZE);
-		datum_r->len = GTHDRSIZE;
+		SET_VARSIZE(datum_r, GTHDRSIZE);
 		datum_r->flag = ALLISTRUE;
 	}
 	else
 	{
 		datum_r = (GISTTYPE *) palloc(GTHDRSIZE + SIGLEN);
-		datum_r->len = GTHDRSIZE + SIGLEN;
+		SET_VARSIZE(datum_r, GTHDRSIZE + SIGLEN);
 		datum_r->flag = 0;
 		memcpy((void *) GETSIGN(datum_r), (void *) GETSIGN(GETENTRY(entryvec, seed_2)), sizeof(BITVEC));
 	}
diff --git a/contrib/hstore/hstore_io.c b/contrib/hstore/hstore_io.c
index ac5df492239d197904453a603c2b7c285fa258df..6a395a2b867767c8ba96c5cc8d7eaa3bc8b0b52c 100644
--- a/contrib/hstore/hstore_io.c
+++ b/contrib/hstore/hstore_io.c
@@ -363,7 +363,7 @@ hstore_in(PG_FUNCTION_ARGS)
 		freeHSParse(&state);
 		len = CALCDATASIZE(0, 0);
 		out = palloc(len);
-		out->len = len;
+		SET_VARSIZE(out, len);
 		out->size = 0;
 		PG_RETURN_POINTER(out);
 	}
@@ -372,7 +372,7 @@ hstore_in(PG_FUNCTION_ARGS)
 
 	len = CALCDATASIZE(state.pcur, buflen);
 	out = palloc(len);
-	out->len = len;
+	SET_VARSIZE(out, len);
 	out->size = state.pcur;
 
 	entries = ARRPTR(out);
@@ -436,7 +436,7 @@ hstore_out(PG_FUNCTION_ARGS)
 	}
 
 	buflen = (4 /* " */ + 2 /* => */ + 2 /* , */ ) * in->size +
-		2 /* esc */ * (in->len - CALCDATASIZE(in->size, 0));
+		2 /* esc */ * (VARSIZE(in) - CALCDATASIZE(in->size, 0));
 
 	out = ptr = palloc(buflen);
 	for (i = 0; i < in->size; i++)
diff --git a/contrib/hstore/hstore_op.c b/contrib/hstore/hstore_op.c
index f16a58988e1e3a1b90402f8ea4731bd8ed04fb33..ef3eb86ca3eaae154ced1b91e84a91b79fa045ec 100644
--- a/contrib/hstore/hstore_op.c
+++ b/contrib/hstore/hstore_op.c
@@ -105,13 +105,13 @@ delete(PG_FUNCTION_ARGS)
 {
 	HStore	   *hs = PG_GETARG_HS(0);
 	text	   *key = PG_GETARG_TEXT_P(1);
-	HStore	   *out = palloc(hs->len);
+	HStore	   *out = palloc(VARSIZE(hs));
 	char	   *ptrs,
 			   *ptrd;
 	HEntry	   *es,
 			   *ed;
 
-	out->len = hs->len;
+	SET_VARSIZE(out, VARSIZE(hs));
 	out->size = hs->size;		/* temporary! */
 
 	ptrs = STRPTR(hs);
@@ -142,7 +142,7 @@ delete(PG_FUNCTION_ARGS)
 		out->size = ed - ARRPTR(out);
 
 		memmove(STRPTR(out), ptrd, buflen);
-		out->len = CALCDATASIZE(out->size, buflen);
+		SET_VARSIZE(out, CALCDATASIZE(out->size, buflen));
 	}
 
 
@@ -159,7 +159,7 @@ hs_concat(PG_FUNCTION_ARGS)
 {
 	HStore	   *s1 = PG_GETARG_HS(0);
 	HStore	   *s2 = PG_GETARG_HS(1);
-	HStore	   *out = palloc(s1->len + s2->len);
+	HStore	   *out = palloc(VARSIZE(s1) + VARSIZE(s2));
 	char	   *ps1,
 			   *ps2,
 			   *pd;
@@ -167,7 +167,7 @@ hs_concat(PG_FUNCTION_ARGS)
 			   *es2,
 			   *ed;
 
-	out->len = s1->len + s2->len;
+	SET_VARSIZE(out, VARSIZE(s1) + VARSIZE(s2));
 	out->size = s1->size + s2->size;
 
 	ps1 = STRPTR(s1);
@@ -256,7 +256,7 @@ hs_concat(PG_FUNCTION_ARGS)
 		out->size = ed - ARRPTR(out);
 
 		memmove(STRPTR(out), pd, buflen);
-		out->len = CALCDATASIZE(out->size, buflen);
+		SET_VARSIZE(out, CALCDATASIZE(out->size, buflen));
 	}
 
 	PG_FREE_IF_COPY(s1, 0);
@@ -277,7 +277,7 @@ tconvert(PG_FUNCTION_ARGS)
 
 	len = CALCDATASIZE(1, VARSIZE(key) + VARSIZE(val) - 2 * VARHDRSZ);
 	out = palloc(len);
-	out->len = len;
+	SET_VARSIZE(out, len);
 	out->size = 1;
 
 	ARRPTR(out)->keylen = VARSIZE(key) - VARHDRSZ;
@@ -399,8 +399,8 @@ setup_firstcall(FuncCallContext *funcctx, HStore * hs)
 
 	st = (AKStore *) palloc(sizeof(AKStore));
 	st->i = 0;
-	st->hs = (HStore *) palloc(hs->len);
-	memcpy(st->hs, hs, hs->len);
+	st->hs = (HStore *) palloc(VARSIZE(hs));
+	memcpy(st->hs, hs, VARSIZE(hs));
 
 	funcctx->user_fctx = (void *) st;
 	MemoryContextSwitchTo(oldcontext);
@@ -568,8 +568,8 @@ each(PG_FUNCTION_ARGS)
 		oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
 		st = (AKStore *) palloc(sizeof(AKStore));
 		st->i = 0;
-		st->hs = (HStore *) palloc(hs->len);
-		memcpy(st->hs, hs, hs->len);
+		st->hs = (HStore *) palloc(VARSIZE(hs));
+		memcpy(st->hs, hs, VARSIZE(hs));
 		funcctx->user_fctx = (void *) st;
 
 		tupdesc = RelationNameGetTupleDesc("hs_each");
diff --git a/contrib/intarray/_int.h b/contrib/intarray/_int.h
index cee970d1b1f2251ac4e530a917814c9fe61edcd8..97e6fe642fcac86a6c7c6666314ed0552a4e285b 100644
--- a/contrib/intarray/_int.h
+++ b/contrib/intarray/_int.h
@@ -85,7 +85,7 @@ typedef char *BITVECP;
  */
 typedef struct
 {
-	int4		len;
+	int32		vl_len_;		/* varlena header (do not touch directly!) */
 	int4		flag;
 	char		data[1];
 }	GISTTYPE;
@@ -94,7 +94,7 @@ typedef struct
 
 #define ISALLTRUE(x)	( ((GISTTYPE*)x)->flag & ALLISTRUE )
 
-#define GTHDRSIZE		( sizeof(int4)*2  )
+#define GTHDRSIZE		(VARHDRSZ + sizeof(int4))
 #define CALCGTSIZE(flag) ( GTHDRSIZE+(((flag) & ALLISTRUE) ? 0 : SIGLEN) )
 
 #define GETSIGN(x)		( (BITVECP)( (char*)x+GTHDRSIZE ) )
@@ -145,12 +145,12 @@ typedef struct ITEM
 
 typedef struct
 {
-	int4		len;
+	int32		vl_len_;		/* varlena header (do not touch directly!) */
 	int4		size;
 	char		data[1];
 }	QUERYTYPE;
 
-#define HDRSIZEQT	( 2*sizeof(int4) )
+#define HDRSIZEQT	(VARHDRSZ + sizeof(int4))
 #define COMPUTESIZE(size)	( HDRSIZEQT + size * sizeof(ITEM) )
 #define GETQUERY(x)  (ITEM*)( (char*)(x)+HDRSIZEQT )
 
diff --git a/contrib/intarray/_int_bool.c b/contrib/intarray/_int_bool.c
index b6a5d1b1e8984d82b37f1665b64cbed765747948..2a9d80bfdbc471cb2267e019c7c5377f1fcba5cf 100644
--- a/contrib/intarray/_int_bool.c
+++ b/contrib/intarray/_int_bool.c
@@ -465,7 +465,7 @@ bqarr_in(PG_FUNCTION_ARGS)
 
 	commonlen = COMPUTESIZE(state.num);
 	query = (QUERYTYPE *) palloc(commonlen);
-	query->len = commonlen;
+	SET_VARSIZE(query, commonlen);
 	query->size = state.num;
 	ptr = GETQUERY(query);
 
diff --git a/contrib/intarray/_intbig_gist.c b/contrib/intarray/_intbig_gist.c
index cb80d8f6f2452cb77df4d8bd7a356dbea2c8aafc..ffbbe71a9563d44f33568387dccdb8595e9d9edc 100644
--- a/contrib/intarray/_intbig_gist.c
+++ b/contrib/intarray/_intbig_gist.c
@@ -147,7 +147,7 @@ g_intbig_compress(PG_FUNCTION_ARGS)
 		ArrayType  *in = (ArrayType *) PG_DETOAST_DATUM(entry->key);
 		int4	   *ptr;
 		int			num;
-		GISTTYPE   *res = (GISTTYPE *) palloc(CALCGTSIZE(0));
+		GISTTYPE   *res = (GISTTYPE *) palloc0(CALCGTSIZE(0));
 
 		CHECKARRVALID(in);
 		if (ARRISVOID(in))
@@ -160,8 +160,7 @@ g_intbig_compress(PG_FUNCTION_ARGS)
 			ptr = ARRPTR(in);
 			num = ARRNELEMS(in);
 		}
-		memset(res, 0, CALCGTSIZE(0));
-		res->len = CALCGTSIZE(0);
+		SET_VARSIZE(res, CALCGTSIZE(0));
 
 		while (num--)
 		{
@@ -192,7 +191,7 @@ g_intbig_compress(PG_FUNCTION_ARGS)
 		);
 
 		res = (GISTTYPE *) palloc(CALCGTSIZE(ALLISTRUE));
-		res->len = CALCGTSIZE(ALLISTRUE);
+		SET_VARSIZE(res, CALCGTSIZE(ALLISTRUE));
 		res->flag = ALLISTRUE;
 
 		retval = (GISTENTRY *) palloc(sizeof(GISTENTRY));
@@ -292,10 +291,11 @@ g_intbig_union(PG_FUNCTION_ARGS)
 
 	len = CALCGTSIZE(flag);
 	result = (GISTTYPE *) palloc(len);
-	*size = result->len = len;
+	SET_VARSIZE(result, len);
 	result->flag = flag;
 	if (!ISALLTRUE(result))
 		memcpy((void *) GETSIGN(result), (void *) base, sizeof(BITVEC));
+	*size = len;
 
 	PG_RETURN_POINTER(result);
 }
@@ -389,26 +389,26 @@ g_intbig_picksplit(PG_FUNCTION_ARGS)
 	if (ISALLTRUE(GETENTRY(entryvec, seed_1)))
 	{
 		datum_l = (GISTTYPE *) palloc(GTHDRSIZE);
-		datum_l->len = GTHDRSIZE;
+		SET_VARSIZE(datum_l, GTHDRSIZE);
 		datum_l->flag = ALLISTRUE;
 	}
 	else
 	{
 		datum_l = (GISTTYPE *) palloc(GTHDRSIZE + SIGLEN);
-		datum_l->len = GTHDRSIZE + SIGLEN;
+		SET_VARSIZE(datum_l, GTHDRSIZE + SIGLEN);
 		datum_l->flag = 0;
 		memcpy((void *) GETSIGN(datum_l), (void *) GETSIGN(GETENTRY(entryvec, seed_1)), sizeof(BITVEC));
 	}
 	if (ISALLTRUE(GETENTRY(entryvec, seed_2)))
 	{
 		datum_r = (GISTTYPE *) palloc(GTHDRSIZE);
-		datum_r->len = GTHDRSIZE;
+		SET_VARSIZE(datum_r, GTHDRSIZE);
 		datum_r->flag = ALLISTRUE;
 	}
 	else
 	{
 		datum_r = (GISTTYPE *) palloc(GTHDRSIZE + SIGLEN);
-		datum_r->len = GTHDRSIZE + SIGLEN;
+		SET_VARSIZE(datum_r, GTHDRSIZE + SIGLEN);
 		datum_r->flag = 0;
 		memcpy((void *) GETSIGN(datum_r), (void *) GETSIGN(GETENTRY(entryvec, seed_2)), sizeof(BITVEC));
 	}
diff --git a/contrib/ltree/_ltree_gist.c b/contrib/ltree/_ltree_gist.c
index 0bac6475478dc9b34e72ad901ff5d8be6463bab5..4ce8864fb39dae625038965227c8a71187673ce4 100644
--- a/contrib/ltree/_ltree_gist.c
+++ b/contrib/ltree/_ltree_gist.c
@@ -94,7 +94,7 @@ _ltree_compress(PG_FUNCTION_ARGS)
 					 errmsg("array must not contain nulls")));
 
 		key = (ltree_gist *) palloc(len);
-		key->len = len;
+		SET_VARSIZE(key, len);
 		key->flag = 0;
 
 		MemSet(LTG_SIGN(key), 0, ASIGLEN);
@@ -124,7 +124,7 @@ _ltree_compress(PG_FUNCTION_ARGS)
 		);
 		len = LTG_HDRSIZE;
 		key = (ltree_gist *) palloc(len);
-		key->len = len;
+		SET_VARSIZE(key, len);
 		key->flag = LTG_ALLTRUE;
 
 		retval = (GISTENTRY *) palloc(sizeof(GISTENTRY));
@@ -204,10 +204,11 @@ _ltree_union(PG_FUNCTION_ARGS)
 
 	len = LTG_HDRSIZE + ((flag & LTG_ALLTRUE) ? 0 : ASIGLEN);
 	result = (ltree_gist *) palloc(len);
-	*size = result->len = len;
+	SET_VARSIZE(result, len);
 	result->flag = flag;
 	if (!LTG_ISALLTRUE(result))
 		memcpy((void *) LTG_SIGN(result), (void *) base, sizeof(ABITVEC));
+	*size = len;
 
 	PG_RETURN_POINTER(result);
 }
@@ -340,26 +341,26 @@ _ltree_picksplit(PG_FUNCTION_ARGS)
 	if (LTG_ISALLTRUE(GETENTRY(entryvec, seed_1)))
 	{
 		datum_l = (ltree_gist *) palloc(LTG_HDRSIZE);
-		datum_l->len = LTG_HDRSIZE;
+		SET_VARSIZE(datum_l, LTG_HDRSIZE);
 		datum_l->flag = LTG_ALLTRUE;
 	}
 	else
 	{
 		datum_l = (ltree_gist *) palloc(LTG_HDRSIZE + ASIGLEN);
-		datum_l->len = LTG_HDRSIZE + ASIGLEN;
+		SET_VARSIZE(datum_l, LTG_HDRSIZE + ASIGLEN);
 		datum_l->flag = 0;
 		memcpy((void *) LTG_SIGN(datum_l), (void *) LTG_SIGN(GETENTRY(entryvec, seed_1)), sizeof(ABITVEC));
 	}
 	if (LTG_ISALLTRUE(GETENTRY(entryvec, seed_2)))
 	{
 		datum_r = (ltree_gist *) palloc(LTG_HDRSIZE);
-		datum_r->len = LTG_HDRSIZE;
+		SET_VARSIZE(datum_r, LTG_HDRSIZE);
 		datum_r->flag = LTG_ALLTRUE;
 	}
 	else
 	{
 		datum_r = (ltree_gist *) palloc(LTG_HDRSIZE + ASIGLEN);
-		datum_r->len = LTG_HDRSIZE + ASIGLEN;
+		SET_VARSIZE(datum_r, LTG_HDRSIZE + ASIGLEN);
 		datum_r->flag = 0;
 		memcpy((void *) LTG_SIGN(datum_r), (void *) LTG_SIGN(GETENTRY(entryvec, seed_2)), sizeof(ABITVEC));
 	}
diff --git a/contrib/ltree/_ltree_op.c b/contrib/ltree/_ltree_op.c
index ff8eec793a644eae571635638aca4c03ed3277ac..f93d2bb8889574dc54efec1cdb2eee8cf5418a1c 100644
--- a/contrib/ltree/_ltree_op.c
+++ b/contrib/ltree/_ltree_op.c
@@ -215,8 +215,8 @@ _ltree_extract_isparent(PG_FUNCTION_ARGS)
 		PG_RETURN_NULL();
 	}
 
-	item = (ltree *) palloc(found->len);
-	memcpy(item, found, found->len);
+	item = (ltree *) palloc(VARSIZE(found));
+	memcpy(item, found, VARSIZE(found));
 
 	PG_FREE_IF_COPY(la, 0);
 	PG_FREE_IF_COPY(query, 1);
@@ -238,8 +238,8 @@ _ltree_extract_risparent(PG_FUNCTION_ARGS)
 		PG_RETURN_NULL();
 	}
 
-	item = (ltree *) palloc(found->len);
-	memcpy(item, found, found->len);
+	item = (ltree *) palloc(VARSIZE(found));
+	memcpy(item, found, VARSIZE(found));
 
 	PG_FREE_IF_COPY(la, 0);
 	PG_FREE_IF_COPY(query, 1);
@@ -261,8 +261,8 @@ _ltq_extract_regex(PG_FUNCTION_ARGS)
 		PG_RETURN_NULL();
 	}
 
-	item = (ltree *) palloc(found->len);
-	memcpy(item, found, found->len);
+	item = (ltree *) palloc(VARSIZE(found));
+	memcpy(item, found, VARSIZE(found));
 
 	PG_FREE_IF_COPY(la, 0);
 	PG_FREE_IF_COPY(query, 1);
@@ -284,8 +284,8 @@ _ltxtq_extract_exec(PG_FUNCTION_ARGS)
 		PG_RETURN_NULL();
 	}
 
-	item = (ltree *) palloc(found->len);
-	memcpy(item, found, found->len);
+	item = (ltree *) palloc(VARSIZE(found));
+	memcpy(item, found, VARSIZE(found));
 
 	PG_FREE_IF_COPY(la, 0);
 	PG_FREE_IF_COPY(query, 1);
diff --git a/contrib/ltree/ltree.h b/contrib/ltree/ltree.h
index 1ff5707fb13a23ba3c7fd607f7dbc82cca221108..d627c45bd3629e9744634bf4abb87004dd8454ce 100644
--- a/contrib/ltree/ltree.h
+++ b/contrib/ltree/ltree.h
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/contrib/ltree/ltree.h,v 1.17 2006/10/04 00:29:45 momjian Exp $ */
+/* $PostgreSQL: pgsql/contrib/ltree/ltree.h,v 1.18 2007/02/28 22:44:38 tgl Exp $ */
 
 #ifndef __LTREE_H__
 #define __LTREE_H__
@@ -18,12 +18,12 @@ typedef struct
 
 typedef struct
 {
-	int32		len;
+	int32		vl_len_;		/* varlena header (do not touch directly!) */
 	uint16		numlevel;
 	char		data[1];
 }	ltree;
 
-#define LTREE_HDRSIZE	MAXALIGN( sizeof(int32) + sizeof(uint16) )
+#define LTREE_HDRSIZE	MAXALIGN(VARHDRSZ + sizeof(uint16))
 #define LTREE_FIRST(x)	( (ltree_level*)( ((char*)(x))+LTREE_HDRSIZE ) )
 
 
@@ -68,14 +68,14 @@ typedef struct
 
 typedef struct
 {
-	int32		len;
+	int32		vl_len_;		/* varlena header (do not touch directly!) */
 	uint16		numlevel;
 	uint16		firstgood;
 	uint16		flag;
 	char		data[1];
 }	lquery;
 
-#define LQUERY_HDRSIZE	 MAXALIGN( sizeof(int32) + 3*sizeof(uint16) )
+#define LQUERY_HDRSIZE	 MAXALIGN(VARHDRSZ + 3*sizeof(uint16))
 #define LQUERY_FIRST(x)   ( (lquery_level*)( ((char*)(x))+LQUERY_HDRSIZE ) )
 
 #define LQUERY_HASNOT		0x01
@@ -105,12 +105,12 @@ typedef struct ITEM
  */
 typedef struct
 {
-	int4		len;
+	int32		vl_len_;		/* varlena header (do not touch directly!) */
 	int4		size;
 	char		data[1];
 }	ltxtquery;
 
-#define HDRSIZEQT		MAXALIGN( 2*sizeof(int4) )
+#define HDRSIZEQT		MAXALIGN(VARHDRSZ + sizeof(int4))
 #define COMPUTESIZE(size,lenofoperand)	( HDRSIZEQT + (size) * sizeof(ITEM) + (lenofoperand) )
 #define GETQUERY(x)  (ITEM*)( (char*)(x)+HDRSIZEQT )
 #define GETOPERAND(x)	( (char*)GETQUERY(x) + ((ltxtquery*)x)->size * sizeof(ITEM) )
@@ -205,7 +205,7 @@ typedef unsigned char *BITVECP;
 
 typedef struct
 {
-	int4		len;
+	int32		vl_len_;		/* varlena header (do not touch directly!) */
 	uint32		flag;
 	char		data[1];
 }	ltree_gist;
@@ -214,14 +214,14 @@ typedef struct
 #define LTG_ALLTRUE 0x02
 #define LTG_NORIGHT 0x04
 
-#define LTG_HDRSIZE MAXALIGN( sizeof(int4) + sizeof(uint32) )
+#define LTG_HDRSIZE MAXALIGN(VARHDRSZ + sizeof(uint32))
 #define LTG_SIGN(x) ( (BITVECP)( ((char*)(x))+LTG_HDRSIZE ) )
 #define LTG_NODE(x) ( (ltree*)( ((char*)(x))+LTG_HDRSIZE ) )
 #define LTG_ISONENODE(x) ( ((ltree_gist*)(x))->flag & LTG_ONENODE )
 #define LTG_ISALLTRUE(x) ( ((ltree_gist*)(x))->flag & LTG_ALLTRUE )
 #define LTG_ISNORIGHT(x) ( ((ltree_gist*)(x))->flag & LTG_NORIGHT )
 #define LTG_LNODE(x)	( (ltree*)( ( ((char*)(x))+LTG_HDRSIZE ) + ( LTG_ISALLTRUE(x) ? 0 : SIGLEN ) ) )
-#define LTG_RENODE(x)	( (ltree*)( ((char*)LTG_LNODE(x)) + LTG_LNODE(x)->len) )
+#define LTG_RENODE(x)	( (ltree*)( ((char*)LTG_LNODE(x)) + VARSIZE(LTG_LNODE(x))) )
 #define LTG_RNODE(x)	( LTG_ISNORIGHT(x) ? LTG_LNODE(x) : LTG_RENODE(x) )
 
 #define LTG_GETLNODE(x) ( LTG_ISONENODE(x) ? LTG_NODE(x) : LTG_LNODE(x) )
diff --git a/contrib/ltree/ltree_gist.c b/contrib/ltree/ltree_gist.c
index 0239c5fe991c183444c51d3a04e16cdd6031f200..b74110d8f50ed198aecef89471736d5233d0eeb1 100644
--- a/contrib/ltree/ltree_gist.c
+++ b/contrib/ltree/ltree_gist.c
@@ -1,7 +1,7 @@
 /*
  * GiST support for ltree
  * Teodor Sigaev <teodor@stack.net>
- * $PostgreSQL: pgsql/contrib/ltree/ltree_gist.c,v 1.19 2006/10/04 00:29:45 momjian Exp $
+ * $PostgreSQL: pgsql/contrib/ltree/ltree_gist.c,v 1.20 2007/02/28 22:44:38 tgl Exp $
  */
 
 #include "ltree.h"
@@ -71,12 +71,12 @@ ltree_compress(PG_FUNCTION_ARGS)
 	{							/* ltree */
 		ltree_gist *key;
 		ltree	   *val = (ltree *) DatumGetPointer(PG_DETOAST_DATUM(entry->key));
-		int4		len = LTG_HDRSIZE + val->len;
+		int4		len = LTG_HDRSIZE + VARSIZE(val);
 
 		key = (ltree_gist *) palloc(len);
-		key->len = len;
+		SET_VARSIZE(key, len);
 		key->flag = LTG_ONENODE;
-		memcpy((void *) LTG_NODE(key), (void *) val, val->len);
+		memcpy((void *) LTG_NODE(key), (void *) val, VARSIZE(val));
 
 		retval = (GISTENTRY *) palloc(sizeof(GISTENTRY));
 		gistentryinit(*retval, PointerGetDatum(key),
@@ -225,10 +225,10 @@ ltree_union(PG_FUNCTION_ARGS)
 	}
 
 	isleqr = (left == right || ISEQ(left, right)) ? true : false;
-	*size = LTG_HDRSIZE + ((isalltrue) ? 0 : SIGLEN) + left->len + ((isleqr) ? 0 : right->len);
+	*size = LTG_HDRSIZE + ((isalltrue) ? 0 : SIGLEN) + VARSIZE(left) + ((isleqr) ? 0 : VARSIZE(right));
 
 	result = (ltree_gist *) palloc(*size);
-	result->len = *size;
+	SET_VARSIZE(result, *size);
 	result->flag = 0;
 
 	if (isalltrue)
@@ -236,11 +236,11 @@ ltree_union(PG_FUNCTION_ARGS)
 	else
 		memcpy((void *) LTG_SIGN(result), base, SIGLEN);
 
-	memcpy((void *) LTG_LNODE(result), (void *) left, left->len);
+	memcpy((void *) LTG_LNODE(result), (void *) left, VARSIZE(left));
 	if (isleqr)
 		result->flag |= LTG_NORIGHT;
 	else
-		memcpy((void *) LTG_RNODE(result), (void *) right, right->len);
+		memcpy((void *) LTG_RNODE(result), (void *) right, VARSIZE(right));
 
 	PG_RETURN_POINTER(result);
 }
@@ -399,36 +399,36 @@ ltree_picksplit(PG_FUNCTION_ARGS)
 
 	lu_l = LTG_GETLNODE(GETENTRY(entryvec, array[FirstOffsetNumber].index));
 	isleqr = (lu_l == lu_r || ISEQ(lu_l, lu_r)) ? true : false;
-	size = LTG_HDRSIZE + ((lisat) ? 0 : SIGLEN) + lu_l->len + ((isleqr) ? 0 : lu_r->len);
+	size = LTG_HDRSIZE + ((lisat) ? 0 : SIGLEN) + VARSIZE(lu_l) + ((isleqr) ? 0 : VARSIZE(lu_r));
 	lu = (ltree_gist *) palloc(size);
-	lu->len = size;
+	SET_VARSIZE(lu, size);
 	lu->flag = 0;
 	if (lisat)
 		lu->flag |= LTG_ALLTRUE;
 	else
 		memcpy((void *) LTG_SIGN(lu), ls, SIGLEN);
-	memcpy((void *) LTG_LNODE(lu), (void *) lu_l, lu_l->len);
+	memcpy((void *) LTG_LNODE(lu), (void *) lu_l, VARSIZE(lu_l));
 	if (isleqr)
 		lu->flag |= LTG_NORIGHT;
 	else
-		memcpy((void *) LTG_RNODE(lu), (void *) lu_r, lu_r->len);
+		memcpy((void *) LTG_RNODE(lu), (void *) lu_r, VARSIZE(lu_r));
 
 
 	ru_l = LTG_GETLNODE(GETENTRY(entryvec, array[1 + ((maxoff - FirstOffsetNumber + 1) / 2)].index));
 	isleqr = (ru_l == ru_r || ISEQ(ru_l, ru_r)) ? true : false;
-	size = LTG_HDRSIZE + ((risat) ? 0 : SIGLEN) + ru_l->len + ((isleqr) ? 0 : ru_r->len);
+	size = LTG_HDRSIZE + ((risat) ? 0 : SIGLEN) + VARSIZE(ru_l) + ((isleqr) ? 0 : VARSIZE(ru_r));
 	ru = (ltree_gist *) palloc(size);
-	ru->len = size;
+	SET_VARSIZE(ru, size);
 	ru->flag = 0;
 	if (risat)
 		ru->flag |= LTG_ALLTRUE;
 	else
 		memcpy((void *) LTG_SIGN(ru), rs, SIGLEN);
-	memcpy((void *) LTG_LNODE(ru), (void *) ru_l, ru_l->len);
+	memcpy((void *) LTG_LNODE(ru), (void *) ru_l, VARSIZE(ru_l));
 	if (isleqr)
 		ru->flag |= LTG_NORIGHT;
 	else
-		memcpy((void *) LTG_RNODE(ru), (void *) ru_r, ru_r->len);
+		memcpy((void *) LTG_RNODE(ru), (void *) ru_r, VARSIZE(ru_r));
 
 	v->spl_ldatum = PointerGetDatum(lu);
 	v->spl_rdatum = PointerGetDatum(ru);
@@ -459,9 +459,9 @@ gist_isparent(ltree_gist * key, ltree * query)
 static ltree *
 copy_ltree(ltree * src)
 {
-	ltree	   *dst = (ltree *) palloc(src->len);
+	ltree	   *dst = (ltree *) palloc(VARSIZE(src));
 
-	memcpy(dst, src, src->len);
+	memcpy(dst, src, VARSIZE(src));
 	return dst;
 }
 
diff --git a/contrib/ltree/ltree_io.c b/contrib/ltree/ltree_io.c
index eb22894079c7896e79f6d68bb5f69da0e17904e2..a6cb357d27bc55415edba2562548090e82e5f06c 100644
--- a/contrib/ltree/ltree_io.c
+++ b/contrib/ltree/ltree_io.c
@@ -1,7 +1,7 @@
 /*
  * in/out function for ltree and lquery
  * Teodor Sigaev <teodor@stack.net>
- * $PostgreSQL: pgsql/contrib/ltree/ltree_io.c,v 1.13 2006/09/22 21:39:57 tgl Exp $
+ * $PostgreSQL: pgsql/contrib/ltree/ltree_io.c,v 1.14 2007/02/28 22:44:38 tgl Exp $
  */
 
 #include "ltree.h"
@@ -119,7 +119,7 @@ ltree_in(PG_FUNCTION_ARGS)
 				 errdetail("Unexpected end of line.")));
 
 	result = (ltree *) palloc(LTREE_HDRSIZE + totallen);
-	result->len = LTREE_HDRSIZE + totallen;
+	SET_VARSIZE(result, LTREE_HDRSIZE + totallen);
 	result->numlevel = lptr - list;
 	curlevel = LTREE_FIRST(result);
 	lptr = list;
@@ -144,7 +144,7 @@ ltree_out(PG_FUNCTION_ARGS)
 	int			i;
 	ltree_level *curlevel;
 
-	ptr = buf = (char *) palloc(in->len);
+	ptr = buf = (char *) palloc(VARSIZE(in));
 	curlevel = LTREE_FIRST(in);
 	for (i = 0; i < in->numlevel; i++)
 	{
@@ -449,7 +449,7 @@ lquery_in(PG_FUNCTION_ARGS)
 	}
 
 	result = (lquery *) palloc(totallen);
-	result->len = totallen;
+	SET_VARSIZE(result, totallen);
 	result->numlevel = num;
 	result->firstgood = 0;
 	result->flag = 0;
diff --git a/contrib/ltree/ltree_op.c b/contrib/ltree/ltree_op.c
index 5f80394a713c566fe63bc8053cfcc38a11966251..be2733273fb7f7cd6953b4e2e9e749a1cee883b9 100644
--- a/contrib/ltree/ltree_op.c
+++ b/contrib/ltree/ltree_op.c
@@ -1,7 +1,7 @@
 /*
  * op function for ltree
  * Teodor Sigaev <teodor@stack.net>
- * $PostgreSQL: pgsql/contrib/ltree/ltree_op.c,v 1.15 2007/02/27 23:48:06 tgl Exp $
+ * $PostgreSQL: pgsql/contrib/ltree/ltree_op.c,v 1.16 2007/02/28 22:44:38 tgl Exp $
  */
 
 #include "ltree.h"
@@ -230,7 +230,7 @@ inner_subltree(ltree * t, int4 startpos, int4 endpos)
 	}
 
 	res = (ltree *) palloc(LTREE_HDRSIZE + (end - start));
-	res->len = LTREE_HDRSIZE + (end - start);
+	SET_VARSIZE(res, LTREE_HDRSIZE + (end - start));
 	res->numlevel = endpos - startpos;
 
 	memcpy(LTREE_FIRST(res), start, end - start);
@@ -286,13 +286,14 @@ ltree_concat(ltree * a, ltree * b)
 {
 	ltree	   *r;
 
-	r = (ltree *) palloc(a->len + b->len - LTREE_HDRSIZE);
-	r->len = a->len + b->len - LTREE_HDRSIZE;
+	r = (ltree *) palloc(VARSIZE(a) + VARSIZE(b) - LTREE_HDRSIZE);
+	SET_VARSIZE(r, VARSIZE(a) + VARSIZE(b) - LTREE_HDRSIZE);
 	r->numlevel = a->numlevel + b->numlevel;
 
-	memcpy(LTREE_FIRST(r), LTREE_FIRST(a), a->len - LTREE_HDRSIZE);
-	memcpy(((char *) LTREE_FIRST(r)) + a->len - LTREE_HDRSIZE, LTREE_FIRST(b), b->len -
-		   LTREE_HDRSIZE);
+	memcpy(LTREE_FIRST(r), LTREE_FIRST(a), VARSIZE(a) - LTREE_HDRSIZE);
+	memcpy(((char *) LTREE_FIRST(r)) + VARSIZE(a) - LTREE_HDRSIZE,
+		   LTREE_FIRST(b),
+		   VARSIZE(b) - LTREE_HDRSIZE);
 	return r;
 }
 
@@ -476,7 +477,7 @@ lca_inner(ltree ** a, int len)
 	}
 
 	res = (ltree *) palloc(reslen);
-	res->len = reslen;
+	SET_VARSIZE(res, reslen);
 	res->numlevel = num;
 
 	l1 = LTREE_FIRST(*a);
@@ -542,7 +543,7 @@ ltree2text(PG_FUNCTION_ARGS)
 	ltree_level *curlevel;
 	text	   *out;
 
-	out = (text *) palloc(in->len + VARHDRSZ);
+	out = (text *) palloc(VARSIZE(in) + VARHDRSZ);
 	ptr = VARDATA(out);
 	curlevel = LTREE_FIRST(in);
 	for (i = 0; i < in->numlevel; i++)
diff --git a/contrib/ltree/ltxtquery_io.c b/contrib/ltree/ltxtquery_io.c
index ca6325adf72b1f59f486bfa4cf33b0f66f306149..904d4490dc9b46ab917d7b1ae57c95cd398cb58b 100644
--- a/contrib/ltree/ltxtquery_io.c
+++ b/contrib/ltree/ltxtquery_io.c
@@ -1,7 +1,7 @@
 /*
  * txtquery io
  * Teodor Sigaev <teodor@stack.net>
- * $PostgreSQL: pgsql/contrib/ltree/ltxtquery_io.c,v 1.12 2006/09/22 21:39:57 tgl Exp $
+ * $PostgreSQL: pgsql/contrib/ltree/ltxtquery_io.c,v 1.13 2007/02/28 22:44:38 tgl Exp $
  */
 
 #include "ltree.h"
@@ -337,7 +337,7 @@ queryin(char *buf)
 	/* make finish struct */
 	commonlen = COMPUTESIZE(state.num, state.sumlen);
 	query = (ltxtquery *) palloc(commonlen);
-	query->len = commonlen;
+	SET_VARSIZE(query, commonlen);
 	query->size = state.num;
 	ptr = GETQUERY(query);
 
diff --git a/contrib/pg_trgm/trgm.h b/contrib/pg_trgm/trgm.h
index b7674c52b583c35c299a81ceb46ab9962d35b33c..bc2a4dc44a85d10280548d5afbb2b988e741958c 100644
--- a/contrib/pg_trgm/trgm.h
+++ b/contrib/pg_trgm/trgm.h
@@ -31,12 +31,12 @@ typedef char trgm[3];
 
 typedef struct
 {
-	int4		len;
+	int32		vl_len_;		/* varlena header (do not touch directly!) */
 	uint8		flag;
 	char		data[1];
 }	TRGM;
 
-#define TRGMHRDSIZE		  (sizeof(int4)+sizeof(uint8))
+#define TRGMHDRSIZE		  (VARHDRSZ + sizeof(uint8))
 
 /* gist */
 #define BITBYTE 8
@@ -70,12 +70,13 @@ typedef char *BITVECP;
 #define ISSIGNKEY(x)	( ((TRGM*)x)->flag & SIGNKEY )
 #define ISALLTRUE(x)	( ((TRGM*)x)->flag & ALLISTRUE )
 
-#define CALCGTSIZE(flag, len) ( TRGMHRDSIZE + ( ( (flag) & ARRKEY ) ? ((len)*sizeof(trgm)) : (((flag) & ALLISTRUE) ? 0 : SIGLEN) ) )
-#define GETSIGN(x)		( (BITVECP)( (char*)x+TRGMHRDSIZE ) )
-#define GETARR(x)		( (trgm*)( (char*)x+TRGMHRDSIZE ) )
-#define ARRNELEM(x) ( ( ((TRGM*)x)->len - TRGMHRDSIZE )/sizeof(trgm) )
+#define CALCGTSIZE(flag, len) ( TRGMHDRSIZE + ( ( (flag) & ARRKEY ) ? ((len)*sizeof(trgm)) : (((flag) & ALLISTRUE) ? 0 : SIGLEN) ) )
+#define GETSIGN(x)		( (BITVECP)( (char*)x+TRGMHDRSIZE ) )
+#define GETARR(x)		( (trgm*)( (char*)x+TRGMHDRSIZE ) )
+#define ARRNELEM(x) ( ( VARSIZE(x) - TRGMHDRSIZE )/sizeof(trgm) )
 
 extern float4 trgm_limit;
+
 TRGM	   *generate_trgm(char *str, int slen);
 float4		cnt_sml(TRGM * trg1, TRGM * trg2);
 
diff --git a/contrib/pg_trgm/trgm_gist.c b/contrib/pg_trgm/trgm_gist.c
index 41a827ae0c3357a157a57983abb02745968a9097..476cb1b9763f72462370449eba9a45003054107b 100644
--- a/contrib/pg_trgm/trgm_gist.c
+++ b/contrib/pg_trgm/trgm_gist.c
@@ -120,7 +120,7 @@ gtrgm_compress(PG_FUNCTION_ARGS)
 
 		len = CALCGTSIZE(SIGNKEY | ALLISTRUE, 0);
 		res = (TRGM *) palloc(len);
-		res->len = len;
+		SET_VARSIZE(res, len);
 		res->flag = SIGNKEY | ALLISTRUE;
 
 		retval = (GISTENTRY *) palloc(sizeof(GISTENTRY));
@@ -235,10 +235,11 @@ gtrgm_union(PG_FUNCTION_ARGS)
 	flag |= SIGNKEY;
 	len = CALCGTSIZE(flag, 0);
 	result = (TRGM *) palloc(len);
-	*size = result->len = len;
+	SET_VARSIZE(result, len);
 	result->flag = flag;
 	if (!ISALLTRUE(result))
 		memcpy((void *) GETSIGN(result), (void *) base, sizeof(BITVEC));
+	*size = len;
 
 	PG_RETURN_POINTER(result);
 }
@@ -486,26 +487,26 @@ gtrgm_picksplit(PG_FUNCTION_ARGS)
 	if (cache[seed_1].allistrue)
 	{
 		datum_l = (TRGM *) palloc(CALCGTSIZE(SIGNKEY | ALLISTRUE, 0));
-		datum_l->len = CALCGTSIZE(SIGNKEY | ALLISTRUE, 0);
+		SET_VARSIZE(datum_l, CALCGTSIZE(SIGNKEY | ALLISTRUE, 0));
 		datum_l->flag = SIGNKEY | ALLISTRUE;
 	}
 	else
 	{
 		datum_l = (TRGM *) palloc(CALCGTSIZE(SIGNKEY, 0));
-		datum_l->len = CALCGTSIZE(SIGNKEY, 0);
+		SET_VARSIZE(datum_l, CALCGTSIZE(SIGNKEY, 0));
 		datum_l->flag = SIGNKEY;
 		memcpy((void *) GETSIGN(datum_l), (void *) cache[seed_1].sign, sizeof(BITVEC));
 	}
 	if (cache[seed_2].allistrue)
 	{
 		datum_r = (TRGM *) palloc(CALCGTSIZE(SIGNKEY | ALLISTRUE, 0));
-		datum_r->len = CALCGTSIZE(SIGNKEY | ALLISTRUE, 0);
+		SET_VARSIZE(datum_r, CALCGTSIZE(SIGNKEY | ALLISTRUE, 0));
 		datum_r->flag = SIGNKEY | ALLISTRUE;
 	}
 	else
 	{
 		datum_r = (TRGM *) palloc(CALCGTSIZE(SIGNKEY, 0));
-		datum_r->len = CALCGTSIZE(SIGNKEY, 0);
+		SET_VARSIZE(datum_r, CALCGTSIZE(SIGNKEY, 0));
 		datum_r->flag = SIGNKEY;
 		memcpy((void *) GETSIGN(datum_r), (void *) cache[seed_2].sign, sizeof(BITVEC));
 	}
diff --git a/contrib/pg_trgm/trgm_op.c b/contrib/pg_trgm/trgm_op.c
index e247756a39996c136fa9a1ac3628909d5a7e35a2..e9afef4b21f7fc5033d8c314679e0249383dabcc 100644
--- a/contrib/pg_trgm/trgm_op.c
+++ b/contrib/pg_trgm/trgm_op.c
@@ -70,9 +70,9 @@ generate_trgm(char *str, int slen)
 	int			wl,
 				len;
 
-	trg = (TRGM *) palloc(TRGMHRDSIZE + sizeof(trgm) * (slen / 2 + 1) * 3);
+	trg = (TRGM *) palloc(TRGMHDRSIZE + sizeof(trgm) * (slen / 2 + 1) * 3);
 	trg->flag = ARRKEY;
-	trg->len = TRGMHRDSIZE;
+	SET_VARSIZE(trg, TRGMHDRSIZE);
 
 	if (slen + LPADDING + RPADDING < 3 || slen == 0)
 		return trg;
@@ -178,7 +178,7 @@ generate_trgm(char *str, int slen)
 		len = unique_array(GETARR(trg), len);
 	}
 
-	trg->len = CALCGTSIZE(ARRKEY, len);
+	SET_VARSIZE(trg, CALCGTSIZE(ARRKEY, len));
 
 	return trg;
 }
diff --git a/contrib/tsearch2/gistidx.c b/contrib/tsearch2/gistidx.c
index a4d9b2312ed828ea79b9a8c0a25bbac419b0c92b..14fdecb0b8d3759120e20841a8b98de42b27f0b4 100644
--- a/contrib/tsearch2/gistidx.c
+++ b/contrib/tsearch2/gistidx.c
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/contrib/tsearch2/gistidx.c,v 1.15 2006/10/04 00:29:46 momjian Exp $ */
+/* $PostgreSQL: pgsql/contrib/tsearch2/gistidx.c,v 1.16 2007/02/28 22:44:38 tgl Exp $ */
 
 #include "postgres.h"
 
@@ -163,7 +163,7 @@ gtsvector_compress(PG_FUNCTION_ARGS)
 
 		len = CALCGTSIZE(ARRKEY, val->size);
 		res = (GISTTYPE *) palloc(len);
-		res->len = len;
+		SET_VARSIZE(res, len);
 		res->flag = ARRKEY;
 		arr = GETARR(res);
 		len = val->size;
@@ -183,17 +183,17 @@ gtsvector_compress(PG_FUNCTION_ARGS)
 			 */
 			len = CALCGTSIZE(ARRKEY, len);
 			res = (GISTTYPE *) repalloc((void *) res, len);
-			res->len = len;
+			SET_VARSIZE(res, len);
 		}
 
 		/* make signature, if array is too long */
-		if (res->len > TOAST_INDEX_TARGET)
+		if (VARSIZE(res) > TOAST_INDEX_TARGET)
 		{
 			GISTTYPE   *ressign;
 
 			len = CALCGTSIZE(SIGNKEY, 0);
 			ressign = (GISTTYPE *) palloc(len);
-			ressign->len = len;
+			SET_VARSIZE(ressign, len);
 			ressign->flag = SIGNKEY;
 			makesign(GETSIGN(ressign), res);
 			res = ressign;
@@ -219,7 +219,7 @@ gtsvector_compress(PG_FUNCTION_ARGS)
 
 		len = CALCGTSIZE(SIGNKEY | ALLISTRUE, 0);
 		res = (GISTTYPE *) palloc(len);
-		res->len = len;
+		SET_VARSIZE(res, len);
 		res->flag = SIGNKEY | ALLISTRUE;
 
 		retval = (GISTENTRY *) palloc(sizeof(GISTENTRY));
@@ -375,10 +375,11 @@ gtsvector_union(PG_FUNCTION_ARGS)
 	flag |= SIGNKEY;
 	len = CALCGTSIZE(flag, 0);
 	result = (GISTTYPE *) palloc(len);
-	*size = result->len = len;
+	SET_VARSIZE(result, len);
 	result->flag = flag;
 	if (!ISALLTRUE(result))
 		memcpy((void *) GETSIGN(result), (void *) base, sizeof(BITVEC));
+	*size = len;
 
 	PG_RETURN_POINTER(result);
 }
@@ -627,26 +628,26 @@ gtsvector_picksplit(PG_FUNCTION_ARGS)
 	if (cache[seed_1].allistrue)
 	{
 		datum_l = (GISTTYPE *) palloc(CALCGTSIZE(SIGNKEY | ALLISTRUE, 0));
-		datum_l->len = CALCGTSIZE(SIGNKEY | ALLISTRUE, 0);
+		SET_VARSIZE(datum_l, CALCGTSIZE(SIGNKEY | ALLISTRUE, 0));
 		datum_l->flag = SIGNKEY | ALLISTRUE;
 	}
 	else
 	{
 		datum_l = (GISTTYPE *) palloc(CALCGTSIZE(SIGNKEY, 0));
-		datum_l->len = CALCGTSIZE(SIGNKEY, 0);
+		SET_VARSIZE(datum_l, CALCGTSIZE(SIGNKEY, 0));
 		datum_l->flag = SIGNKEY;
 		memcpy((void *) GETSIGN(datum_l), (void *) cache[seed_1].sign, sizeof(BITVEC));
 	}
 	if (cache[seed_2].allistrue)
 	{
 		datum_r = (GISTTYPE *) palloc(CALCGTSIZE(SIGNKEY | ALLISTRUE, 0));
-		datum_r->len = CALCGTSIZE(SIGNKEY | ALLISTRUE, 0);
+		SET_VARSIZE(datum_r, CALCGTSIZE(SIGNKEY | ALLISTRUE, 0));
 		datum_r->flag = SIGNKEY | ALLISTRUE;
 	}
 	else
 	{
 		datum_r = (GISTTYPE *) palloc(CALCGTSIZE(SIGNKEY, 0));
-		datum_r->len = CALCGTSIZE(SIGNKEY, 0);
+		SET_VARSIZE(datum_r, CALCGTSIZE(SIGNKEY, 0));
 		datum_r->flag = SIGNKEY;
 		memcpy((void *) GETSIGN(datum_r), (void *) cache[seed_2].sign, sizeof(BITVEC));
 	}
diff --git a/contrib/tsearch2/gistidx.h b/contrib/tsearch2/gistidx.h
index 9545946e31568536848701c28452063eae6c9f8a..5362584b80787af5df615510bb8b949d34eded9b 100644
--- a/contrib/tsearch2/gistidx.h
+++ b/contrib/tsearch2/gistidx.h
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/contrib/tsearch2/gistidx.h,v 1.7 2006/03/11 04:38:30 momjian Exp $ */
+/* $PostgreSQL: pgsql/contrib/tsearch2/gistidx.h,v 1.8 2007/02/28 22:44:38 tgl Exp $ */
 
 #ifndef __GISTIDX_H__
 #define __GISTIDX_H__
@@ -39,7 +39,7 @@ typedef char *BITVECP;
  */
 typedef struct
 {
-	int4		len;
+	int32		vl_len_;		/* varlena header (do not touch directly!) */
 	int4		flag;
 	char		data[1];
 }	GISTTYPE;
@@ -52,11 +52,11 @@ typedef struct
 #define ISSIGNKEY(x)	( ((GISTTYPE*)(x))->flag & SIGNKEY )
 #define ISALLTRUE(x)	( ((GISTTYPE*)(x))->flag & ALLISTRUE )
 
-#define GTHDRSIZE	( sizeof(int4) * 2	)
+#define GTHDRSIZE	( VARHDRSZ + sizeof(int4) )
 #define CALCGTSIZE(flag, len) ( GTHDRSIZE + ( ( (flag) & ARRKEY ) ? ((len)*sizeof(int4)) : (((flag) & ALLISTRUE) ? 0 : SIGLEN) ) )
 
 #define GETSIGN(x)	( (BITVECP)( (char*)(x)+GTHDRSIZE ) )
 #define GETARR(x)	( (int4*)( (char*)(x)+GTHDRSIZE ) )
-#define ARRNELEM(x) ( ( ((GISTTYPE*)(x))->len - GTHDRSIZE )/sizeof(int4) )
+#define ARRNELEM(x) ( ( VARSIZE(x) - GTHDRSIZE )/sizeof(int4) )
 
 #endif
diff --git a/contrib/tsearch2/query.c b/contrib/tsearch2/query.c
index eb2d30e15921f5d11a225be5181dc69635d779da..62a305ed1e8eef89cb94f8293f5684bec00ff986 100644
--- a/contrib/tsearch2/query.c
+++ b/contrib/tsearch2/query.c
@@ -658,7 +658,7 @@ static QUERYTYPE *
 				(errmsg("tsearch query doesn't contain lexeme(s): \"%s\"",
 						state.buffer)));
 		query = (QUERYTYPE *) palloc(HDRSIZEQT);
-		query->len = HDRSIZEQT;
+		SET_VARSIZE(query, HDRSIZEQT);
 		query->size = 0;
 		return query;
 	}
@@ -666,7 +666,7 @@ static QUERYTYPE *
 	/* make finish struct */
 	commonlen = COMPUTESIZE(state.num, state.sumlen);
 	query = (QUERYTYPE *) palloc(commonlen);
-	query->len = commonlen;
+	SET_VARSIZE(query, commonlen);
 	query->size = state.num;
 	ptr = GETQUERY(query);
 
@@ -961,7 +961,7 @@ to_tsquery(PG_FUNCTION_ARGS)
 	res = clean_fakeval_v2(GETQUERY(query), &len);
 	if (!res)
 	{
-		query->len = HDRSIZEQT;
+		SET_VARSIZE(query, HDRSIZEQT);
 		query->size = 0;
 		PG_RETURN_POINTER(query);
 	}
@@ -1016,7 +1016,7 @@ plainto_tsquery(PG_FUNCTION_ARGS)
 	res = clean_fakeval_v2(GETQUERY(query), &len);
 	if (!res)
 	{
-		query->len = HDRSIZEQT;
+		SET_VARSIZE(query, HDRSIZEQT);
 		query->size = 0;
 		PG_RETURN_POINTER(query);
 	}
diff --git a/contrib/tsearch2/query.h b/contrib/tsearch2/query.h
index b4d586a684b085c043c0eb611a269a73a0edf97d..44f87012130dce8b0bc9d20d793b89672dc2e585 100644
--- a/contrib/tsearch2/query.h
+++ b/contrib/tsearch2/query.h
@@ -28,12 +28,12 @@ typedef struct ITEM
  */
 typedef struct
 {
-	int4		len;
+	int32		vl_len_;		/* varlena header (do not touch directly!) */
 	int4		size;
 	char		data[1];
 }	QUERYTYPE;
 
-#define HDRSIZEQT	( 2 * sizeof(int4) )
+#define HDRSIZEQT	( VARHDRSZ + sizeof(int4) )
 #define COMPUTESIZE(size,lenofoperand)	( HDRSIZEQT + (size) * sizeof(ITEM) + (lenofoperand) )
 #define GETQUERY(x)  (ITEM*)( (char*)(x)+HDRSIZEQT )
 #define GETOPERAND(x)	( (char*)GETQUERY(x) + ((QUERYTYPE*)(x))->size * sizeof(ITEM) )
diff --git a/contrib/tsearch2/query_rewrite.c b/contrib/tsearch2/query_rewrite.c
index 63d8140a6c296863cf8b87cee64cf1bda43102a5..0604a49927a25ab6680b3ca54f54a3b166b58f48 100644
--- a/contrib/tsearch2/query_rewrite.c
+++ b/contrib/tsearch2/query_rewrite.c
@@ -250,7 +250,7 @@ rewrite_accum(PG_FUNCTION_ARGS)
 	if (acc == NULL || PG_ARGISNULL(0))
 	{
 		acc = (QUERYTYPE *) MEMALLOC(AggMemory, sizeof(QUERYTYPE));
-		acc->len = HDRSIZEQT;
+		SET_VARSIZE(acc, HDRSIZEQT);
 		acc->size = 0;
 	}
 
@@ -287,7 +287,7 @@ rewrite_accum(PG_FUNCTION_ARGS)
 
 	if (!acc->size)
 	{
-		if (acc->len > HDRSIZEQT)
+		if (VARSIZE(acc) > HDRSIZEQT)
 		{
 			pfree(elemsp);
 			PG_RETURN_POINTER(acc);
@@ -328,7 +328,7 @@ rewrite_accum(PG_FUNCTION_ARGS)
 		else
 		{
 			acc = (QUERYTYPE *) MEMALLOC(AggMemory, HDRSIZEQT * 2);
-			acc->len = HDRSIZEQT * 2;
+			SET_VARSIZE(acc, HDRSIZEQT * 2);
 			acc->size = 0;
 		}
 	}
@@ -353,12 +353,12 @@ rewrite_finish(PG_FUNCTION_ARGS)
 	if (acc == NULL || PG_ARGISNULL(0) || acc->size == 0)
 	{
 		acc = (QUERYTYPE *) palloc(sizeof(QUERYTYPE));
-		acc->len = HDRSIZEQT;
+		SET_VARSIZE(acc, HDRSIZEQT);
 		acc->size = 0;
 	}
 
-	rewrited = (QUERYTYPE *) palloc(acc->len);
-	memcpy(rewrited, acc, acc->len);
+	rewrited = (QUERYTYPE *) palloc(VARSIZE(acc));
+	memcpy(rewrited, acc, VARSIZE(acc));
 	pfree(acc);
 
 	PG_RETURN_POINTER(rewrited);
@@ -481,7 +481,7 @@ tsquery_rewrite(PG_FUNCTION_ARGS)
 	}
 	else
 	{
-		rewrited->len = HDRSIZEQT;
+		SET_VARSIZE(rewrited, HDRSIZEQT);
 		rewrited->size = 0;
 	}
 
@@ -529,7 +529,7 @@ tsquery_rewrite_query(PG_FUNCTION_ARGS)
 
 	if (!tree)
 	{
-		rewrited->len = HDRSIZEQT;
+		SET_VARSIZE(rewrited, HDRSIZEQT);
 		rewrited->size = 0;
 		PG_FREE_IF_COPY(ex, 1);
 		PG_FREE_IF_COPY(subst, 2);
diff --git a/contrib/tsearch2/query_support.c b/contrib/tsearch2/query_support.c
index dfdd71407396ff1f5f9826a7a2ef80f1c1ce2604..0fc6fe334d2858587331d013299ead4c731412e4 100644
--- a/contrib/tsearch2/query_support.c
+++ b/contrib/tsearch2/query_support.c
@@ -144,9 +144,9 @@ CompareTSQ(QUERYTYPE * a, QUERYTYPE * b)
 	{
 		return (a->size < b->size) ? -1 : 1;
 	}
-	else if (a->len != b->len)
+	else if (VARSIZE(a) != VARSIZE(b))
 	{
-		return (a->len < b->len) ? -1 : 1;
+		return (VARSIZE(a) < VARSIZE(b)) ? -1 : 1;
 	}
 	else
 	{
diff --git a/contrib/tsearch2/query_util.c b/contrib/tsearch2/query_util.c
index efa74fe053ca16fbc939e9918ac6f877d77a0498..083d173d1320478b654fe59afab28080e220ba58 100644
--- a/contrib/tsearch2/query_util.c
+++ b/contrib/tsearch2/query_util.c
@@ -260,7 +260,7 @@ QTN2QT(QTNode * in, MemoryType memtype)
 	len = COMPUTESIZE(nnode, sumlen);
 
 	out = (QUERYTYPE *) MEMALLOC(memtype, len);
-	out->len = len;
+	SET_VARSIZE(out, len);
 	out->size = nnode;
 
 	state.curitem = GETQUERY(out);