diff --git a/contrib/hstore/hstore_op.c b/contrib/hstore/hstore_op.c
index 4f285ee633953d3ab5c13d2a26856183112912fa..bb1ebe4055f1a9e11d3e726c91ab53734ac47af1 100644
--- a/contrib/hstore/hstore_op.c
+++ b/contrib/hstore/hstore_op.c
@@ -610,7 +610,7 @@ each(PG_FUNCTION_ARGS)
 		HEntry	   *ptr = &(ARRPTR(st->hs)[st->i]);
 		Datum		res,
 					dvalues[2];
-		char		nulls[] = {' ', ' '};
+		bool		nulls[2] = {false, false};
 		text	   *item;
 		HeapTuple	tuple;
 
@@ -620,7 +620,7 @@ each(PG_FUNCTION_ARGS)
 		if (ptr->valisnull)
 		{
 			dvalues[1] = (Datum) 0;
-			nulls[1] = 'n';
+			nulls[1] = true;
 		}
 		else
 		{
@@ -630,11 +630,11 @@ each(PG_FUNCTION_ARGS)
 		}
 		st->i++;
 
-		tuple = heap_formtuple(funcctx->attinmeta->tupdesc, dvalues, nulls);
+		tuple = heap_form_tuple(funcctx->attinmeta->tupdesc, dvalues, nulls);
 		res = HeapTupleGetDatum(tuple);
 
 		pfree(DatumGetPointer(dvalues[0]));
-		if (nulls[1] != 'n')
+		if (!nulls[1])
 			pfree(DatumGetPointer(dvalues[1]));
 
 		SRF_RETURN_NEXT(funcctx, PointerGetDatum(res));
diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c
index db557f900bd2c2a64e767bab1563f8590452960d..201a3878bc6eec9b7f68c8254e2a3a4879fa45f8 100644
--- a/src/backend/access/common/heaptuple.c
+++ b/src/backend/access/common/heaptuple.c
@@ -4,13 +4,6 @@
  *	  This file contains heap tuple accessor and mutator routines, as well
  *	  as various tuple utilities.
  *
- * NOTE: there is massive duplication of code in this module to
- * support both the convention that a null is marked by a bool TRUE,
- * and the convention that a null is marked by a char 'n'.	The latter
- * convention is deprecated but it'll probably be a long time before
- * we can get rid of it entirely.
- *
- *
  * Some notes about varlenas and this code:
  *
  * Before Postgres 8.3 varlenas always had a 4-byte length header, and
@@ -24,8 +17,8 @@
  * be expanded back to the normal 4-byte-header format by pg_detoast_datum.
  * (In performance-critical code paths we can use pg_detoast_datum_packed
  * and the appropriate access macros to avoid that overhead.)  Note that this
- * conversion is performed directly in heap_form_tuple (or heap_formtuple),
- * without explicitly invoking the toaster.
+ * conversion is performed directly in heap_form_tuple, without invoking
+ * tuptoaster.c.
  *
  * This change will break any code that assumes it needn't detoast values
  * that have been put into a tuple but never sent to disk.	Hopefully there
@@ -57,7 +50,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/access/common/heaptuple.c,v 1.122 2008/05/12 00:00:43 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/access/common/heaptuple.c,v 1.123 2008/11/02 01:45:26 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -128,54 +121,6 @@ heap_compute_data_size(TupleDesc tupleDesc,
 	return data_length;
 }
 
-/* ----------------
- *		ComputeDataSize
- *
- * Determine size of the data area of a tuple to be constructed
- *
- * OLD API with char 'n'/' ' convention for indicating nulls
- * ----------------
- */
-static Size
-ComputeDataSize(TupleDesc tupleDesc,
-				Datum *values,
-				char *nulls)
-{
-	Size		data_length = 0;
-	int			i;
-	int			numberOfAttributes = tupleDesc->natts;
-	Form_pg_attribute *att = tupleDesc->attrs;
-
-	for (i = 0; i < numberOfAttributes; i++)
-	{
-		Datum		val;
-
-		if (nulls[i] != ' ')
-			continue;
-
-		val = values[i];
-
-		if (ATT_IS_PACKABLE(att[i]) &&
-			VARATT_CAN_MAKE_SHORT(DatumGetPointer(val)))
-		{
-			/*
-			 * we're anticipating converting to a short varlena header, so
-			 * adjust length and don't count any alignment
-			 */
-			data_length += VARATT_CONVERTED_SHORT_SIZE(DatumGetPointer(val));
-		}
-		else
-		{
-			data_length = att_align_datum(data_length, att[i]->attalign,
-										  att[i]->attlen, val);
-			data_length = att_addlength_datum(data_length, att[i]->attlen,
-											  val);
-		}
-	}
-
-	return data_length;
-}
-
 /*
  * heap_fill_tuple
  *		Load data portion of a tuple from values/isnull arrays
@@ -310,138 +255,6 @@ heap_fill_tuple(TupleDesc tupleDesc,
 	Assert((data - start) == data_size);
 }
 
-/* ----------------
- *		DataFill
- *
- * Load data portion of a tuple from values/nulls arrays
- *
- * OLD API with char 'n'/' ' convention for indicating nulls
- * ----------------
- */
-static void
-DataFill(TupleDesc tupleDesc,
-		 Datum *values, char *nulls,
-		 char *data, Size data_size,
-		 uint16 *infomask, bits8 *bit)
-{
-	bits8	   *bitP;
-	int			bitmask;
-	int			i;
-	int			numberOfAttributes = tupleDesc->natts;
-	Form_pg_attribute *att = tupleDesc->attrs;
-
-#ifdef USE_ASSERT_CHECKING
-	char	   *start = data;
-#endif
-
-	if (bit != NULL)
-	{
-		bitP = &bit[-1];
-		bitmask = HIGHBIT;
-	}
-	else
-	{
-		/* just to keep compiler quiet */
-		bitP = NULL;
-		bitmask = 0;
-	}
-
-	*infomask &= ~(HEAP_HASNULL | HEAP_HASVARWIDTH | HEAP_HASEXTERNAL);
-
-	for (i = 0; i < numberOfAttributes; i++)
-	{
-		Size		data_length;
-
-		if (bit != NULL)
-		{
-			if (bitmask != HIGHBIT)
-				bitmask <<= 1;
-			else
-			{
-				bitP += 1;
-				*bitP = 0x0;
-				bitmask = 1;
-			}
-
-			if (nulls[i] == 'n')
-			{
-				*infomask |= HEAP_HASNULL;
-				continue;
-			}
-
-			*bitP |= bitmask;
-		}
-
-		/*
-		 * XXX we use the att_align macros on the pointer value itself, not on
-		 * an offset.  This is a bit of a hack.
-		 */
-
-		if (att[i]->attbyval)
-		{
-			/* pass-by-value */
-			data = (char *) att_align_nominal((long) data, att[i]->attalign);
-			store_att_byval(data, values[i], att[i]->attlen);
-			data_length = att[i]->attlen;
-		}
-		else if (att[i]->attlen == -1)
-		{
-			/* varlena */
-			Pointer		val = DatumGetPointer(values[i]);
-
-			*infomask |= HEAP_HASVARWIDTH;
-			if (VARATT_IS_EXTERNAL(val))
-			{
-				*infomask |= HEAP_HASEXTERNAL;
-				/* no alignment, since it's short by definition */
-				data_length = VARSIZE_EXTERNAL(val);
-				memcpy(data, val, data_length);
-			}
-			else if (VARATT_IS_SHORT(val))
-			{
-				/* no alignment for short varlenas */
-				data_length = VARSIZE_SHORT(val);
-				memcpy(data, val, data_length);
-			}
-			else if (VARLENA_ATT_IS_PACKABLE(att[i]) &&
-					 VARATT_CAN_MAKE_SHORT(val))
-			{
-				/* convert to short varlena -- no alignment */
-				data_length = VARATT_CONVERTED_SHORT_SIZE(val);
-				SET_VARSIZE_SHORT(data, data_length);
-				memcpy(data + 1, VARDATA(val), data_length - 1);
-			}
-			else
-			{
-				/* full 4-byte header varlena */
-				data = (char *) att_align_nominal((long) data,
-												  att[i]->attalign);
-				data_length = VARSIZE(val);
-				memcpy(data, val, data_length);
-			}
-		}
-		else if (att[i]->attlen == -2)
-		{
-			/* cstring ... never needs alignment */
-			*infomask |= HEAP_HASVARWIDTH;
-			Assert(att[i]->attalign == 'c');
-			data_length = strlen(DatumGetCString(values[i])) + 1;
-			memcpy(data, DatumGetPointer(values[i]), data_length);
-		}
-		else
-		{
-			/* fixed-length pass-by-reference */
-			data = (char *) att_align_nominal((long) data, att[i]->attalign);
-			Assert(att[i]->attlen > 0);
-			data_length = att[i]->attlen;
-			memcpy(data, DatumGetPointer(values[i]), data_length);
-		}
-
-		data += data_length;
-	}
-
-	Assert((data - start) == data_size);
-}
 
 /* ----------------------------------------------------------------
  *						heap tuple interface
@@ -952,7 +765,7 @@ heap_form_tuple(TupleDesc tupleDescriptor,
 	return tuple;
 }
 
-/* ----------------
+/*
  *		heap_formtuple
  *
  *		construct a tuple from the given values[] and nulls[] arrays
@@ -960,8 +773,9 @@ heap_form_tuple(TupleDesc tupleDescriptor,
  *		Null attributes are indicated by a 'n' in the appropriate byte
  *		of nulls[]. Non-null attributes are indicated by a ' ' (space).
  *
- * OLD API with char 'n'/' ' convention for indicating nulls
- * ----------------
+ * OLD API with char 'n'/' ' convention for indicating nulls.
+ * This is deprecated and should not be used in new code, but we keep it
+ * around for use by old add-on modules.
  */
 HeapTuple
 heap_formtuple(TupleDesc tupleDescriptor,
@@ -969,96 +783,16 @@ heap_formtuple(TupleDesc tupleDescriptor,
 			   char *nulls)
 {
 	HeapTuple	tuple;			/* return tuple */
-	HeapTupleHeader td;			/* tuple data */
-	Size		len,
-				data_len;
-	int			hoff;
-	bool		hasnull = false;
-	Form_pg_attribute *att = tupleDescriptor->attrs;
 	int			numberOfAttributes = tupleDescriptor->natts;
+	bool	   *boolNulls = (bool *) palloc(numberOfAttributes * sizeof(bool));
 	int			i;
 
-	if (numberOfAttributes > MaxTupleAttributeNumber)
-		ereport(ERROR,
-				(errcode(ERRCODE_TOO_MANY_COLUMNS),
-				 errmsg("number of columns (%d) exceeds limit (%d)",
-						numberOfAttributes, MaxTupleAttributeNumber)));
-
-	/*
-	 * Check for nulls and embedded tuples; expand any toasted attributes in
-	 * embedded tuples.  This preserves the invariant that toasting can only
-	 * go one level deep.
-	 *
-	 * We can skip calling toast_flatten_tuple_attribute() if the attribute
-	 * couldn't possibly be of composite type.  All composite datums are
-	 * varlena and have alignment 'd'; furthermore they aren't arrays. Also,
-	 * if an attribute is already toasted, it must have been sent to disk
-	 * already and so cannot contain toasted attributes.
-	 */
 	for (i = 0; i < numberOfAttributes; i++)
-	{
-		if (nulls[i] != ' ')
-			hasnull = true;
-		else if (att[i]->attlen == -1 &&
-				 att[i]->attalign == 'd' &&
-				 att[i]->attndims == 0 &&
-				 !VARATT_IS_EXTENDED(DatumGetPointer(values[i])))
-		{
-			values[i] = toast_flatten_tuple_attribute(values[i],
-													  att[i]->atttypid,
-													  att[i]->atttypmod);
-		}
-	}
-
-	/*
-	 * Determine total space needed
-	 */
-	len = offsetof(HeapTupleHeaderData, t_bits);
+		boolNulls[i] = (nulls[i] == 'n');
 
-	if (hasnull)
-		len += BITMAPLEN(numberOfAttributes);
-
-	if (tupleDescriptor->tdhasoid)
-		len += sizeof(Oid);
+	tuple = heap_form_tuple(tupleDescriptor, values, boolNulls);
 
-	hoff = len = MAXALIGN(len); /* align user data safely */
-
-	data_len = ComputeDataSize(tupleDescriptor, values, nulls);
-
-	len += data_len;
-
-	/*
-	 * Allocate and zero the space needed.	Note that the tuple body and
-	 * HeapTupleData management structure are allocated in one chunk.
-	 */
-	tuple = (HeapTuple) palloc0(HEAPTUPLESIZE + len);
-	tuple->t_data = td = (HeapTupleHeader) ((char *) tuple + HEAPTUPLESIZE);
-
-	/*
-	 * And fill in the information.  Note we fill the Datum fields even though
-	 * this tuple may never become a Datum.
-	 */
-	tuple->t_len = len;
-	ItemPointerSetInvalid(&(tuple->t_self));
-	tuple->t_tableOid = InvalidOid;
-
-	HeapTupleHeaderSetDatumLength(td, len);
-	HeapTupleHeaderSetTypeId(td, tupleDescriptor->tdtypeid);
-	HeapTupleHeaderSetTypMod(td, tupleDescriptor->tdtypmod);
-
-	HeapTupleHeaderSetNatts(td, numberOfAttributes);
-	td->t_hoff = hoff;
-
-	if (tupleDescriptor->tdhasoid)		/* else leave infomask = 0 */
-		td->t_infomask = HEAP_HASOID;
-
-	DataFill(tupleDescriptor,
-			 values,
-			 nulls,
-			 (char *) td + hoff,
-			 data_len,
-			 &td->t_infomask,
-			 (hasnull ? td->t_bits : NULL));
+	pfree(boolNulls);
 
 	return tuple;
 }
@@ -1134,7 +868,7 @@ heap_modify_tuple(HeapTuple tuple,
 	return newTuple;
 }
 
-/* ----------------
+/*
  *		heap_modifytuple
  *
  *		forms a new tuple from an old tuple and a set of replacement values.
@@ -1142,7 +876,8 @@ heap_modify_tuple(HeapTuple tuple,
  *
  * OLD API with char 'n'/' ' convention for indicating nulls, and
  * char 'r'/' ' convention for indicating whether to replace columns.
- * ----------------
+ * This is deprecated and should not be used in new code, but we keep it
+ * around for use by old add-on modules.
  */
 HeapTuple
 heap_modifytuple(HeapTuple tuple,
@@ -1151,59 +886,24 @@ heap_modifytuple(HeapTuple tuple,
 				 char *replNulls,
 				 char *replActions)
 {
+	HeapTuple	result;
 	int			numberOfAttributes = tupleDesc->natts;
-	int			attoff;
-	Datum	   *values;
-	char	   *nulls;
-	HeapTuple	newTuple;
-
-	/*
-	 * allocate and fill values and nulls arrays from either the tuple or the
-	 * repl information, as appropriate.
-	 *
-	 * NOTE: it's debatable whether to use heap_deformtuple() here or just
-	 * heap_getattr() only the non-replaced colums.  The latter could win if
-	 * there are many replaced columns and few non-replaced ones. However,
-	 * heap_deformtuple costs only O(N) while the heap_getattr way would cost
-	 * O(N^2) if there are many non-replaced columns, so it seems better to
-	 * err on the side of linear cost.
-	 */
-	values = (Datum *) palloc(numberOfAttributes * sizeof(Datum));
-	nulls = (char *) palloc(numberOfAttributes * sizeof(char));
-
-	heap_deformtuple(tuple, tupleDesc, values, nulls);
+	bool	   *boolNulls = (bool *) palloc(numberOfAttributes * sizeof(bool));
+	bool	   *boolActions = (bool *) palloc(numberOfAttributes * sizeof(bool));
+	int			attnum;
 
-	for (attoff = 0; attoff < numberOfAttributes; attoff++)
+	for (attnum = 0; attnum < numberOfAttributes; attnum++)
 	{
-		if (replActions[attoff] == 'r')
-		{
-			values[attoff] = replValues[attoff];
-			nulls[attoff] = replNulls[attoff];
-		}
-		else if (replActions[attoff] != ' ')
-			elog(ERROR, "unrecognized replace flag: %d",
-				 (int) replActions[attoff]);
+		boolNulls[attnum] = (replNulls[attnum] == 'n');
+		boolActions[attnum] = (replActions[attnum] == 'r');
 	}
 
-	/*
-	 * create a new tuple from the values and nulls arrays
-	 */
-	newTuple = heap_formtuple(tupleDesc, values, nulls);
+	result = heap_modify_tuple(tuple, tupleDesc, replValues, boolNulls, boolActions);
 
-	pfree(values);
-	pfree(nulls);
+	pfree(boolNulls);
+	pfree(boolActions);
 
-	/*
-	 * copy the identification info of the old tuple: t_ctid, t_self, and OID
-	 * (if any)
-	 */
-	newTuple->t_data->t_ctid = tuple->t_data->t_ctid;
-	newTuple->t_self = tuple->t_self;
-	newTuple->t_tableOid = tuple->t_tableOid;
-	if (tupleDesc->tdhasoid)
-		HeapTupleSetOid(newTuple, HeapTupleGetOid(tuple));
-
-	return newTuple;
+	return result;
 }
 
 /*
@@ -1312,7 +1012,7 @@ heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc,
 	}
 }
 
-/* ----------------
+/*
  *		heap_deformtuple
  *
  *		Given a tuple, extract data into values/nulls arrays; this is
@@ -1329,8 +1029,9 @@ heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc,
  *		heap_getattr; the loop will become O(N^2) as soon as any
  *		noncacheable attribute offsets are involved.
  *
- * OLD API with char 'n'/' ' convention for indicating nulls
- * ----------------
+ * OLD API with char 'n'/' ' convention for indicating nulls.
+ * This is deprecated and should not be used in new code, but we keep it
+ * around for use by old add-on modules.
  */
 void
 heap_deformtuple(HeapTuple tuple,
@@ -1338,90 +1039,16 @@ heap_deformtuple(HeapTuple tuple,
 				 Datum *values,
 				 char *nulls)
 {
-	HeapTupleHeader tup = tuple->t_data;
-	bool		hasnulls = HeapTupleHasNulls(tuple);
-	Form_pg_attribute *att = tupleDesc->attrs;
-	int			tdesc_natts = tupleDesc->natts;
-	int			natts;			/* number of atts to extract */
+	int			natts = tupleDesc->natts;
+	bool	   *boolNulls = (bool *) palloc(natts * sizeof(bool));
 	int			attnum;
-	char	   *tp;				/* ptr to tuple data */
-	long		off;			/* offset in tuple data */
-	bits8	   *bp = tup->t_bits;		/* ptr to null bitmap in tuple */
-	bool		slow = false;	/* can we use/set attcacheoff? */
 
-	natts = HeapTupleHeaderGetNatts(tup);
-
-	/*
-	 * In inheritance situations, it is possible that the given tuple actually
-	 * has more fields than the caller is expecting.  Don't run off the end of
-	 * the caller's arrays.
-	 */
-	natts = Min(natts, tdesc_natts);
-
-	tp = (char *) tup + tup->t_hoff;
-
-	off = 0;
+	heap_deform_tuple(tuple, tupleDesc, values, boolNulls);
 
 	for (attnum = 0; attnum < natts; attnum++)
-	{
-		Form_pg_attribute thisatt = att[attnum];
-
-		if (hasnulls && att_isnull(attnum, bp))
-		{
-			values[attnum] = (Datum) 0;
-			nulls[attnum] = 'n';
-			slow = true;		/* can't use attcacheoff anymore */
-			continue;
-		}
-
-		nulls[attnum] = ' ';
+		nulls[attnum] = (boolNulls[attnum] ? 'n' : ' ');
 
-		if (!slow && thisatt->attcacheoff >= 0)
-			off = thisatt->attcacheoff;
-		else if (thisatt->attlen == -1)
-		{
-			/*
-			 * We can only cache the offset for a varlena attribute if the
-			 * offset is already suitably aligned, so that there would be no
-			 * pad bytes in any case: then the offset will be valid for either
-			 * an aligned or unaligned value.
-			 */
-			if (!slow &&
-				off == att_align_nominal(off, thisatt->attalign))
-				thisatt->attcacheoff = off;
-			else
-			{
-				off = att_align_pointer(off, thisatt->attalign, -1,
-										tp + off);
-				slow = true;
-			}
-		}
-		else
-		{
-			/* not varlena, so safe to use att_align_nominal */
-			off = att_align_nominal(off, thisatt->attalign);
-
-			if (!slow)
-				thisatt->attcacheoff = off;
-		}
-
-		values[attnum] = fetchatt(thisatt, tp + off);
-
-		off = att_addlength_pointer(off, thisatt->attlen, tp + off);
-
-		if (thisatt->attlen <= 0)
-			slow = true;		/* can't use attcacheoff anymore */
-	}
-
-	/*
-	 * If tuple doesn't have all the atts indicated by tupleDesc, read the
-	 * rest as null
-	 */
-	for (; attnum < tdesc_natts; attnum++)
-	{
-		values[attnum] = (Datum) 0;
-		nulls[attnum] = 'n';
-	}
+	pfree(boolNulls);
 }
 
 /*
diff --git a/src/backend/access/heap/tuptoaster.c b/src/backend/access/heap/tuptoaster.c
index 802b7f151b04823f88aa6907102805b324903ee8..e3014e288ab14a37fad7533579c3a67e0252f9b7 100644
--- a/src/backend/access/heap/tuptoaster.c
+++ b/src/backend/access/heap/tuptoaster.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/access/heap/tuptoaster.c,v 1.89 2008/06/19 00:46:03 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/access/heap/tuptoaster.c,v 1.90 2008/11/02 01:45:27 tgl Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -359,10 +359,10 @@ toast_delete(Relation rel, HeapTuple oldtup)
 	/*
 	 * Get the tuple descriptor and break down the tuple into fields.
 	 *
-	 * NOTE: it's debatable whether to use heap_deformtuple() here or just
+	 * NOTE: it's debatable whether to use heap_deform_tuple() here or just
 	 * heap_getattr() only the varlena columns.  The latter could win if there
 	 * are few varlena columns and many non-varlena ones. However,
-	 * heap_deformtuple costs only O(N) while the heap_getattr way would cost
+	 * heap_deform_tuple costs only O(N) while the heap_getattr way would cost
 	 * O(N^2) if there are many varlena columns, so it seems better to err on
 	 * the side of linear cost.  (We won't even be here unless there's at
 	 * least one varlena column, by the way.)
diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index 04194acd3f2d0f2445a27c78195707567e3f6133..c7bcfd2456354ad62d90552343812f5438d0e334 100644
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.246 2008/09/30 10:52:11 heikki Exp $
+ *	  $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.247 2008/11/02 01:45:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -169,7 +169,7 @@ struct typmap
 static struct typmap **Typ = NULL;
 static struct typmap *Ap = NULL;
 
-static char Blanks[MAXATTR];
+static bool Nulls[MAXATTR];
 
 Form_pg_attribute attrtypes[MAXATTR];	/* points to attribute info */
 static Datum values[MAXATTR];	/* corresponding attribute values */
@@ -488,7 +488,7 @@ BootstrapModeMain(void)
 	for (i = 0; i < MAXATTR; i++)
 	{
 		attrtypes[i] = NULL;
-		Blanks[i] = ' ';
+		Nulls[i] = false;
 	}
 	for (i = 0; i < STRTABLESIZE; ++i)
 		strtable[i] = NULL;
@@ -797,7 +797,7 @@ InsertOneTuple(Oid objectid)
 	tupDesc = CreateTupleDesc(numattr,
 							  RelationGetForm(boot_reldesc)->relhasoids,
 							  attrtypes);
-	tuple = heap_formtuple(tupDesc, values, Blanks);
+	tuple = heap_form_tuple(tupDesc, values, Nulls);
 	if (objectid != (Oid) 0)
 		HeapTupleSetOid(tuple, objectid);
 	pfree(tupDesc);				/* just free's tupDesc, not the attrtypes */
@@ -807,10 +807,10 @@ InsertOneTuple(Oid objectid)
 	elog(DEBUG4, "row inserted");
 
 	/*
-	 * Reset blanks for next tuple
+	 * Reset null markers for next tuple
 	 */
 	for (i = 0; i < numattr; i++)
-		Blanks[i] = ' ';
+		Nulls[i] = false;
 }
 
 /* ----------------
@@ -857,7 +857,7 @@ InsertOneNull(int i)
 	elog(DEBUG4, "inserting column %d NULL", i);
 	Assert(i >= 0 || i < MAXATTR);
 	values[i] = PointerGetDatum(NULL);
-	Blanks[i] = 'n';
+	Nulls[i] = true;
 }
 
 /* ----------------
diff --git a/src/backend/catalog/aclchk.c b/src/backend/catalog/aclchk.c
index 941ee62da77fe396bd262c030971c2770ae649b1..f25c7608e41e4ee3d5f9e9207b1d44bf52f62570 100644
--- a/src/backend/catalog/aclchk.c
+++ b/src/backend/catalog/aclchk.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/catalog/aclchk.c,v 1.148 2008/09/08 00:47:40 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/catalog/aclchk.c,v 1.149 2008/11/02 01:45:27 tgl Exp $
  *
  * NOTES
  *	  See acl.h.
@@ -554,8 +554,8 @@ ExecGrant_Relation(InternalGrant *istmt)
 		HeapTuple	tuple;
 		HeapTuple	newtuple;
 		Datum		values[Natts_pg_class];
-		char		nulls[Natts_pg_class];
-		char		replaces[Natts_pg_class];
+		bool		nulls[Natts_pg_class];
+		bool		replaces[Natts_pg_class];
 		int			noldmembers;
 		int			nnewmembers;
 		Oid		   *oldmembers;
@@ -694,13 +694,13 @@ ExecGrant_Relation(InternalGrant *istmt)
 
 		/* finished building new ACL value, now insert it */
 		MemSet(values, 0, sizeof(values));
-		MemSet(nulls, ' ', sizeof(nulls));
-		MemSet(replaces, ' ', sizeof(replaces));
+		MemSet(nulls, false, sizeof(nulls));
+		MemSet(replaces, false, sizeof(replaces));
 
-		replaces[Anum_pg_class_relacl - 1] = 'r';
+		replaces[Anum_pg_class_relacl - 1] = true;
 		values[Anum_pg_class_relacl - 1] = PointerGetDatum(new_acl);
 
-		newtuple = heap_modifytuple(tuple, RelationGetDescr(relation), values, nulls, replaces);
+		newtuple = heap_modify_tuple(tuple, RelationGetDescr(relation), values, nulls, replaces);
 
 		simple_heap_update(relation, &newtuple->t_self, newtuple);
 
@@ -749,8 +749,8 @@ ExecGrant_Database(InternalGrant *istmt)
 		Oid			ownerId;
 		HeapTuple	newtuple;
 		Datum		values[Natts_pg_database];
-		char		nulls[Natts_pg_database];
-		char		replaces[Natts_pg_database];
+		bool		nulls[Natts_pg_database];
+		bool		replaces[Natts_pg_database];
 		int			noldmembers;
 		int			nnewmembers;
 		Oid		   *oldmembers;
@@ -809,14 +809,14 @@ ExecGrant_Database(InternalGrant *istmt)
 
 		/* finished building new ACL value, now insert it */
 		MemSet(values, 0, sizeof(values));
-		MemSet(nulls, ' ', sizeof(nulls));
-		MemSet(replaces, ' ', sizeof(replaces));
+		MemSet(nulls, false, sizeof(nulls));
+		MemSet(replaces, false, sizeof(replaces));
 
-		replaces[Anum_pg_database_datacl - 1] = 'r';
+		replaces[Anum_pg_database_datacl - 1] = true;
 		values[Anum_pg_database_datacl - 1] = PointerGetDatum(new_acl);
 
-		newtuple = heap_modifytuple(tuple, RelationGetDescr(relation), values,
-									nulls, replaces);
+		newtuple = heap_modify_tuple(tuple, RelationGetDescr(relation), values,
+									 nulls, replaces);
 
 		simple_heap_update(relation, &newtuple->t_self, newtuple);
 
@@ -866,8 +866,8 @@ ExecGrant_Function(InternalGrant *istmt)
 		HeapTuple	tuple;
 		HeapTuple	newtuple;
 		Datum		values[Natts_pg_proc];
-		char		nulls[Natts_pg_proc];
-		char		replaces[Natts_pg_proc];
+		bool		nulls[Natts_pg_proc];
+		bool		replaces[Natts_pg_proc];
 		int			noldmembers;
 		int			nnewmembers;
 		Oid		   *oldmembers;
@@ -925,14 +925,14 @@ ExecGrant_Function(InternalGrant *istmt)
 
 		/* finished building new ACL value, now insert it */
 		MemSet(values, 0, sizeof(values));
-		MemSet(nulls, ' ', sizeof(nulls));
-		MemSet(replaces, ' ', sizeof(replaces));
+		MemSet(nulls, false, sizeof(nulls));
+		MemSet(replaces, false, sizeof(replaces));
 
-		replaces[Anum_pg_proc_proacl - 1] = 'r';
+		replaces[Anum_pg_proc_proacl - 1] = true;
 		values[Anum_pg_proc_proacl - 1] = PointerGetDatum(new_acl);
 
-		newtuple = heap_modifytuple(tuple, RelationGetDescr(relation), values,
-									nulls, replaces);
+		newtuple = heap_modify_tuple(tuple, RelationGetDescr(relation), values,
+									 nulls, replaces);
 
 		simple_heap_update(relation, &newtuple->t_self, newtuple);
 
@@ -982,8 +982,8 @@ ExecGrant_Language(InternalGrant *istmt)
 		HeapTuple	tuple;
 		HeapTuple	newtuple;
 		Datum		values[Natts_pg_language];
-		char		nulls[Natts_pg_language];
-		char		replaces[Natts_pg_language];
+		bool		nulls[Natts_pg_language];
+		bool		replaces[Natts_pg_language];
 		int			noldmembers;
 		int			nnewmembers;
 		Oid		   *oldmembers;
@@ -1048,14 +1048,14 @@ ExecGrant_Language(InternalGrant *istmt)
 
 		/* finished building new ACL value, now insert it */
 		MemSet(values, 0, sizeof(values));
-		MemSet(nulls, ' ', sizeof(nulls));
-		MemSet(replaces, ' ', sizeof(replaces));
+		MemSet(nulls, false, sizeof(nulls));
+		MemSet(replaces, false, sizeof(replaces));
 
-		replaces[Anum_pg_language_lanacl - 1] = 'r';
+		replaces[Anum_pg_language_lanacl - 1] = true;
 		values[Anum_pg_language_lanacl - 1] = PointerGetDatum(new_acl);
 
-		newtuple = heap_modifytuple(tuple, RelationGetDescr(relation), values,
-									nulls, replaces);
+		newtuple = heap_modify_tuple(tuple, RelationGetDescr(relation), values,
+									 nulls, replaces);
 
 		simple_heap_update(relation, &newtuple->t_self, newtuple);
 
@@ -1105,8 +1105,8 @@ ExecGrant_Namespace(InternalGrant *istmt)
 		HeapTuple	tuple;
 		HeapTuple	newtuple;
 		Datum		values[Natts_pg_namespace];
-		char		nulls[Natts_pg_namespace];
-		char		replaces[Natts_pg_namespace];
+		bool		nulls[Natts_pg_namespace];
+		bool		replaces[Natts_pg_namespace];
 		int			noldmembers;
 		int			nnewmembers;
 		Oid		   *oldmembers;
@@ -1165,14 +1165,14 @@ ExecGrant_Namespace(InternalGrant *istmt)
 
 		/* finished building new ACL value, now insert it */
 		MemSet(values, 0, sizeof(values));
-		MemSet(nulls, ' ', sizeof(nulls));
-		MemSet(replaces, ' ', sizeof(replaces));
+		MemSet(nulls, false, sizeof(nulls));
+		MemSet(replaces, false, sizeof(replaces));
 
-		replaces[Anum_pg_namespace_nspacl - 1] = 'r';
+		replaces[Anum_pg_namespace_nspacl - 1] = true;
 		values[Anum_pg_namespace_nspacl - 1] = PointerGetDatum(new_acl);
 
-		newtuple = heap_modifytuple(tuple, RelationGetDescr(relation), values,
-									nulls, replaces);
+		newtuple = heap_modify_tuple(tuple, RelationGetDescr(relation), values,
+									 nulls, replaces);
 
 		simple_heap_update(relation, &newtuple->t_self, newtuple);
 
@@ -1221,8 +1221,8 @@ ExecGrant_Tablespace(InternalGrant *istmt)
 		Oid			ownerId;
 		HeapTuple	newtuple;
 		Datum		values[Natts_pg_tablespace];
-		char		nulls[Natts_pg_tablespace];
-		char		replaces[Natts_pg_tablespace];
+		bool		nulls[Natts_pg_tablespace];
+		bool		replaces[Natts_pg_tablespace];
 		int			noldmembers;
 		int			nnewmembers;
 		Oid		   *oldmembers;
@@ -1288,14 +1288,14 @@ ExecGrant_Tablespace(InternalGrant *istmt)
 
 		/* finished building new ACL value, now insert it */
 		MemSet(values, 0, sizeof(values));
-		MemSet(nulls, ' ', sizeof(nulls));
-		MemSet(replaces, ' ', sizeof(replaces));
+		MemSet(nulls, false, sizeof(nulls));
+		MemSet(replaces, false, sizeof(replaces));
 
-		replaces[Anum_pg_tablespace_spcacl - 1] = 'r';
+		replaces[Anum_pg_tablespace_spcacl - 1] = true;
 		values[Anum_pg_tablespace_spcacl - 1] = PointerGetDatum(new_acl);
 
-		newtuple = heap_modifytuple(tuple, RelationGetDescr(relation), values,
-									nulls, replaces);
+		newtuple = heap_modify_tuple(tuple, RelationGetDescr(relation), values,
+									 nulls, replaces);
 
 		simple_heap_update(relation, &newtuple->t_self, newtuple);
 
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 478eb045c0988dff9df748129062e2736371d537..f7585632e0519b626bbda1ba87286c49784266a7 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/catalog/heap.c,v 1.341 2008/10/14 23:27:40 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/catalog/heap.c,v 1.342 2008/11/02 01:45:27 tgl Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -618,12 +618,12 @@ InsertPgClassTuple(Relation pg_class_desc,
 {
 	Form_pg_class rd_rel = new_rel_desc->rd_rel;
 	Datum		values[Natts_pg_class];
-	char		nulls[Natts_pg_class];
+	bool		nulls[Natts_pg_class];
 	HeapTuple	tup;
 
 	/* This is a tad tedious, but way cleaner than what we used to do... */
 	memset(values, 0, sizeof(values));
-	memset(nulls, ' ', sizeof(nulls));
+	memset(nulls, false, sizeof(nulls));
 
 	values[Anum_pg_class_relname - 1] = NameGetDatum(&rd_rel->relname);
 	values[Anum_pg_class_relnamespace - 1] = ObjectIdGetDatum(rd_rel->relnamespace);
@@ -651,13 +651,13 @@ InsertPgClassTuple(Relation pg_class_desc,
 	values[Anum_pg_class_relhassubclass - 1] = BoolGetDatum(rd_rel->relhassubclass);
 	values[Anum_pg_class_relfrozenxid - 1] = TransactionIdGetDatum(rd_rel->relfrozenxid);
 	/* start out with empty permissions */
-	nulls[Anum_pg_class_relacl - 1] = 'n';
+	nulls[Anum_pg_class_relacl - 1] = true;
 	if (reloptions != (Datum) 0)
 		values[Anum_pg_class_reloptions - 1] = reloptions;
 	else
-		nulls[Anum_pg_class_reloptions - 1] = 'n';
+		nulls[Anum_pg_class_reloptions - 1] = true;
 
-	tup = heap_formtuple(RelationGetDescr(pg_class_desc), values, nulls);
+	tup = heap_form_tuple(RelationGetDescr(pg_class_desc), values, nulls);
 
 	/*
 	 * The new tuple must have the oid already chosen for the rel.	Sure would
@@ -1464,7 +1464,7 @@ StoreAttrDefault(Relation rel, AttrNumber attnum, Node *expr)
 	Relation	adrel;
 	HeapTuple	tuple;
 	Datum		values[4];
-	static char nulls[4] = {' ', ' ', ' ', ' '};
+	static bool nulls[4] = {false, false, false, false};
 	Relation	attrrel;
 	HeapTuple	atttup;
 	Form_pg_attribute attStruct;
@@ -1495,7 +1495,7 @@ StoreAttrDefault(Relation rel, AttrNumber attnum, Node *expr)
 
 	adrel = heap_open(AttrDefaultRelationId, RowExclusiveLock);
 
-	tuple = heap_formtuple(adrel->rd_att, values, nulls);
+	tuple = heap_form_tuple(adrel->rd_att, values, nulls);
 	attrdefOid = simple_heap_insert(adrel, tuple);
 
 	CatalogUpdateIndexes(adrel, tuple);
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 8172918252e005e27ac9693773e6f7299607d2d6..7c0c313e91b520c082fcae4e562f8cdaf1622ef5 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.306 2008/10/14 21:47:39 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.307 2008/11/02 01:45:27 tgl Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -389,7 +389,7 @@ UpdateIndexRelation(Oid indexoid,
 	Datum		exprsDatum;
 	Datum		predDatum;
 	Datum		values[Natts_pg_index];
-	char		nulls[Natts_pg_index];
+	bool		nulls[Natts_pg_index];
 	Relation	pg_index;
 	HeapTuple	tuple;
 	int			i;
@@ -441,7 +441,7 @@ UpdateIndexRelation(Oid indexoid,
 	/*
 	 * Build a pg_index tuple
 	 */
-	MemSet(nulls, ' ', sizeof(nulls));
+	MemSet(nulls, false, sizeof(nulls));
 
 	values[Anum_pg_index_indexrelid - 1] = ObjectIdGetDatum(indexoid);
 	values[Anum_pg_index_indrelid - 1] = ObjectIdGetDatum(heapoid);
@@ -458,12 +458,12 @@ UpdateIndexRelation(Oid indexoid,
 	values[Anum_pg_index_indoption - 1] = PointerGetDatum(indoption);
 	values[Anum_pg_index_indexprs - 1] = exprsDatum;
 	if (exprsDatum == (Datum) 0)
-		nulls[Anum_pg_index_indexprs - 1] = 'n';
+		nulls[Anum_pg_index_indexprs - 1] = true;
 	values[Anum_pg_index_indpred - 1] = predDatum;
 	if (predDatum == (Datum) 0)
-		nulls[Anum_pg_index_indpred - 1] = 'n';
+		nulls[Anum_pg_index_indpred - 1] = true;
 
-	tuple = heap_formtuple(RelationGetDescr(pg_index), values, nulls);
+	tuple = heap_form_tuple(RelationGetDescr(pg_index), values, nulls);
 
 	/*
 	 * insert the tuple into the pg_index catalog
diff --git a/src/backend/catalog/pg_aggregate.c b/src/backend/catalog/pg_aggregate.c
index 42eadca1e2b2c03d93281657f27fd9b2e0bd2d80..69bfe4c1578d92d6639ad3384c18b65dfc9f743a 100644
--- a/src/backend/catalog/pg_aggregate.c
+++ b/src/backend/catalog/pg_aggregate.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/catalog/pg_aggregate.c,v 1.95 2008/07/16 16:55:23 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/catalog/pg_aggregate.c,v 1.96 2008/11/02 01:45:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -54,7 +54,7 @@ AggregateCreate(const char *aggName,
 {
 	Relation	aggdesc;
 	HeapTuple	tup;
-	char		nulls[Natts_pg_aggregate];
+	bool		nulls[Natts_pg_aggregate];
 	Datum		values[Natts_pg_aggregate];
 	Form_pg_proc proc;
 	Oid			transfn;
@@ -225,7 +225,7 @@ AggregateCreate(const char *aggName,
 	/* initialize nulls and values */
 	for (i = 0; i < Natts_pg_aggregate; i++)
 	{
-		nulls[i] = ' ';
+		nulls[i] = false;
 		values[i] = (Datum) NULL;
 	}
 	values[Anum_pg_aggregate_aggfnoid - 1] = ObjectIdGetDatum(procOid);
@@ -236,12 +236,12 @@ AggregateCreate(const char *aggName,
 	if (agginitval)
 		values[Anum_pg_aggregate_agginitval - 1] = CStringGetTextDatum(agginitval);
 	else
-		nulls[Anum_pg_aggregate_agginitval - 1] = 'n';
+		nulls[Anum_pg_aggregate_agginitval - 1] = true;
 
 	aggdesc = heap_open(AggregateRelationId, RowExclusiveLock);
 	tupDesc = aggdesc->rd_att;
 
-	tup = heap_formtuple(tupDesc, values, nulls);
+	tup = heap_form_tuple(tupDesc, values, nulls);
 	simple_heap_insert(aggdesc, tup);
 
 	CatalogUpdateIndexes(aggdesc, tup);
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 1bf5c4ec3c86aeb87321e331aea276e73c9df5ef..6a5559dd3cb29274205ec13ea60f272f151a9d12 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/catalog/pg_constraint.c,v 1.42 2008/06/19 00:46:04 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/catalog/pg_constraint.c,v 1.43 2008/11/02 01:45:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -68,7 +68,7 @@ CreateConstraintEntry(const char *constraintName,
 	Relation	conDesc;
 	Oid			conOid;
 	HeapTuple	tup;
-	char		nulls[Natts_pg_constraint];
+	bool		nulls[Natts_pg_constraint];
 	Datum		values[Natts_pg_constraint];
 	ArrayType  *conkeyArray;
 	ArrayType  *confkeyArray;
@@ -133,7 +133,7 @@ CreateConstraintEntry(const char *constraintName,
 	/* initialize nulls and values */
 	for (i = 0; i < Natts_pg_constraint; i++)
 	{
-		nulls[i] = ' ';
+		nulls[i] = false;
 		values[i] = (Datum) NULL;
 	}
 
@@ -154,27 +154,27 @@ CreateConstraintEntry(const char *constraintName,
 	if (conkeyArray)
 		values[Anum_pg_constraint_conkey - 1] = PointerGetDatum(conkeyArray);
 	else
-		nulls[Anum_pg_constraint_conkey - 1] = 'n';
+		nulls[Anum_pg_constraint_conkey - 1] = true;
 
 	if (confkeyArray)
 		values[Anum_pg_constraint_confkey - 1] = PointerGetDatum(confkeyArray);
 	else
-		nulls[Anum_pg_constraint_confkey - 1] = 'n';
+		nulls[Anum_pg_constraint_confkey - 1] = true;
 
 	if (conpfeqopArray)
 		values[Anum_pg_constraint_conpfeqop - 1] = PointerGetDatum(conpfeqopArray);
 	else
-		nulls[Anum_pg_constraint_conpfeqop - 1] = 'n';
+		nulls[Anum_pg_constraint_conpfeqop - 1] = true;
 
 	if (conppeqopArray)
 		values[Anum_pg_constraint_conppeqop - 1] = PointerGetDatum(conppeqopArray);
 	else
-		nulls[Anum_pg_constraint_conppeqop - 1] = 'n';
+		nulls[Anum_pg_constraint_conppeqop - 1] = true;
 
 	if (conffeqopArray)
 		values[Anum_pg_constraint_conffeqop - 1] = PointerGetDatum(conffeqopArray);
 	else
-		nulls[Anum_pg_constraint_conffeqop - 1] = 'n';
+		nulls[Anum_pg_constraint_conffeqop - 1] = true;
 
 	/*
 	 * initialize the binary form of the check constraint.
@@ -182,7 +182,7 @@ CreateConstraintEntry(const char *constraintName,
 	if (conBin)
 		values[Anum_pg_constraint_conbin - 1] = CStringGetTextDatum(conBin);
 	else
-		nulls[Anum_pg_constraint_conbin - 1] = 'n';
+		nulls[Anum_pg_constraint_conbin - 1] = true;
 
 	/*
 	 * initialize the text form of the check constraint
@@ -190,9 +190,9 @@ CreateConstraintEntry(const char *constraintName,
 	if (conSrc)
 		values[Anum_pg_constraint_consrc - 1] = CStringGetTextDatum(conSrc);
 	else
-		nulls[Anum_pg_constraint_consrc - 1] = 'n';
+		nulls[Anum_pg_constraint_consrc - 1] = true;
 
-	tup = heap_formtuple(RelationGetDescr(conDesc), values, nulls);
+	tup = heap_form_tuple(RelationGetDescr(conDesc), values, nulls);
 
 	conOid = simple_heap_insert(conDesc, tup);
 
diff --git a/src/backend/catalog/pg_conversion.c b/src/backend/catalog/pg_conversion.c
index d03cb647eeba66365fd2561838ac8855ca03c15d..4937ae3f02664b9709fb24b7f687827ef75099ba 100644
--- a/src/backend/catalog/pg_conversion.c
+++ b/src/backend/catalog/pg_conversion.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/catalog/pg_conversion.c,v 1.45 2008/06/19 00:46:04 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/catalog/pg_conversion.c,v 1.46 2008/11/02 01:45:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -46,7 +46,7 @@ ConversionCreate(const char *conname, Oid connamespace,
 	Relation	rel;
 	TupleDesc	tupDesc;
 	HeapTuple	tup;
-	char		nulls[Natts_pg_conversion];
+	bool		nulls[Natts_pg_conversion];
 	Datum		values[Natts_pg_conversion];
 	NameData	cname;
 	Oid			oid;
@@ -89,7 +89,7 @@ ConversionCreate(const char *conname, Oid connamespace,
 	/* initialize nulls and values */
 	for (i = 0; i < Natts_pg_conversion; i++)
 	{
-		nulls[i] = ' ';
+		nulls[i] = false;
 		values[i] = (Datum) NULL;
 	}
 
@@ -103,7 +103,7 @@ ConversionCreate(const char *conname, Oid connamespace,
 	values[Anum_pg_conversion_conproc - 1] = ObjectIdGetDatum(conproc);
 	values[Anum_pg_conversion_condefault - 1] = BoolGetDatum(def);
 
-	tup = heap_formtuple(tupDesc, values, nulls);
+	tup = heap_form_tuple(tupDesc, values, nulls);
 
 	/* insert a new tuple */
 	oid = simple_heap_insert(rel, tup);
diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c
index 405510ce90c1273b0dd0f1835a6f0fce6528d813..6dd043e5046fe1a311afb827bdd231b587525b1e 100644
--- a/src/backend/catalog/pg_depend.c
+++ b/src/backend/catalog/pg_depend.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/catalog/pg_depend.c,v 1.29 2008/06/19 00:46:04 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/catalog/pg_depend.c,v 1.30 2008/11/02 01:45:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -59,7 +59,7 @@ recordMultipleDependencies(const ObjectAddress *depender,
 	CatalogIndexState indstate;
 	HeapTuple	tup;
 	int			i;
-	char		nulls[Natts_pg_depend];
+	bool		nulls[Natts_pg_depend];
 	Datum		values[Natts_pg_depend];
 
 	if (nreferenced <= 0)
@@ -77,7 +77,7 @@ recordMultipleDependencies(const ObjectAddress *depender,
 	/* Don't open indexes unless we need to make an update */
 	indstate = NULL;
 
-	memset(nulls, ' ', sizeof(nulls));
+	memset(nulls, false, sizeof(nulls));
 
 	for (i = 0; i < nreferenced; i++, referenced++)
 	{
@@ -102,7 +102,7 @@ recordMultipleDependencies(const ObjectAddress *depender,
 
 			values[Anum_pg_depend_deptype - 1] = CharGetDatum((char) behavior);
 
-			tup = heap_formtuple(dependDesc->rd_att, values, nulls);
+			tup = heap_form_tuple(dependDesc->rd_att, values, nulls);
 
 			simple_heap_insert(dependDesc, tup);
 
diff --git a/src/backend/catalog/pg_enum.c b/src/backend/catalog/pg_enum.c
index 846c623df6c72b45f3cdb30386bd0df873b80bbc..2a221da97a4feba77ac08b6cf4334ef4cec43a13 100644
--- a/src/backend/catalog/pg_enum.c
+++ b/src/backend/catalog/pg_enum.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/catalog/pg_enum.c,v 1.7 2008/06/19 00:46:04 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/catalog/pg_enum.c,v 1.8 2008/11/02 01:45:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -42,7 +42,7 @@ EnumValuesCreate(Oid enumTypeOid, List *vals)
 	int			i,
 				n;
 	Datum		values[Natts_pg_enum];
-	char		nulls[Natts_pg_enum];
+	bool		nulls[Natts_pg_enum];
 	ListCell   *lc;
 	HeapTuple	tup;
 
@@ -74,7 +74,7 @@ EnumValuesCreate(Oid enumTypeOid, List *vals)
 	qsort(oids, n, sizeof(Oid), oid_cmp);
 
 	/* and make the entries */
-	memset(nulls, ' ', sizeof(nulls));
+	memset(nulls, false, sizeof(nulls));
 
 	i = 0;
 	foreach(lc, vals)
@@ -96,7 +96,7 @@ EnumValuesCreate(Oid enumTypeOid, List *vals)
 		namestrcpy(&enumlabel, lab);
 		values[Anum_pg_enum_enumlabel - 1] = NameGetDatum(&enumlabel);
 
-		tup = heap_formtuple(tupDesc, values, nulls);
+		tup = heap_form_tuple(tupDesc, values, nulls);
 		HeapTupleSetOid(tup, oids[i]);
 
 		simple_heap_insert(pg_enum, tup);
diff --git a/src/backend/catalog/pg_largeobject.c b/src/backend/catalog/pg_largeobject.c
index 308c4162f4746b6cf8d04fab5a64f821e3128596..d9d7c8a9e80ed681e960e703d82bd3ea13f50d0c 100644
--- a/src/backend/catalog/pg_largeobject.c
+++ b/src/backend/catalog/pg_largeobject.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/catalog/pg_largeobject.c,v 1.30 2008/06/19 00:46:04 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/catalog/pg_largeobject.c,v 1.31 2008/11/02 01:45:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -37,7 +37,7 @@ LargeObjectCreate(Oid loid)
 	Relation	pg_largeobject;
 	HeapTuple	ntup;
 	Datum		values[Natts_pg_largeobject];
-	char		nulls[Natts_pg_largeobject];
+	bool		nulls[Natts_pg_largeobject];
 	int			i;
 
 	pg_largeobject = heap_open(LargeObjectRelationId, RowExclusiveLock);
@@ -48,7 +48,7 @@ LargeObjectCreate(Oid loid)
 	for (i = 0; i < Natts_pg_largeobject; i++)
 	{
 		values[i] = (Datum) NULL;
-		nulls[i] = ' ';
+		nulls[i] = false;
 	}
 
 	i = 0;
@@ -57,7 +57,7 @@ LargeObjectCreate(Oid loid)
 	values[i++] = DirectFunctionCall1(byteain,
 									  CStringGetDatum(""));
 
-	ntup = heap_formtuple(pg_largeobject->rd_att, values, nulls);
+	ntup = heap_form_tuple(pg_largeobject->rd_att, values, nulls);
 
 	/*
 	 * Insert it
diff --git a/src/backend/catalog/pg_namespace.c b/src/backend/catalog/pg_namespace.c
index 804dfc80161960079de3e53a24bdf42f361fdb0d..121f6a17b94a94271dfe1f94ef3c65c3d7788e87 100644
--- a/src/backend/catalog/pg_namespace.c
+++ b/src/backend/catalog/pg_namespace.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/catalog/pg_namespace.c,v 1.19 2008/06/19 00:46:04 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/catalog/pg_namespace.c,v 1.20 2008/11/02 01:45:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -33,7 +33,7 @@ NamespaceCreate(const char *nspName, Oid ownerId)
 	Relation	nspdesc;
 	HeapTuple	tup;
 	Oid			nspoid;
-	char		nulls[Natts_pg_namespace];
+	bool		nulls[Natts_pg_namespace];
 	Datum		values[Natts_pg_namespace];
 	NameData	nname;
 	TupleDesc	tupDesc;
@@ -54,18 +54,18 @@ NamespaceCreate(const char *nspName, Oid ownerId)
 	/* initialize nulls and values */
 	for (i = 0; i < Natts_pg_namespace; i++)
 	{
-		nulls[i] = ' ';
+		nulls[i] = false;
 		values[i] = (Datum) NULL;
 	}
 	namestrcpy(&nname, nspName);
 	values[Anum_pg_namespace_nspname - 1] = NameGetDatum(&nname);
 	values[Anum_pg_namespace_nspowner - 1] = ObjectIdGetDatum(ownerId);
-	nulls[Anum_pg_namespace_nspacl - 1] = 'n';
+	nulls[Anum_pg_namespace_nspacl - 1] = true;
 
 	nspdesc = heap_open(NamespaceRelationId, RowExclusiveLock);
 	tupDesc = nspdesc->rd_att;
 
-	tup = heap_formtuple(tupDesc, values, nulls);
+	tup = heap_form_tuple(tupDesc, values, nulls);
 
 	nspoid = simple_heap_insert(nspdesc, tup);
 	Assert(OidIsValid(nspoid));
diff --git a/src/backend/catalog/pg_operator.c b/src/backend/catalog/pg_operator.c
index 94b3bf28625e6b138ca6b9b36b3cb87aa18fb7b3..30b29aab260a735e1b8eb8d44287ca10c96f51b5 100644
--- a/src/backend/catalog/pg_operator.c
+++ b/src/backend/catalog/pg_operator.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/catalog/pg_operator.c,v 1.105 2008/08/16 00:01:35 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/catalog/pg_operator.c,v 1.106 2008/11/02 01:45:27 tgl Exp $
  *
  * NOTES
  *	  these routines moved here from commands/define.c and somewhat cleaned up.
@@ -207,7 +207,7 @@ OperatorShellMake(const char *operatorName,
 	int			i;
 	HeapTuple	tup;
 	Datum		values[Natts_pg_operator];
-	char		nulls[Natts_pg_operator];
+	bool		nulls[Natts_pg_operator];
 	NameData	oname;
 	TupleDesc	tupDesc;
 
@@ -225,7 +225,7 @@ OperatorShellMake(const char *operatorName,
 	 */
 	for (i = 0; i < Natts_pg_operator; ++i)
 	{
-		nulls[i] = ' ';
+		nulls[i] = false;
 		values[i] = (Datum) NULL;		/* redundant, but safe */
 	}
 
@@ -259,7 +259,7 @@ OperatorShellMake(const char *operatorName,
 	/*
 	 * create a new operator tuple
 	 */
-	tup = heap_formtuple(tupDesc, values, nulls);
+	tup = heap_form_tuple(tupDesc, values, nulls);
 
 	/*
 	 * insert our "shell" operator tuple
@@ -336,8 +336,8 @@ OperatorCreate(const char *operatorName,
 {
 	Relation	pg_operator_desc;
 	HeapTuple	tup;
-	char		nulls[Natts_pg_operator];
-	char		replaces[Natts_pg_operator];
+	bool		nulls[Natts_pg_operator];
+	bool		replaces[Natts_pg_operator];
 	Datum		values[Natts_pg_operator];
 	Oid			operatorObjectId;
 	bool		operatorAlreadyDefined;
@@ -483,8 +483,8 @@ OperatorCreate(const char *operatorName,
 	for (i = 0; i < Natts_pg_operator; ++i)
 	{
 		values[i] = (Datum) NULL;
-		replaces[i] = 'r';
-		nulls[i] = ' ';
+		replaces[i] = true;
+		nulls[i] = false;
 	}
 
 	i = 0;
@@ -518,7 +518,7 @@ OperatorCreate(const char *operatorName,
 			elog(ERROR, "cache lookup failed for operator %u",
 				 operatorObjectId);
 
-		tup = heap_modifytuple(tup,
+		tup = heap_modify_tuple(tup,
 							   RelationGetDescr(pg_operator_desc),
 							   values,
 							   nulls,
@@ -529,7 +529,7 @@ OperatorCreate(const char *operatorName,
 	else
 	{
 		tupDesc = pg_operator_desc->rd_att;
-		tup = heap_formtuple(tupDesc, values, nulls);
+		tup = heap_form_tuple(tupDesc, values, nulls);
 
 		operatorObjectId = simple_heap_insert(pg_operator_desc, tup);
 	}
@@ -639,15 +639,15 @@ OperatorUpd(Oid baseId, Oid commId, Oid negId)
 	int			i;
 	Relation	pg_operator_desc;
 	HeapTuple	tup;
-	char		nulls[Natts_pg_operator];
-	char		replaces[Natts_pg_operator];
+	bool		nulls[Natts_pg_operator];
+	bool		replaces[Natts_pg_operator];
 	Datum		values[Natts_pg_operator];
 
 	for (i = 0; i < Natts_pg_operator; ++i)
 	{
 		values[i] = (Datum) 0;
-		replaces[i] = ' ';
-		nulls[i] = ' ';
+		replaces[i] = false;
+		nulls[i] = false;
 	}
 
 	/*
@@ -680,16 +680,16 @@ OperatorUpd(Oid baseId, Oid commId, Oid negId)
 				if (!OidIsValid(t->oprnegate))
 				{
 					values[Anum_pg_operator_oprnegate - 1] = ObjectIdGetDatum(baseId);
-					replaces[Anum_pg_operator_oprnegate - 1] = 'r';
+					replaces[Anum_pg_operator_oprnegate - 1] = true;
 				}
 
 				if (!OidIsValid(t->oprcom))
 				{
 					values[Anum_pg_operator_oprcom - 1] = ObjectIdGetDatum(baseId);
-					replaces[Anum_pg_operator_oprcom - 1] = 'r';
+					replaces[Anum_pg_operator_oprcom - 1] = true;
 				}
 
-				tup = heap_modifytuple(tup,
+				tup = heap_modify_tuple(tup,
 									   RelationGetDescr(pg_operator_desc),
 									   values,
 									   nulls,
@@ -712,9 +712,9 @@ OperatorUpd(Oid baseId, Oid commId, Oid negId)
 		!(OidIsValid(((Form_pg_operator) GETSTRUCT(tup))->oprcom)))
 	{
 		values[Anum_pg_operator_oprcom - 1] = ObjectIdGetDatum(baseId);
-		replaces[Anum_pg_operator_oprcom - 1] = 'r';
+		replaces[Anum_pg_operator_oprcom - 1] = true;
 
-		tup = heap_modifytuple(tup,
+		tup = heap_modify_tuple(tup,
 							   RelationGetDescr(pg_operator_desc),
 							   values,
 							   nulls,
@@ -725,7 +725,7 @@ OperatorUpd(Oid baseId, Oid commId, Oid negId)
 		CatalogUpdateIndexes(pg_operator_desc, tup);
 
 		values[Anum_pg_operator_oprcom - 1] = (Datum) NULL;
-		replaces[Anum_pg_operator_oprcom - 1] = ' ';
+		replaces[Anum_pg_operator_oprcom - 1] = false;
 	}
 
 	/* check and update the negator, if necessary */
@@ -738,9 +738,9 @@ OperatorUpd(Oid baseId, Oid commId, Oid negId)
 		!(OidIsValid(((Form_pg_operator) GETSTRUCT(tup))->oprnegate)))
 	{
 		values[Anum_pg_operator_oprnegate - 1] = ObjectIdGetDatum(baseId);
-		replaces[Anum_pg_operator_oprnegate - 1] = 'r';
+		replaces[Anum_pg_operator_oprnegate - 1] = true;
 
-		tup = heap_modifytuple(tup,
+		tup = heap_modify_tuple(tup,
 							   RelationGetDescr(pg_operator_desc),
 							   values,
 							   nulls,
diff --git a/src/backend/catalog/pg_proc.c b/src/backend/catalog/pg_proc.c
index e2513eb7dde1df0253103237e7a1be78fc7e6996..e17aa43fd5c22f019f58280681cdbc43c7a335ad 100644
--- a/src/backend/catalog/pg_proc.c
+++ b/src/backend/catalog/pg_proc.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/catalog/pg_proc.c,v 1.153 2008/07/18 03:32:52 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/catalog/pg_proc.c,v 1.154 2008/11/02 01:45:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -89,9 +89,9 @@ ProcedureCreate(const char *procedureName,
 	Relation	rel;
 	HeapTuple	tup;
 	HeapTuple	oldtup;
-	char		nulls[Natts_pg_proc];
+	bool		nulls[Natts_pg_proc];
 	Datum		values[Natts_pg_proc];
-	char		replaces[Natts_pg_proc];
+	bool		replaces[Natts_pg_proc];
 	Oid			relid;
 	NameData	procname;
 	TupleDesc	tupDesc;
@@ -276,9 +276,9 @@ ProcedureCreate(const char *procedureName,
 
 	for (i = 0; i < Natts_pg_proc; ++i)
 	{
-		nulls[i] = ' ';
+		nulls[i] = false;
 		values[i] = (Datum) 0;
-		replaces[i] = 'r';
+		replaces[i] = true;
 	}
 
 	namestrcpy(&procname, procedureName);
@@ -300,26 +300,26 @@ ProcedureCreate(const char *procedureName,
 	if (allParameterTypes != PointerGetDatum(NULL))
 		values[Anum_pg_proc_proallargtypes - 1] = allParameterTypes;
 	else
-		nulls[Anum_pg_proc_proallargtypes - 1] = 'n';
+		nulls[Anum_pg_proc_proallargtypes - 1] = true;
 	if (parameterModes != PointerGetDatum(NULL))
 		values[Anum_pg_proc_proargmodes - 1] = parameterModes;
 	else
-		nulls[Anum_pg_proc_proargmodes - 1] = 'n';
+		nulls[Anum_pg_proc_proargmodes - 1] = true;
 	if (parameterNames != PointerGetDatum(NULL))
 		values[Anum_pg_proc_proargnames - 1] = parameterNames;
 	else
-		nulls[Anum_pg_proc_proargnames - 1] = 'n';
+		nulls[Anum_pg_proc_proargnames - 1] = true;
 	values[Anum_pg_proc_prosrc - 1] = CStringGetTextDatum(prosrc);
 	if (probin)
 		values[Anum_pg_proc_probin - 1] = CStringGetTextDatum(probin);
 	else
-		nulls[Anum_pg_proc_probin - 1] = 'n';
+		nulls[Anum_pg_proc_probin - 1] = true;
 	if (proconfig != PointerGetDatum(NULL))
 		values[Anum_pg_proc_proconfig - 1] = proconfig;
 	else
-		nulls[Anum_pg_proc_proconfig - 1] = 'n';
+		nulls[Anum_pg_proc_proconfig - 1] = true;
 	/* start out with empty permissions */
-	nulls[Anum_pg_proc_proacl - 1] = 'n';
+	nulls[Anum_pg_proc_proacl - 1] = true;
 
 	rel = heap_open(ProcedureRelationId, RowExclusiveLock);
 	tupDesc = RelationGetDescr(rel);
@@ -396,11 +396,11 @@ ProcedureCreate(const char *procedureName,
 		}
 
 		/* do not change existing ownership or permissions, either */
-		replaces[Anum_pg_proc_proowner - 1] = ' ';
-		replaces[Anum_pg_proc_proacl - 1] = ' ';
+		replaces[Anum_pg_proc_proowner - 1] = false;
+		replaces[Anum_pg_proc_proacl - 1] = false;
 
 		/* Okay, do it... */
-		tup = heap_modifytuple(oldtup, tupDesc, values, nulls, replaces);
+		tup = heap_modify_tuple(oldtup, tupDesc, values, nulls, replaces);
 		simple_heap_update(rel, &tup->t_self, tup);
 
 		ReleaseSysCache(oldtup);
@@ -409,7 +409,7 @@ ProcedureCreate(const char *procedureName,
 	else
 	{
 		/* Creating a new procedure */
-		tup = heap_formtuple(tupDesc, values, nulls);
+		tup = heap_form_tuple(tupDesc, values, nulls);
 		simple_heap_insert(rel, tup);
 		is_update = false;
 	}
diff --git a/src/backend/catalog/pg_shdepend.c b/src/backend/catalog/pg_shdepend.c
index 0ca342bdce5ba762fe014d38e4be43d2f1767c29..08150139194d72eb46ad18efe1a784c1f5279f82 100644
--- a/src/backend/catalog/pg_shdepend.c
+++ b/src/backend/catalog/pg_shdepend.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/catalog/pg_shdepend.c,v 1.28 2008/05/12 00:00:47 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/catalog/pg_shdepend.c,v 1.29 2008/11/02 01:45:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -239,7 +239,7 @@ shdepChangeDep(Relation sdepRel, Oid classid, Oid objid,
 		Datum		values[Natts_pg_shdepend];
 		bool		nulls[Natts_pg_shdepend];
 
-		memset(nulls, 0, sizeof(nulls));
+		memset(nulls, false, sizeof(nulls));
 
 		values[Anum_pg_shdepend_dbid - 1] = ObjectIdGetDatum(dbid);
 		values[Anum_pg_shdepend_classid - 1] = ObjectIdGetDatum(classid);
diff --git a/src/backend/catalog/pg_type.c b/src/backend/catalog/pg_type.c
index a43ebec60268c065e6c0aa2705ad0d264781eb2d..bae51024b9836ac86680545677c8693d0d6753b0 100644
--- a/src/backend/catalog/pg_type.c
+++ b/src/backend/catalog/pg_type.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/catalog/pg_type.c,v 1.121 2008/08/03 15:23:58 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/catalog/pg_type.c,v 1.122 2008/11/02 01:45:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -54,7 +54,7 @@ TypeShellMake(const char *typeName, Oid typeNamespace)
 	int			i;
 	HeapTuple	tup;
 	Datum		values[Natts_pg_type];
-	char		nulls[Natts_pg_type];
+	bool		nulls[Natts_pg_type];
 	Oid			typoid;
 	NameData	name;
 
@@ -71,7 +71,7 @@ TypeShellMake(const char *typeName, Oid typeNamespace)
 	 */
 	for (i = 0; i < Natts_pg_type; ++i)
 	{
-		nulls[i] = ' ';
+		nulls[i] = false;
 		values[i] = (Datum) NULL;		/* redundant, but safe */
 	}
 
@@ -111,13 +111,13 @@ TypeShellMake(const char *typeName, Oid typeNamespace)
 	values[i++] = ObjectIdGetDatum(InvalidOid); /* typbasetype */
 	values[i++] = Int32GetDatum(-1);	/* typtypmod */
 	values[i++] = Int32GetDatum(0);		/* typndims */
-	nulls[i++] = 'n';			/* typdefaultbin */
-	nulls[i++] = 'n';			/* typdefault */
+	nulls[i++] = true;			/* typdefaultbin */
+	nulls[i++] = true;			/* typdefault */
 
 	/*
 	 * create a new type tuple
 	 */
-	tup = heap_formtuple(tupDesc, values, nulls);
+	tup = heap_form_tuple(tupDesc, values, nulls);
 
 	/*
 	 * insert the tuple in the relation and get the tuple's oid.
@@ -202,8 +202,8 @@ TypeCreate(Oid newTypeOid,
 	Oid			typeObjectId;
 	bool		rebuildDeps = false;
 	HeapTuple	tup;
-	char		nulls[Natts_pg_type];
-	char		replaces[Natts_pg_type];
+	bool		nulls[Natts_pg_type];
+	bool		replaces[Natts_pg_type];
 	Datum		values[Natts_pg_type];
 	NameData	name;
 	int			i;
@@ -294,12 +294,12 @@ TypeCreate(Oid newTypeOid,
 				 errmsg("fixed-size types must have storage PLAIN")));
 
 	/*
-	 * initialize arrays needed for heap_formtuple or heap_modifytuple
+	 * initialize arrays needed for heap_form_tuple or heap_modify_tuple
 	 */
 	for (i = 0; i < Natts_pg_type; ++i)
 	{
-		nulls[i] = ' ';
-		replaces[i] = 'r';
+		nulls[i] = false;
+		replaces[i] = true;
 		values[i] = (Datum) 0;
 	}
 
@@ -342,7 +342,7 @@ TypeCreate(Oid newTypeOid,
 	if (defaultTypeBin)
 		values[i] = CStringGetTextDatum(defaultTypeBin);
 	else
-		nulls[i] = 'n';
+		nulls[i] = true;
 	i++;						/* typdefaultbin */
 
 	/*
@@ -351,7 +351,7 @@ TypeCreate(Oid newTypeOid,
 	if (defaultTypeValue)
 		values[i] = CStringGetTextDatum(defaultTypeValue);
 	else
-		nulls[i] = 'n';
+		nulls[i] = true;
 	i++;						/* typdefault */
 
 	/*
@@ -390,7 +390,7 @@ TypeCreate(Oid newTypeOid,
 		/*
 		 * Okay to update existing shell type tuple
 		 */
-		tup = heap_modifytuple(tup,
+		tup = heap_modify_tuple(tup,
 							   RelationGetDescr(pg_type_desc),
 							   values,
 							   nulls,
@@ -404,7 +404,7 @@ TypeCreate(Oid newTypeOid,
 	}
 	else
 	{
-		tup = heap_formtuple(RelationGetDescr(pg_type_desc),
+		tup = heap_form_tuple(RelationGetDescr(pg_type_desc),
 							 values,
 							 nulls);
 
diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c
index 4b164aa7c5f3e8a81b9265236710b1d34b3a98c1..13a66e17e98027daab945241351ae86b458a1dae 100644
--- a/src/backend/commands/analyze.c
+++ b/src/backend/commands/analyze.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/commands/analyze.c,v 1.126 2008/10/31 15:05:00 heikki Exp $
+ *	  $PostgreSQL: pgsql/src/backend/commands/analyze.c,v 1.127 2008/11/02 01:45:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1277,8 +1277,8 @@ update_attstats(Oid relid, int natts, VacAttrStats **vacattrstats)
 					k,
 					n;
 		Datum		values[Natts_pg_statistic];
-		char		nulls[Natts_pg_statistic];
-		char		replaces[Natts_pg_statistic];
+		bool		nulls[Natts_pg_statistic];
+		bool		replaces[Natts_pg_statistic];
 
 		/* Ignore attr if we weren't able to collect stats */
 		if (!stats->stats_valid)
@@ -1289,8 +1289,8 @@ update_attstats(Oid relid, int natts, VacAttrStats **vacattrstats)
 		 */
 		for (i = 0; i < Natts_pg_statistic; ++i)
 		{
-			nulls[i] = ' ';
-			replaces[i] = 'r';
+			nulls[i] = false;
+			replaces[i] = true;
 		}
 
 		i = 0;
@@ -1326,7 +1326,7 @@ update_attstats(Oid relid, int natts, VacAttrStats **vacattrstats)
 			}
 			else
 			{
-				nulls[i] = 'n';
+				nulls[i] = true;
 				values[i++] = (Datum) 0;
 			}
 		}
@@ -1346,7 +1346,7 @@ update_attstats(Oid relid, int natts, VacAttrStats **vacattrstats)
 			}
 			else
 			{
-				nulls[i] = 'n';
+				nulls[i] = true;
 				values[i++] = (Datum) 0;
 			}
 		}
@@ -1360,7 +1360,7 @@ update_attstats(Oid relid, int natts, VacAttrStats **vacattrstats)
 		if (HeapTupleIsValid(oldtup))
 		{
 			/* Yes, replace it */
-			stup = heap_modifytuple(oldtup,
+			stup = heap_modify_tuple(oldtup,
 									RelationGetDescr(sd),
 									values,
 									nulls,
@@ -1371,7 +1371,7 @@ update_attstats(Oid relid, int natts, VacAttrStats **vacattrstats)
 		else
 		{
 			/* No, insert new tuple */
-			stup = heap_formtuple(RelationGetDescr(sd), values, nulls);
+			stup = heap_form_tuple(RelationGetDescr(sd), values, nulls);
 			simple_heap_insert(sd, stup);
 		}
 
diff --git a/src/backend/commands/async.c b/src/backend/commands/async.c
index fabba799c4a50d190aad342c01875b65c938a33e..195159f305359593529b6f1d56cb4830958a7af9 100644
--- a/src/backend/commands/async.c
+++ b/src/backend/commands/async.c
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/commands/async.c,v 1.141 2008/08/30 01:39:13 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/commands/async.c,v 1.142 2008/11/02 01:45:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -446,7 +446,7 @@ Exec_Listen(Relation lRel, const char *relname)
 	HeapScanDesc scan;
 	HeapTuple	tuple;
 	Datum		values[Natts_pg_listener];
-	char		nulls[Natts_pg_listener];
+	bool		nulls[Natts_pg_listener];
 	NameData	condname;
 	bool		alreadyListener = false;
 
@@ -475,14 +475,14 @@ Exec_Listen(Relation lRel, const char *relname)
 	/*
 	 * OK to insert a new tuple
 	 */
-	memset(nulls, ' ', sizeof(nulls));
+	memset(nulls, false, sizeof(nulls));
 
 	namestrcpy(&condname, relname);
 	values[Anum_pg_listener_relname - 1] = NameGetDatum(&condname);
 	values[Anum_pg_listener_pid - 1] = Int32GetDatum(MyProcPid);
 	values[Anum_pg_listener_notify - 1] = Int32GetDatum(0);	/* no notifies pending */
 
-	tuple = heap_formtuple(RelationGetDescr(lRel), values, nulls);
+	tuple = heap_form_tuple(RelationGetDescr(lRel), values, nulls);
 
 	simple_heap_insert(lRel, tuple);
 
@@ -585,14 +585,14 @@ Send_Notify(Relation lRel)
 	HeapTuple	lTuple,
 				rTuple;
 	Datum		value[Natts_pg_listener];
-	char		repl[Natts_pg_listener],
+	bool		repl[Natts_pg_listener],
 				nulls[Natts_pg_listener];
 
 	/* preset data to update notify column to MyProcPid */
-	nulls[0] = nulls[1] = nulls[2] = ' ';
-	repl[0] = repl[1] = repl[2] = ' ';
-	repl[Anum_pg_listener_notify - 1] = 'r';
-	value[0] = value[1] = value[2] = (Datum) 0;
+	memset(nulls, false, sizeof(nulls));
+	memset(repl, false, sizeof(repl));
+	repl[Anum_pg_listener_notify - 1] = true;
+	memset(value, 0, sizeof(value));
 	value[Anum_pg_listener_notify - 1] = Int32GetDatum(MyProcPid);
 
 	scan = heap_beginscan(lRel, SnapshotNow, 0, NULL);
@@ -647,7 +647,7 @@ Send_Notify(Relation lRel)
 			else if (listener->notification == 0)
 			{
 				/* Rewrite the tuple with my PID in notification column */
-				rTuple = heap_modifytuple(lTuple, tdesc, value, nulls, repl);
+				rTuple = heap_modify_tuple(lTuple, tdesc, value, nulls, repl);
 				simple_heap_update(lRel, &lTuple->t_self, rTuple);
 
 #ifdef NOT_USED					/* currently there are no indexes */
@@ -950,7 +950,7 @@ ProcessIncomingNotify(void)
 	HeapTuple	lTuple,
 				rTuple;
 	Datum		value[Natts_pg_listener];
-	char		repl[Natts_pg_listener],
+	bool		repl[Natts_pg_listener],
 				nulls[Natts_pg_listener];
 	bool		catchup_enabled;
 
@@ -977,10 +977,10 @@ ProcessIncomingNotify(void)
 	scan = heap_beginscan(lRel, SnapshotNow, 1, key);
 
 	/* Prepare data for rewriting 0 into notification field */
-	nulls[0] = nulls[1] = nulls[2] = ' ';
-	repl[0] = repl[1] = repl[2] = ' ';
-	repl[Anum_pg_listener_notify - 1] = 'r';
-	value[0] = value[1] = value[2] = (Datum) 0;
+	memset(nulls, false, sizeof(nulls));
+	memset(repl, false, sizeof(repl));
+	repl[Anum_pg_listener_notify - 1] = true;
+	memset(value, 0, sizeof(value));
 	value[Anum_pg_listener_notify - 1] = Int32GetDatum(0);
 
 	while ((lTuple = heap_getnext(scan, ForwardScanDirection)) != NULL)
@@ -1002,7 +1002,7 @@ ProcessIncomingNotify(void)
 			/*
 			 * Rewrite the tuple with 0 in notification column.
 			 */
-			rTuple = heap_modifytuple(lTuple, tdesc, value, nulls, repl);
+			rTuple = heap_modify_tuple(lTuple, tdesc, value, nulls, repl);
 			simple_heap_update(lRel, &lTuple->t_self, rTuple);
 
 #ifdef NOT_USED					/* currently there are no indexes */
diff --git a/src/backend/commands/comment.c b/src/backend/commands/comment.c
index 7172b8638c1c9a4752c39b156a66b8f4a365e755..4f3e5c82c4036a7e83c3924272ba9413e471a624 100644
--- a/src/backend/commands/comment.c
+++ b/src/backend/commands/comment.c
@@ -7,7 +7,7 @@
  * Copyright (c) 1996-2008, PostgreSQL Global Development Group
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/commands/comment.c,v 1.104 2008/10/21 10:38:51 petere Exp $
+ *	  $PostgreSQL: pgsql/src/backend/commands/comment.c,v 1.105 2008/11/02 01:45:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -197,8 +197,8 @@ CreateComments(Oid oid, Oid classoid, int32 subid, char *comment)
 	HeapTuple	oldtuple;
 	HeapTuple	newtuple = NULL;
 	Datum		values[Natts_pg_description];
-	char		nulls[Natts_pg_description];
-	char		replaces[Natts_pg_description];
+	bool		nulls[Natts_pg_description];
+	bool		replaces[Natts_pg_description];
 	int			i;
 
 	/* Reduce empty-string to NULL case */
@@ -210,8 +210,8 @@ CreateComments(Oid oid, Oid classoid, int32 subid, char *comment)
 	{
 		for (i = 0; i < Natts_pg_description; i++)
 		{
-			nulls[i] = ' ';
-			replaces[i] = 'r';
+			nulls[i] = false;
+			replaces[i] = true;
 		}
 		i = 0;
 		values[i++] = ObjectIdGetDatum(oid);
@@ -248,7 +248,7 @@ CreateComments(Oid oid, Oid classoid, int32 subid, char *comment)
 			simple_heap_delete(description, &oldtuple->t_self);
 		else
 		{
-			newtuple = heap_modifytuple(oldtuple, RelationGetDescr(description), values,
+			newtuple = heap_modify_tuple(oldtuple, RelationGetDescr(description), values,
 										nulls, replaces);
 			simple_heap_update(description, &oldtuple->t_self, newtuple);
 		}
@@ -262,7 +262,7 @@ CreateComments(Oid oid, Oid classoid, int32 subid, char *comment)
 
 	if (newtuple == NULL && comment != NULL)
 	{
-		newtuple = heap_formtuple(RelationGetDescr(description),
+		newtuple = heap_form_tuple(RelationGetDescr(description),
 								  values, nulls);
 		simple_heap_insert(description, newtuple);
 	}
@@ -297,8 +297,8 @@ CreateSharedComments(Oid oid, Oid classoid, char *comment)
 	HeapTuple	oldtuple;
 	HeapTuple	newtuple = NULL;
 	Datum		values[Natts_pg_shdescription];
-	char		nulls[Natts_pg_shdescription];
-	char		replaces[Natts_pg_shdescription];
+	bool		nulls[Natts_pg_shdescription];
+	bool		replaces[Natts_pg_shdescription];
 	int			i;
 
 	/* Reduce empty-string to NULL case */
@@ -310,8 +310,8 @@ CreateSharedComments(Oid oid, Oid classoid, char *comment)
 	{
 		for (i = 0; i < Natts_pg_shdescription; i++)
 		{
-			nulls[i] = ' ';
-			replaces[i] = 'r';
+			nulls[i] = false;
+			replaces[i] = true;
 		}
 		i = 0;
 		values[i++] = ObjectIdGetDatum(oid);
@@ -343,7 +343,7 @@ CreateSharedComments(Oid oid, Oid classoid, char *comment)
 			simple_heap_delete(shdescription, &oldtuple->t_self);
 		else
 		{
-			newtuple = heap_modifytuple(oldtuple, RelationGetDescr(shdescription),
+			newtuple = heap_modify_tuple(oldtuple, RelationGetDescr(shdescription),
 										values, nulls, replaces);
 			simple_heap_update(shdescription, &oldtuple->t_self, newtuple);
 		}
@@ -357,7 +357,7 @@ CreateSharedComments(Oid oid, Oid classoid, char *comment)
 
 	if (newtuple == NULL && comment != NULL)
 	{
-		newtuple = heap_formtuple(RelationGetDescr(shdescription),
+		newtuple = heap_form_tuple(RelationGetDescr(shdescription),
 								  values, nulls);
 		simple_heap_insert(shdescription, newtuple);
 	}
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index 69a059631bc10738366030979d78a2c8eac5c1b0..4d6fd988d77a90390ee47d5894d98d2576d43682 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/commands/copy.c,v 1.299 2008/05/12 20:01:59 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/commands/copy.c,v 1.300 2008/11/02 01:45:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1638,7 +1638,7 @@ CopyFrom(CopyState cstate)
 	int			i;
 	Oid			in_func_oid;
 	Datum	   *values;
-	char	   *nulls;
+	bool	   *nulls;
 	int			nfields;
 	char	  **field_strings;
 	bool		done = false;
@@ -1872,7 +1872,7 @@ CopyFrom(CopyState cstate)
 	}
 
 	values = (Datum *) palloc(num_phys_attrs * sizeof(Datum));
-	nulls = (char *) palloc(num_phys_attrs * sizeof(char));
+	nulls = (bool *) palloc(num_phys_attrs * sizeof(bool));
 
 	/* create workspace for CopyReadAttributes results */
 	nfields = file_has_oids ? (attr_count + 1) : attr_count;
@@ -1916,7 +1916,7 @@ CopyFrom(CopyState cstate)
 
 		/* Initialize all values for row to NULL */
 		MemSet(values, 0, num_phys_attrs * sizeof(Datum));
-		MemSet(nulls, 'n', num_phys_attrs * sizeof(char));
+		MemSet(nulls, true, num_phys_attrs * sizeof(bool));
 
 		if (!cstate->binary)
 		{
@@ -1998,7 +1998,7 @@ CopyFrom(CopyState cstate)
 											  typioparams[m],
 											  attr[m]->atttypmod);
 				if (string != NULL)
-					nulls[m] = ' ';
+					nulls[m] = false;
 				cstate->cur_attname = NULL;
 				cstate->cur_attval = NULL;
 			}
@@ -2054,8 +2054,7 @@ CopyFrom(CopyState cstate)
 													&in_functions[m],
 													typioparams[m],
 													attr[m]->atttypmod,
-													&isnull);
-				nulls[m] = isnull ? 'n' : ' ';
+													&nulls[m]);
 				cstate->cur_attname = NULL;
 			}
 		}
@@ -2068,13 +2067,11 @@ CopyFrom(CopyState cstate)
 		for (i = 0; i < num_defaults; i++)
 		{
 			values[defmap[i]] = ExecEvalExpr(defexprs[i], econtext,
-											 &isnull, NULL);
-			if (!isnull)
-				nulls[defmap[i]] = ' ';
+											 &nulls[defmap[i]], NULL);
 		}
 
 		/* And now we can form the input tuple. */
-		tuple = heap_formtuple(tupDesc, values, nulls);
+		tuple = heap_form_tuple(tupDesc, values, nulls);
 
 		if (cstate->oids && file_has_oids)
 			HeapTupleSetOid(tuple, loaded_oid);
diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c
index 1efe0c3777b9c9314a976f4407486360bd863c81..7eb6e1bda00c4288ac77ad8453a63069ab9f66d5 100644
--- a/src/backend/commands/dbcommands.c
+++ b/src/backend/commands/dbcommands.c
@@ -13,7 +13,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.214 2008/10/09 10:34:06 heikki Exp $
+ *	  $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.215 2008/11/02 01:45:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -98,7 +98,7 @@ createdb(const CreatedbStmt *stmt)
 	Relation	pg_database_rel;
 	HeapTuple	tuple;
 	Datum		new_record[Natts_pg_database];
-	char		new_record_nulls[Natts_pg_database];
+	bool		new_record_nulls[Natts_pg_database];
 	Oid			dboid;
 	Oid			datdba;
 	ListCell   *option;
@@ -492,7 +492,7 @@ createdb(const CreatedbStmt *stmt)
 
 	/* Form tuple */
 	MemSet(new_record, 0, sizeof(new_record));
-	MemSet(new_record_nulls, ' ', sizeof(new_record_nulls));
+	MemSet(new_record_nulls, false, sizeof(new_record_nulls));
 
 	new_record[Anum_pg_database_datname - 1] =
 		DirectFunctionCall1(namein, CStringGetDatum(dbname));
@@ -515,10 +515,10 @@ createdb(const CreatedbStmt *stmt)
 	 * a bad idea when the owner is not the same as the template's owner. It's
 	 * more debatable whether datconfig should be copied.
 	 */
-	new_record_nulls[Anum_pg_database_datconfig - 1] = 'n';
-	new_record_nulls[Anum_pg_database_datacl - 1] = 'n';
+	new_record_nulls[Anum_pg_database_datconfig - 1] = true;
+	new_record_nulls[Anum_pg_database_datacl - 1] = true;
 
-	tuple = heap_formtuple(RelationGetDescr(pg_database_rel),
+	tuple = heap_form_tuple(RelationGetDescr(pg_database_rel),
 						   new_record, new_record_nulls);
 
 	HeapTupleSetOid(tuple, dboid);
@@ -949,8 +949,8 @@ AlterDatabase(AlterDatabaseStmt *stmt)
 	int			connlimit = -1;
 	DefElem    *dconnlimit = NULL;
 	Datum		new_record[Natts_pg_database];
-	char		new_record_nulls[Natts_pg_database];
-	char		new_record_repl[Natts_pg_database];
+	bool		new_record_nulls[Natts_pg_database];
+	bool		new_record_repl[Natts_pg_database];
 
 	/* Extract options from the statement node tree */
 	foreach(option, stmt->options)
@@ -999,16 +999,16 @@ AlterDatabase(AlterDatabaseStmt *stmt)
 	 * Build an updated tuple, perusing the information just obtained
 	 */
 	MemSet(new_record, 0, sizeof(new_record));
-	MemSet(new_record_nulls, ' ', sizeof(new_record_nulls));
-	MemSet(new_record_repl, ' ', sizeof(new_record_repl));
+	MemSet(new_record_nulls, false, sizeof(new_record_nulls));
+	MemSet(new_record_repl, false, sizeof(new_record_repl));
 
 	if (dconnlimit)
 	{
 		new_record[Anum_pg_database_datconnlimit - 1] = Int32GetDatum(connlimit);
-		new_record_repl[Anum_pg_database_datconnlimit - 1] = 'r';
+		new_record_repl[Anum_pg_database_datconnlimit - 1] = true;
 	}
 
-	newtuple = heap_modifytuple(tuple, RelationGetDescr(rel), new_record,
+	newtuple = heap_modify_tuple(tuple, RelationGetDescr(rel), new_record,
 								new_record_nulls, new_record_repl);
 	simple_heap_update(rel, &tuple->t_self, newtuple);
 
@@ -1040,8 +1040,8 @@ AlterDatabaseSet(AlterDatabaseSetStmt *stmt)
 	ScanKeyData scankey;
 	SysScanDesc scan;
 	Datum		repl_val[Natts_pg_database];
-	char		repl_null[Natts_pg_database];
-	char		repl_repl[Natts_pg_database];
+	bool		repl_null[Natts_pg_database];
+	bool		repl_repl[Natts_pg_database];
 
 	valuestr = ExtractSetVariableArgs(stmt->setstmt);
 
@@ -1067,13 +1067,13 @@ AlterDatabaseSet(AlterDatabaseSetStmt *stmt)
 		aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_DATABASE,
 					   stmt->dbname);
 
-	memset(repl_repl, ' ', sizeof(repl_repl));
-	repl_repl[Anum_pg_database_datconfig - 1] = 'r';
+	memset(repl_repl, false, sizeof(repl_repl));
+	repl_repl[Anum_pg_database_datconfig - 1] = true;
 
 	if (stmt->setstmt->kind == VAR_RESET_ALL)
 	{
 		/* RESET ALL, so just set datconfig to null */
-		repl_null[Anum_pg_database_datconfig - 1] = 'n';
+		repl_null[Anum_pg_database_datconfig - 1] = true;
 		repl_val[Anum_pg_database_datconfig - 1] = (Datum) 0;
 	}
 	else
@@ -1082,7 +1082,7 @@ AlterDatabaseSet(AlterDatabaseSetStmt *stmt)
 		bool		isnull;
 		ArrayType  *a;
 
-		repl_null[Anum_pg_database_datconfig - 1] = ' ';
+		repl_null[Anum_pg_database_datconfig - 1] = false;
 
 		/* Extract old value of datconfig */
 		datum = heap_getattr(tuple, Anum_pg_database_datconfig,
@@ -1098,10 +1098,10 @@ AlterDatabaseSet(AlterDatabaseSetStmt *stmt)
 		if (a)
 			repl_val[Anum_pg_database_datconfig - 1] = PointerGetDatum(a);
 		else
-			repl_null[Anum_pg_database_datconfig - 1] = 'n';
+			repl_null[Anum_pg_database_datconfig - 1] = true;
 	}
 
-	newtuple = heap_modifytuple(tuple, RelationGetDescr(rel),
+	newtuple = heap_modify_tuple(tuple, RelationGetDescr(rel),
 								repl_val, repl_null, repl_repl);
 	simple_heap_update(rel, &tuple->t_self, newtuple);
 
@@ -1160,8 +1160,8 @@ AlterDatabaseOwner(const char *dbname, Oid newOwnerId)
 	if (datForm->datdba != newOwnerId)
 	{
 		Datum		repl_val[Natts_pg_database];
-		char		repl_null[Natts_pg_database];
-		char		repl_repl[Natts_pg_database];
+		bool		repl_null[Natts_pg_database];
+		bool		repl_repl[Natts_pg_database];
 		Acl		   *newAcl;
 		Datum		aclDatum;
 		bool		isNull;
@@ -1189,10 +1189,10 @@ AlterDatabaseOwner(const char *dbname, Oid newOwnerId)
 					(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
 				   errmsg("permission denied to change owner of database")));
 
-		memset(repl_null, ' ', sizeof(repl_null));
-		memset(repl_repl, ' ', sizeof(repl_repl));
+		memset(repl_null, false, sizeof(repl_null));
+		memset(repl_repl, false, sizeof(repl_repl));
 
-		repl_repl[Anum_pg_database_datdba - 1] = 'r';
+		repl_repl[Anum_pg_database_datdba - 1] = true;
 		repl_val[Anum_pg_database_datdba - 1] = ObjectIdGetDatum(newOwnerId);
 
 		/*
@@ -1207,11 +1207,11 @@ AlterDatabaseOwner(const char *dbname, Oid newOwnerId)
 		{
 			newAcl = aclnewowner(DatumGetAclP(aclDatum),
 								 datForm->datdba, newOwnerId);
-			repl_repl[Anum_pg_database_datacl - 1] = 'r';
+			repl_repl[Anum_pg_database_datacl - 1] = true;
 			repl_val[Anum_pg_database_datacl - 1] = PointerGetDatum(newAcl);
 		}
 
-		newtuple = heap_modifytuple(tuple, RelationGetDescr(rel), repl_val, repl_null, repl_repl);
+		newtuple = heap_modify_tuple(tuple, RelationGetDescr(rel), repl_val, repl_null, repl_repl);
 		simple_heap_update(rel, &newtuple->t_self, newtuple);
 		CatalogUpdateIndexes(rel, newtuple);
 
diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c
index 80a57457ee506065824d278dbec918280b704c0c..97cde6419d10b26d4277025dc740e1ee3bf139e3 100644
--- a/src/backend/commands/functioncmds.c
+++ b/src/backend/commands/functioncmds.c
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/commands/functioncmds.c,v 1.100 2008/10/31 08:39:20 heikki Exp $
+ *	  $PostgreSQL: pgsql/src/backend/commands/functioncmds.c,v 1.101 2008/11/02 01:45:27 tgl Exp $
  *
  * DESCRIPTION
  *	  These routines take the parse tree and pick out the
@@ -1104,8 +1104,8 @@ AlterFunctionOwner_internal(Relation rel, HeapTuple tup, Oid newOwnerId)
 	if (procForm->proowner != newOwnerId)
 	{
 		Datum		repl_val[Natts_pg_proc];
-		char		repl_null[Natts_pg_proc];
-		char		repl_repl[Natts_pg_proc];
+		bool		repl_null[Natts_pg_proc];
+		bool		repl_repl[Natts_pg_proc];
 		Acl		   *newAcl;
 		Datum		aclDatum;
 		bool		isNull;
@@ -1131,10 +1131,10 @@ AlterFunctionOwner_internal(Relation rel, HeapTuple tup, Oid newOwnerId)
 							   get_namespace_name(procForm->pronamespace));
 		}
 
-		memset(repl_null, ' ', sizeof(repl_null));
-		memset(repl_repl, ' ', sizeof(repl_repl));
+		memset(repl_null, false, sizeof(repl_null));
+		memset(repl_repl, false, sizeof(repl_repl));
 
-		repl_repl[Anum_pg_proc_proowner - 1] = 'r';
+		repl_repl[Anum_pg_proc_proowner - 1] = true;
 		repl_val[Anum_pg_proc_proowner - 1] = ObjectIdGetDatum(newOwnerId);
 
 		/*
@@ -1148,11 +1148,11 @@ AlterFunctionOwner_internal(Relation rel, HeapTuple tup, Oid newOwnerId)
 		{
 			newAcl = aclnewowner(DatumGetAclP(aclDatum),
 								 procForm->proowner, newOwnerId);
-			repl_repl[Anum_pg_proc_proacl - 1] = 'r';
+			repl_repl[Anum_pg_proc_proacl - 1] = true;
 			repl_val[Anum_pg_proc_proacl - 1] = PointerGetDatum(newAcl);
 		}
 
-		newtuple = heap_modifytuple(tup, RelationGetDescr(rel), repl_val,
+		newtuple = heap_modify_tuple(tup, RelationGetDescr(rel), repl_val,
 									repl_null, repl_repl);
 
 		simple_heap_update(rel, &newtuple->t_self, newtuple);
@@ -1259,8 +1259,8 @@ AlterFunction(AlterFunctionStmt *stmt)
 		bool		isnull;
 		ArrayType  *a;
 		Datum		repl_val[Natts_pg_proc];
-		char		repl_null[Natts_pg_proc];
-		char		repl_repl[Natts_pg_proc];
+		bool		repl_null[Natts_pg_proc];
+		bool		repl_repl[Natts_pg_proc];
 
 		/* extract existing proconfig setting */
 		datum = SysCacheGetAttr(PROCOID, tup, Anum_pg_proc_proconfig, &isnull);
@@ -1270,21 +1270,21 @@ AlterFunction(AlterFunctionStmt *stmt)
 		a = update_proconfig_value(a, set_items);
 
 		/* update the tuple */
-		memset(repl_repl, ' ', sizeof(repl_repl));
-		repl_repl[Anum_pg_proc_proconfig - 1] = 'r';
+		memset(repl_repl, false, sizeof(repl_repl));
+		repl_repl[Anum_pg_proc_proconfig - 1] = true;
 
 		if (a == NULL)
 		{
 			repl_val[Anum_pg_proc_proconfig - 1] = (Datum) 0;
-			repl_null[Anum_pg_proc_proconfig - 1] = 'n';
+			repl_null[Anum_pg_proc_proconfig - 1] = true;
 		}
 		else
 		{
 			repl_val[Anum_pg_proc_proconfig - 1] = PointerGetDatum(a);
-			repl_null[Anum_pg_proc_proconfig - 1] = ' ';
+			repl_null[Anum_pg_proc_proconfig - 1] = false;
 		}
 
-		tup = heap_modifytuple(tup, RelationGetDescr(rel),
+		tup = heap_modify_tuple(tup, RelationGetDescr(rel),
 							   repl_val, repl_null, repl_repl);
 	}
 
@@ -1387,7 +1387,7 @@ CreateCast(CreateCastStmt *stmt)
 	Relation	relation;
 	HeapTuple	tuple;
 	Datum		values[Natts_pg_cast];
-	char		nulls[Natts_pg_cast];
+	bool		nulls[Natts_pg_cast];
 	ObjectAddress myself,
 				referenced;
 
@@ -1575,9 +1575,9 @@ CreateCast(CreateCastStmt *stmt)
 	values[Anum_pg_cast_castcontext - 1] = CharGetDatum(castcontext);
 	values[Anum_pg_cast_castmethod - 1] = CharGetDatum(castmethod);
 
-	MemSet(nulls, ' ', Natts_pg_cast);
+	MemSet(nulls, false, sizeof(nulls));
 
-	tuple = heap_formtuple(RelationGetDescr(relation), values, nulls);
+	tuple = heap_form_tuple(RelationGetDescr(relation), values, nulls);
 
 	simple_heap_insert(relation, tuple);
 
diff --git a/src/backend/commands/opclasscmds.c b/src/backend/commands/opclasscmds.c
index de114079e2563426e6c226700cf7ad5cbad38366..809e1b148a43233e28f405d1761167abffa6af9f 100644
--- a/src/backend/commands/opclasscmds.c
+++ b/src/backend/commands/opclasscmds.c
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/commands/opclasscmds.c,v 1.62 2008/06/19 00:46:04 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/commands/opclasscmds.c,v 1.63 2008/11/02 01:45:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -176,7 +176,7 @@ CreateOpFamily(char *amname, char *opfname, Oid namespaceoid, Oid amoid)
 	Relation	rel;
 	HeapTuple	tup;
 	Datum		values[Natts_pg_opfamily];
-	char		nulls[Natts_pg_opfamily];
+	bool		nulls[Natts_pg_opfamily];
 	NameData	opfName;
 	ObjectAddress myself,
 				referenced;
@@ -201,7 +201,7 @@ CreateOpFamily(char *amname, char *opfname, Oid namespaceoid, Oid amoid)
 	 * Okay, let's create the pg_opfamily entry.
 	 */
 	memset(values, 0, sizeof(values));
-	memset(nulls, ' ', sizeof(nulls));
+	memset(nulls, false, sizeof(nulls));
 
 	values[Anum_pg_opfamily_opfmethod - 1] = ObjectIdGetDatum(amoid);
 	namestrcpy(&opfName, opfname);
@@ -209,7 +209,7 @@ CreateOpFamily(char *amname, char *opfname, Oid namespaceoid, Oid amoid)
 	values[Anum_pg_opfamily_opfnamespace - 1] = ObjectIdGetDatum(namespaceoid);
 	values[Anum_pg_opfamily_opfowner - 1] = ObjectIdGetDatum(GetUserId());
 
-	tup = heap_formtuple(rel->rd_att, values, nulls);
+	tup = heap_form_tuple(rel->rd_att, values, nulls);
 
 	opfamilyoid = simple_heap_insert(rel, tup);
 
@@ -264,7 +264,7 @@ DefineOpClass(CreateOpClassStmt *stmt)
 	HeapTuple	tup;
 	Form_pg_am	pg_am;
 	Datum		values[Natts_pg_opclass];
-	char		nulls[Natts_pg_opclass];
+	bool		nulls[Natts_pg_opclass];
 	AclResult	aclresult;
 	NameData	opcName;
 	ObjectAddress myself,
@@ -570,7 +570,7 @@ DefineOpClass(CreateOpClassStmt *stmt)
 	 * Okay, let's create the pg_opclass entry.
 	 */
 	memset(values, 0, sizeof(values));
-	memset(nulls, ' ', sizeof(nulls));
+	memset(nulls, false, sizeof(nulls));
 
 	values[Anum_pg_opclass_opcmethod - 1] = ObjectIdGetDatum(amoid);
 	namestrcpy(&opcName, opcname);
@@ -582,7 +582,7 @@ DefineOpClass(CreateOpClassStmt *stmt)
 	values[Anum_pg_opclass_opcdefault - 1] = BoolGetDatum(stmt->isDefault);
 	values[Anum_pg_opclass_opckeytype - 1] = ObjectIdGetDatum(storageoid);
 
-	tup = heap_formtuple(rel->rd_att, values, nulls);
+	tup = heap_form_tuple(rel->rd_att, values, nulls);
 
 	opclassoid = simple_heap_insert(rel, tup);
 
@@ -656,7 +656,7 @@ DefineOpFamily(CreateOpFamilyStmt *stmt)
 	Relation	rel;
 	HeapTuple	tup;
 	Datum		values[Natts_pg_opfamily];
-	char		nulls[Natts_pg_opfamily];
+	bool		nulls[Natts_pg_opfamily];
 	AclResult	aclresult;
 	NameData	opfName;
 	ObjectAddress myself,
@@ -719,7 +719,7 @@ DefineOpFamily(CreateOpFamilyStmt *stmt)
 	 * Okay, let's create the pg_opfamily entry.
 	 */
 	memset(values, 0, sizeof(values));
-	memset(nulls, ' ', sizeof(nulls));
+	memset(nulls, false, sizeof(nulls));
 
 	values[Anum_pg_opfamily_opfmethod - 1] = ObjectIdGetDatum(amoid);
 	namestrcpy(&opfName, opfname);
@@ -727,7 +727,7 @@ DefineOpFamily(CreateOpFamilyStmt *stmt)
 	values[Anum_pg_opfamily_opfnamespace - 1] = ObjectIdGetDatum(namespaceoid);
 	values[Anum_pg_opfamily_opfowner - 1] = ObjectIdGetDatum(GetUserId());
 
-	tup = heap_formtuple(rel->rd_att, values, nulls);
+	tup = heap_form_tuple(rel->rd_att, values, nulls);
 
 	opfamilyoid = simple_heap_insert(rel, tup);
 
@@ -1226,7 +1226,7 @@ storeOperators(List *opfamilyname, Oid amoid,
 {
 	Relation	rel;
 	Datum		values[Natts_pg_amop];
-	char		nulls[Natts_pg_amop];
+	bool		nulls[Natts_pg_amop];
 	HeapTuple	tup;
 	Oid			entryoid;
 	ObjectAddress myself,
@@ -1259,7 +1259,7 @@ storeOperators(List *opfamilyname, Oid amoid,
 
 		/* Create the pg_amop entry */
 		memset(values, 0, sizeof(values));
-		memset(nulls, ' ', sizeof(nulls));
+		memset(nulls, false, sizeof(nulls));
 
 		values[Anum_pg_amop_amopfamily - 1] = ObjectIdGetDatum(opfamilyoid);
 		values[Anum_pg_amop_amoplefttype - 1] = ObjectIdGetDatum(op->lefttype);
@@ -1268,7 +1268,7 @@ storeOperators(List *opfamilyname, Oid amoid,
 		values[Anum_pg_amop_amopopr - 1] = ObjectIdGetDatum(op->object);
 		values[Anum_pg_amop_amopmethod - 1] = ObjectIdGetDatum(amoid);
 
-		tup = heap_formtuple(rel->rd_att, values, nulls);
+		tup = heap_form_tuple(rel->rd_att, values, nulls);
 
 		entryoid = simple_heap_insert(rel, tup);
 
@@ -1326,7 +1326,7 @@ storeProcedures(List *opfamilyname, Oid amoid,
 {
 	Relation	rel;
 	Datum		values[Natts_pg_amproc];
-	char		nulls[Natts_pg_amproc];
+	bool		nulls[Natts_pg_amproc];
 	HeapTuple	tup;
 	Oid			entryoid;
 	ObjectAddress myself,
@@ -1359,7 +1359,7 @@ storeProcedures(List *opfamilyname, Oid amoid,
 
 		/* Create the pg_amproc entry */
 		memset(values, 0, sizeof(values));
-		memset(nulls, ' ', sizeof(nulls));
+		memset(nulls, false, sizeof(nulls));
 
 		values[Anum_pg_amproc_amprocfamily - 1] = ObjectIdGetDatum(opfamilyoid);
 		values[Anum_pg_amproc_amproclefttype - 1] = ObjectIdGetDatum(proc->lefttype);
@@ -1367,7 +1367,7 @@ storeProcedures(List *opfamilyname, Oid amoid,
 		values[Anum_pg_amproc_amprocnum - 1] = Int16GetDatum(proc->number);
 		values[Anum_pg_amproc_amproc - 1] = ObjectIdGetDatum(proc->object);
 
-		tup = heap_formtuple(rel->rd_att, values, nulls);
+		tup = heap_form_tuple(rel->rd_att, values, nulls);
 
 		entryoid = simple_heap_insert(rel, tup);
 
diff --git a/src/backend/commands/proclang.c b/src/backend/commands/proclang.c
index 9fb2ea780003427d53c348be8e6a27b2c69a54c5..6827834f30ca67cd2ab7ce727974fdcc0f6ddbf1 100644
--- a/src/backend/commands/proclang.c
+++ b/src/backend/commands/proclang.c
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/commands/proclang.c,v 1.79 2008/06/19 00:46:04 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/commands/proclang.c,v 1.80 2008/11/02 01:45:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -268,7 +268,7 @@ create_proc_lang(const char *languageName,
 	Relation	rel;
 	TupleDesc	tupDesc;
 	Datum		values[Natts_pg_language];
-	char		nulls[Natts_pg_language];
+	bool		nulls[Natts_pg_language];
 	NameData	langname;
 	HeapTuple	tup;
 	ObjectAddress myself,
@@ -281,7 +281,7 @@ create_proc_lang(const char *languageName,
 	tupDesc = rel->rd_att;
 
 	memset(values, 0, sizeof(values));
-	memset(nulls, ' ', sizeof(nulls));
+	memset(nulls, false, sizeof(nulls));
 
 	namestrcpy(&langname, languageName);
 	values[Anum_pg_language_lanname - 1] = NameGetDatum(&langname);
@@ -290,9 +290,9 @@ create_proc_lang(const char *languageName,
 	values[Anum_pg_language_lanpltrusted - 1] = BoolGetDatum(trusted);
 	values[Anum_pg_language_lanplcallfoid - 1] = ObjectIdGetDatum(handlerOid);
 	values[Anum_pg_language_lanvalidator - 1] = ObjectIdGetDatum(valOid);
-	nulls[Anum_pg_language_lanacl - 1] = 'n';
+	nulls[Anum_pg_language_lanacl - 1] = true;
 
-	tup = heap_formtuple(tupDesc, values, nulls);
+	tup = heap_form_tuple(tupDesc, values, nulls);
 
 	simple_heap_insert(rel, tup);
 
@@ -594,8 +594,8 @@ AlterLanguageOwner_internal(HeapTuple tup, Relation rel, Oid newOwnerId)
 	if (lanForm->lanowner != newOwnerId)
 	{
 		Datum		repl_val[Natts_pg_language];
-		char		repl_null[Natts_pg_language];
-		char		repl_repl[Natts_pg_language];
+		bool		repl_null[Natts_pg_language];
+		bool		repl_repl[Natts_pg_language];
 		Acl		   *newAcl;
 		Datum		aclDatum;
 		bool		isNull;
@@ -609,10 +609,10 @@ AlterLanguageOwner_internal(HeapTuple tup, Relation rel, Oid newOwnerId)
 		/* Must be able to become new owner */
 		check_is_member_of_role(GetUserId(), newOwnerId);
 
-		memset(repl_null, ' ', sizeof(repl_null));
-		memset(repl_repl, ' ', sizeof(repl_repl));
+		memset(repl_null, false, sizeof(repl_null));
+		memset(repl_repl, false, sizeof(repl_repl));
 
-		repl_repl[Anum_pg_language_lanowner - 1] = 'r';
+		repl_repl[Anum_pg_language_lanowner - 1] = true;
 		repl_val[Anum_pg_language_lanowner - 1] = ObjectIdGetDatum(newOwnerId);
 
 		/*
@@ -626,11 +626,11 @@ AlterLanguageOwner_internal(HeapTuple tup, Relation rel, Oid newOwnerId)
 		{
 			newAcl = aclnewowner(DatumGetAclP(aclDatum),
 								 lanForm->lanowner, newOwnerId);
-			repl_repl[Anum_pg_language_lanacl - 1] = 'r';
+			repl_repl[Anum_pg_language_lanacl - 1] = true;
 			repl_val[Anum_pg_language_lanacl - 1] = PointerGetDatum(newAcl);
 		}
 
-		newtuple = heap_modifytuple(tup, RelationGetDescr(rel),
+		newtuple = heap_modify_tuple(tup, RelationGetDescr(rel),
 									repl_val, repl_null, repl_repl);
 
 		simple_heap_update(rel, &newtuple->t_self, newtuple);
diff --git a/src/backend/commands/schemacmds.c b/src/backend/commands/schemacmds.c
index 8029013e2cce60b8d12c9fce5812f8970dfd8ef5..f05fb00936cb081dce71b81f5f3edcc29c653a75 100644
--- a/src/backend/commands/schemacmds.c
+++ b/src/backend/commands/schemacmds.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/commands/schemacmds.c,v 1.50 2008/06/14 18:04:33 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/commands/schemacmds.c,v 1.51 2008/11/02 01:45:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -366,8 +366,8 @@ AlterSchemaOwner_internal(HeapTuple tup, Relation rel, Oid newOwnerId)
 	if (nspForm->nspowner != newOwnerId)
 	{
 		Datum		repl_val[Natts_pg_namespace];
-		char		repl_null[Natts_pg_namespace];
-		char		repl_repl[Natts_pg_namespace];
+		bool		repl_null[Natts_pg_namespace];
+		bool		repl_repl[Natts_pg_namespace];
 		Acl		   *newAcl;
 		Datum		aclDatum;
 		bool		isNull;
@@ -397,10 +397,10 @@ AlterSchemaOwner_internal(HeapTuple tup, Relation rel, Oid newOwnerId)
 			aclcheck_error(aclresult, ACL_KIND_DATABASE,
 						   get_database_name(MyDatabaseId));
 
-		memset(repl_null, ' ', sizeof(repl_null));
-		memset(repl_repl, ' ', sizeof(repl_repl));
+		memset(repl_null, false, sizeof(repl_null));
+		memset(repl_repl, false, sizeof(repl_repl));
 
-		repl_repl[Anum_pg_namespace_nspowner - 1] = 'r';
+		repl_repl[Anum_pg_namespace_nspowner - 1] = true;
 		repl_val[Anum_pg_namespace_nspowner - 1] = ObjectIdGetDatum(newOwnerId);
 
 		/*
@@ -414,11 +414,11 @@ AlterSchemaOwner_internal(HeapTuple tup, Relation rel, Oid newOwnerId)
 		{
 			newAcl = aclnewowner(DatumGetAclP(aclDatum),
 								 nspForm->nspowner, newOwnerId);
-			repl_repl[Anum_pg_namespace_nspacl - 1] = 'r';
+			repl_repl[Anum_pg_namespace_nspacl - 1] = true;
 			repl_val[Anum_pg_namespace_nspacl - 1] = PointerGetDatum(newAcl);
 		}
 
-		newtuple = heap_modifytuple(tup, RelationGetDescr(rel), repl_val, repl_null, repl_repl);
+		newtuple = heap_modify_tuple(tup, RelationGetDescr(rel), repl_val, repl_null, repl_repl);
 
 		simple_heap_update(rel, &newtuple->t_self, newtuple);
 		CatalogUpdateIndexes(rel, newtuple);
diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c
index 87b857826c14a09ed3e84b129e6e855f5d7a6c48..5a5a46818562f96a171784a7428cc12b074b647b 100644
--- a/src/backend/commands/sequence.c
+++ b/src/backend/commands/sequence.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/commands/sequence.c,v 1.154 2008/07/13 20:45:47 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/commands/sequence.c,v 1.155 2008/11/02 01:45:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -114,7 +114,7 @@ DefineSequence(CreateSeqStmt *seq)
 	HeapTuple	tuple;
 	TupleDesc	tupDesc;
 	Datum		value[SEQ_COL_LASTCOL];
-	char		null[SEQ_COL_LASTCOL];
+	bool		null[SEQ_COL_LASTCOL];
 	int			i;
 	NameData	name;
 
@@ -136,7 +136,7 @@ DefineSequence(CreateSeqStmt *seq)
 		coldef->cooked_default = NULL;
 		coldef->constraints = NIL;
 
-		null[i - 1] = ' ';
+		null[i - 1] = false;
 
 		switch (i)
 		{
@@ -222,7 +222,7 @@ DefineSequence(CreateSeqStmt *seq)
 	rel->rd_targblock = 0;
 
 	/* Now form & insert sequence tuple */
-	tuple = heap_formtuple(tupDesc, value, null);
+	tuple = heap_form_tuple(tupDesc, value, null);
 	simple_heap_insert(rel, tuple);
 
 	Assert(ItemPointerGetOffsetNumber(&(tuple->t_self)) == FirstOffsetNumber);
@@ -249,7 +249,7 @@ DefineSequence(CreateSeqStmt *seq)
 	{
 		/*
 		 * Note that the "tuple" structure is still just a local tuple record
-		 * created by heap_formtuple; its t_data pointer doesn't point at the
+		 * created by heap_form_tuple; its t_data pointer doesn't point at the
 		 * disk buffer.  To scribble on the disk buffer we need to fetch the
 		 * item pointer.  But do the same to the local tuple, since that will
 		 * be the source for the WAL log record, below.
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 94705aef285fa7eb86ea3af1488f6a839a2adad7..98defdc0911a276aee1ec6f9dfd4913443c245f0 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.268 2008/10/21 10:38:51 petere Exp $
+ *	  $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.269 2008/11/02 01:45:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1670,7 +1670,7 @@ StoreCatalogInheritance1(Oid relationId, Oid parentOid,
 {
 	TupleDesc	desc = RelationGetDescr(inhRelation);
 	Datum		datum[Natts_pg_inherits];
-	char		nullarr[Natts_pg_inherits];
+	bool		nullarr[Natts_pg_inherits];
 	ObjectAddress childobject,
 				parentobject;
 	HeapTuple	tuple;
@@ -1682,11 +1682,11 @@ StoreCatalogInheritance1(Oid relationId, Oid parentOid,
 	datum[1] = ObjectIdGetDatum(parentOid);		/* inhparent */
 	datum[2] = Int16GetDatum(seqNumber);		/* inhseqno */
 
-	nullarr[0] = ' ';
-	nullarr[1] = ' ';
-	nullarr[2] = ' ';
+	nullarr[0] = false;
+	nullarr[1] = false;
+	nullarr[2] = false;
 
-	tuple = heap_formtuple(desc, datum, nullarr);
+	tuple = heap_form_tuple(desc, datum, nullarr);
 
 	simple_heap_insert(inhRelation, tuple);
 
@@ -6142,8 +6142,8 @@ ATExecChangeOwner(Oid relationOid, Oid newOwnerId, bool recursing)
 	if (tuple_class->relowner != newOwnerId)
 	{
 		Datum		repl_val[Natts_pg_class];
-		char		repl_null[Natts_pg_class];
-		char		repl_repl[Natts_pg_class];
+		bool		repl_null[Natts_pg_class];
+		bool		repl_repl[Natts_pg_class];
 		Acl		   *newAcl;
 		Datum		aclDatum;
 		bool		isNull;
@@ -6175,10 +6175,10 @@ ATExecChangeOwner(Oid relationOid, Oid newOwnerId, bool recursing)
 			}
 		}
 
-		memset(repl_null, ' ', sizeof(repl_null));
-		memset(repl_repl, ' ', sizeof(repl_repl));
+		memset(repl_null, false, sizeof(repl_null));
+		memset(repl_repl, false, sizeof(repl_repl));
 
-		repl_repl[Anum_pg_class_relowner - 1] = 'r';
+		repl_repl[Anum_pg_class_relowner - 1] = true;
 		repl_val[Anum_pg_class_relowner - 1] = ObjectIdGetDatum(newOwnerId);
 
 		/*
@@ -6192,11 +6192,11 @@ ATExecChangeOwner(Oid relationOid, Oid newOwnerId, bool recursing)
 		{
 			newAcl = aclnewowner(DatumGetAclP(aclDatum),
 								 tuple_class->relowner, newOwnerId);
-			repl_repl[Anum_pg_class_relacl - 1] = 'r';
+			repl_repl[Anum_pg_class_relacl - 1] = true;
 			repl_val[Anum_pg_class_relacl - 1] = PointerGetDatum(newAcl);
 		}
 
-		newtuple = heap_modifytuple(tuple, RelationGetDescr(class_rel), repl_val, repl_null, repl_repl);
+		newtuple = heap_modify_tuple(tuple, RelationGetDescr(class_rel), repl_val, repl_null, repl_repl);
 
 		simple_heap_update(class_rel, &newtuple->t_self, newtuple);
 		CatalogUpdateIndexes(class_rel, newtuple);
@@ -6408,8 +6408,8 @@ ATExecSetRelOptions(Relation rel, List *defList, bool isReset)
 	bool		isnull;
 	Datum		newOptions;
 	Datum		repl_val[Natts_pg_class];
-	char		repl_null[Natts_pg_class];
-	char		repl_repl[Natts_pg_class];
+	bool		repl_null[Natts_pg_class];
+	bool		repl_repl[Natts_pg_class];
 
 	if (defList == NIL)
 		return;					/* nothing to do */
@@ -6453,17 +6453,17 @@ ATExecSetRelOptions(Relation rel, List *defList, bool isReset)
 	 * propagated into relcaches during post-commit cache inval.
 	 */
 	memset(repl_val, 0, sizeof(repl_val));
-	memset(repl_null, ' ', sizeof(repl_null));
-	memset(repl_repl, ' ', sizeof(repl_repl));
+	memset(repl_null, false, sizeof(repl_null));
+	memset(repl_repl, false, sizeof(repl_repl));
 
 	if (newOptions != (Datum) 0)
 		repl_val[Anum_pg_class_reloptions - 1] = newOptions;
 	else
-		repl_null[Anum_pg_class_reloptions - 1] = 'n';
+		repl_null[Anum_pg_class_reloptions - 1] = true;
 
-	repl_repl[Anum_pg_class_reloptions - 1] = 'r';
+	repl_repl[Anum_pg_class_reloptions - 1] = true;
 
-	newtuple = heap_modifytuple(tuple, RelationGetDescr(pgclass),
+	newtuple = heap_modify_tuple(tuple, RelationGetDescr(pgclass),
 								repl_val, repl_null, repl_repl);
 
 	simple_heap_update(pgclass, &newtuple->t_self, newtuple);
diff --git a/src/backend/commands/tablespace.c b/src/backend/commands/tablespace.c
index c19eedcb6d57653df06beb7d1973c851cac55199..b87ae34593561052259972f550c676e865142dac 100644
--- a/src/backend/commands/tablespace.c
+++ b/src/backend/commands/tablespace.c
@@ -37,7 +37,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/commands/tablespace.c,v 1.57 2008/06/19 00:46:04 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/commands/tablespace.c,v 1.58 2008/11/02 01:45:28 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -197,7 +197,7 @@ CreateTableSpace(CreateTableSpaceStmt *stmt)
 #ifdef HAVE_SYMLINK
 	Relation	rel;
 	Datum		values[Natts_pg_tablespace];
-	char		nulls[Natts_pg_tablespace];
+	bool		nulls[Natts_pg_tablespace];
 	HeapTuple	tuple;
 	Oid			tablespaceoid;
 	char	   *location;
@@ -278,7 +278,7 @@ CreateTableSpace(CreateTableSpaceStmt *stmt)
 	 */
 	rel = heap_open(TableSpaceRelationId, RowExclusiveLock);
 
-	MemSet(nulls, ' ', Natts_pg_tablespace);
+	MemSet(nulls, false, sizeof(nulls));
 
 	values[Anum_pg_tablespace_spcname - 1] =
 		DirectFunctionCall1(namein, CStringGetDatum(stmt->tablespacename));
@@ -286,9 +286,9 @@ CreateTableSpace(CreateTableSpaceStmt *stmt)
 		ObjectIdGetDatum(ownerId);
 	values[Anum_pg_tablespace_spclocation - 1] =
 		CStringGetTextDatum(location);
-	nulls[Anum_pg_tablespace_spcacl - 1] = 'n';
+	nulls[Anum_pg_tablespace_spcacl - 1] = true;
 
-	tuple = heap_formtuple(rel->rd_att, values, nulls);
+	tuple = heap_form_tuple(rel->rd_att, values, nulls);
 
 	tablespaceoid = simple_heap_insert(rel, tuple);
 
@@ -845,8 +845,8 @@ AlterTableSpaceOwner(const char *name, Oid newOwnerId)
 	if (spcForm->spcowner != newOwnerId)
 	{
 		Datum		repl_val[Natts_pg_tablespace];
-		char		repl_null[Natts_pg_tablespace];
-		char		repl_repl[Natts_pg_tablespace];
+		bool		repl_null[Natts_pg_tablespace];
+		bool		repl_repl[Natts_pg_tablespace];
 		Acl		   *newAcl;
 		Datum		aclDatum;
 		bool		isNull;
@@ -870,10 +870,10 @@ AlterTableSpaceOwner(const char *name, Oid newOwnerId)
 		 * anyway.
 		 */
 
-		memset(repl_null, ' ', sizeof(repl_null));
-		memset(repl_repl, ' ', sizeof(repl_repl));
+		memset(repl_null, false, sizeof(repl_null));
+		memset(repl_repl, false, sizeof(repl_repl));
 
-		repl_repl[Anum_pg_tablespace_spcowner - 1] = 'r';
+		repl_repl[Anum_pg_tablespace_spcowner - 1] = true;
 		repl_val[Anum_pg_tablespace_spcowner - 1] = ObjectIdGetDatum(newOwnerId);
 
 		/*
@@ -888,11 +888,11 @@ AlterTableSpaceOwner(const char *name, Oid newOwnerId)
 		{
 			newAcl = aclnewowner(DatumGetAclP(aclDatum),
 								 spcForm->spcowner, newOwnerId);
-			repl_repl[Anum_pg_tablespace_spcacl - 1] = 'r';
+			repl_repl[Anum_pg_tablespace_spcacl - 1] = true;
 			repl_val[Anum_pg_tablespace_spcacl - 1] = PointerGetDatum(newAcl);
 		}
 
-		newtuple = heap_modifytuple(tup, RelationGetDescr(rel), repl_val, repl_null, repl_repl);
+		newtuple = heap_modify_tuple(tup, RelationGetDescr(rel), repl_val, repl_null, repl_repl);
 
 		simple_heap_update(rel, &newtuple->t_self, newtuple);
 		CatalogUpdateIndexes(rel, newtuple);
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index ffdb168236f20f56747f4d411e7a76666ba019da..53fb1995fc88031a16bffec0481fce4d9946c77c 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.238 2008/10/24 23:42:35 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.239 2008/11/02 01:45:28 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -83,7 +83,7 @@ CreateTrigger(CreateTrigStmt *stmt, Oid constraintOid)
 	int16		tgtype;
 	int2vector *tgattr;
 	Datum		values[Natts_pg_trigger];
-	char		nulls[Natts_pg_trigger];
+	bool		nulls[Natts_pg_trigger];
 	Relation	rel;
 	AclResult	aclresult;
 	Relation	tgrel;
@@ -310,7 +310,7 @@ CreateTrigger(CreateTrigStmt *stmt, Oid constraintOid)
 	/*
 	 * Build the new pg_trigger tuple.
 	 */
-	memset(nulls, ' ', Natts_pg_trigger * sizeof(char));
+	memset(nulls, false, sizeof(nulls));
 
 	values[Anum_pg_trigger_tgrelid - 1] = ObjectIdGetDatum(RelationGetRelid(rel));
 	values[Anum_pg_trigger_tgname - 1] = DirectFunctionCall1(namein,
@@ -374,7 +374,7 @@ CreateTrigger(CreateTrigStmt *stmt, Oid constraintOid)
 	tgattr = buildint2vector(NULL, 0);
 	values[Anum_pg_trigger_tgattr - 1] = PointerGetDatum(tgattr);
 
-	tuple = heap_formtuple(tgrel->rd_att, values, nulls);
+	tuple = heap_form_tuple(tgrel->rd_att, values, nulls);
 
 	/* force tuple to have the desired OID */
 	HeapTupleSetOid(tuple, trigoid);
diff --git a/src/backend/commands/tsearchcmds.c b/src/backend/commands/tsearchcmds.c
index c150f2d1de81e6adfd6a6528be09a89377c01652..807c94d098dc27e0d8b72e5a0208fe516a84f9b1 100644
--- a/src/backend/commands/tsearchcmds.c
+++ b/src/backend/commands/tsearchcmds.c
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/commands/tsearchcmds.c,v 1.13 2008/06/19 00:46:04 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/commands/tsearchcmds.c,v 1.14 2008/11/02 01:45:28 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -167,7 +167,7 @@ DefineTSParser(List *names, List *parameters)
 	Relation	prsRel;
 	HeapTuple	tup;
 	Datum		values[Natts_pg_ts_parser];
-	char		nulls[Natts_pg_ts_parser];
+	bool		nulls[Natts_pg_ts_parser];
 	NameData	pname;
 	Oid			prsOid;
 	Oid			namespaceoid;
@@ -182,7 +182,7 @@ DefineTSParser(List *names, List *parameters)
 
 	/* initialize tuple fields with name/namespace */
 	memset(values, 0, sizeof(values));
-	memset(nulls, ' ', sizeof(nulls));
+	memset(nulls, false, sizeof(nulls));
 
 	namestrcpy(&pname, prsname);
 	values[Anum_pg_ts_parser_prsname - 1] = NameGetDatum(&pname);
@@ -255,7 +255,7 @@ DefineTSParser(List *names, List *parameters)
 	 */
 	prsRel = heap_open(TSParserRelationId, RowExclusiveLock);
 
-	tup = heap_formtuple(prsRel->rd_att, values, nulls);
+	tup = heap_form_tuple(prsRel->rd_att, values, nulls);
 
 	prsOid = simple_heap_insert(prsRel, tup);
 
@@ -497,7 +497,7 @@ DefineTSDictionary(List *names, List *parameters)
 	Relation	dictRel;
 	HeapTuple	tup;
 	Datum		values[Natts_pg_ts_dict];
-	char		nulls[Natts_pg_ts_dict];
+	bool		nulls[Natts_pg_ts_dict];
 	NameData	dname;
 	Oid			templId = InvalidOid;
 	List	   *dictoptions = NIL;
@@ -547,7 +547,7 @@ DefineTSDictionary(List *names, List *parameters)
 	 * Looks good, insert
 	 */
 	memset(values, 0, sizeof(values));
-	memset(nulls, ' ', sizeof(nulls));
+	memset(nulls, false, sizeof(nulls));
 
 	namestrcpy(&dname, dictname);
 	values[Anum_pg_ts_dict_dictname - 1] = NameGetDatum(&dname);
@@ -558,11 +558,11 @@ DefineTSDictionary(List *names, List *parameters)
 		values[Anum_pg_ts_dict_dictinitoption - 1] =
 			PointerGetDatum(serialize_deflist(dictoptions));
 	else
-		nulls[Anum_pg_ts_dict_dictinitoption - 1] = 'n';
+		nulls[Anum_pg_ts_dict_dictinitoption - 1] = true;
 
 	dictRel = heap_open(TSDictionaryRelationId, RowExclusiveLock);
 
-	tup = heap_formtuple(dictRel->rd_att, values, nulls);
+	tup = heap_form_tuple(dictRel->rd_att, values, nulls);
 
 	dictOid = simple_heap_insert(dictRel, tup);
 
@@ -742,8 +742,8 @@ AlterTSDictionary(AlterTSDictionaryStmt *stmt)
 	Datum		opt;
 	bool		isnull;
 	Datum		repl_val[Natts_pg_ts_dict];
-	char		repl_null[Natts_pg_ts_dict];
-	char		repl_repl[Natts_pg_ts_dict];
+	bool		repl_null[Natts_pg_ts_dict];
+	bool		repl_repl[Natts_pg_ts_dict];
 
 	dictId = TSDictionaryGetDictid(stmt->dictname, false);
 
@@ -813,17 +813,17 @@ AlterTSDictionary(AlterTSDictionaryStmt *stmt)
 	 * Looks good, update
 	 */
 	memset(repl_val, 0, sizeof(repl_val));
-	memset(repl_null, ' ', sizeof(repl_null));
-	memset(repl_repl, ' ', sizeof(repl_repl));
+	memset(repl_null, false, sizeof(repl_null));
+	memset(repl_repl, false, sizeof(repl_repl));
 
 	if (dictoptions)
 		repl_val[Anum_pg_ts_dict_dictinitoption - 1] =
 			PointerGetDatum(serialize_deflist(dictoptions));
 	else
-		repl_null[Anum_pg_ts_dict_dictinitoption - 1] = 'n';
-	repl_repl[Anum_pg_ts_dict_dictinitoption - 1] = 'r';
+		repl_null[Anum_pg_ts_dict_dictinitoption - 1] = true;
+	repl_repl[Anum_pg_ts_dict_dictinitoption - 1] = true;
 
-	newtup = heap_modifytuple(tup, RelationGetDescr(rel),
+	newtup = heap_modify_tuple(tup, RelationGetDescr(rel),
 							  repl_val, repl_null, repl_repl);
 
 	simple_heap_update(rel, &newtup->t_self, newtup);
@@ -995,7 +995,7 @@ DefineTSTemplate(List *names, List *parameters)
 	Relation	tmplRel;
 	HeapTuple	tup;
 	Datum		values[Natts_pg_ts_template];
-	char		nulls[Natts_pg_ts_template];
+	bool		nulls[Natts_pg_ts_template];
 	NameData	dname;
 	int			i;
 	Oid			dictOid;
@@ -1012,7 +1012,7 @@ DefineTSTemplate(List *names, List *parameters)
 
 	for (i = 0; i < Natts_pg_ts_template; i++)
 	{
-		nulls[i] = ' ';
+		nulls[i] = false;
 		values[i] = ObjectIdGetDatum(InvalidOid);
 	}
 
@@ -1031,13 +1031,13 @@ DefineTSTemplate(List *names, List *parameters)
 		{
 			values[Anum_pg_ts_template_tmplinit - 1] =
 				get_ts_template_func(defel, Anum_pg_ts_template_tmplinit);
-			nulls[Anum_pg_ts_template_tmplinit - 1] = ' ';
+			nulls[Anum_pg_ts_template_tmplinit - 1] = false;
 		}
 		else if (pg_strcasecmp(defel->defname, "lexize") == 0)
 		{
 			values[Anum_pg_ts_template_tmpllexize - 1] =
 				get_ts_template_func(defel, Anum_pg_ts_template_tmpllexize);
-			nulls[Anum_pg_ts_template_tmpllexize - 1] = ' ';
+			nulls[Anum_pg_ts_template_tmpllexize - 1] = false;
 		}
 		else
 			ereport(ERROR,
@@ -1060,7 +1060,7 @@ DefineTSTemplate(List *names, List *parameters)
 
 	tmplRel = heap_open(TSTemplateRelationId, RowExclusiveLock);
 
-	tup = heap_formtuple(tmplRel->rd_att, values, nulls);
+	tup = heap_form_tuple(tmplRel->rd_att, values, nulls);
 
 	dictOid = simple_heap_insert(tmplRel, tup);
 
@@ -1327,7 +1327,7 @@ DefineTSConfiguration(List *names, List *parameters)
 	Relation	mapRel = NULL;
 	HeapTuple	tup;
 	Datum		values[Natts_pg_ts_config];
-	char		nulls[Natts_pg_ts_config];
+	bool		nulls[Natts_pg_ts_config];
 	AclResult	aclresult;
 	Oid			namespaceoid;
 	char	   *cfgname;
@@ -1403,7 +1403,7 @@ DefineTSConfiguration(List *names, List *parameters)
 	 * Looks good, build tuple and insert
 	 */
 	memset(values, 0, sizeof(values));
-	memset(nulls, ' ', sizeof(nulls));
+	memset(nulls, false, sizeof(nulls));
 
 	namestrcpy(&cname, cfgname);
 	values[Anum_pg_ts_config_cfgname - 1] = NameGetDatum(&cname);
@@ -1413,7 +1413,7 @@ DefineTSConfiguration(List *names, List *parameters)
 
 	cfgRel = heap_open(TSConfigRelationId, RowExclusiveLock);
 
-	tup = heap_formtuple(cfgRel->rd_att, values, nulls);
+	tup = heap_form_tuple(cfgRel->rd_att, values, nulls);
 
 	cfgOid = simple_heap_insert(cfgRel, tup);
 
@@ -1443,17 +1443,17 @@ DefineTSConfiguration(List *names, List *parameters)
 			Form_pg_ts_config_map cfgmap = (Form_pg_ts_config_map) GETSTRUCT(maptup);
 			HeapTuple	newmaptup;
 			Datum		mapvalues[Natts_pg_ts_config_map];
-			char		mapnulls[Natts_pg_ts_config_map];
+			bool		mapnulls[Natts_pg_ts_config_map];
 
 			memset(mapvalues, 0, sizeof(mapvalues));
-			memset(mapnulls, ' ', sizeof(mapnulls));
+			memset(mapnulls, false, sizeof(mapnulls));
 
 			mapvalues[Anum_pg_ts_config_map_mapcfg - 1] = cfgOid;
 			mapvalues[Anum_pg_ts_config_map_maptokentype - 1] = cfgmap->maptokentype;
 			mapvalues[Anum_pg_ts_config_map_mapseqno - 1] = cfgmap->mapseqno;
 			mapvalues[Anum_pg_ts_config_map_mapdict - 1] = cfgmap->mapdict;
 
-			newmaptup = heap_formtuple(mapRel->rd_att, mapvalues, mapnulls);
+			newmaptup = heap_form_tuple(mapRel->rd_att, mapvalues, mapnulls);
 
 			simple_heap_insert(mapRel, newmaptup);
 
@@ -1911,18 +1911,18 @@ MakeConfigurationMapping(AlterTSConfigurationStmt *stmt,
 			if (cfgmap->mapdict == dictOld)
 			{
 				Datum		repl_val[Natts_pg_ts_config_map];
-				char		repl_null[Natts_pg_ts_config_map];
-				char		repl_repl[Natts_pg_ts_config_map];
+				bool		repl_null[Natts_pg_ts_config_map];
+				bool		repl_repl[Natts_pg_ts_config_map];
 				HeapTuple	newtup;
 
 				memset(repl_val, 0, sizeof(repl_val));
-				memset(repl_null, ' ', sizeof(repl_null));
-				memset(repl_repl, ' ', sizeof(repl_repl));
+				memset(repl_null, false, sizeof(repl_null));
+				memset(repl_repl, false, sizeof(repl_repl));
 
 				repl_val[Anum_pg_ts_config_map_mapdict - 1] = ObjectIdGetDatum(dictNew);
-				repl_repl[Anum_pg_ts_config_map_mapdict - 1] = 'r';
+				repl_repl[Anum_pg_ts_config_map_mapdict - 1] = true;
 
-				newtup = heap_modifytuple(maptup,
+				newtup = heap_modify_tuple(maptup,
 										  RelationGetDescr(relMap),
 										  repl_val, repl_null, repl_repl);
 				simple_heap_update(relMap, &newtup->t_self, newtup);
@@ -1943,15 +1943,15 @@ MakeConfigurationMapping(AlterTSConfigurationStmt *stmt,
 			for (j = 0; j < ndict; j++)
 			{
 				Datum		values[Natts_pg_ts_config_map];
-				char		nulls[Natts_pg_ts_config_map];
+				bool		nulls[Natts_pg_ts_config_map];
 
-				memset(nulls, ' ', sizeof(nulls));
+				memset(nulls, false, sizeof(nulls));
 				values[Anum_pg_ts_config_map_mapcfg - 1] = ObjectIdGetDatum(cfgId);
 				values[Anum_pg_ts_config_map_maptokentype - 1] = Int32GetDatum(tokens[i]);
 				values[Anum_pg_ts_config_map_mapseqno - 1] = Int32GetDatum(j + 1);
 				values[Anum_pg_ts_config_map_mapdict - 1] = ObjectIdGetDatum(dictIds[j]);
 
-				tup = heap_formtuple(relMap->rd_att, values, nulls);
+				tup = heap_form_tuple(relMap->rd_att, values, nulls);
 				simple_heap_insert(relMap, tup);
 				CatalogUpdateIndexes(relMap, tup);
 
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index f985df6298b46666e5618ce2df1a40272040906c..2ea9021a9ba8e832f1e33fa6f74088a130f9b046 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.125 2008/10/21 10:38:51 petere Exp $
+ *	  $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.126 2008/11/02 01:45:28 tgl Exp $
  *
  * DESCRIPTION
  *	  The "DefineFoo" routines take the parse tree and pick out the
@@ -1436,8 +1436,8 @@ AlterDomainDefault(List *names, Node *defaultRaw)
 	char	   *defaultValue;
 	Node	   *defaultExpr = NULL;		/* NULL if no default specified */
 	Datum		new_record[Natts_pg_type];
-	char		new_record_nulls[Natts_pg_type];
-	char		new_record_repl[Natts_pg_type];
+	bool		new_record_nulls[Natts_pg_type];
+	bool		new_record_repl[Natts_pg_type];
 	HeapTuple	newtuple;
 	Form_pg_type typTup;
 
@@ -1460,8 +1460,8 @@ AlterDomainDefault(List *names, Node *defaultRaw)
 
 	/* Setup new tuple */
 	MemSet(new_record, (Datum) 0, sizeof(new_record));
-	MemSet(new_record_nulls, ' ', sizeof(new_record_nulls));
-	MemSet(new_record_repl, ' ', sizeof(new_record_repl));
+	MemSet(new_record_nulls, false, sizeof(new_record_nulls));
+	MemSet(new_record_repl, false, sizeof(new_record_repl));
 
 	/* Store the new default into the tuple */
 	if (defaultRaw)
@@ -1487,10 +1487,10 @@ AlterDomainDefault(List *names, Node *defaultRaw)
 			(IsA(defaultExpr, Const) &&((Const *) defaultExpr)->constisnull))
 		{
 			/* Default is NULL, drop it */
-			new_record_nulls[Anum_pg_type_typdefaultbin - 1] = 'n';
-			new_record_repl[Anum_pg_type_typdefaultbin - 1] = 'r';
-			new_record_nulls[Anum_pg_type_typdefault - 1] = 'n';
-			new_record_repl[Anum_pg_type_typdefault - 1] = 'r';
+			new_record_nulls[Anum_pg_type_typdefaultbin - 1] = true;
+			new_record_repl[Anum_pg_type_typdefaultbin - 1] = true;
+			new_record_nulls[Anum_pg_type_typdefault - 1] = true;
+			new_record_repl[Anum_pg_type_typdefault - 1] = true;
 		}
 		else
 		{
@@ -1509,21 +1509,21 @@ AlterDomainDefault(List *names, Node *defaultRaw)
 			 */
 			new_record[Anum_pg_type_typdefaultbin - 1] = CStringGetTextDatum(nodeToString(defaultExpr));
 
-			new_record_repl[Anum_pg_type_typdefaultbin - 1] = 'r';
+			new_record_repl[Anum_pg_type_typdefaultbin - 1] = true;
 			new_record[Anum_pg_type_typdefault - 1] = CStringGetTextDatum(defaultValue);
-			new_record_repl[Anum_pg_type_typdefault - 1] = 'r';
+			new_record_repl[Anum_pg_type_typdefault - 1] = true;
 		}
 	}
 	else
 	{
 		/* ALTER ... DROP DEFAULT */
-		new_record_nulls[Anum_pg_type_typdefaultbin - 1] = 'n';
-		new_record_repl[Anum_pg_type_typdefaultbin - 1] = 'r';
-		new_record_nulls[Anum_pg_type_typdefault - 1] = 'n';
-		new_record_repl[Anum_pg_type_typdefault - 1] = 'r';
+		new_record_nulls[Anum_pg_type_typdefaultbin - 1] = true;
+		new_record_repl[Anum_pg_type_typdefaultbin - 1] = true;
+		new_record_nulls[Anum_pg_type_typdefault - 1] = true;
+		new_record_repl[Anum_pg_type_typdefault - 1] = true;
 	}
 
-	newtuple = heap_modifytuple(tup, RelationGetDescr(rel),
+	newtuple = heap_modify_tuple(tup, RelationGetDescr(rel),
 								new_record, new_record_nulls,
 								new_record_repl);
 
diff --git a/src/backend/commands/user.c b/src/backend/commands/user.c
index ce9c6853e7265c23c20490a373e758b2e84f7250..a47980b8b7c0930a636a8646e625dff3b85502fd 100644
--- a/src/backend/commands/user.c
+++ b/src/backend/commands/user.c
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.182 2008/05/12 00:00:48 alvherre Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.183 2008/11/02 01:45:28 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -78,7 +78,7 @@ CreateRole(CreateRoleStmt *stmt)
 	TupleDesc	pg_authid_dsc;
 	HeapTuple	tuple;
 	Datum		new_record[Natts_pg_authid];
-	char		new_record_nulls[Natts_pg_authid];
+	bool		new_record_nulls[Natts_pg_authid];
 	Oid			roleid;
 	ListCell   *item;
 	ListCell   *option;
@@ -295,7 +295,7 @@ CreateRole(CreateRoleStmt *stmt)
 	 * Build a tuple to insert
 	 */
 	MemSet(new_record, 0, sizeof(new_record));
-	MemSet(new_record_nulls, ' ', sizeof(new_record_nulls));
+	MemSet(new_record_nulls, false, sizeof(new_record_nulls));
 
 	new_record[Anum_pg_authid_rolname - 1] =
 		DirectFunctionCall1(namein, CStringGetDatum(stmt->role));
@@ -324,7 +324,7 @@ CreateRole(CreateRoleStmt *stmt)
 		}
 	}
 	else
-		new_record_nulls[Anum_pg_authid_rolpassword - 1] = 'n';
+		new_record_nulls[Anum_pg_authid_rolpassword - 1] = true;
 
 	if (validUntil)
 		new_record[Anum_pg_authid_rolvaliduntil - 1] =
@@ -334,11 +334,11 @@ CreateRole(CreateRoleStmt *stmt)
 								Int32GetDatum(-1));
 
 	else
-		new_record_nulls[Anum_pg_authid_rolvaliduntil - 1] = 'n';
+		new_record_nulls[Anum_pg_authid_rolvaliduntil - 1] = true;
 
-	new_record_nulls[Anum_pg_authid_rolconfig - 1] = 'n';
+	new_record_nulls[Anum_pg_authid_rolconfig - 1] = true;
 
-	tuple = heap_formtuple(pg_authid_dsc, new_record, new_record_nulls);
+	tuple = heap_form_tuple(pg_authid_dsc, new_record, new_record_nulls);
 
 	/*
 	 * Insert new record in the pg_authid table
@@ -402,8 +402,8 @@ void
 AlterRole(AlterRoleStmt *stmt)
 {
 	Datum		new_record[Natts_pg_authid];
-	char		new_record_nulls[Natts_pg_authid];
-	char		new_record_repl[Natts_pg_authid];
+	bool		new_record_nulls[Natts_pg_authid];
+	bool		new_record_repl[Natts_pg_authid];
 	Relation	pg_authid_rel;
 	TupleDesc	pg_authid_dsc;
 	HeapTuple	tuple,
@@ -586,8 +586,8 @@ AlterRole(AlterRoleStmt *stmt)
 	 * Build an updated tuple, perusing the information just obtained
 	 */
 	MemSet(new_record, 0, sizeof(new_record));
-	MemSet(new_record_nulls, ' ', sizeof(new_record_nulls));
-	MemSet(new_record_repl, ' ', sizeof(new_record_repl));
+	MemSet(new_record_nulls, false, sizeof(new_record_nulls));
+	MemSet(new_record_repl, false, sizeof(new_record_repl));
 
 	/*
 	 * issuper/createrole/catupdate/etc
@@ -600,40 +600,40 @@ AlterRole(AlterRoleStmt *stmt)
 	if (issuper >= 0)
 	{
 		new_record[Anum_pg_authid_rolsuper - 1] = BoolGetDatum(issuper > 0);
-		new_record_repl[Anum_pg_authid_rolsuper - 1] = 'r';
+		new_record_repl[Anum_pg_authid_rolsuper - 1] = true;
 
 		new_record[Anum_pg_authid_rolcatupdate - 1] = BoolGetDatum(issuper > 0);
-		new_record_repl[Anum_pg_authid_rolcatupdate - 1] = 'r';
+		new_record_repl[Anum_pg_authid_rolcatupdate - 1] = true;
 	}
 
 	if (inherit >= 0)
 	{
 		new_record[Anum_pg_authid_rolinherit - 1] = BoolGetDatum(inherit > 0);
-		new_record_repl[Anum_pg_authid_rolinherit - 1] = 'r';
+		new_record_repl[Anum_pg_authid_rolinherit - 1] = true;
 	}
 
 	if (createrole >= 0)
 	{
 		new_record[Anum_pg_authid_rolcreaterole - 1] = BoolGetDatum(createrole > 0);
-		new_record_repl[Anum_pg_authid_rolcreaterole - 1] = 'r';
+		new_record_repl[Anum_pg_authid_rolcreaterole - 1] = true;
 	}
 
 	if (createdb >= 0)
 	{
 		new_record[Anum_pg_authid_rolcreatedb - 1] = BoolGetDatum(createdb > 0);
-		new_record_repl[Anum_pg_authid_rolcreatedb - 1] = 'r';
+		new_record_repl[Anum_pg_authid_rolcreatedb - 1] = true;
 	}
 
 	if (canlogin >= 0)
 	{
 		new_record[Anum_pg_authid_rolcanlogin - 1] = BoolGetDatum(canlogin > 0);
-		new_record_repl[Anum_pg_authid_rolcanlogin - 1] = 'r';
+		new_record_repl[Anum_pg_authid_rolcanlogin - 1] = true;
 	}
 
 	if (dconnlimit)
 	{
 		new_record[Anum_pg_authid_rolconnlimit - 1] = Int32GetDatum(connlimit);
-		new_record_repl[Anum_pg_authid_rolconnlimit - 1] = 'r';
+		new_record_repl[Anum_pg_authid_rolconnlimit - 1] = true;
 	}
 
 	/* password */
@@ -650,14 +650,14 @@ AlterRole(AlterRoleStmt *stmt)
 			new_record[Anum_pg_authid_rolpassword - 1] =
 				CStringGetTextDatum(encrypted_password);
 		}
-		new_record_repl[Anum_pg_authid_rolpassword - 1] = 'r';
+		new_record_repl[Anum_pg_authid_rolpassword - 1] = true;
 	}
 
 	/* unset password */
 	if (dpassword && dpassword->arg == NULL)
 	{
-		new_record_repl[Anum_pg_authid_rolpassword - 1] = 'r';
-		new_record_nulls[Anum_pg_authid_rolpassword - 1] = 'n';
+		new_record_repl[Anum_pg_authid_rolpassword - 1] = true;
+		new_record_nulls[Anum_pg_authid_rolpassword - 1] = true;
 	}
 
 	/* valid until */
@@ -668,10 +668,10 @@ AlterRole(AlterRoleStmt *stmt)
 								CStringGetDatum(validUntil),
 								ObjectIdGetDatum(InvalidOid),
 								Int32GetDatum(-1));
-		new_record_repl[Anum_pg_authid_rolvaliduntil - 1] = 'r';
+		new_record_repl[Anum_pg_authid_rolvaliduntil - 1] = true;
 	}
 
-	new_tuple = heap_modifytuple(tuple, pg_authid_dsc, new_record,
+	new_tuple = heap_modify_tuple(tuple, pg_authid_dsc, new_record,
 								 new_record_nulls, new_record_repl);
 	simple_heap_update(pg_authid_rel, &tuple->t_self, new_tuple);
 
@@ -721,8 +721,8 @@ AlterRoleSet(AlterRoleSetStmt *stmt)
 				newtuple;
 	Relation	rel;
 	Datum		repl_val[Natts_pg_authid];
-	char		repl_null[Natts_pg_authid];
-	char		repl_repl[Natts_pg_authid];
+	bool		repl_null[Natts_pg_authid];
+	bool		repl_repl[Natts_pg_authid];
 
 	valuestr = ExtractSetVariableArgs(stmt->setstmt);
 
@@ -755,13 +755,13 @@ AlterRoleSet(AlterRoleSetStmt *stmt)
 					 errmsg("permission denied")));
 	}
 
-	memset(repl_repl, ' ', sizeof(repl_repl));
-	repl_repl[Anum_pg_authid_rolconfig - 1] = 'r';
+	memset(repl_repl, false, sizeof(repl_repl));
+	repl_repl[Anum_pg_authid_rolconfig - 1] = true;
 
 	if (stmt->setstmt->kind == VAR_RESET_ALL)
 	{
 		/* RESET ALL, so just set rolconfig to null */
-		repl_null[Anum_pg_authid_rolconfig - 1] = 'n';
+		repl_null[Anum_pg_authid_rolconfig - 1] = true;
 		repl_val[Anum_pg_authid_rolconfig - 1] = (Datum) 0;
 	}
 	else
@@ -770,7 +770,7 @@ AlterRoleSet(AlterRoleSetStmt *stmt)
 		bool		isnull;
 		ArrayType  *array;
 
-		repl_null[Anum_pg_authid_rolconfig - 1] = ' ';
+		repl_null[Anum_pg_authid_rolconfig - 1] = false;
 
 		/* Extract old value of rolconfig */
 		datum = SysCacheGetAttr(AUTHNAME, oldtuple,
@@ -786,10 +786,10 @@ AlterRoleSet(AlterRoleSetStmt *stmt)
 		if (array)
 			repl_val[Anum_pg_authid_rolconfig - 1] = PointerGetDatum(array);
 		else
-			repl_null[Anum_pg_authid_rolconfig - 1] = 'n';
+			repl_null[Anum_pg_authid_rolconfig - 1] = true;
 	}
 
-	newtuple = heap_modifytuple(oldtuple, RelationGetDescr(rel),
+	newtuple = heap_modify_tuple(oldtuple, RelationGetDescr(rel),
 								repl_val, repl_null, repl_repl);
 
 	simple_heap_update(rel, &oldtuple->t_self, newtuple);
@@ -983,8 +983,8 @@ RenameRole(const char *oldname, const char *newname)
 	Datum		datum;
 	bool		isnull;
 	Datum		repl_val[Natts_pg_authid];
-	char		repl_null[Natts_pg_authid];
-	char		repl_repl[Natts_pg_authid];
+	bool		repl_null[Natts_pg_authid];
+	bool		repl_repl[Natts_pg_authid];
 	int			i;
 	Oid			roleid;
 
@@ -1053,26 +1053,26 @@ RenameRole(const char *oldname, const char *newname)
 
 	/* OK, construct the modified tuple */
 	for (i = 0; i < Natts_pg_authid; i++)
-		repl_repl[i] = ' ';
+		repl_repl[i] = false;
 
-	repl_repl[Anum_pg_authid_rolname - 1] = 'r';
+	repl_repl[Anum_pg_authid_rolname - 1] = true;
 	repl_val[Anum_pg_authid_rolname - 1] = DirectFunctionCall1(namein,
 												   CStringGetDatum(newname));
-	repl_null[Anum_pg_authid_rolname - 1] = ' ';
+	repl_null[Anum_pg_authid_rolname - 1] = false;
 
 	datum = heap_getattr(oldtuple, Anum_pg_authid_rolpassword, dsc, &isnull);
 
 	if (!isnull && isMD5(TextDatumGetCString(datum)))
 	{
 		/* MD5 uses the username as salt, so just clear it on a rename */
-		repl_repl[Anum_pg_authid_rolpassword - 1] = 'r';
-		repl_null[Anum_pg_authid_rolpassword - 1] = 'n';
+		repl_repl[Anum_pg_authid_rolpassword - 1] = true;
+		repl_null[Anum_pg_authid_rolpassword - 1] = true;
 
 		ereport(NOTICE,
 				(errmsg("MD5 password cleared because of role rename")));
 	}
 
-	newtuple = heap_modifytuple(oldtuple, dsc, repl_val, repl_null, repl_repl);
+	newtuple = heap_modify_tuple(oldtuple, dsc, repl_val, repl_null, repl_repl);
 	simple_heap_update(rel, &oldtuple->t_self, newtuple);
 
 	CatalogUpdateIndexes(rel, newtuple);
@@ -1296,8 +1296,8 @@ AddRoleMems(const char *rolename, Oid roleid,
 		HeapTuple	authmem_tuple;
 		HeapTuple	tuple;
 		Datum		new_record[Natts_pg_auth_members];
-		char		new_record_nulls[Natts_pg_auth_members];
-		char		new_record_repl[Natts_pg_auth_members];
+		bool		new_record_nulls[Natts_pg_auth_members];
+		bool		new_record_repl[Natts_pg_auth_members];
 
 		/*
 		 * Refuse creation of membership loops, including the trivial case
@@ -1333,8 +1333,8 @@ AddRoleMems(const char *rolename, Oid roleid,
 
 		/* Build a tuple to insert or update */
 		MemSet(new_record, 0, sizeof(new_record));
-		MemSet(new_record_nulls, ' ', sizeof(new_record_nulls));
-		MemSet(new_record_repl, ' ', sizeof(new_record_repl));
+		MemSet(new_record_nulls, false, sizeof(new_record_nulls));
+		MemSet(new_record_repl, false, sizeof(new_record_repl));
 
 		new_record[Anum_pg_auth_members_roleid - 1] = ObjectIdGetDatum(roleid);
 		new_record[Anum_pg_auth_members_member - 1] = ObjectIdGetDatum(memberid);
@@ -1343,9 +1343,9 @@ AddRoleMems(const char *rolename, Oid roleid,
 
 		if (HeapTupleIsValid(authmem_tuple))
 		{
-			new_record_repl[Anum_pg_auth_members_grantor - 1] = 'r';
-			new_record_repl[Anum_pg_auth_members_admin_option - 1] = 'r';
-			tuple = heap_modifytuple(authmem_tuple, pg_authmem_dsc,
+			new_record_repl[Anum_pg_auth_members_grantor - 1] = true;
+			new_record_repl[Anum_pg_auth_members_admin_option - 1] = true;
+			tuple = heap_modify_tuple(authmem_tuple, pg_authmem_dsc,
 									 new_record,
 									 new_record_nulls, new_record_repl);
 			simple_heap_update(pg_authmem_rel, &tuple->t_self, tuple);
@@ -1354,7 +1354,7 @@ AddRoleMems(const char *rolename, Oid roleid,
 		}
 		else
 		{
-			tuple = heap_formtuple(pg_authmem_dsc,
+			tuple = heap_form_tuple(pg_authmem_dsc,
 								   new_record, new_record_nulls);
 			simple_heap_insert(pg_authmem_rel, tuple);
 			CatalogUpdateIndexes(pg_authmem_rel, tuple);
@@ -1453,18 +1453,18 @@ DelRoleMems(const char *rolename, Oid roleid,
 			/* Just turn off the admin option */
 			HeapTuple	tuple;
 			Datum		new_record[Natts_pg_auth_members];
-			char		new_record_nulls[Natts_pg_auth_members];
-			char		new_record_repl[Natts_pg_auth_members];
+			bool		new_record_nulls[Natts_pg_auth_members];
+			bool		new_record_repl[Natts_pg_auth_members];
 
 			/* Build a tuple to update with */
 			MemSet(new_record, 0, sizeof(new_record));
-			MemSet(new_record_nulls, ' ', sizeof(new_record_nulls));
-			MemSet(new_record_repl, ' ', sizeof(new_record_repl));
+			MemSet(new_record_nulls, false, sizeof(new_record_nulls));
+			MemSet(new_record_repl, false, sizeof(new_record_repl));
 
 			new_record[Anum_pg_auth_members_admin_option - 1] = BoolGetDatum(false);
-			new_record_repl[Anum_pg_auth_members_admin_option - 1] = 'r';
+			new_record_repl[Anum_pg_auth_members_admin_option - 1] = true;
 
-			tuple = heap_modifytuple(authmem_tuple, pg_authmem_dsc,
+			tuple = heap_modify_tuple(authmem_tuple, pg_authmem_dsc,
 									 new_record,
 									 new_record_nulls, new_record_repl);
 			simple_heap_update(pg_authmem_rel, &tuple->t_self, tuple);
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 7d92f8deff4f3230dd8c67367cd121e527c078a3..0c7052c9b31156455f6e8cf70f7a808a0a713b5d 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -15,7 +15,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/executor/execTuples.c,v 1.103 2008/10/28 22:02:05 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/executor/execTuples.c,v 1.104 2008/11/02 01:45:28 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1126,12 +1126,12 @@ BuildTupleFromCStrings(AttInMetadata *attinmeta, char **values)
 	TupleDesc	tupdesc = attinmeta->tupdesc;
 	int			natts = tupdesc->natts;
 	Datum	   *dvalues;
-	char	   *nulls;
+	bool	   *nulls;
 	int			i;
 	HeapTuple	tuple;
 
 	dvalues = (Datum *) palloc(natts * sizeof(Datum));
-	nulls = (char *) palloc(natts * sizeof(char));
+	nulls = (bool *) palloc(natts * sizeof(bool));
 
 	/* Call the "in" function for each non-dropped attribute */
 	for (i = 0; i < natts; i++)
@@ -1144,22 +1144,22 @@ BuildTupleFromCStrings(AttInMetadata *attinmeta, char **values)
 										   attinmeta->attioparams[i],
 										   attinmeta->atttypmods[i]);
 			if (values[i] != NULL)
-				nulls[i] = ' ';
+				nulls[i] = false;
 			else
-				nulls[i] = 'n';
+				nulls[i] = true;
 		}
 		else
 		{
 			/* Handle dropped attributes by setting to NULL */
 			dvalues[i] = (Datum) 0;
-			nulls[i] = 'n';
+			nulls[i] = true;
 		}
 	}
 
 	/*
 	 * Form a tuple
 	 */
-	tuple = heap_formtuple(tupdesc, dvalues, nulls);
+	tuple = heap_form_tuple(tupdesc, dvalues, nulls);
 
 	/*
 	 * Release locally palloc'd space.  XXX would probably be good to pfree
diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c
index e70e923dfc801f09df9b3cfe626510f0c28e2ca8..9cf119eaed9083e6a4745ec30c218dbc0d4e65cf 100644
--- a/src/backend/executor/spi.c
+++ b/src/backend/executor/spi.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.199 2008/10/16 13:23:21 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.200 2008/11/02 01:45:28 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -627,7 +627,7 @@ SPI_modifytuple(Relation rel, HeapTuple tuple, int natts, int *attnum,
 	HeapTuple	mtuple;
 	int			numberOfAttributes;
 	Datum	   *v;
-	char	   *n;
+	bool	   *n;
 	int			i;
 
 	if (rel == NULL || tuple == NULL || natts < 0 || attnum == NULL || Values == NULL)
@@ -645,10 +645,10 @@ SPI_modifytuple(Relation rel, HeapTuple tuple, int natts, int *attnum,
 	SPI_result = 0;
 	numberOfAttributes = rel->rd_att->natts;
 	v = (Datum *) palloc(numberOfAttributes * sizeof(Datum));
-	n = (char *) palloc(numberOfAttributes * sizeof(char));
+	n = (bool *) palloc(numberOfAttributes * sizeof(bool));
 
 	/* fetch old values and nulls */
-	heap_deformtuple(tuple, rel->rd_att, v, n);
+	heap_deform_tuple(tuple, rel->rd_att, v, n);
 
 	/* replace values and nulls */
 	for (i = 0; i < natts; i++)
@@ -656,12 +656,12 @@ SPI_modifytuple(Relation rel, HeapTuple tuple, int natts, int *attnum,
 		if (attnum[i] <= 0 || attnum[i] > numberOfAttributes)
 			break;
 		v[attnum[i] - 1] = Values[i];
-		n[attnum[i] - 1] = (Nulls && Nulls[i] == 'n') ? 'n' : ' ';
+		n[attnum[i] - 1] = (Nulls && Nulls[i] == 'n') ? true : false;
 	}
 
 	if (i == natts)				/* no errors in *attnum */
 	{
-		mtuple = heap_formtuple(rel->rd_att, v, n);
+		mtuple = heap_form_tuple(rel->rd_att, v, n);
 
 		/*
 		 * copy the identification info of the old tuple: t_ctid, t_self, and
diff --git a/src/backend/optimizer/prep/preptlist.c b/src/backend/optimizer/prep/preptlist.c
index 45aa0e9ca5bf1fc5dc82c8fa85eec8deb22b9140..2861125212f1f7c9ef2734515295571480c4c313 100644
--- a/src/backend/optimizer/prep/preptlist.c
+++ b/src/backend/optimizer/prep/preptlist.c
@@ -16,7 +16,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/optimizer/prep/preptlist.c,v 1.92 2008/10/21 20:42:53 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/optimizer/prep/preptlist.c,v 1.93 2008/11/02 01:45:28 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -68,7 +68,7 @@ preprocess_targetlist(PlannerInfo *root, List *tlist)
 	}
 
 	/*
-	 * for heap_formtuple to work, the targetlist must match the exact order
+	 * for heap_form_tuple to work, the targetlist must match the exact order
 	 * of the attributes. We also need to fill in any missing attributes. -ay
 	 * 10/94
 	 */
diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c
index 75653240c96d68766ee7a5497112d8acd27bf1f3..6f40944ef2650b1310e52fb68dce474a3cdffa89 100644
--- a/src/backend/rewrite/rewriteDefine.c
+++ b/src/backend/rewrite/rewriteDefine.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/rewrite/rewriteDefine.c,v 1.130 2008/10/04 21:56:54 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/rewrite/rewriteDefine.c,v 1.131 2008/11/02 01:45:28 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -60,8 +60,8 @@ InsertRule(char *rulname,
 	char	   *actiontree = nodeToString((Node *) action);
 	int			i;
 	Datum		values[Natts_pg_rewrite];
-	char		nulls[Natts_pg_rewrite];
-	char		replaces[Natts_pg_rewrite];
+	bool		nulls[Natts_pg_rewrite];
+	bool		replaces[Natts_pg_rewrite];
 	NameData	rname;
 	Relation	pg_rewrite_desc;
 	HeapTuple	tup,
@@ -74,7 +74,7 @@ InsertRule(char *rulname,
 	/*
 	 * Set up *nulls and *values arrays
 	 */
-	MemSet(nulls, ' ', sizeof(nulls));
+	MemSet(nulls, false, sizeof(nulls));
 
 	i = 0;
 	namestrcpy(&rname, rulname);
@@ -111,14 +111,14 @@ InsertRule(char *rulname,
 		/*
 		 * When replacing, we don't need to replace every attribute
 		 */
-		MemSet(replaces, ' ', sizeof(replaces));
-		replaces[Anum_pg_rewrite_ev_attr - 1] = 'r';
-		replaces[Anum_pg_rewrite_ev_type - 1] = 'r';
-		replaces[Anum_pg_rewrite_is_instead - 1] = 'r';
-		replaces[Anum_pg_rewrite_ev_qual - 1] = 'r';
-		replaces[Anum_pg_rewrite_ev_action - 1] = 'r';
-
-		tup = heap_modifytuple(oldtup, RelationGetDescr(pg_rewrite_desc),
+		MemSet(replaces, false, sizeof(replaces));
+		replaces[Anum_pg_rewrite_ev_attr - 1] = true;
+		replaces[Anum_pg_rewrite_ev_type - 1] = true;
+		replaces[Anum_pg_rewrite_is_instead - 1] = true;
+		replaces[Anum_pg_rewrite_ev_qual - 1] = true;
+		replaces[Anum_pg_rewrite_ev_action - 1] = true;
+
+		tup = heap_modify_tuple(oldtup, RelationGetDescr(pg_rewrite_desc),
 							   values, nulls, replaces);
 
 		simple_heap_update(pg_rewrite_desc, &tup->t_self, tup);
@@ -130,7 +130,7 @@ InsertRule(char *rulname,
 	}
 	else
 	{
-		tup = heap_formtuple(pg_rewrite_desc->rd_att, values, nulls);
+		tup = heap_form_tuple(pg_rewrite_desc->rd_att, values, nulls);
 
 		rewriteObjectId = simple_heap_insert(pg_rewrite_desc, tup);
 	}
diff --git a/src/backend/storage/large_object/inv_api.c b/src/backend/storage/large_object/inv_api.c
index 7bfafbc8dadcf6fa78e24335b8a190623dcaedd7..3936260e6cfb0a90e56cb0d013cec8d3fd6ac943 100644
--- a/src/backend/storage/large_object/inv_api.c
+++ b/src/backend/storage/large_object/inv_api.c
@@ -24,7 +24,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/storage/large_object/inv_api.c,v 1.134 2008/06/19 00:46:05 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/storage/large_object/inv_api.c,v 1.135 2008/11/02 01:45:28 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -522,8 +522,8 @@ inv_write(LargeObjectDesc *obj_desc, const char *buf, int nbytes)
 	char	   *workb = VARDATA(&workbuf.hdr);
 	HeapTuple	newtup;
 	Datum		values[Natts_pg_largeobject];
-	char		nulls[Natts_pg_largeobject];
-	char		replace[Natts_pg_largeobject];
+	bool		nulls[Natts_pg_largeobject];
+	bool		replace[Natts_pg_largeobject];
 	CatalogIndexState indstate;
 
 	Assert(PointerIsValid(obj_desc));
@@ -627,11 +627,11 @@ inv_write(LargeObjectDesc *obj_desc, const char *buf, int nbytes)
 			 * Form and insert updated tuple
 			 */
 			memset(values, 0, sizeof(values));
-			memset(nulls, ' ', sizeof(nulls));
-			memset(replace, ' ', sizeof(replace));
+			memset(nulls, false, sizeof(nulls));
+			memset(replace, false, sizeof(replace));
 			values[Anum_pg_largeobject_data - 1] = PointerGetDatum(&workbuf);
-			replace[Anum_pg_largeobject_data - 1] = 'r';
-			newtup = heap_modifytuple(oldtuple, RelationGetDescr(lo_heap_r),
+			replace[Anum_pg_largeobject_data - 1] = true;
+			newtup = heap_modify_tuple(oldtuple, RelationGetDescr(lo_heap_r),
 									  values, nulls, replace);
 			simple_heap_update(lo_heap_r, &newtup->t_self, newtup);
 			CatalogIndexInsert(indstate, newtup);
@@ -671,11 +671,11 @@ inv_write(LargeObjectDesc *obj_desc, const char *buf, int nbytes)
 			 * Form and insert updated tuple
 			 */
 			memset(values, 0, sizeof(values));
-			memset(nulls, ' ', sizeof(nulls));
+			memset(nulls, false, sizeof(nulls));
 			values[Anum_pg_largeobject_loid - 1] = ObjectIdGetDatum(obj_desc->id);
 			values[Anum_pg_largeobject_pageno - 1] = Int32GetDatum(pageno);
 			values[Anum_pg_largeobject_data - 1] = PointerGetDatum(&workbuf);
-			newtup = heap_formtuple(lo_heap_r->rd_att, values, nulls);
+			newtup = heap_form_tuple(lo_heap_r->rd_att, values, nulls);
 			simple_heap_insert(lo_heap_r, newtup);
 			CatalogIndexInsert(indstate, newtup);
 			heap_freetuple(newtup);
@@ -714,8 +714,8 @@ inv_truncate(LargeObjectDesc *obj_desc, int len)
 	char	   *workb = VARDATA(&workbuf.hdr);
 	HeapTuple	newtup;
 	Datum		values[Natts_pg_largeobject];
-	char		nulls[Natts_pg_largeobject];
-	char		replace[Natts_pg_largeobject];
+	bool		nulls[Natts_pg_largeobject];
+	bool		replace[Natts_pg_largeobject];
 	CatalogIndexState indstate;
 
 	Assert(PointerIsValid(obj_desc));
@@ -796,11 +796,11 @@ inv_truncate(LargeObjectDesc *obj_desc, int len)
 		 * Form and insert updated tuple
 		 */
 		memset(values, 0, sizeof(values));
-		memset(nulls, ' ', sizeof(nulls));
-		memset(replace, ' ', sizeof(replace));
+		memset(nulls, false, sizeof(nulls));
+		memset(replace, false, sizeof(replace));
 		values[Anum_pg_largeobject_data - 1] = PointerGetDatum(&workbuf);
-		replace[Anum_pg_largeobject_data - 1] = 'r';
-		newtup = heap_modifytuple(oldtuple, RelationGetDescr(lo_heap_r),
+		replace[Anum_pg_largeobject_data - 1] = true;
+		newtup = heap_modify_tuple(oldtuple, RelationGetDescr(lo_heap_r),
 								  values, nulls, replace);
 		simple_heap_update(lo_heap_r, &newtup->t_self, newtup);
 		CatalogIndexInsert(indstate, newtup);
@@ -831,11 +831,11 @@ inv_truncate(LargeObjectDesc *obj_desc, int len)
 		 * Form and insert new tuple
 		 */
 		memset(values, 0, sizeof(values));
-		memset(nulls, ' ', sizeof(nulls));
+		memset(nulls, false, sizeof(nulls));
 		values[Anum_pg_largeobject_loid - 1] = ObjectIdGetDatum(obj_desc->id);
 		values[Anum_pg_largeobject_pageno - 1] = Int32GetDatum(pageno);
 		values[Anum_pg_largeobject_data - 1] = PointerGetDatum(&workbuf);
-		newtup = heap_formtuple(lo_heap_r->rd_att, values, nulls);
+		newtup = heap_form_tuple(lo_heap_r->rd_att, values, nulls);
 		simple_heap_insert(lo_heap_r, newtup);
 		CatalogIndexInsert(indstate, newtup);
 		heap_freetuple(newtup);
diff --git a/src/backend/utils/adt/lockfuncs.c b/src/backend/utils/adt/lockfuncs.c
index 7724a75b55f1520b8daac30166d83b64e967c02f..98657c2f978484988839fa1a472b3e4b4d552aea 100644
--- a/src/backend/utils/adt/lockfuncs.c
+++ b/src/backend/utils/adt/lockfuncs.c
@@ -6,7 +6,7 @@
  * Copyright (c) 2002-2008, PostgreSQL Global Development Group
  *
  * IDENTIFICATION
- *		$PostgreSQL: pgsql/src/backend/utils/adt/lockfuncs.c,v 1.34 2008/05/12 00:00:51 alvherre Exp $
+ *		$PostgreSQL: pgsql/src/backend/utils/adt/lockfuncs.c,v 1.35 2008/11/02 01:45:28 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -144,7 +144,7 @@ pg_lock_status(PG_FUNCTION_ARGS)
 		const char *locktypename;
 		char		tnbuf[32];
 		Datum		values[14];
-		char		nulls[14];
+		bool		nulls[14];
 		HeapTuple	tuple;
 		Datum		result;
 
@@ -203,7 +203,7 @@ pg_lock_status(PG_FUNCTION_ARGS)
 		 * Form tuple with appropriate data.
 		 */
 		MemSet(values, 0, sizeof(values));
-		MemSet(nulls, ' ', sizeof(nulls));
+		MemSet(nulls, false, sizeof(nulls));
 
 		if (lock->tag.locktag_type <= LOCKTAG_LAST_TYPE)
 			locktypename = LockTagTypeNames[lock->tag.locktag_type];
@@ -221,58 +221,58 @@ pg_lock_status(PG_FUNCTION_ARGS)
 			case LOCKTAG_RELATION_EXTEND:
 				values[1] = ObjectIdGetDatum(lock->tag.locktag_field1);
 				values[2] = ObjectIdGetDatum(lock->tag.locktag_field2);
-				nulls[3] = 'n';
-				nulls[4] = 'n';
-				nulls[5] = 'n';
-				nulls[6] = 'n';
-				nulls[7] = 'n';
-				nulls[8] = 'n';
-				nulls[9] = 'n';
+				nulls[3] = true;
+				nulls[4] = true;
+				nulls[5] = true;
+				nulls[6] = true;
+				nulls[7] = true;
+				nulls[8] = true;
+				nulls[9] = true;
 				break;
 			case LOCKTAG_PAGE:
 				values[1] = ObjectIdGetDatum(lock->tag.locktag_field1);
 				values[2] = ObjectIdGetDatum(lock->tag.locktag_field2);
 				values[3] = UInt32GetDatum(lock->tag.locktag_field3);
-				nulls[4] = 'n';
-				nulls[5] = 'n';
-				nulls[6] = 'n';
-				nulls[7] = 'n';
-				nulls[8] = 'n';
-				nulls[9] = 'n';
+				nulls[4] = true;
+				nulls[5] = true;
+				nulls[6] = true;
+				nulls[7] = true;
+				nulls[8] = true;
+				nulls[9] = true;
 				break;
 			case LOCKTAG_TUPLE:
 				values[1] = ObjectIdGetDatum(lock->tag.locktag_field1);
 				values[2] = ObjectIdGetDatum(lock->tag.locktag_field2);
 				values[3] = UInt32GetDatum(lock->tag.locktag_field3);
 				values[4] = UInt16GetDatum(lock->tag.locktag_field4);
-				nulls[5] = 'n';
-				nulls[6] = 'n';
-				nulls[7] = 'n';
-				nulls[8] = 'n';
-				nulls[9] = 'n';
+				nulls[5] = true;
+				nulls[6] = true;
+				nulls[7] = true;
+				nulls[8] = true;
+				nulls[9] = true;
 				break;
 			case LOCKTAG_TRANSACTION:
 				values[6] = TransactionIdGetDatum(lock->tag.locktag_field1);
-				nulls[1] = 'n';
-				nulls[2] = 'n';
-				nulls[3] = 'n';
-				nulls[4] = 'n';
-				nulls[5] = 'n';
-				nulls[7] = 'n';
-				nulls[8] = 'n';
-				nulls[9] = 'n';
+				nulls[1] = true;
+				nulls[2] = true;
+				nulls[3] = true;
+				nulls[4] = true;
+				nulls[5] = true;
+				nulls[7] = true;
+				nulls[8] = true;
+				nulls[9] = true;
 				break;
 			case LOCKTAG_VIRTUALTRANSACTION:
 				values[5] = VXIDGetDatum(lock->tag.locktag_field1,
 										 lock->tag.locktag_field2);
-				nulls[1] = 'n';
-				nulls[2] = 'n';
-				nulls[3] = 'n';
-				nulls[4] = 'n';
-				nulls[6] = 'n';
-				nulls[7] = 'n';
-				nulls[8] = 'n';
-				nulls[9] = 'n';
+				nulls[1] = true;
+				nulls[2] = true;
+				nulls[3] = true;
+				nulls[4] = true;
+				nulls[6] = true;
+				nulls[7] = true;
+				nulls[8] = true;
+				nulls[9] = true;
 				break;
 			case LOCKTAG_OBJECT:
 			case LOCKTAG_USERLOCK:
@@ -282,11 +282,11 @@ pg_lock_status(PG_FUNCTION_ARGS)
 				values[7] = ObjectIdGetDatum(lock->tag.locktag_field2);
 				values[8] = ObjectIdGetDatum(lock->tag.locktag_field3);
 				values[9] = Int16GetDatum(lock->tag.locktag_field4);
-				nulls[2] = 'n';
-				nulls[3] = 'n';
-				nulls[4] = 'n';
-				nulls[5] = 'n';
-				nulls[6] = 'n';
+				nulls[2] = true;
+				nulls[3] = true;
+				nulls[4] = true;
+				nulls[5] = true;
+				nulls[6] = true;
 				break;
 		}
 
@@ -294,11 +294,11 @@ pg_lock_status(PG_FUNCTION_ARGS)
 		if (proc->pid != 0)
 			values[11] = Int32GetDatum(proc->pid);
 		else
-			nulls[11] = 'n';
+			nulls[11] = true;
 		values[12] = CStringGetTextDatum(GetLockmodeName(LOCK_LOCKMETHOD(*lock), mode));
 		values[13] = BoolGetDatum(granted);
 
-		tuple = heap_formtuple(funcctx->tuple_desc, values, nulls);
+		tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
 		result = HeapTupleGetDatum(tuple);
 		SRF_RETURN_NEXT(funcctx, result);
 	}
diff --git a/src/backend/utils/adt/rowtypes.c b/src/backend/utils/adt/rowtypes.c
index f08244216e87b566ed0aa2e0924c0cd138bba32c..109715e5a50ca88af207f04553f69e3148026dee 100644
--- a/src/backend/utils/adt/rowtypes.c
+++ b/src/backend/utils/adt/rowtypes.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/adt/rowtypes.c,v 1.22 2008/10/13 16:25:19 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/adt/rowtypes.c,v 1.23 2008/11/02 01:45:28 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -83,7 +83,7 @@ record_in(PG_FUNCTION_ARGS)
 	int			i;
 	char	   *ptr;
 	Datum	   *values;
-	char	   *nulls;
+	bool	   *nulls;
 	StringInfoData buf;
 
 	/*
@@ -129,7 +129,7 @@ record_in(PG_FUNCTION_ARGS)
 	}
 
 	values = (Datum *) palloc(ncolumns * sizeof(Datum));
-	nulls = (char *) palloc(ncolumns * sizeof(char));
+	nulls = (bool *) palloc(ncolumns * sizeof(bool));
 
 	/*
 	 * Scan the string.  We use "buf" to accumulate the de-quoted data for
@@ -157,7 +157,7 @@ record_in(PG_FUNCTION_ARGS)
 		if (tupdesc->attrs[i]->attisdropped)
 		{
 			values[i] = (Datum) 0;
-			nulls[i] = 'n';
+			nulls[i] = true;
 			continue;
 		}
 
@@ -178,7 +178,7 @@ record_in(PG_FUNCTION_ARGS)
 		if (*ptr == ',' || *ptr == ')')
 		{
 			column_data = NULL;
-			nulls[i] = 'n';
+			nulls[i] = true;
 		}
 		else
 		{
@@ -223,7 +223,7 @@ record_in(PG_FUNCTION_ARGS)
 			}
 
 			column_data = buf.data;
-			nulls[i] = ' ';
+			nulls[i] = false;
 		}
 
 		/*
@@ -264,10 +264,10 @@ record_in(PG_FUNCTION_ARGS)
 				 errmsg("malformed record literal: \"%s\"", string),
 				 errdetail("Junk after right parenthesis.")));
 
-	tuple = heap_formtuple(tupdesc, values, nulls);
+	tuple = heap_form_tuple(tupdesc, values, nulls);
 
 	/*
-	 * We cannot return tuple->t_data because heap_formtuple allocates it as
+	 * We cannot return tuple->t_data because heap_form_tuple allocates it as
 	 * part of a larger chunk, and our caller may expect to be able to pfree
 	 * our result.	So must copy the info into a new palloc chunk.
 	 */
@@ -299,7 +299,7 @@ record_out(PG_FUNCTION_ARGS)
 	int			ncolumns;
 	int			i;
 	Datum	   *values;
-	char	   *nulls;
+	bool	   *nulls;
 	StringInfoData buf;
 
 	/* Extract type info from the tuple itself */
@@ -343,10 +343,10 @@ record_out(PG_FUNCTION_ARGS)
 	}
 
 	values = (Datum *) palloc(ncolumns * sizeof(Datum));
-	nulls = (char *) palloc(ncolumns * sizeof(char));
+	nulls = (bool *) palloc(ncolumns * sizeof(bool));
 
 	/* Break down the tuple into fields */
-	heap_deformtuple(&tuple, tupdesc, values, nulls);
+	heap_deform_tuple(&tuple, tupdesc, values, nulls);
 
 	/* And build the result string */
 	initStringInfo(&buf);
@@ -369,7 +369,7 @@ record_out(PG_FUNCTION_ARGS)
 			appendStringInfoChar(&buf, ',');
 		needComma = true;
 
-		if (nulls[i] == 'n')
+		if (nulls[i])
 		{
 			/* emit nothing... */
 			continue;
@@ -453,7 +453,7 @@ record_recv(PG_FUNCTION_ARGS)
 	int			validcols;
 	int			i;
 	Datum	   *values;
-	char	   *nulls;
+	bool	   *nulls;
 
 	/*
 	 * Use the passed type unless it's RECORD; we can't support input of
@@ -498,7 +498,7 @@ record_recv(PG_FUNCTION_ARGS)
 	}
 
 	values = (Datum *) palloc(ncolumns * sizeof(Datum));
-	nulls = (char *) palloc(ncolumns * sizeof(char));
+	nulls = (bool *) palloc(ncolumns * sizeof(bool));
 
 	/* Fetch number of columns user thinks it has */
 	usercols = pq_getmsgint(buf, 4);
@@ -531,7 +531,7 @@ record_recv(PG_FUNCTION_ARGS)
 		if (tupdesc->attrs[i]->attisdropped)
 		{
 			values[i] = (Datum) 0;
-			nulls[i] = 'n';
+			nulls[i] = true;
 			continue;
 		}
 
@@ -554,7 +554,7 @@ record_recv(PG_FUNCTION_ARGS)
 		{
 			/* -1 length means NULL */
 			bufptr = NULL;
-			nulls[i] = 'n';
+			nulls[i] = true;
 			csave = 0;			/* keep compiler quiet */
 		}
 		else
@@ -576,7 +576,7 @@ record_recv(PG_FUNCTION_ARGS)
 			buf->data[buf->cursor] = '\0';
 
 			bufptr = &item_buf;
-			nulls[i] = ' ';
+			nulls[i] = false;
 		}
 
 		/* Now call the column's receiveproc */
@@ -608,10 +608,10 @@ record_recv(PG_FUNCTION_ARGS)
 		}
 	}
 
-	tuple = heap_formtuple(tupdesc, values, nulls);
+	tuple = heap_form_tuple(tupdesc, values, nulls);
 
 	/*
-	 * We cannot return tuple->t_data because heap_formtuple allocates it as
+	 * We cannot return tuple->t_data because heap_form_tuple allocates it as
 	 * part of a larger chunk, and our caller may expect to be able to pfree
 	 * our result.	So must copy the info into a new palloc chunk.
 	 */
@@ -642,7 +642,7 @@ record_send(PG_FUNCTION_ARGS)
 	int			validcols;
 	int			i;
 	Datum	   *values;
-	char	   *nulls;
+	bool	   *nulls;
 	StringInfoData buf;
 
 	/* Extract type info from the tuple itself */
@@ -686,10 +686,10 @@ record_send(PG_FUNCTION_ARGS)
 	}
 
 	values = (Datum *) palloc(ncolumns * sizeof(Datum));
-	nulls = (char *) palloc(ncolumns * sizeof(char));
+	nulls = (bool *) palloc(ncolumns * sizeof(bool));
 
 	/* Break down the tuple into fields */
-	heap_deformtuple(&tuple, tupdesc, values, nulls);
+	heap_deform_tuple(&tuple, tupdesc, values, nulls);
 
 	/* And build the result string */
 	pq_begintypsend(&buf);
@@ -715,7 +715,7 @@ record_send(PG_FUNCTION_ARGS)
 
 		pq_sendint(&buf, column_type, sizeof(Oid));
 
-		if (nulls[i] == 'n')
+		if (nulls[i])
 		{
 			/* emit -1 data length to signify a NULL */
 			pq_sendint(&buf, -1, 4);
diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c
index 83a12776fd419d5bc500b92d5fc3872629cc2a4d..d5f237bc58235a144ddd2efb92761237d5267c85 100644
--- a/src/backend/utils/cache/catcache.c
+++ b/src/backend/utils/cache/catcache.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/cache/catcache.c,v 1.144 2008/06/19 00:46:05 alvherre Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/cache/catcache.c,v 1.145 2008/11/02 01:45:28 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1673,16 +1673,16 @@ build_dummy_tuple(CatCache *cache, int nkeys, ScanKey skeys)
 	HeapTuple	ntp;
 	TupleDesc	tupDesc = cache->cc_tupdesc;
 	Datum	   *values;
-	char	   *nulls;
+	bool	   *nulls;
 	Oid			tupOid = InvalidOid;
 	NameData	tempNames[4];
 	int			i;
 
 	values = (Datum *) palloc(tupDesc->natts * sizeof(Datum));
-	nulls = (char *) palloc(tupDesc->natts * sizeof(char));
+	nulls = (bool *) palloc(tupDesc->natts * sizeof(bool));
 
 	memset(values, 0, tupDesc->natts * sizeof(Datum));
-	memset(nulls, 'n', tupDesc->natts * sizeof(char));
+	memset(nulls, true, tupDesc->natts * sizeof(bool));
 
 	for (i = 0; i < nkeys; i++)
 	{
@@ -1695,7 +1695,7 @@ build_dummy_tuple(CatCache *cache, int nkeys, ScanKey skeys)
 			 * Here we must be careful in case the caller passed a C string
 			 * where a NAME is wanted: convert the given argument to a
 			 * correctly padded NAME.  Otherwise the memcpy() done in
-			 * heap_formtuple could fall off the end of memory.
+			 * heap_form_tuple could fall off the end of memory.
 			 */
 			if (cache->cc_isname[i])
 			{
@@ -1705,7 +1705,7 @@ build_dummy_tuple(CatCache *cache, int nkeys, ScanKey skeys)
 				keyval = NameGetDatum(newval);
 			}
 			values[attindex - 1] = keyval;
-			nulls[attindex - 1] = ' ';
+			nulls[attindex - 1] = false;
 		}
 		else
 		{
@@ -1714,7 +1714,7 @@ build_dummy_tuple(CatCache *cache, int nkeys, ScanKey skeys)
 		}
 	}
 
-	ntp = heap_formtuple(tupDesc, values, nulls);
+	ntp = heap_form_tuple(tupDesc, values, nulls);
 	if (tupOid != InvalidOid)
 		HeapTupleSetOid(ntp, tupOid);
 
diff --git a/src/include/access/htup.h b/src/include/access/htup.h
index 0803c1b2c77cbd587245809f989963b0ae0c8b49..6bcd9cdcbc2b98acbe52ae5ad2ff11dd5a6c11b0 100644
--- a/src/include/access/htup.h
+++ b/src/include/access/htup.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/access/htup.h,v 1.102 2008/10/28 15:51:03 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/access/htup.h,v 1.103 2008/11/02 01:45:28 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -823,20 +823,21 @@ extern HeapTuple heap_copytuple(HeapTuple tuple);
 extern void heap_copytuple_with_tuple(HeapTuple src, HeapTuple dest);
 extern HeapTuple heap_form_tuple(TupleDesc tupleDescriptor,
 				Datum *values, bool *isnull);
-extern HeapTuple heap_formtuple(TupleDesc tupleDescriptor,
-			   Datum *values, char *nulls);
 extern HeapTuple heap_modify_tuple(HeapTuple tuple,
 				  TupleDesc tupleDesc,
 				  Datum *replValues,
 				  bool *replIsnull,
 				  bool *doReplace);
+extern void heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc,
+				  Datum *values, bool *isnull);
+/* these three are deprecated versions of the three above: */
+extern HeapTuple heap_formtuple(TupleDesc tupleDescriptor,
+			   Datum *values, char *nulls);
 extern HeapTuple heap_modifytuple(HeapTuple tuple,
 				 TupleDesc tupleDesc,
 				 Datum *replValues,
 				 char *replNulls,
 				 char *replActions);
-extern void heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc,
-				  Datum *values, bool *isnull);
 extern void heap_deformtuple(HeapTuple tuple, TupleDesc tupleDesc,
 				 Datum *values, char *nulls);
 extern void heap_freetuple(HeapTuple htup);
diff --git a/src/include/funcapi.h b/src/include/funcapi.h
index c4eb44398be63277abb95736b3eb12a44da2fb01..f5b9e18abbea101cadc936e8e355dc10f2bb1fbb 100644
--- a/src/include/funcapi.h
+++ b/src/include/funcapi.h
@@ -9,7 +9,7 @@
  *
  * Copyright (c) 2002-2008, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/include/funcapi.h,v 1.26 2008/01/01 19:45:56 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/funcapi.h,v 1.27 2008/11/02 01:45:28 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -113,7 +113,7 @@ typedef struct FuncCallContext
 	 *
 	 * tuple_desc is for use when returning tuples (i.e. composite data types)
 	 * and is only needed if you are going to build the tuples with
-	 * heap_formtuple() rather than with BuildTupleFromCStrings().	Note that
+	 * heap_form_tuple() rather than with BuildTupleFromCStrings().	Note that
 	 * the TupleDesc pointer stored here should usually have been run through
 	 * BlessTupleDesc() first.
 	 */
@@ -187,7 +187,7 @@ extern TupleDesc build_function_result_tupdesc_t(HeapTuple procTuple);
  * External declarations:
  * TupleDesc BlessTupleDesc(TupleDesc tupdesc) - "Bless" a completed tuple
  *		descriptor so that it can be used to return properly labeled tuples.
- *		You need to call this if you are going to use heap_formtuple directly.
+ *		You need to call this if you are going to use heap_form_tuple directly.
  *		TupleDescGetAttInMetadata does it for you, however, so no need to call
  *		it if you call TupleDescGetAttInMetadata.
  * AttInMetadata *TupleDescGetAttInMetadata(TupleDesc tupdesc) - Build an
diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c
index 9716b812004e81fbabae9d62aa3c1819252586c6..69f5a06d06344ab7f827de1c989dd923ad97e977 100644
--- a/src/pl/plpgsql/src/pl_exec.c
+++ b/src/pl/plpgsql/src/pl_exec.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.222 2008/10/29 00:00:39 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.223 2008/11/02 01:45:28 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -3578,9 +3578,9 @@ exec_assign_value(PLpgSQL_execstate *estate,
 				int			fno;
 				HeapTuple	newtup;
 				int			natts;
-				int			i;
 				Datum	   *values;
-				char	   *nulls;
+				bool	   *nulls;
+				bool	   *replaces;
 				void	   *mustfree;
 				bool		attisnull;
 				Oid			atttype;
@@ -3602,10 +3602,11 @@ exec_assign_value(PLpgSQL_execstate *estate,
 
 				/*
 				 * Get the number of the records field to change and the
-				 * number of attributes in the tuple.
+				 * number of attributes in the tuple.  Note: disallow
+				 * system column names because the code below won't cope.
 				 */
 				fno = SPI_fnumber(rec->tupdesc, recfield->fieldname);
-				if (fno == SPI_ERROR_NOATTRIBUTE)
+				if (fno <= 0)
 					ereport(ERROR,
 							(errcode(ERRCODE_UNDEFINED_COLUMN),
 							 errmsg("record \"%s\" has no field \"%s\"",
@@ -3614,24 +3615,16 @@ exec_assign_value(PLpgSQL_execstate *estate,
 				natts = rec->tupdesc->natts;
 
 				/*
-				 * Set up values/datums arrays for heap_formtuple.	For all
+				 * Set up values/control arrays for heap_modify_tuple. For all
 				 * the attributes except the one we want to replace, use the
 				 * value that's in the old tuple.
 				 */
 				values = palloc(sizeof(Datum) * natts);
-				nulls = palloc(natts);
+				nulls = palloc(sizeof(bool) * natts);
+				replaces = palloc(sizeof(bool) * natts);
 
-				for (i = 0; i < natts; i++)
-				{
-					if (i == fno)
-						continue;
-					values[i] = SPI_getbinval(rec->tup, rec->tupdesc,
-											  i + 1, &attisnull);
-					if (attisnull)
-						nulls[i] = 'n';
-					else
-						nulls[i] = ' ';
-				}
+				memset(replaces, false, sizeof(bool) * natts);
+				replaces[fno] = true;
 
 				/*
 				 * Now insert the new value, being careful to cast it to the
@@ -3645,10 +3638,7 @@ exec_assign_value(PLpgSQL_execstate *estate,
 													 atttype,
 													 atttypmod,
 													 attisnull);
-				if (attisnull)
-					nulls[fno] = 'n';
-				else
-					nulls[fno] = ' ';
+				nulls[fno] = attisnull;
 
 				/*
 				 * Avoid leaking the result of exec_simple_cast_value, if it
@@ -3660,10 +3650,11 @@ exec_assign_value(PLpgSQL_execstate *estate,
 					mustfree = NULL;
 
 				/*
-				 * Now call heap_formtuple() to create a new tuple that
+				 * Now call heap_modify_tuple() to create a new tuple that
 				 * replaces the old one in the record.
 				 */
-				newtup = heap_formtuple(rec->tupdesc, values, nulls);
+				newtup = heap_modify_tuple(rec->tup, rec->tupdesc,
+										   values, nulls, replaces);
 
 				if (rec->freetup)
 					heap_freetuple(rec->tup);
@@ -3673,6 +3664,7 @@ exec_assign_value(PLpgSQL_execstate *estate,
 
 				pfree(values);
 				pfree(nulls);
+				pfree(replaces);
 				if (mustfree)
 					pfree(mustfree);
 
@@ -4519,12 +4511,12 @@ exec_move_row(PLpgSQL_execstate *estate,
 		else if (tupdesc)
 		{
 			/* If we have a tupdesc but no data, form an all-nulls tuple */
-			char	   *nulls;
+			bool	   *nulls;
 
-			nulls = (char *) palloc(tupdesc->natts * sizeof(char));
-			memset(nulls, 'n', tupdesc->natts * sizeof(char));
+			nulls = (bool *) palloc(tupdesc->natts * sizeof(bool));
+			memset(nulls, true, tupdesc->natts * sizeof(bool));
 
-			tup = heap_formtuple(tupdesc, NULL, nulls);
+			tup = heap_form_tuple(tupdesc, NULL, nulls);
 
 			pfree(nulls);
 		}
diff --git a/src/pl/plpython/plpython.c b/src/pl/plpython/plpython.c
index 9fb612fd63270666bc8ca92cf56e51af3bd8b379..b732ac5427c60c9f380af338aff54bfebc600a7f 100644
--- a/src/pl/plpython/plpython.c
+++ b/src/pl/plpython/plpython.c
@@ -1,7 +1,7 @@
 /**********************************************************************
  * plpython.c - python as a procedural language for PostgreSQL
  *
- *	$PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.114 2008/10/11 00:09:33 alvherre Exp $
+ *	$PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.115 2008/11/02 01:45:28 tgl Exp $
  *
  *********************************************************************
  */
@@ -1766,7 +1766,7 @@ PLyMapping_ToTuple(PLyTypeInfo * info, PyObject * mapping)
 	TupleDesc	desc;
 	HeapTuple	tuple;
 	Datum	   *values;
-	char	   *nulls;
+	bool	   *nulls;
 	volatile int i;
 
 	Assert(PyMapping_Check(mapping));
@@ -1778,7 +1778,7 @@ PLyMapping_ToTuple(PLyTypeInfo * info, PyObject * mapping)
 
 	/* Build tuple */
 	values = palloc(sizeof(Datum) * desc->natts);
-	nulls = palloc(sizeof(char) * desc->natts);
+	nulls = palloc(sizeof(bool) * desc->natts);
 	for (i = 0; i < desc->natts; ++i)
 	{
 		char	   *key;
@@ -1793,7 +1793,7 @@ PLyMapping_ToTuple(PLyTypeInfo * info, PyObject * mapping)
 			if (value == Py_None)
 			{
 				values[i] = (Datum) NULL;
-				nulls[i] = 'n';
+				nulls[i] = true;
 			}
 			else if (value)
 			{
@@ -1810,7 +1810,7 @@ PLyMapping_ToTuple(PLyTypeInfo * info, PyObject * mapping)
 											  ,-1);
 				Py_DECREF(so);
 				so = NULL;
-				nulls[i] = ' ';
+				nulls[i] = false;
 			}
 			else
 				ereport(ERROR,
@@ -1831,7 +1831,7 @@ PLyMapping_ToTuple(PLyTypeInfo * info, PyObject * mapping)
 		PG_END_TRY();
 	}
 
-	tuple = heap_formtuple(desc, values, nulls);
+	tuple = heap_form_tuple(desc, values, nulls);
 	ReleaseTupleDesc(desc);
 	pfree(values);
 	pfree(nulls);
@@ -1846,7 +1846,7 @@ PLySequence_ToTuple(PLyTypeInfo * info, PyObject * sequence)
 	TupleDesc	desc;
 	HeapTuple	tuple;
 	Datum	   *values;
-	char	   *nulls;
+	bool	   *nulls;
 	volatile int i;
 
 	Assert(PySequence_Check(sequence));
@@ -1868,7 +1868,7 @@ PLySequence_ToTuple(PLyTypeInfo * info, PyObject * sequence)
 
 	/* Build tuple */
 	values = palloc(sizeof(Datum) * desc->natts);
-	nulls = palloc(sizeof(char) * desc->natts);
+	nulls = palloc(sizeof(bool) * desc->natts);
 	for (i = 0; i < desc->natts; ++i)
 	{
 		PyObject   *volatile value,
@@ -1882,7 +1882,7 @@ PLySequence_ToTuple(PLyTypeInfo * info, PyObject * sequence)
 			if (value == Py_None)
 			{
 				values[i] = (Datum) NULL;
-				nulls[i] = 'n';
+				nulls[i] = true;
 			}
 			else if (value)
 			{
@@ -1898,7 +1898,7 @@ PLySequence_ToTuple(PLyTypeInfo * info, PyObject * sequence)
 											  ,-1);
 				Py_DECREF(so);
 				so = NULL;
-				nulls[i] = ' ';
+				nulls[i] = false;
 			}
 
 			Py_XDECREF(value);
@@ -1913,7 +1913,7 @@ PLySequence_ToTuple(PLyTypeInfo * info, PyObject * sequence)
 		PG_END_TRY();
 	}
 
-	tuple = heap_formtuple(desc, values, nulls);
+	tuple = heap_form_tuple(desc, values, nulls);
 	ReleaseTupleDesc(desc);
 	pfree(values);
 	pfree(nulls);
@@ -1928,7 +1928,7 @@ PLyObject_ToTuple(PLyTypeInfo * info, PyObject * object)
 	TupleDesc	desc;
 	HeapTuple	tuple;
 	Datum	   *values;
-	char	   *nulls;
+	bool	   *nulls;
 	volatile int i;
 
 	desc = lookup_rowtype_tupdesc(info->out.d.typoid, -1);
@@ -1938,7 +1938,7 @@ PLyObject_ToTuple(PLyTypeInfo * info, PyObject * object)
 
 	/* Build tuple */
 	values = palloc(sizeof(Datum) * desc->natts);
-	nulls = palloc(sizeof(char) * desc->natts);
+	nulls = palloc(sizeof(bool) * desc->natts);
 	for (i = 0; i < desc->natts; ++i)
 	{
 		char	   *key;
@@ -1953,7 +1953,7 @@ PLyObject_ToTuple(PLyTypeInfo * info, PyObject * object)
 			if (value == Py_None)
 			{
 				values[i] = (Datum) NULL;
-				nulls[i] = 'n';
+				nulls[i] = true;
 			}
 			else if (value)
 			{
@@ -1969,7 +1969,7 @@ PLyObject_ToTuple(PLyTypeInfo * info, PyObject * object)
 											  ,-1);
 				Py_DECREF(so);
 				so = NULL;
-				nulls[i] = ' ';
+				nulls[i] = false;
 			}
 			else
 				ereport(ERROR,
@@ -1991,7 +1991,7 @@ PLyObject_ToTuple(PLyTypeInfo * info, PyObject * object)
 		PG_END_TRY();
 	}
 
-	tuple = heap_formtuple(desc, values, nulls);
+	tuple = heap_form_tuple(desc, values, nulls);
 	ReleaseTupleDesc(desc);
 	pfree(values);
 	pfree(nulls);