diff --git a/src/backend/commands/async.c b/src/backend/commands/async.c
index ae5d3d2e9feb15ca51c4103fd14548b544d46ca5..1b1d59f77e43b7ae431d3903280d2352bb0609c0 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
- *	  $Header: /cvsroot/pgsql/src/backend/commands/async.c,v 1.65 2000/06/08 22:37:01 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/commands/async.c,v 1.66 2000/07/08 03:04:12 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -87,6 +87,7 @@
 #include "libpq/libpq.h"
 #include "libpq/pqformat.h"
 #include "miscadmin.h"
+#include "tcop/dest.h"
 #include "utils/fmgroids.h"
 #include "utils/ps_status.h"
 #include "utils/syscache.h"
diff --git a/src/backend/libpq/Makefile b/src/backend/libpq/Makefile
index a527915e5a10c26605795aec57d5a0e768237cbe..8712a61bb9191b957b7bce1210818f4c3b242339 100644
--- a/src/backend/libpq/Makefile
+++ b/src/backend/libpq/Makefile
@@ -4,15 +4,17 @@
 #    Makefile for libpq subsystem (backend half of libpq interface)
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/backend/libpq/Makefile,v 1.20 2000/06/17 00:09:40 petere Exp $
+#    $Header: /cvsroot/pgsql/src/backend/libpq/Makefile,v 1.21 2000/07/08 03:04:39 tgl Exp $
 #
 #-------------------------------------------------------------------------
 
 SRCDIR = ../..
 include ../../Makefile.global
 
-OBJS = be-dumpdata.o be-fsstubs.o be-pqexec.o portal.o portalbuf.o \
-	auth.o hba.o crypt.o password.o \
+# be-fsstubs is here for historical reasons, probably belongs elsewhere
+
+OBJS = be-fsstubs.o \
+	auth.o crypt.o hba.o password.o \
 	pqcomm.o pqformat.o pqpacket.o pqsignal.o util.o
 
 
diff --git a/src/backend/libpq/be-dumpdata.c b/src/backend/libpq/be-dumpdata.c
deleted file mode 100644
index 8bcb77f98e04cb945b747fa9580095c940daa182..0000000000000000000000000000000000000000
--- a/src/backend/libpq/be-dumpdata.c
+++ /dev/null
@@ -1,331 +0,0 @@
-/*-------------------------------------------------------------------------
- *
- * be-dumpdata.c
- *	  support for collection of returned tuples from an internal
- *	  PQ call into a backend buffer.
- *
- * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
- * Portions Copyright (c) 1994, Regents of the University of California
- *
- *	$Id: be-dumpdata.c,v 1.34 2000/05/30 04:24:46 tgl Exp $
- *
- *-------------------------------------------------------------------------
- */
-/*
- * INTERFACE ROUTINES
- *		be_portalinit	 - initialize backend portal administration
- *		be_portalpush	 - add a portal to the top of the portal stack
- *		be_portalpop	 - remove portal on the top of the stack & return it
- *		be_currentportal - return the top portal on the portal stack
- *		be_newportal	 - return a new portal.
- *		be_portalinit	 - initialize backend portal expected to hold results.
- *		be_printtup		 - add a tuple to a backend portal
- *
- * NOTES
- *		Since backend user-defined operators can call queries
- *		which in turn call user-defined operators can call queries...
- *		we have to keep track of portals on a stack.  BeginCommand()
- *		puts portals on the stack and the PQ functions remove them.
- *
- */
-
-#include "postgres.h"
-
-#include "access/heapam.h"
-#include "access/printtup.h"
-#include "catalog/catalog.h"
-#include "lib/dllist.h"
-#include "libpq/libpq.h"
-
-/* ----------------
- *		backend portal stack for recursive PQexec calls
- * ----------------
- */
-static Dllist *be_portalstack;
-
-/* ----------------
- *		be_portalinit - initialize backend portal administration
- *
- *		This is called once from InitPostgres() to initialize
- *		the portal stack.
- * ----------------
- */
-void
-be_portalinit(void)
-{
-	be_portalstack = DLNewList();
-}
-
-/* ----------------
- *		be_portalpush - add a portal to the top of the portal stack
- *
- *		used by BeginCommand()
- * ----------------
- */
-void
-be_portalpush(PortalEntry *entry)
-{
-	DLAddTail(be_portalstack, DLNewElem(entry));
-}
-
-/* ----------------
- *		be_portalpop - remove the portal on the top of the stack & return it
- *
- *		used by PQexec()
- * ----------------
- */
-PortalEntry *
-be_portalpop(void)
-{
-	PortalEntry *p;
-	Dlelem	   *elt;
-
-	elt = DLRemTail(be_portalstack);
-
-	p = (elt ? (PortalEntry *) DLE_VAL(elt) : NULL);
-	DLFreeElem(elt);
-	return p;
-
-
-}
-
-/* ----------------
- *		be_currentportal - return the top portal on the portal stack
- *
- *		used by be_printtup()
- * ----------------
- */
-PortalEntry *
-be_currentportal(void)
-{
-	Dlelem	   *elt;
-
-	elt = DLGetTail(be_portalstack);
-	return elt ? (PortalEntry *) DLE_VAL(elt) : NULL;
-}
-
-/* ----------------
- *		be_newportal - return a new portal.
- *
- *		If the user-defined function does not specify a portal name,
- *		we generate a unique one.  Names are generated from a combination
- *		of a postgres oid and an integer counter which is incremented
- *		every time we ask for a local portal.
- *
- *		used by BeginCommand()
- * ----------------
- */
-
-static Oid	be_portaloid;
-static u_int be_portalcnt = 0;
-
-PortalEntry *
-be_newportal(void)
-{
-	PortalEntry *entry;
-	char		buf[PortalNameLength];
-
-	/* ----------------
-	 *	generate a new name
-	 * ----------------
-	 */
-	if (be_portalcnt == 0)
-		be_portaloid = newoid();
-	be_portalcnt++;
-	snprintf(buf, PortalNameLength, "be_%u_%d", be_portaloid, be_portalcnt);
-
-	/* ----------------
-	 *	initialize the new portal entry and keep track
-	 *	of the current memory context for be_printtup().
-	 *	This is important - otherwise whatever we allocate
-	 *	will go away and the contents of the portal after
-	 *	PQexec() returns will be meaningless.
-	 * ----------------
-	 */
-	entry = pbuf_setup(buf);
-	entry->portalcxt = (Pointer) CurrentMemoryContext;
-
-	return entry;
-}
-
-/* ----------------
- *		be_typeinit - initialize backend portal expected to hold
- *						query results.
- *
- *		used by BeginCommand()
- * ----------------
- */
-void
-be_typeinit(PortalEntry *entry,
-			TupleDesc tupDesc,
-			int natts)
-{
-	PortalBuffer *portal;
-	GroupBuffer *group;
-	int			i;
-	Form_pg_attribute *attrs = tupDesc->attrs;
-
-	/* ----------------
-	 *	add a new portal group to the portal
-	 * ----------------
-	 */
-	portal = entry->portal;
-	portal->no_groups++;
-	portal->groups = group = pbuf_addGroup(portal);
-	group->no_fields = natts;
-
-	/* ----------------
-	 *	initialize portal group type info
-	 * ----------------
-	 */
-	if (natts > 0)
-	{
-		group->types = pbuf_addTypes(natts);
-		for (i = 0; i < natts; ++i)
-		{
-			strncpy(group->types[i].name,
-					NameStr(attrs[i]->attname), NAMEDATALEN);
-			group->types[i].typid = attrs[i]->atttypid;
-			group->types[i].typlen = attrs[i]->attlen;
-		}
-	}
-}
-
-/* ----------------
- *		be_printtup - add a tuple to a backend portal
- *
- *		used indirectly by ExecRetrieve()
- *
- *		This code is pretty much copied from printtup(), dump_type()
- *		and dump_data().  -cim 2/12/91
- * ----------------
- */
-void
-be_printtup(HeapTuple tuple, TupleDesc typeinfo, DestReceiver *self)
-{
-	int			i;
-	Datum		attr;
-	bool		isnull;
-	Oid			typoutput,
-				typelem;
-
-	PortalEntry *entry = NULL;
-	PortalBuffer *portal = NULL;
-	GroupBuffer *group = NULL;
-	TupleBlock *tuples = NULL;
-	char	  **values;
-	int		   *lengths;
-
-	MemoryContext savecxt;
-
-	/* ----------------
-	 *	get the current portal and group
-	 * ----------------
-	 */
-	entry = be_currentportal();
-	portal = entry->portal;
-	group = portal->groups;
-
-	/* ----------------
-	 *	switch to the portal's memory context so that
-	 *	the tuples we allocate are returned to the user.
-	 * ----------------
-	 */
-	savecxt = MemoryContextSwitchTo((MemoryContext) entry->portalcxt);
-
-	/* ----------------
-	 *	If no tuple block yet, allocate one.
-	 *	If the current block is full, allocate another one.
-	 * ----------------
-	 */
-	if (group->tuples == NULL)
-	{
-		tuples = group->tuples = pbuf_addTuples();
-		tuples->tuple_index = 0;
-	}
-	else
-	{
-		tuples = group->tuples;
-		/* walk to the end of the linked list of TupleBlocks */
-		while (tuples->next)
-			tuples = tuples->next;
-
-		/*
-		 * now, tuples is the last TupleBlock, check to see if it is full.
-		 * If so, allocate a new TupleBlock and add it to the end of the
-		 * chain
-		 */
-
-		if (tuples->tuple_index == TupleBlockSize)
-		{
-			tuples->next = pbuf_addTuples();
-			tuples = tuples->next;
-			tuples->tuple_index = 0;
-		}
-	}
-
-	/* ----------------
-	 *	Allocate space for a tuple.
-	 * ----------------
-	 */
-	tuples->values[tuples->tuple_index] = pbuf_addTuple(tuple->t_data->t_natts);
-	tuples->lengths[tuples->tuple_index] = pbuf_addTupleValueLengths(tuple->t_data->t_natts);
-	/* ----------------
-	 *	copy printable representations of the tuple's attributes
-	 *	to the portal.
-	 *
-	 *	This seems silly, because the user's function which is calling
-	 *	PQexec() or PQfn() will probably just convert this back into the
-	 *	internal form anyways, but the point here is to provide a uniform
-	 *	libpq interface and this is how the fe libpq interface currently
-	 *	works.	Pretty soon we'll have to add code to let the fe or be
-	 *	select the desired data representation and then deal with that.
-	 *	This should not be too hard, as there already exist typrecieve()
-	 *	and typsend() procedures for user-defined types (see pg_type.h)
-	 *	-cim 2/11/91
-	 * ----------------
-	 */
-
-	values = tuples->values[tuples->tuple_index];
-	lengths = tuples->lengths[tuples->tuple_index];
-
-	for (i = 0; i < tuple->t_data->t_natts; i++)
-	{
-		attr = heap_getattr(tuple, i + 1, typeinfo, &isnull);
-		getTypeOutAndElem((Oid) typeinfo->attrs[i]->atttypid,
-						  &typoutput, &typelem);
-
-		lengths[i] = typeinfo->attrs[i]->attlen;
-
-		if (lengths[i] == -1)	/* variable length attribute */
-		{
-			if (!isnull)
-				lengths[i] = VARSIZE(attr) - VARHDRSZ;
-			else
-				lengths[i] = 0;
-		}
-
-		if (!isnull && OidIsValid(typoutput))
-			values[i] = DatumGetCString(OidFunctionCall3(typoutput,
-										attr,
-										ObjectIdGetDatum(typelem),
-										Int32GetDatum(typeinfo->attrs[i]->atttypmod)));
-		else
-			values[i] = NULL;
-
-	}
-
-	/* ----------------
-	 *	increment tuple group counters
-	 * ----------------
-	 */
-	portal->no_tuples++;
-	group->no_tuples++;
-	tuples->tuple_index++;
-
-	/* ----------------
-	 *	return to the original memory context
-	 * ----------------
-	 */
-	MemoryContextSwitchTo(savecxt);
-}
diff --git a/src/backend/libpq/be-pqexec.c b/src/backend/libpq/be-pqexec.c
deleted file mode 100644
index 474da587792ad32343b1d49fd5d889b979bc451f..0000000000000000000000000000000000000000
--- a/src/backend/libpq/be-pqexec.c
+++ /dev/null
@@ -1,423 +0,0 @@
-/*-------------------------------------------------------------------------
- *
- * be-pqexec.c
- *	  support for executing POSTGRES commands and functions from a
- *	  user-defined function in a backend.
- *
- * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
- * Portions Copyright (c) 1994, Regents of the University of California
- *
- *
- * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/libpq/Attic/be-pqexec.c,v 1.36 2000/07/07 21:12:53 tgl Exp $
- *
- *-------------------------------------------------------------------------
- */
-/*
- * INTERFACE ROUTINES
- *		PQfn			- call a POSTGRES function
- *		PQexec			- execute a POSTGRES query
- *
- * NOTES
- *		These routines are compiled into the postgres backend.
- */
-#include "postgres.h"
-
-#include "libpq/libpq.h"
-#include "tcop/fastpath.h"
-#include "tcop/tcopprot.h"
-#include "utils/builtins.h"
-
-static char *strmake(char *str, int len);
-
-/* ----------------------------------------------------------------
- *						PQ interface routines
- * ----------------------------------------------------------------
- */
-
-/* ----------------
- *		PQfn -	Send a function call to the POSTGRES backend.
- *
- *		fnid			: function id
- *		result_buf		: pointer to result buffer (&int if integer)
- *		result_len		: length of return value.
- *		result_is_int	: If the result is an integer, this must be non-zero
- *		args			: pointer to an array of PQArgBlock items.
- *						  (length, if integer, and result-pointer)
- *		nargs			: # of arguments in args array.
- *
- *		This code scavenged from HandleFunctionRequest() in tcop/fastpath.h
- * ----------------
- */
-char *
-PQfn(int fnid,
-	 int *result_buf,			/* can't use void, dec compiler barfs */
-	 int result_len,
-	 int result_is_int,
-	 PQArgBlock *args,
-	 int nargs)
-{
-	FmgrInfo				flinfo;
-	FunctionCallInfoData	fcinfo;
-	Datum					retval;
-	int						i;
-
-	if (nargs > FUNC_MAX_ARGS)
-		elog(ERROR, "functions cannot have more than %d arguments",
-			 FUNC_MAX_ARGS);
-
-	/* ----------------
-	 *	set up the argument block for the function manager
-	 * ----------------
-	 */
-	fmgr_info((Oid) fnid, &flinfo);
-
-	MemSet(&fcinfo, 0, sizeof(fcinfo));
-    fcinfo.flinfo = &flinfo;
-	fcinfo.nargs = nargs;
-
-	for (i = 0; i < nargs; i++)
-	{
-		if (args[i].len == VAR_LENGTH_ARG)
-			fcinfo.arg[i] = (Datum) args[i].u.ptr;
-		else if ((Size) args[i].len > sizeof(int4))
-			elog(ERROR, "arg_length of argument %d too long", i);
-		else
-			fcinfo.arg[i] = (Datum) args[i].u.integer;
-	}
-
-	/* ----------------
-	 *	call the postgres function manager
-	 * ----------------
-	 */
-	retval = FunctionCallInvoke(&fcinfo);
-
-	/* ----------------
-	 *	put the result in the buffer the user specified and
-	 *	return the proper code.
-	 * ----------------
-	 */
-	if (fcinfo.isnull)			/* void retval */
-		return "0";
-
-	if (result_is_int)
-		*result_buf = DatumGetInt32(retval);
-	else
-		memmove(result_buf, DatumGetPointer(retval), result_len);
-	return "G";
-}
-
-/* ----------------
- *		PQexec -  Send a query to the POSTGRES backend
- *
- *		The return value is a string.
- *		If 0 or more tuples fetched from the backend, return "P portal-name".
- *		If a query is does not return tuples, return "C query-command".
- *		If there is an error: return "E error-message".
- *
- *		Note: if we get a serious error or an elog(ERROR), then PQexec never
- *		returns because the system longjmp's back to the main loop.
- * ----------------
- */
-char *
-PQexec(char *query)
-{
-	PortalEntry *entry = NULL;
-	char	   *result = NULL;
-
-	/* ----------------
-	 *	create a new portal and put it on top of the portal stack.
-	 * ----------------
-	 */
-	entry = (PortalEntry *) be_newportal();
-	be_portalpush(entry);
-
-	/* ----------------
-	 *	pg_exec_query_dest will put the query results in a portal which will
-	 *	end up on the top of the portal stack.
-	 *
-	 * XXX memory context manipulation is WRONG here --- the query needs
-	 * to be executed in a context different from CurrentMemoryContext,
-	 * perhaps a freshly created sub-context.  If I were expecting that
-	 * this code needs to work again, then I'd fix it.  But actually I'm
-	 * planning to rip out this entire module sometime soon...  tgl 7/2000.
-	 * ----------------
-	 */
-	pg_exec_query_dest(query, Local, CurrentMemoryContext);
-
-	/* ----------------
-	 *	pop the portal off the portal stack and return the
-	 *	result.  Note if result is null, we return C.
-	 * ----------------
-	 */
-	entry = (PortalEntry *) be_portalpop();
-	result = entry->result;
-	if (result == NULL)
-	{
-		char	   *PQE = "Cnull PQexec result";
-
-		result = pstrdup(PQE);
-	}
-
-	if (result[0] != 'P')
-	{
-
-		/*
-		 * some successful command was executed, but it's not one where we
-		 * return the portal name so here we should be sure to clear out
-		 * the portal (since the caller has no handle on it)
-		 */
-		pbuf_close(entry->name);
-
-	}
-	return result;
-}
-
-/* ----------------------------------------------------------------
- *						pqtest support
- * ----------------------------------------------------------------
- */
-
-/* ----------------
- *		pqtest_PQexec takes a text query and returns the number of
- *		tuples it returns.	Note: there is no need to PQclear()
- *		here - the memory will go away at end transaction.
- * ----------------
- */
-int
-pqtest_PQexec(char *q)
-{
-	PortalBuffer *a;
-	char	   *res;
-	int			t;
-
-	/* ----------------
-	 *	execute the postgres query
-	 * ----------------
-	 */
-	res = PQexec(q);
-
-	/* ----------------
-	 *	return number of tuples in portal or 0 if command returns no tuples.
-	 * ----------------
-	 */
-	t = 0;
-	switch (res[0])
-	{
-		case 'P':
-			a = PQparray(&res[1]);
-			if (a == NULL)
-				elog(ERROR, "pqtest_PQexec: PQparray could not find portal %s",
-					 res);
-
-			t = PQntuples(a);
-			break;
-		case 'C':
-			break;
-		default:
-			elog(NOTICE, "pqtest_PQexec: PQexec(%s) returns %s", q, res);
-			break;
-	}
-
-	return t;
-}
-
-/* ----------------
- *		utilities for pqtest_PQfn()
- * ----------------
- */
-static char *
-strmake(char *str, int len)
-{
-	char	   *newstr;
-
-	if (str == NULL)
-		return NULL;
-	if (len <= 0)
-		len = strlen(str);
-
-	newstr = (char *) palloc(len + 1);
-	memcpy(newstr, str, len);
-	newstr[len] = (char) 0;
-	return newstr;
-}
-
-#define SKIP 0
-#define SCAN 1
-
-static char spacestr[] = " ";
-
-static int
-strparse(char *s, char **fields, int *offsets, int maxfields)
-{
-	int			len = strlen(s);
-	char	   *cp = s,
-			   *end = cp + len,
-			   *ep;
-	int			parsed = 0;
-	int			mode = SKIP,
-				i = 0;
-
-	if (*(end - 1) == '\n')
-		end--;
-
-	for (i = 0; i < maxfields; i++)
-		fields[i] = spacestr;
-
-	i = 0;
-	while (!parsed)
-	{
-		if (mode == SKIP)
-		{
-
-			while ((cp < end) &&
-				   (*cp == ' ' || *cp == '\t'))
-				cp++;
-			if (cp < end)
-				mode = SCAN;
-			else
-				parsed = 1;
-
-		}
-		else
-		{
-
-			ep = cp;
-			while ((ep < end) && (*ep != ' ' && *ep != '\t'))
-				ep++;
-
-			if (ep < end)
-				mode = SKIP;
-			else
-				parsed = 1;
-
-			fields[i] = strmake(cp, ep - cp);
-			if (offsets != NULL)
-				offsets[i] = cp - s;
-
-			i++;
-			cp = ep;
-			if (i > maxfields)
-				parsed = 1;
-
-		}
-	}
-	return i;
-}
-
-/* ----------------
- *		pqtest_PQfn converts its string into a PQArgBlock and
- *		calls the specified function, which is assumed to return
- *		an integer value.
- * ----------------
- */
-int
-pqtest_PQfn(char *q)
-{
-	int			k,
-				j,
-				i,
-				v,
-				f,
-				offsets;
-	char	   *fields[FUNC_MAX_ARGS];
-	PQArgBlock	pqargs[FUNC_MAX_ARGS];
-	int			res;
-	char	   *pqres;
-
-	/* ----------------
-	 *	parse q into fields
-	 * ----------------
-	 */
-	i = strparse(q, fields, &offsets, FUNC_MAX_ARGS);
-	printf("pqtest_PQfn: strparse returns %d fields\n", i);		/* debug */
-	if (i == 0)
-		return -1;
-
-	/* ----------------
-	 *	get the function id
-	 * ----------------
-	 */
-	f = atoi(fields[0]);
-	printf("pqtest_PQfn: func is %d\n", f);		/* debug */
-	if (f == 0)
-		return -1;
-
-	/* ----------------
-	 *	build a PQArgBlock
-	 * ----------------
-	 */
-	for (j = 1; j < i && j < FUNC_MAX_ARGS; j++)
-	{
-		k = j - 1;
-		v = atoi(fields[j]);
-		if (v != 0 || (v == 0 && fields[j][0] == '0'))
-		{
-			pqargs[k].len = sizeof(int4);
-			pqargs[k].u.integer = v;
-			printf("pqtest_PQfn: arg %d is int %d\n", k, v);	/* debug */
-		}
-		else
-		{
-			pqargs[k].len = VAR_LENGTH_ARG;
-			pqargs[k].u.ptr = (int *)
-				DatumGetTextP(DirectFunctionCall1(textin,
-												  CStringGetDatum(fields[j])));
-			printf("pqtest_PQfn: arg %d is text %s\n", k, fields[j]);	/* debug */
-		}
-	}
-
-	/* ----------------
-	 *	call PQfn
-	 * ----------------
-	 */
-	pqres = PQfn(f, &res, sizeof(int4), 1, pqargs, i - 1);
-	printf("pqtest_PQfn: pqres is %s\n", pqres);		/* debug */
-
-	/* ----------------
-	 *	free memory used
-	 * ----------------
-	 */
-	for (j = 0; j < i; j++)
-	{
-		pfree(fields[j]);
-		if (pqargs[j].len == VAR_LENGTH_ARG)
-			pfree(pqargs[j].u.ptr);
-	}
-
-	/* ----------------
-	 *	return result
-	 * ----------------
-	 */
-	printf("pqtest_PQfn: res is %d\n", res);	/* debugg */
-	return res;
-}
-
-/* ----------------
- *		pqtest looks at the first character of its test argument
- *		and decides which of pqtest_PQexec or pqtest_PQfn to call.
- * ----------------
- */
-int32
-pqtest(struct varlena * vlena)
-{
-	char	   *q;
-
-	/* ----------------
-	 *	get the query
-	 * ----------------
-	 */
-	q = DatumGetCString(DirectFunctionCall1(textout,
-											PointerGetDatum(vlena)));
-
-	switch (q[0])
-	{
-		case '%':
-			return pqtest_PQfn(&q[1]);
-			break;
-		default:
-			return pqtest_PQexec(q);
-			break;
-	}
-	return 0;
-}
diff --git a/src/backend/libpq/hba.c b/src/backend/libpq/hba.c
index 61c6b9f43614031f4e98470b11a276b732e11bbc..dca3cf4fc3c49ed66b50c2fc1de6a368d77ff8ed 100644
--- a/src/backend/libpq/hba.c
+++ b/src/backend/libpq/hba.c
@@ -5,7 +5,7 @@
  *	  wherein you authenticate a user by seeing what IP address the system
  *	  says he comes from and possibly using ident).
  *
- *	$Id: hba.c,v 1.52 2000/06/02 15:57:20 momjian Exp $
+ *	$Id: hba.c,v 1.53 2000/07/08 03:04:39 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -22,6 +22,7 @@
 
 #include "libpq/libpq.h"
 #include "miscadmin.h"
+#include "storage/fd.h"
 
 
 #define MAX_TOKEN 80
diff --git a/src/backend/libpq/password.c b/src/backend/libpq/password.c
index 6f47d5d4378021393985cbdeea6035c57194f4b6..d34ca4cdf42d07956ca58b0947c4ac7466f21e97 100644
--- a/src/backend/libpq/password.c
+++ b/src/backend/libpq/password.c
@@ -2,21 +2,24 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: password.c,v 1.30 2000/07/04 16:31:53 petere Exp $
+ * $Id: password.c,v 1.31 2000/07/08 03:04:40 tgl Exp $
  *
  */
 
 #include <unistd.h>
 
 #include "postgres.h"
+
 #ifdef HAVE_CRYPT_H
-#include "crypt.h"
+#include <crypt.h>
 #endif
 
 #include "libpq/libpq.h"
 #include "libpq/password.h"
 #include "libpq/crypt.h"
 #include "miscadmin.h"
+#include "storage/fd.h"
+
 
 int
 verify_password(const Port *port, const char *user, const char *password)
diff --git a/src/backend/libpq/portal.c b/src/backend/libpq/portal.c
deleted file mode 100644
index 4c97dd1cf11b8f3e27bd7e8dc2c43591e64e563d..0000000000000000000000000000000000000000
--- a/src/backend/libpq/portal.c
+++ /dev/null
@@ -1,643 +0,0 @@
-/*-------------------------------------------------------------------------
- *
- * portal.c
- *	  generalized portal support routines
- *
- * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
- * Portions Copyright (c) 1994, Regents of the University of California
- *
- *	$Id: portal.c,v 1.30 2000/03/17 02:36:08 tgl Exp $
- *
- *-------------------------------------------------------------------------
- */
-/*
- *	 INTERFACE ROUTINES
- *		PQnportals		- Return the number of open portals.
- *		PQpnames		- Return all the portal names
- *		PQparray		- Return the portal buffer given a portal name
- *		PQrulep			- Return 1 if an asynchronous portal
- *		PQntuples		- Return the number of tuples in a portal buffer
- *		PQninstances	-	same as PQntuples using object terminology
- *		PQngroups		- Return the number of tuple groups in a portal buffer
- *		PQntuplesGroup	- Return the number of tuples in a tuple group
- *		PQninstancesGroup  - same as PQntuplesGroup using object terminology
- *		PQnfieldsGroup	- Return the number of fields in a tuple group
- *		PQfnumberGroup	- Return field number given (group index, field name)
- *		PQftypeGroup	- Return field type given (group index, field index)
- *		PQfsizeGroup	- Return field size given (group index, field index)
- *		PQfnameGroup	- Return field name given (group index, field index)
- *		PQgroup			- Return the tuple group that a particular tuple is in
- *		PQgetgroup		- Return the index of the group that a tuple is in
- *		PQnfields		- Return the number of fields in a tuple
- *		PQfnumber		- Return the field index of a field name in a tuple
- *		PQfname			- Return the name of a field
- *		PQftype			- Return the type of a field
- *		PQfsize			- Return the size of a field
- *		PQftype			- Return the type of a field
- *		PQsametype		- Return 1 if the two tuples have the same type
- *		PQgetvalue		- Return an attribute (field) value
- *		PQgetlength		- Return an attribute (field) length
- *		PQclear			- free storage claimed by named portal
- *
- *	 NOTES
- *		These functions may be used by both frontend routines which
- *		communicate with a backend or by user-defined functions which
- *		are compiled or dynamically loaded into a backend.
- *
- *		the *portals array should be organized as a hash table for
- *		quick portal-by-name lookup.
- *
- *		Do not confuse "PortalEntry" (or "PortalBuffer") with "Portal"
- *		see utils/mmgr/portalmem.c for why. -cim 2/22/91
- *
- */
-
-#include "postgres.h"
-
-#include "libpq/libpq.h"
-
-
-/* ----------------------------------------------------------------
- *	  Helper routines for PQ portal interface routines below
- * ----------------------------------------------------------------
- */
-
-static int
-in_range(char *msg, int value, int min, int max)
-{
-	if (value < min || value >= max)
-	{
-		snprintf(PQerrormsg, PQERRORMSG_LENGTH,
-		"FATAL: %s, %d is not in range [%d,%d)\n", msg, value, min, max);
-		pqdebug("%s", PQerrormsg);
-		fputs(PQerrormsg, stderr);
-		return 0;
-	}
-	return 1;
-}
-
-static int
-valid_pointer(char *msg, void *ptr)
-{
-	if (!ptr)
-	{
-		snprintf(PQerrormsg, PQERRORMSG_LENGTH, "FATAL: %s\n", msg);
-		pqdebug("%s", PQerrormsg);
-		fputs(PQerrormsg, stderr);
-		return 0;
-	}
-	return 1;
-}
-
-
-/* ----------------------------------------------------------------
- *					PQ portal interface routines
- * ----------------------------------------------------------------
- */
-
-/* --------------------------------
- *		PQnportals - Return the number of open portals.
- *		If rule_p, only return asynchronous portals.
- * --------------------------------
- */
-int
-PQnportals(int rule_p)
-{
-	int			i,
-				n = 0;
-
-	for (i = 0; i < (int) portals_array_size; ++i)
-	{
-		if (portals[i] && portals[i]->portal)
-		{
-			if (!rule_p || portals[i]->portal->rule_p)
-				++n;
-		}
-	}
-	return n;
-}
-
-/* --------------------------------
- *		PQpnames - Return all the portal names
- *		If rule_p, only return asynchronous portals.
- *
- *		   the caller must have allocated sufficient memory for char** pnames
- *		   (an array of PQnportals strings of length PortalNameLength).
- *
- *		   notice that this assumes that the user is calling PQnportals and
- *		   PQpnames with the same rule_p argument, and with no intervening
- *		   portal closures.  if not, you can get in heap big trouble..
- * --------------------------------
- */
-void
-PQpnames(char **pnames, int rule_p)
-{
-	int			i,
-				cur_pname = 0;
-
-	if (!valid_pointer("PQpnames: invalid name buffer", pnames))
-		return;
-
-	for (i = 0; i < (int) portals_array_size; ++i)
-	{
-		if (portals[i] && portals[i]->portal)
-		{
-			if (!rule_p || portals[i]->portal->rule_p)
-			{
-				strncpy(pnames[cur_pname], portals[i]->name, PortalNameLength + 1);
-				++cur_pname;
-			}
-		}
-	}
-}
-
-/* --------------------------------
- *		PQparray - Return the portal buffer given a portal name
- * --------------------------------
- */
-PortalBuffer *
-PQparray(char *pname)
-{
-	int			i;
-
-	if (!valid_pointer("PQparray: invalid name buffer", pname))
-		return NULL;
-
-	if ((i = pbuf_getIndex(pname)) < 0)
-		return (PortalBuffer *) NULL;
-	return portals[i]->portal;
-}
-
-/* --------------------------------
- *		PQrulep - Return 1 if an asynchronous portal
- * --------------------------------
- */
-int
-PQrulep(PortalBuffer *portal)
-{
-	if (!valid_pointer("PQrulep: invalid portal pointer", portal))
-		return -1;
-
-	return portal->rule_p;
-}
-
-/* --------------------------------
- *		PQntuples - Return the number of tuples in a portal buffer
- * --------------------------------
- */
-int
-PQntuples(PortalBuffer *portal)
-{
-	if (!valid_pointer("PQntuples: invalid portal pointer", portal))
-		return -1;
-
-	return portal->no_tuples;
-}
-
-int
-PQninstances(PortalBuffer *portal)
-{
-	return PQntuples(portal);
-}
-
-/* --------------------------------
- *		PQngroups - Return the number of tuple groups in a portal buffer
- * --------------------------------
- */
-int
-PQngroups(PortalBuffer *portal)
-{
-	if (!valid_pointer("PQngroups: invalid portal pointer", portal))
-		return -1;
-
-	return portal->no_groups;
-}
-
-/* --------------------------------
- *		PQntuplesGroup - Return the number of tuples in a tuple group
- * --------------------------------
- */
-int
-PQntuplesGroup(PortalBuffer *portal, int group_index)
-{
-	GroupBuffer *gbp;
-
-	if (!valid_pointer("PQntuplesGroup: invalid portal pointer", portal) ||
-		!in_range("PQntuplesGroup: group index",
-				  group_index, 0, portal->no_groups))
-		return -1;
-
-	gbp = pbuf_findGroup(portal, group_index);
-	if (gbp)
-		return gbp->no_tuples;
-	return -1;
-}
-
-int
-PQninstancesGroup(PortalBuffer *portal, int group_index)
-{
-	return PQntuplesGroup(portal, group_index);
-}
-
-/* --------------------------------
- *		PQnfieldsGroup - Return the number of fields in a tuple group
- * --------------------------------
- */
-int
-PQnfieldsGroup(PortalBuffer *portal, int group_index)
-{
-	GroupBuffer *gbp;
-
-	if (!valid_pointer("PQnfieldsGroup: invalid portal pointer", portal) ||
-		!in_range("PQnfieldsGroup: group index",
-				  group_index, 0, portal->no_groups))
-		return -1;
-	gbp = pbuf_findGroup(portal, group_index);
-	if (gbp)
-		return gbp->no_fields;
-	return -1;
-}
-
-/* --------------------------------
- *		PQfnumberGroup - Return the field number (index) given
- *						 the group index and the field name
- * --------------------------------
- */
-int
-PQfnumberGroup(PortalBuffer *portal, int group_index, char *field_name)
-{
-	GroupBuffer *gbp;
-
-	if (!valid_pointer("PQfnumberGroup: invalid portal pointer", portal) ||
-		!valid_pointer("PQfnumberGroup: invalid field name pointer",
-					   field_name) ||
-		!in_range("PQfnumberGroup: group index",
-				  group_index, 0, portal->no_groups))
-		return -1;
-	gbp = pbuf_findGroup(portal, group_index);
-	if (gbp)
-		return pbuf_findFnumber(gbp, field_name);
-	return -1;
-}
-
-/* --------------------------------
- *		PQfnameGroup - Return the field (attribute) name given
- *						the group index and field index.
- * --------------------------------
- */
-char *
-PQfnameGroup(PortalBuffer *portal, int group_index, int field_number)
-{
-	GroupBuffer *gbp;
-
-	if (!valid_pointer("PQfnameGroup: invalid portal pointer", portal) ||
-		!in_range("PQfnameGroup: group index",
-				  group_index, 0, portal->no_groups))
-		return (char *) NULL;
-
-	if ((gbp = pbuf_findGroup(portal, group_index)) &&
-		in_range("PQfnameGroup: field number",
-				 field_number, 0, gbp->no_fields))
-		return pbuf_findFname(gbp, field_number);
-	return (char *) NULL;
-}
-
-/* --------------------------------
- *		PQftypeGroup - Return the type of a field given
- *						the group index and field index
- * --------------------------------
- */
-int
-PQftypeGroup(PortalBuffer *portal, int group_index, int field_number)
-{
-	GroupBuffer *gbp;
-
-	if (!valid_pointer("PQftypeGroup: invalid portal pointer", portal) ||
-		!in_range("PQftypeGroup: group index",
-				  group_index, 0, portal->no_groups))
-		return -1;
-
-	if ((gbp = pbuf_findGroup(portal, group_index)) &&
-		in_range("PQftypeGroup: field number", field_number, 0, gbp->no_fields))
-		return gbp->types[field_number].typid;
-	return -1;
-}
-
-/* --------------------------------
- *		PQfsizeGroup - Return the size of a field given
- *					   the group index and field index
- * --------------------------------
- */
-int
-PQfsizeGroup(PortalBuffer *portal, int group_index, int field_number)
-{
-	GroupBuffer *gbp;
-
-	if (!valid_pointer("PQfsizeGroup: invalid portal pointer", portal) ||
-		!in_range("PQfsizeGroup: tuple index",
-				  group_index, 0, portal->no_groups))
-		return -1;
-
-	if ((gbp = pbuf_findGroup(portal, group_index)) &&
-		in_range("PQfsizeGroup: field number", field_number, 0, gbp->no_fields))
-		return gbp->types[field_number].typlen;
-	return -1;
-}
-
-
-/* --------------------------------
- *		PQgroup - Return the tuple group that a particular tuple is in
- * --------------------------------
- */
-GroupBuffer *
-PQgroup(PortalBuffer *portal, int tuple_index)
-{
-	GroupBuffer *gbp;
-	int			tuple_count = 0;
-
-	if (!valid_pointer("PQgroup: invalid portal pointer", portal) ||
-		!in_range("PQgroup: tuple index",
-				  tuple_index, 0, portal->no_tuples))
-		return (GroupBuffer *) NULL;
-
-	for (gbp = portal->groups;
-		 gbp && tuple_index >= (tuple_count += gbp->no_tuples);
-		 gbp = gbp->next)
-		;
-	if (!in_range("PQgroup: tuple not found: tuple index",
-				  tuple_index, 0, tuple_count))
-		return (GroupBuffer *) NULL;
-	return gbp;
-}
-
-/* --------------------------------
- *		PQgetgroup - Return the index of the group that a
- *					 particular tuple is in
- * --------------------------------
- */
-int
-PQgetgroup(PortalBuffer *portal, int tuple_index)
-{
-	GroupBuffer *gbp;
-	int			tuple_count = 0,
-				group_count = 0;
-
-	if (!valid_pointer("PQgetgroup: invalid portal pointer", portal) ||
-		!in_range("PQgetgroup: tuple index",
-				  tuple_index, 0, portal->no_tuples))
-		return -1;
-
-	for (gbp = portal->groups;
-		 gbp && tuple_index >= (tuple_count += gbp->no_tuples);
-		 gbp = gbp->next)
-		++group_count;
-	if (!gbp || !in_range("PQgetgroup: tuple not found: tuple index",
-						  tuple_index, 0, tuple_count))
-		return -1;
-	return group_count;
-}
-
-/* --------------------------------
- *		PQnfields - Return the number of fields in a tuple
- * --------------------------------
- */
-int
-PQnfields(PortalBuffer *portal, int tuple_index)
-{
-	GroupBuffer *gbp;
-
-	if (!valid_pointer("PQnfields: invalid portal pointer", portal) ||
-		!in_range("PQnfields: tuple index",
-				  tuple_index, 0, portal->no_tuples))
-		return -1;
-	gbp = PQgroup(portal, tuple_index);
-	if (gbp)
-		return gbp->no_fields;
-	return -1;
-}
-
-/* --------------------------------
- *		PQfnumber - Return the field index of a given
- *					field name within a tuple.
- * --------------------------------
- */
-int
-PQfnumber(PortalBuffer *portal, int tuple_index, char *field_name)
-{
-	GroupBuffer *gbp;
-
-	if (!valid_pointer("PQfnumber: invalid portal pointer", portal) ||
-	!valid_pointer("PQfnumber: invalid field name pointer", field_name) ||
-		!in_range("PQfnumber: tuple index",
-				  tuple_index, 0, portal->no_tuples))
-		return -1;
-	gbp = PQgroup(portal, tuple_index);
-	if (gbp)
-		return pbuf_findFnumber(gbp, field_name);
-	return -1;
-}
-
-/* --------------------------------
- *		PQfname - Return the name of a field
- * --------------------------------
- */
-char *
-PQfname(PortalBuffer *portal, int tuple_index, int field_number)
-{
-	GroupBuffer *gbp;
-
-	if (!valid_pointer("PQfname: invalid portal pointer", portal) ||
-		!in_range("PQfname: tuple index",
-				  tuple_index, 0, portal->no_tuples))
-		return (char *) NULL;
-
-	if ((gbp = PQgroup(portal, tuple_index)) &&
-		in_range("PQfname: field number",
-				 field_number, 0, gbp->no_fields))
-		return pbuf_findFname(gbp, field_number);
-	return (char *) NULL;
-}
-
-/* --------------------------------
- *		PQftype - Return the type of a field
- * --------------------------------
- */
-int
-PQftype(PortalBuffer *portal, int tuple_index, int field_number)
-{
-	GroupBuffer *gbp;
-
-	if (!valid_pointer("PQftype: invalid portal pointer", portal) ||
-		!in_range("PQfname: tuple index",
-				  tuple_index, 0, portal->no_tuples))
-		return -1;
-
-	if ((gbp = PQgroup(portal, tuple_index)) &&
-	  in_range("PQftype: field number", field_number, 0, gbp->no_fields))
-		return gbp->types[field_number].typid;
-	return -1;
-}
-
-/* --------------------------------
- *		PQfsize - Return the size of a field
- * --------------------------------
- */
-int
-PQfsize(PortalBuffer *portal, int tuple_index, int field_number)
-{
-	GroupBuffer *gbp;
-
-	if (!valid_pointer("PQfsize: invalid portal pointer", portal) ||
-		!in_range("PQfsize: tuple index",
-				  tuple_index, 0, portal->no_tuples))
-		return -1;
-
-	if ((gbp = PQgroup(portal, tuple_index)) &&
-	  in_range("PQfsize: field number", field_number, 0, gbp->no_fields))
-		return gbp->types[field_number].typlen;
-	return -1;
-}
-
-
-
-/* --------------------------------
- *		PQsametype - Return 1 if the two tuples have the same type
- *						(in the same group)
- * --------------------------------
- */
-int
-PQsametype(PortalBuffer *portal, int tuple_index1, int tuple_index2)
-{
-	GroupBuffer *gbp1,
-			   *gbp2;
-
-	if (!valid_pointer("PQsametype: invalid portal pointer", portal) ||
-		!in_range("PQsametype: tuple index 1",
-				  tuple_index1, 0, portal->no_tuples) ||
-		!in_range("PQsametype: tuple index 2",
-				  tuple_index2, 0, portal->no_tuples))
-		return -1;
-
-	gbp1 = PQgroup(portal, tuple_index1);
-	gbp2 = PQgroup(portal, tuple_index2);
-	if (gbp1 && gbp2)
-		return gbp1 == gbp2;
-	return -1;
-}
-
-static TupleBlock *
-PQGetTupleBlock(PortalBuffer *portal,
-				int tuple_index,
-				int *tuple_offset)
-{
-	GroupBuffer *gbp;
-	TupleBlock *tbp;
-	int			tuple_count = 0;
-
-	if (!valid_pointer("PQGetTupleBlock: invalid portal pointer", portal) ||
-		!valid_pointer("PQGetTupleBlock: invalid offset pointer",
-					   tuple_offset) ||
-		!in_range("PQGetTupleBlock: tuple index",
-				  tuple_index, 0, portal->no_tuples))
-		return (TupleBlock *) NULL;
-
-	for (gbp = portal->groups;
-		 gbp && tuple_index >= (tuple_count += gbp->no_tuples);
-		 gbp = gbp->next)
-		;
-	if (!gbp ||
-		!in_range("PQGetTupleBlock: tuple not found: tuple index",
-				  tuple_index, 0, tuple_count))
-		return (TupleBlock *) NULL;
-	tuple_count -= gbp->no_tuples;
-	for (tbp = gbp->tuples;
-		 tbp && tuple_index >= (tuple_count += TupleBlockSize);
-		 tbp = tbp->next)
-		;
-	if (!tbp ||
-		!in_range("PQGetTupleBlock: tuple not found: tuple index",
-				  tuple_index, 0, tuple_count))
-		return (TupleBlock *) NULL;
-	tuple_count -= TupleBlockSize;
-
-	*tuple_offset = tuple_index - tuple_count;
-	return tbp;
-}
-
-/* --------------------------------
- *		PQgetvalue - Return an attribute (field) value
- * --------------------------------
- */
-char *
-PQgetvalue(PortalBuffer *portal,
-		   int tuple_index,
-		   int field_number)
-{
-	TupleBlock *tbp;
-	int			tuple_offset;
-
-	tbp = PQGetTupleBlock(portal, tuple_index, &tuple_offset);
-	if (tbp)
-		return tbp->values[tuple_offset][field_number];
-	return (char *) NULL;
-}
-
-/* --------------------------------
- *		PQgetAttr - Return an attribute (field) value
- *		this differs from PQgetvalue in that the value returned is
- *		a copy.  The CALLER is responsible for free'ing the data returned.
- * --------------------------------
- */
-char *
-PQgetAttr(PortalBuffer *portal,
-		  int tuple_index,
-		  int field_number)
-{
-	TupleBlock *tbp;
-	int			tuple_offset;
-	int			len;
-	char	   *result = NULL;
-
-	tbp = PQGetTupleBlock(portal, tuple_index, &tuple_offset);
-	if (tbp)
-	{
-		len = tbp->lengths[tuple_offset][field_number];
-		result = palloc(len + 1);
-		memcpy(result,
-			   tbp->values[tuple_offset][field_number],
-			   len);
-		result[len] = '\0';
-	}
-	return result;
-}
-
-
-/* --------------------------------
- *		PQgetlength - Return an attribute (field) length
- * --------------------------------
- */
-int
-PQgetlength(PortalBuffer *portal,
-			int tuple_index,
-			int field_number)
-{
-	TupleBlock *tbp;
-	int			tuple_offset;
-
-	tbp = PQGetTupleBlock(portal, tuple_index, &tuple_offset);
-	if (tbp)
-		return tbp->lengths[tuple_offset][field_number];
-	return -1;
-}
-
-/* ----------------
- *		PQclear			- free storage claimed by named portal
- * ----------------
- */
-void
-PQclear(char *pname)
-{
-	if (!valid_pointer("PQclear: invalid portal name pointer", pname))
-		return;
-	pbuf_close(pname);
-}
diff --git a/src/backend/libpq/portalbuf.c b/src/backend/libpq/portalbuf.c
deleted file mode 100644
index 3cab2e4a7df2d7747e27d8dd14b350fbb85adb07..0000000000000000000000000000000000000000
--- a/src/backend/libpq/portalbuf.c
+++ /dev/null
@@ -1,517 +0,0 @@
-/*-------------------------------------------------------------------------
- *
- * portalbuf.c
- *	  portal buffer support routines for src/libpq/portal.c
- *
- * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
- * Portions Copyright (c) 1994, Regents of the University of California
- *
- *
- * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/libpq/Attic/portalbuf.c,v 1.24 2000/04/12 17:15:14 momjian Exp $
- *
- *-------------------------------------------------------------------------
- */
-/*
- * INTERFACE ROUTINES
- *		pbuf_alloc		  - allocate memory for libpq routines
- *		pbuf_free		  - free memory for libpq routines
- *		pbuf_addPortal	  - Allocate a new portal buffer
- *		pbuf_addGroup	  - Add a new tuple group to the portal
- *		pbuf_addTypes	  - Allocate n type blocks
- *		pbuf_addTuples	  - Allocate a tuple block
- *		pbuf_addTuple	  - Allocate a tuple of n fields (attributes)
- *		pbuf_addValues	  - Allocate n bytes for a value
- *		pbuf_addEntry	  - Allocate a portal entry
- *		pbuf_freeEntry	  - Free a portal entry in the portal table
- *		pbuf_freeTypes	  - Free up the space used by a portal
- *		pbuf_freeTuples   - free space used by tuple block
- *		pbuf_freeGroup	  - free space used by group, types and tuples
- *		pbuf_freePortal   - free space used by portal and portal's group
- *		pbuf_getIndex	  - Return the index of the portal entry
- *		pbuf_setup		  - Set up a portal for dumping data
- *		pbuf_close		  - Close a portal, remove it from the portal table
- *		pbuf_findGroup	  - Return group given the group_index
- *		pbuf_findFnumber  - Return field index of a given field within a group
- *		pbuf_findFname	  - Find the field name given the field index
- *		pbuf_checkFnumber - signal an error if field number is out of bounds
- *
- * NOTES
- *		These functions may be used by both frontend routines which
- *		communicate with a backend or by user-defined functions which
- *		are compiled or dynamically loaded into a backend.
- *
- *		the portals[] array should be organized as a hash table for
- *		quick portal-by-name lookup.
- *
- *		Do not confuse "PortalEntry" (or "PortalBuffer") with "Portal"
- *		see utils/mmgr/portalmem.c for why. -cim 2/22/91
- *
- */
-#include <sys/types.h>
-
-#include "postgres.h"
-
-#include "libpq/libpq.h"
-
-PortalEntry **portals = (PortalEntry **) NULL;
-size_t		portals_array_size = 0;
-
-/* portals array memory is palloc'd instead of using MemoryContexts */
-/* since it will be used by both front and backend programs*/
-/*	GlobalMemory portals_mmcxt = (GlobalMemory) NULL;  */
-
-/* -------------------------------
- * portals_realloc
- *	  grow the size of the portals array by size
- *
- *	  also ensures that elements are initially NULL
- */
-
-static void
-portals_realloc(size_t size)
-{
-	size_t		oldsize;
-	int			i;
-	PortalEntry **newp;
-
-	oldsize = portals_array_size;
-
-	portals_array_size += size;
-	if (portals)
-		newp = (PortalEntry **) realloc(portals,
-							 portals_array_size * sizeof(PortalEntry *));
-	else
-		newp = (PortalEntry **) palloc(portals_array_size * sizeof(PortalEntry *));
-
-	if (newp)
-		portals = newp;
-	else
-		libpq_raise(&PortalError,
-		   vararg_format("Cannot alloc more memory in portals_realloc"));
-
-	for (i = oldsize; i < (int) portals_array_size; i++)
-		portals[i] = (PortalEntry *) NULL;
-
-}
-
-/* --------------------------------
- *		pbuf_alloc - allocate memory for portal buffers
- *
- *		remember: palloc() in the backend uses the postgres MemoryContext
- *		library and palloc() in the frontend (fe-pqstubs.c) calls malloc().
- * --------------------------------
- */
-caddr_t
-pbuf_alloc(size_t size)
-{
-	caddr_t		addr;
-
-	if (size <= 0)
-		libpq_raise(&MemoryError, vararg_format("Invalid argument to pbuf_alloc()."));
-
-	addr = (caddr_t) palloc(size);
-	if (addr == (caddr_t) NULL)
-		libpq_raise(&MemoryError, vararg_format("Cannot Allocate space."));
-
-	return addr;
-}
-
-/* --------------------------------
- *		pbuf_free - free memory for portal buffers
- *
- *		remember: pfree() in the backend uses the postgres MemoryContext
- *		library and pfree() in the frontend (fe-pqstubs.c) calls free().
- * --------------------------------
- */
-void
-pbuf_free(caddr_t pointer)
-{
-	if (pointer)
-		pfree(pointer);
-	else
-		libpq_raise(&MemoryError, vararg_format("Tried to free NULL memory pointer"));
-
-}
-
-/* --------------------------------
- *		pbuf_addPortal - Allocate a new portal buffer
- * --------------------------------
- */
-PortalBuffer *
-pbuf_addPortal()
-{
-	PortalBuffer *portal;
-
-	portal = (PortalBuffer *)
-		pbuf_alloc(sizeof(PortalBuffer));
-
-	portal->rule_p = 0;
-	portal->no_tuples = 0;
-	portal->no_groups = 0;
-	portal->groups = NULL;
-
-	return portal;
-}
-
-/* --------------------------------
- *		pbuf_addGroup - Add a new tuple group to the portal
- * --------------------------------
- */
-GroupBuffer *
-pbuf_addGroup(PortalBuffer *portal)
-{
-	GroupBuffer *group,
-			   *group1;
-
-	group = (GroupBuffer *)
-		pbuf_alloc(sizeof(GroupBuffer));
-
-	/* Initialize the new group buffer. */
-	group->no_tuples = 0;
-	group->no_fields = 0;
-	group->types = NULL;
-	group->tuples = NULL;
-	group->next = NULL;
-
-	if ((group1 = portal->groups) == NULL)
-		portal->groups = group;
-	else
-	{
-		while (group1->next != NULL)
-			group1 = group1->next;
-		group1->next = group;
-	}
-
-	return group;
-}
-
-/* --------------------------------
- *		pbuf_addTypes - Allocate n type blocks
- * --------------------------------
- */
-TypeBlock  *
-pbuf_addTypes(int n)
-{
-	TypeBlock  *types;
-
-	types = (TypeBlock *)
-		pbuf_alloc(n * sizeof(TypeBlock));
-
-	return types;
-}
-
-/* --------------------------------
- *		pbuf_addTuples - Allocate a tuple block
- * --------------------------------
- */
-TupleBlock *
-pbuf_addTuples()
-{
-	TupleBlock *tuples;
-
-	tuples = (TupleBlock *)
-		pbuf_alloc(sizeof(TupleBlock));
-
-	tuples->next = NULL;
-	tuples->tuple_index = 0;
-
-	return tuples;
-}
-
-/* --------------------------------
- *		pbuf_addTuple - Allocate a tuple of n fields (attributes)
- * --------------------------------
- */
-char	  **
-pbuf_addTuple(int n)
-{
-	return (char **)
-	pbuf_alloc(n * sizeof(char *));
-}
-
-/* --------------------------------
- *		pbuf_addTupleValueLengths - Allocate a tuple of n lengths (attributes)
- * --------------------------------
- */
-int *
-pbuf_addTupleValueLengths(int n)
-{
-	return (int *)
-	pbuf_alloc(n * sizeof(int));
-}
-
-/* --------------------------------
- *		pbuf_addValues - Allocate n bytes for a value
- * --------------------------------
- */
-char *
-pbuf_addValues(int n)
-{
-	return pbuf_alloc(n);
-}
-
-/* --------------------------------
- *		pbuf_addEntry - Allocate a portal entry
- * --------------------------------
- */
-PortalEntry *
-pbuf_addEntry()
-{
-	return (PortalEntry *)
-	pbuf_alloc(sizeof(PortalEntry));
-}
-
-/* --------------------------------
- *		pbuf_freeEntry - Free a portal entry in the portal table
- *		the portal is freed separately.
- * --------------------------------
- */
-void
-pbuf_freeEntry(int i)
-{
-	if (portals)
-	{
-		pbuf_free((caddr_t) portals[i]);
-		portals[i] = NULL;
-	}
-}
-
-
-/* --------------------------------
- *		pbuf_freeTypes - Free up the space used by a portal
- * --------------------------------
- */
-void
-pbuf_freeTypes(TypeBlock *types)
-{
-	pbuf_free((caddr_t) types);
-}
-
-/* --------------------------------
- *		pbuf_freeTuples - free space used by tuple block
- * --------------------------------
- */
-void
-pbuf_freeTuples(TupleBlock *tuples,
-				int no_tuples,
-				int no_fields)
-{
-	int			i,
-				j;
-
-	if (no_tuples > TupleBlockSize)
-	{
-		pbuf_freeTuples(tuples->next, no_tuples - TupleBlockSize, no_fields);
-		no_tuples = TupleBlockSize;
-	}
-
-	/* For each tuple, free all its attribute values. */
-	for (i = 0; i < no_tuples; i++)
-	{
-		for (j = 0; j < no_fields; j++)
-			if (tuples->values[i][j] != NULL)
-				pbuf_free((caddr_t) tuples->values[i][j]);
-		if (tuples->lengths[i])
-			pbuf_free((caddr_t) tuples->lengths[i]);
-		if (tuples->values[i])
-			pbuf_free((caddr_t) tuples->values[i]);
-	}
-
-	pbuf_free((caddr_t) tuples);
-}
-
-/* --------------------------------
- *		pbuf_freeGroup - free space used by group, types and tuples
- * --------------------------------
- */
-void
-pbuf_freeGroup(GroupBuffer *group)
-{
-	if (group->next != NULL)
-		pbuf_freeGroup(group->next);
-
-	if (group->types != NULL)
-		pbuf_freeTypes(group->types);
-
-	if (group->tuples != NULL)
-		pbuf_freeTuples(group->tuples, group->no_tuples, group->no_fields);
-
-	pbuf_free((caddr_t) group);
-}
-
-/* --------------------------------
- *		pbuf_freePortal - free space used by portal and portal's group
- * --------------------------------
- */
-void
-pbuf_freePortal(PortalBuffer *portal)
-{
-	if (portal->groups != NULL)
-		pbuf_freeGroup(portal->groups);
-
-	pbuf_free((caddr_t) portal);
-}
-
-/* --------------------------------
- *		pbuf_getIndex - Return the index of the portal entry
- *		note: portals[] maps portal names to portal buffers.
- * --------------------------------
- */
-int
-pbuf_getIndex(char *pname)
-{
-	int			i;
-
-	if (portals)
-	{
-		for (i = 0; i < (int) portals_array_size; i++)
-			if (portals[i] != NULL &&
-				strncmp(portals[i]->name, pname, PortalNameLength) == 0)
-				return i;
-	}
-
-	return -1;
-}
-
-/* --------------------------------
- *		pbuf_setportalname - assign a user given name to a portal
- * --------------------------------
- */
-void
-pbuf_setportalinfo(PortalEntry *entry, char *pname)
-{
-	if (entry)
-		StrNCpy(entry->name, pname, PortalNameLength);
-}
-
-/* --------------------------------
- *		pbuf_setup - Set up a portal for dumping data
- * --------------------------------
- */
-PortalEntry *
-pbuf_setup(char *pname)
-{
-	int			i;
-
-	if (!portals)				/* the portals array has not been
-								 * allocated yet */
-	{
-		/* allocate portals[] array here */
-		portals_realloc(PORTALS_INITIAL_SIZE);
-	}
-
-	/* If a portal with the same name already exists, close it. */
-	/* else look for an empty entry in the portal table. */
-	if ((i = pbuf_getIndex(pname)) != -1)
-		pbuf_freePortal(portals[i]->portal);
-	else
-	{
-		for (i = 0; i < (int) portals_array_size; i++)
-			if (portals[i] == NULL)
-				break;
-
-		/* If the portal table is full, enlarge it */
-		if (i >= (int) portals_array_size)
-			portals_realloc(PORTALS_GROW_BY);
-
-		portals[i] = pbuf_addEntry();
-		strncpy(portals[i]->name, pname, PortalNameLength);
-	}
-	portals[i]->portal = pbuf_addPortal();
-	portals[i]->portalcxt = NULL;
-	portals[i]->result = NULL;
-
-	return portals[i];
-}
-
-/* --------------------------------
- *		pbuf_close - Close a portal, remove it from the portal table
- *						and free up the space
- * --------------------------------
- */
-void
-pbuf_close(char *pname)
-{
-	int			i;
-
-	if ((i = pbuf_getIndex(pname)) == -1)
-		libpq_raise(&PortalError, vararg_format("Portal %s does not exist.", pname));
-
-	pbuf_freePortal(portals[i]->portal);
-	pbuf_freeEntry(i);
-}
-
-/* --------------------------------
- *		pbuf_findGroup - Return the group given the group_index
- * --------------------------------
- */
-GroupBuffer *
-pbuf_findGroup(PortalBuffer *portal,
-			   int group_index)
-{
-	GroupBuffer *group;
-
-	group = portal->groups;
-	while (group_index > 0 && group != NULL)
-	{
-		group = group->next;
-		group_index--;
-	}
-
-	if (group == NULL)
-		libpq_raise(&PortalError,
-			 vararg_format("Group index %d out of bound.", group_index));
-
-	return group;
-}
-
-/* --------------------------------
- * pbuf_findFnumber - Return the field index of a given field within a group
- * --------------------------------
- */
-int
-pbuf_findFnumber(GroupBuffer *group,
-				 char *field_name)
-{
-	TypeBlock  *types;
-	int			i;
-
-	types = group->types;
-
-	for (i = 0; i < group->no_fields; i++)
-		if (strncmp(types[i].name, field_name, NAMEDATALEN) == 0)
-			return i;
-
-	libpq_raise(&PortalError,
-			 vararg_format("Field-name %s does not exist.", field_name));
-
-	/* not reached, here to make compiler happy */
-	return 0;
-
-}
-
-/* --------------------------------
- *		pbuf_checkFnumber - signal an error if field number is out of bounds
- * --------------------------------
- */
-void
-pbuf_checkFnumber(GroupBuffer *group,
-				  int field_number)
-{
-	if (field_number < 0 || field_number >= group->no_fields)
-		libpq_raise(&PortalError,
-		   vararg_format("Field number %d out of bound.", field_number));
-}
-
-/* --------------------------------
- *		pbuf_findFname - Find the field name given the field index
- * --------------------------------
- */
-char *
-pbuf_findFname(GroupBuffer *group,
-			   int field_number)
-{
-	pbuf_checkFnumber(group, field_number);
-	return (group->types[field_number]).name;
-}
diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c
index f0cd93b3872019fb837ac90a0024fff72b6fe67f..0f3b3d4295bcb414a2c3c9701826534a768dd942 100644
--- a/src/backend/libpq/pqcomm.c
+++ b/src/backend/libpq/pqcomm.c
@@ -29,7 +29,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- *	$Id: pqcomm.c,v 1.99 2000/07/03 20:45:57 petere Exp $
+ *	$Id: pqcomm.c,v 1.100 2000/07/08 03:04:40 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -79,9 +79,8 @@
 
 #ifndef SOMAXCONN
 #define SOMAXCONN 5				/* from Linux listen(2) man page */
-#endif	 /* SOMAXCONN */
+#endif
 
-extern FILE *debug_port;		/* in util.c */
 
 /*
  * Buffers for low-level I/O
@@ -113,8 +112,6 @@ pq_init(void)
 {
 	PqSendPointer = PqRecvPointer = PqRecvLength = 0;
 	DoingCopyOut = false;
-	if (getenv("LIBPQ_DEBUG"))
-		debug_port = stderr;
 }
 
 
diff --git a/src/backend/libpq/util.c b/src/backend/libpq/util.c
index 44103a5d3a3949c34e8fd297cb4fe3bfa3dbc426..4d593b294311409313f2a0ddbbdbc1a2c9a0a877 100644
--- a/src/backend/libpq/util.c
+++ b/src/backend/libpq/util.c
@@ -1,25 +1,24 @@
 /*-------------------------------------------------------------------------
  *
  * util.c
- *	  general routines for libpq backend
+ *	  general routines for backend libpq modules
  *
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- *	$Id: util.c,v 1.15 2000/01/26 05:56:29 momjian Exp $
+ *	$Header: /cvsroot/pgsql/src/backend/libpq/Attic/util.c,v 1.16 2000/07/08 03:04:41 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 /*
  *	 UTILITY ROUTINES
  *		pqdebug			- send a string to the debugging output port
- *		pqdebug2		- send two strings to stdout
  *		PQtrace			- turn on pqdebug() tracing
  *		PQuntrace		- turn off pqdebug() tracing
  */
 
-
 #include "postgres.h"
+
 #include "libpq/libpq.h"
 
 
@@ -29,17 +28,14 @@
  */
 char		PQerrormsg[PQERRORMSG_LENGTH];
 
+/*
+ * These are not really global --- they are referred to nowhere else.
+ * We declare them as global symbols to make them easier to set in a debugger.
+ */
+
 int			PQtracep = 0;		/* 1 to print out debugging messages */
-FILE	   *debug_port = (FILE *) NULL;
 
-/* ----------------
- *		exceptions
- * ----------------
- */
-Exception	MemoryError = {"Memory Allocation Error"};
-Exception	PortalError = {"Invalid arguments to portal functions"};
-Exception	PostquelError = {"Sql Error"};
-Exception	ProtocolError = {"Protocol Error"};
+FILE	   *debug_port = (FILE *) NULL;
 
 /* ----------------------------------------------------------------
  *						PQ utility routines
@@ -47,39 +43,20 @@ Exception	ProtocolError = {"Protocol Error"};
  */
 
 void
-pqdebug(char *target, char *msg)
-{
-	if (!target)
-		return;
-
-	if (PQtracep)
-	{
-
-		/*
-		 * if nothing else was suggested default to stdout
-		 */
-		if (!debug_port)
-			debug_port = stdout;
-		fprintf(debug_port, target, msg);
-		fprintf(debug_port, "\n");
-	}
-}
-
-void
-pqdebug2(char *target, char *msg1, char *msg2)
+pqdebug(char *fmt, char *msg)
 {
-	if (!target)
+	if (!fmt)
 		return;
 
 	if (PQtracep)
 	{
 
 		/*
-		 * if nothing else was suggested default to stdout
+		 * if nothing else was suggested default to stderr
 		 */
 		if (!debug_port)
-			debug_port = stdout;
-		fprintf(debug_port, target, msg1, msg2);
+			debug_port = stderr;
+		fprintf(debug_port, fmt, msg);
 		fprintf(debug_port, "\n");
 	}
 }
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index 9b30fa447d9de34b5de31e3bfa18a7b98529428d..c20ddbd1ec448c9ffed052c01d41227ac7e41ed7 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.152 2000/07/03 20:45:58 petere Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.153 2000/07/08 03:04:13 tgl Exp $
  *
  * NOTES
  *
@@ -83,6 +83,7 @@
 #include "storage/proc.h"
 #include "access/xlog.h"
 #include "tcop/tcopprot.h"
+#include "utils/exc.h"
 #include "utils/guc.h"
 
 /*
diff --git a/src/backend/tcop/dest.c b/src/backend/tcop/dest.c
index ce60aaadb4f7c1136a48a0b8a175fbeb61852a9e..0505c4c5cf26540c27b05d24fc913ed41e98d4a0 100644
--- a/src/backend/tcop/dest.c
+++ b/src/backend/tcop/dest.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/tcop/dest.c,v 1.38 2000/01/26 05:57:07 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/tcop/dest.c,v 1.39 2000/07/08 03:04:15 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -72,9 +72,6 @@ static DestReceiver donothingDR = {
 static DestReceiver printtup_internalDR = {
 	printtup_internal, donothingSetup, donothingCleanup
 };
-static DestReceiver be_printtupDR = {
-	be_printtup, donothingSetup, donothingCleanup
-};
 static DestReceiver debugtupDR = {
 	debugtup, donothingSetup, donothingCleanup
 };
@@ -95,18 +92,16 @@ BeginCommand(char *pname,
 			 char *tag,
 			 CommandDest dest)
 {
-	PortalEntry *entry;
 	Form_pg_attribute *attrs = tupdesc->attrs;
 	int			natts = tupdesc->natts;
 	int			i;
-	char	   *p;
 
 	switch (dest)
 	{
 		case Remote:
 		case RemoteInternal:
 			/* ----------------
-			 *		if this is a "retrieve portal" query, done
+			 *		if this is a "retrieve into portal" query, done
 			 *		because nothing needs to be sent to the fe.
 			 * ----------------
 			 */
@@ -158,32 +153,6 @@ BeginCommand(char *pname,
 			}
 			break;
 
-		case Local:
-			/* ----------------
-			 *		prepare local portal buffer for query results
-			 *		and setup result for PQexec()
-			 * ----------------
-			 */
-			entry = be_currentportal();
-			if (pname != NULL)
-				pbuf_setportalinfo(entry, pname);
-
-			if (operation == CMD_SELECT && !isIntoRel)
-			{
-				be_typeinit(entry, tupdesc, natts);
-				p = (char *) palloc(strlen(entry->name) + 2);
-				p[0] = 'P';
-				strcpy(p + 1, entry->name);
-			}
-			else
-			{
-				p = (char *) palloc(strlen(tag) + 2);
-				p[0] = 'C';
-				strcpy(p + 1, tag);
-			}
-			entry->result = p;
-			break;
-
 		case Debug:
 			/* ----------------
 			 *		show the return type of the tuples
@@ -219,10 +188,6 @@ DestToFunction(CommandDest dest)
 			return &printtup_internalDR;
 			break;
 
-		case Local:
-			return &be_printtupDR;
-			break;
-
 		case Debug:
 			return &debugtupDR;
 			break;
@@ -266,7 +231,6 @@ EndCommand(char *commandTag, CommandDest dest)
 			CommandInfo[0] = '\0';
 			break;
 
-		case Local:
 		case Debug:
 		case None:
 		default:
@@ -329,7 +293,6 @@ NullCommand(CommandDest dest)
 			pq_putbytes("I", 2);/* note we send I and \0 */
 			break;
 
-		case Local:
 		case Debug:
 		case None:
 		default:
@@ -360,7 +323,6 @@ ReadyForQuery(CommandDest dest)
 			pq_flush();
 			break;
 
-		case Local:
 		case Debug:
 		case None:
 		default:
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 3843ce7a2d49b486c1aed597cc6bcbc01b5855fc..575e18351ad8cf4d044cb9d94f774d3c867986ee 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.166 2000/07/04 06:11:43 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.167 2000/07/08 03:04:15 tgl Exp $
  *
  * NOTES
  *	  this is the "main" module of the postgres backend and
@@ -54,9 +54,10 @@
 #include "tcop/tcopprot.h"
 #include "tcop/utility.h"
 #include "storage/proc.h"
+#include "utils/exc.h"
+#include "utils/guc.h"
 #include "utils/ps_status.h"
 #include "utils/temprel.h"
-#include "utils/guc.h"
 #ifdef MULTIBYTE
 #include "mb/pg_wchar.h"
 #endif
@@ -1414,7 +1415,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
 	if (!IsUnderPostmaster)
 	{
 		puts("\nPOSTGRES backend interactive interface ");
-		puts("$Revision: 1.166 $ $Date: 2000/07/04 06:11:43 $\n");
+		puts("$Revision: 1.167 $ $Date: 2000/07/08 03:04:15 $\n");
 	}
 
 	/*
diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c
index 0d5d070c8db80330b01693522e591ffd1fa5e196..ba0e2dd97afa02cf0dc006ca05ceb294ec23aa0c 100644
--- a/src/backend/utils/init/postinit.c
+++ b/src/backend/utils/init/postinit.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/utils/init/postinit.c,v 1.62 2000/07/03 03:27:31 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/init/postinit.c,v 1.63 2000/07/08 03:04:16 tgl Exp $
  *
  *
  *-------------------------------------------------------------------------
@@ -24,7 +24,6 @@
 #include "access/heapam.h"
 #include "catalog/catname.h"
 #include "catalog/pg_database.h"
-#include "libpq/libpq.h"
 #include "miscadmin.h"
 #include "storage/backendid.h"
 #include "storage/proc.h"
@@ -228,15 +227,6 @@ InitPostgres(const char *dbname)
 {
 	bool		bootstrap = IsBootstrapProcessingMode();
 
-	/* ----------------
-	 *	initialize the backend local portal stack used by
-	 *	internal PQ function calls.  see src/lib/libpq/be-dumpdata.c
-	 *	This is different from the "portal manager" so this goes here.
-	 *	-cim 2/12/91
-	 * ----------------
-	 */
-	be_portalinit();
-
 	/* initialize the local buffer manager */
 	InitLocalBuffer();
 
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index cdf2b06ea339f3d08cd2fcce43adb2ad66616620..bd260a827b47440414a4c2d08f3538f148b486d3 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_proc.h,v 1.145 2000/07/07 19:24:41 petere Exp $
+ * $Id: pg_proc.h,v 1.146 2000/07/08 03:04:21 tgl Exp $
  *
  * NOTES
  *	  The script catalog/genbki.sh reads this file and generates .bki
@@ -965,9 +965,6 @@ DESCR("distance between");
 DATA(insert OID = 729 (  poly_distance	   PGUID 11 f t t t 2 f 701 "604 604" 100 0 0 100  poly_distance - ));
 DESCR("distance between");
 
-DATA(insert OID = 730 (  pqtest			   PGUID 11 f t f t 1 f 23 "25" 100 0 0 100  pqtest - ));
-DESCR("");
-
 DATA(insert OID = 740 (  text_lt		   PGUID 12 f t t t 2 f 16 "25 25" 100 0 0 0	text_lt - ));
 DESCR("less-than");
 DATA(insert OID = 741 (  text_le		   PGUID 12 f t t t 2 f 16 "25 25" 100 0 0 0	text_le - ));
diff --git a/src/include/libpq/libpq.h b/src/include/libpq/libpq.h
index 78e34f0d4aea8fcccad1ddb64fbda86fdf3f55ff..3632012f671c984317b58bdb16c98b72f51ce5ae 100644
--- a/src/include/libpq/libpq.h
+++ b/src/include/libpq/libpq.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: libpq.h,v 1.38 2000/06/06 16:04:32 petere Exp $
+ * $Id: libpq.h,v 1.39 2000/07/08 03:04:30 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -15,18 +15,15 @@
 #define LIBPQ_H
 
 #include <sys/types.h>
-
 #include <netinet/in.h>
 
 #include "lib/stringinfo.h"
 #include "libpq/libpq-be.h"
-#include "tcop/dest.h"
-#include "utils/exc.h"
 
 /* ----------------
  * PQArgBlock
  *		Information (pointer to array of this structure) required
- *		for the PQfn() call.
+ *		for the PQfn() call.  (This probably ought to go somewhere else...)
  * ----------------
  */
 typedef struct
@@ -40,101 +37,6 @@ typedef struct
 	}			u;
 } PQArgBlock;
 
-/* ----------------
- * TypeBlock
- *		Information about an attribute.
- * ----------------
- */
-#define NameLength NAMEDATALEN
-
-typedef struct TypeBlock
-{
-	char		name[NAMEDATALEN];		/* name of the attribute */
-	int			typid;			/* typid of the type */
-	int			typlen;			/* typlen of the type */
-} TypeBlock;
-
-/* ----------------
- * TupleBlock
- *		Data of a tuple.
- * ----------------
- */
-#define TupleBlockSize 100
-
-typedef struct TupleBlock
-{
-	char	  **values[TupleBlockSize]; /* an array of tuples */
-	int		   *lengths[TupleBlockSize];		/* an array of length vec.
-												 * foreach tuple */
-	struct TupleBlock *next;	/* next tuple block */
-	int			tuple_index;	/* current tuple index */
-} TupleBlock;
-
-/* ----------------
- * GroupBuffer
- *		A group of tuples with the same attributes.
- * ----------------
- */
-typedef struct GroupBuffer
-{
-	int			no_tuples;		/* number of tuples in this group */
-	int			no_fields;		/* number of attributes */
-	TypeBlock  *types;			/* types of the attributes */
-	TupleBlock *tuples;			/* tuples in this group */
-	struct GroupBuffer *next;	/* next group */
-} GroupBuffer;
-
-/* ----------------
- * PortalBuffer
- *		Data structure of a portal buffer.
- * ----------------
- */
-typedef struct PortalBuffer
-{
-	int			rule_p;			/* 1 if this is an asynchronized portal. */
-	int			no_tuples;		/* number of tuples in this portal buffer */
-	int			no_groups;		/* number of tuple groups */
-	GroupBuffer *groups;		/* linked list of tuple groups */
-} PortalBuffer;
-
-/* ----------------
- * PortalEntry
- *		an entry in the global portal table
- *
- * Note: the portalcxt is only meaningful for PQcalls made from
- *		 within a postgres backend.  frontend apps should ignore it.
- * ----------------
- */
-#define PortalNameLength 32
-
-typedef struct PortalEntry
-{
-	char		name[PortalNameLength]; /* name of this portal */
-	PortalBuffer *portal;		/* tuples contained in this portal */
-	Pointer		portalcxt;		/* memory context (for backend) */
-	Pointer		result;			/* result for PQexec */
-} PortalEntry;
-
-#define PORTALS_INITIAL_SIZE 32
-#define PORTALS_GROW_BY		 32
-
-/* in portalbuf.c */
-extern PortalEntry **portals;
-extern size_t portals_array_size;
-
-/*
- * Exceptions.
- */
-
-#define libpq_raise(X, Y) ExcRaise((Exception *)(X), (ExcDetail) (Y),\
-								   (ExcData)0, (ExcMessage) 0)
-
-/* in portal.c */
-extern Exception MemoryError,
-			PortalError,
-			PostquelError,
-			ProtocolError;
-
 /*
  * PQerrormsg[] is used only for error messages generated within backend
  * libpq, none of which are remarkably long.  Note that this length should
@@ -150,89 +52,6 @@ extern char PQerrormsg[PQERRORMSG_LENGTH];		/* in libpq/util.c */
  * External functions.
  */
 
-/*
- * prototypes for functions in portal.c
- */
-extern void pqdebug(char *target, char *msg);
-extern void pqdebug2(char *target, char *msg1, char *msg2);
-extern void PQtrace(void);
-extern void PQuntrace(void);
-extern int	PQnportals(int rule_p);
-extern void PQpnames(char **pnames, int rule_p);
-extern PortalBuffer *PQparray(char *pname);
-extern int	PQrulep(PortalBuffer *portal);
-extern int	PQntuples(PortalBuffer *portal);
-extern int	PQninstances(PortalBuffer *portal);
-extern int	PQngroups(PortalBuffer *portal);
-extern int	PQntuplesGroup(PortalBuffer *portal, int group_index);
-extern int	PQninstancesGroup(PortalBuffer *portal, int group_index);
-extern int	PQnfieldsGroup(PortalBuffer *portal, int group_index);
-extern int	PQfnumberGroup(PortalBuffer *portal, int group_index, char *field_name);
-extern char *PQfnameGroup(PortalBuffer *portal, int group_index, int field_number);
-extern int PQftypeGroup(PortalBuffer *portal, int group_index,
-			 int field_number);
-extern int PQfsizeGroup(PortalBuffer *portal, int group_index,
-			 int field_number);
-extern GroupBuffer *PQgroup(PortalBuffer *portal, int tuple_index);
-extern int	PQgetgroup(PortalBuffer *portal, int tuple_index);
-extern int	PQnfields(PortalBuffer *portal, int tuple_index);
-extern int	PQfnumber(PortalBuffer *portal, int tuple_index, char *field_name);
-extern char *PQfname(PortalBuffer *portal, int tuple_index, int field_number);
-extern int	PQftype(PortalBuffer *portal, int tuple_index, int field_number);
-extern int	PQfsize(PortalBuffer *portal, int tuple_index, int field_number);
-extern int	PQsametype(PortalBuffer *portal, int tuple_index1, int tuple_index2);
-extern char *PQgetvalue(PortalBuffer *portal, int tuple_index, int field_number);
-extern char *PQgetAttr(PortalBuffer *portal, int tuple_index, int field_number);
-extern int	PQgetlength(PortalBuffer *portal, int tuple_index, int field_number);
-extern void PQclear(char *pname);
-
-/*
- * prototypes for functions in portalbuf.c
- */
-extern caddr_t pbuf_alloc(size_t size);
-extern void pbuf_free(caddr_t pointer);
-extern PortalBuffer *pbuf_addPortal(void);
-extern GroupBuffer *pbuf_addGroup(PortalBuffer *portal);
-extern TypeBlock *pbuf_addTypes(int n);
-extern TupleBlock *pbuf_addTuples(void);
-extern char **pbuf_addTuple(int n);
-extern int *pbuf_addTupleValueLengths(int n);
-extern char *pbuf_addValues(int n);
-extern PortalEntry *pbuf_addEntry(void);
-extern void pbuf_freeEntry(int i);
-extern void pbuf_freeTypes(TypeBlock *types);
-extern void pbuf_freeTuples(TupleBlock *tuples, int no_tuples, int no_fields);
-extern void pbuf_freeGroup(GroupBuffer *group);
-extern void pbuf_freePortal(PortalBuffer *portal);
-extern int	pbuf_getIndex(char *pname);
-extern void pbuf_setportalinfo(PortalEntry *entry, char *pname);
-extern PortalEntry *pbuf_setup(char *pname);
-extern void pbuf_close(char *pname);
-extern GroupBuffer *pbuf_findGroup(PortalBuffer *portal, int group_index);
-extern int	pbuf_findFnumber(GroupBuffer *group, char *field_name);
-extern void pbuf_checkFnumber(GroupBuffer *group, int field_number);
-extern char *pbuf_findFname(GroupBuffer *group, int field_number);
-
-/* in be-dumpdata.c */
-extern void be_portalinit(void);
-extern void be_portalpush(PortalEntry *entry);
-extern PortalEntry *be_portalpop(void);
-extern PortalEntry *be_currentportal(void);
-extern PortalEntry *be_newportal(void);
-extern void be_typeinit(PortalEntry *entry, TupleDesc attrs,
-			int natts);
-extern void be_printtup(HeapTuple tuple, TupleDesc typeinfo,
-			DestReceiver *self);
-
-
-/* in be-pqexec.c */
-extern char *PQfn(int fnid, int *result_buf, int result_len, int result_is_int,
-	 PQArgBlock *args, int nargs);
-extern char *PQexec(char *query);
-extern int	pqtest_PQexec(char *q);
-extern int	pqtest_PQfn(char *q);
-extern int32 pqtest(struct varlena * vlena);
-
 /*
  * prototypes for functions in pqcomm.c
  */
@@ -250,4 +69,11 @@ extern int	pq_putmessage(char msgtype, const char *s, size_t len);
 extern void pq_startcopyout(void);
 extern void pq_endcopyout(bool errorAbort);
 
+/*
+ * prototypes for functions in util.c
+ */
+extern void pqdebug(char *fmt, char *msg);
+extern void PQtrace(void);
+extern void PQuntrace(void);
+
 #endif	 /* LIBPQ_H */
diff --git a/src/include/tcop/dest.h b/src/include/tcop/dest.h
index e601cb4bc9c2e301625c833bab79fefbbd43f033..1cff3a78bb1db7d08a89cd1d1baf6dc31f8e8c00 100644
--- a/src/include/tcop/dest.h
+++ b/src/include/tcop/dest.h
@@ -2,22 +2,16 @@
  *
  * dest.h
  *		Whenever the backend executes a query, the results
- *		have to go someplace - either to the standard output,
- *		to a local portal buffer or to a remote portal buffer.
+ *		have to go someplace.
  *
  *	  - stdout is the destination only when we are running a
  *		backend without a postmaster and are returning results
- *		back to the user.
+ *		back to an interactive user.
  *
- *	  - a local portal buffer is the destination when a backend
- *		executes a user-defined function which calls PQexec() or
- *		PQfn().  In this case, the results are collected into a
- *		PortalBuffer which the user's function may diddle with.
- *
- *	  - a remote portal buffer is the destination when we are
+ *	  - a remote process is the destination when we are
  *		running a backend with a frontend and the frontend executes
  *		PQexec() or PQfn().  In this case, the results are sent
- *		to the frontend via the pq_ functions.
+ *		to the frontend via the functions in backend/libpq.
  *
  *	  - None is the destination when the system executes
  *		a query internally.  This is not used now but it may be
@@ -45,7 +39,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: dest.h,v 1.23 2000/01/26 05:58:35 momjian Exp $
+ * $Id: dest.h,v 1.24 2000/07/08 03:04:33 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -63,7 +57,6 @@ typedef enum
 {
 	None,						/* results are discarded */
 	Debug,						/* results go to debugging output */
-	Local,						/* results go in local portal buffer */
 	Remote,						/* results sent to frontend process */
 	RemoteInternal,				/* results sent to frontend process in
 								 * internal (binary) form */
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index eedc97663022ae9be33b3e534bf4ce667a7bb099..e2c66f513d5466cdf4d433ab1f610511457aa8e7 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: builtins.h,v 1.121 2000/07/07 19:24:43 petere Exp $
+ * $Id: builtins.h,v 1.122 2000/07/08 03:04:36 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -184,14 +184,6 @@ extern Datum rt_poly_size(PG_FUNCTION_ARGS);
 extern POLYGON *rt_poly_union(POLYGON *a, POLYGON *b);
 extern POLYGON *rt_poly_inter(POLYGON *a, POLYGON *b);
 
-/* projection utilities */
-/* extern char *GetAttributeByName();
-   extern char *GetAttributeByNum(); ,
- in executor/executor.h*/
-
-
-extern int32 pqtest(struct varlena * vlena);
-
 /* arrayfuncs.c */
 
 /* filename.c */