diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index 4efa13635aa54c866898e74eb2fbd917887daa7e..dd2809181658ce1a523e31bcf2580caf7e799222 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -6,7 +6,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.74 1999/04/25 03:19:09 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.75 1999/05/03 19:09:38 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1061,7 +1061,7 @@ GetIndexRelations(Oid main_relation_oid,
 	}
 }
 
-#define EXT_ATTLEN 5*8192
+#define EXT_ATTLEN 5*BLCKSZ
 
 /*
    returns 1 is c is in s
diff --git a/src/backend/libpq/be-fsstubs.c b/src/backend/libpq/be-fsstubs.c
index 66320cd54d2ceddffa4c5a91512b92d9a7b0690d..46c75f932e50805a2b91a3e9c0dcab57373528a2 100644
--- a/src/backend/libpq/be-fsstubs.c
+++ b/src/backend/libpq/be-fsstubs.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/libpq/be-fsstubs.c,v 1.28 1999/02/13 23:15:41 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/libpq/be-fsstubs.c,v 1.29 1999/05/03 19:09:39 momjian Exp $
  *
  * NOTES
  *	  This should be moved to a more appropriate place.  It is here
@@ -44,7 +44,9 @@
 /* [PA] is Pascal André <andre@via.ecp.fr> */
 
 /*#define FSDB 1*/
-#define MAX_LOBJ_FDS 256
+#define MAX_LOBJ_FDS	256
+#define BUFSIZE			1024
+#define FNAME_BUFSIZE	8192
 
 static LargeObjectDesc *cookies[MAX_LOBJ_FDS];
 
@@ -257,9 +259,8 @@ lo_import(text *filename)
 	int			nbytes,
 				tmp;
 
-#define BUFSIZE		   1024
 	char		buf[BUFSIZE];
-	char		fnamebuf[8192];
+	char		fnamebuf[FNAME_BUFSIZE];
 	LargeObjectDesc *lobj;
 	Oid			lobjOid;
 
@@ -324,9 +325,8 @@ lo_export(Oid lobjId, text *filename)
 	int			nbytes,
 				tmp;
 
-#define BUFSIZE		   1024
 	char		buf[BUFSIZE];
-	char		fnamebuf[8192];
+	char		fnamebuf[FNAME_BUFSIZE];
 	LargeObjectDesc *lobj;
 	mode_t		oumask;
 
diff --git a/src/backend/parser/Makefile b/src/backend/parser/Makefile
index 8fb817c91ff76dc8d9a74ff243f0cef279a5b74a..b9e955e8523de3dbf997c3444477a535ee1e7249 100644
--- a/src/backend/parser/Makefile
+++ b/src/backend/parser/Makefile
@@ -4,7 +4,7 @@
 #    Makefile for parser
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/backend/parser/Makefile,v 1.19 1998/07/26 04:30:30 scrappy Exp $
+#    $Header: /cvsroot/pgsql/src/backend/parser/Makefile,v 1.20 1999/05/03 19:09:40 momjian Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -37,7 +37,9 @@ gram.c parse.h: gram.y
 
 scan.c:	scan.l
 	$(LEX) $<
-	mv lex.yy.c scan.c
+	sed -e 's/#define YY_BUF_SIZE .*/#define YY_BUF_SIZE 65536/' \
+		<lex.yy.c >scan.c
+	rm -f lex.yy.c
 
 # The following dependencies on parse.h are computed by
 # make depend, but we state them here explicitly anyway because 
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 86f737179a36d90b936af33680337ee5ac6bcd7b..b3836e0191d204410a653b2545918b22c1496203 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.71 1999/04/27 13:33:43 wieck Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.72 1999/05/03 19:09:41 momjian Exp $
  *
  * HISTORY
  *	  AUTHOR			DATE			MAJOR EVENT
@@ -3290,7 +3290,6 @@ Typename:  Array opt_array_bounds
 					else
 						$$->setof = FALSE;
 				}
-		| Character
 		| SETOF Array
 				{
 					$$ = $2;
@@ -3301,6 +3300,7 @@ Typename:  Array opt_array_bounds
 Array:  Generic
 		| Datetime
 		| Numeric
+		| Character
 		;
 
 Generic:  generic
@@ -3425,10 +3425,6 @@ opt_decimal:  '(' Iconst ',' Iconst ')'
 
 /* SQL92 character data types
  * The following implements CHAR() and VARCHAR().
- * We do it here instead of the 'Generic' production
- * because we don't want to allow arrays of VARCHAR().
- * I haven't thought about whether that will work or not.
- *								- ay 6/95
  */
 Character:  character '(' Iconst ')'
 				{
diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l
index f87a124f0920b9f4d5c6b6f60a4354ad5533a1f2..d50ee9c62d8ecb8621141bbc6547c799410f8e1e 100644
--- a/src/backend/parser/scan.l
+++ b/src/backend/parser/scan.l
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.47 1999/03/17 20:17:13 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.48 1999/05/03 19:09:42 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -32,6 +32,11 @@
 #include "parse.h"
 #include "utils/builtins.h"
 
+#ifdef  YY_READ_BUF_SIZE
+#undef  YY_READ_BUF_SIZE
+#endif
+#define YY_READ_BUF_SIZE	MAX_PARSE_BUFFER
+
 extern char *parseString;
 static char *parseCh;
 
diff --git a/src/backend/port/hpux/fixade.h b/src/backend/port/hpux/fixade.h
index 8a96ad7cf29462a56f9eea94832ad280a67298be..d76c8c256e0d2482c9626382909978ac28a9615d 100644
--- a/src/backend/port/hpux/fixade.h
+++ b/src/backend/port/hpux/fixade.h
@@ -7,7 +7,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: fixade.h,v 1.5 1999/02/13 23:17:33 momjian Exp $
+ * $Id: fixade.h,v 1.6 1999/05/03 19:09:44 momjian Exp $
  *
  *	 NOTES
  *		This must be included in EVERY source file.
@@ -47,11 +47,11 @@
  */
 struct HP_WAY_BOGUS
 {
-	char		hpwb_bogus[8192];
+	char		hpwb_bogus[8191+1];
 };
 struct HP_TOO_BOGUS
 {
-	int			hptb_bogus[8192];
+	int			hptb_bogus[8191+1];
 };
 
 #endif	 /* BROKEN_STRUCT_INIT */
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 7e596fcc4804816c40e51356b4751436ed92d119..f196e51eaf0de775777151a6178bc0d8f5fadf49 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.109 1999/05/01 17:16:25 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.110 1999/05/03 19:09:54 momjian Exp $
  *
  * NOTES
  *	  this is the "main" module of the postgres backend and
@@ -452,14 +452,14 @@ pg_parse_and_plan(char *query_string,	/* string to execute */
 			else
 			{
 				/* Print condensed query string to fit in one log line */
-				char		buff[8192 + 1];
+				char		buff[MAX_QUERY_SIZE + 1];
 				char		c,
 						   *s,
 						   *d;
 				int			n,
 							is_space = 1;
 
-				for (s = query_string, d = buff, n = 0; (c = *s) && (n < 8192); s++)
+				for (s = query_string, d = buff, n = 0; (c = *s) && (n < MAX_QUERY_SIZE); s++)
 				{
 					switch (c)
 					{
@@ -1539,7 +1539,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
 	if (!IsUnderPostmaster)
 	{
 		puts("\nPOSTGRES backend interactive interface ");
-		puts("$Revision: 1.109 $ $Date: 1999/05/01 17:16:25 $\n");
+		puts("$Revision: 1.110 $ $Date: 1999/05/03 19:09:54 $\n");
 	}
 
 	/* ----------------
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index a4f1842e5f9362ed0642054d269227eadfa779e1..f8fe7e42229878276d4c7b4f0bdd4d871a15175c 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/utils/adt/arrayfuncs.c,v 1.38 1999/02/13 23:19:00 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/adt/arrayfuncs.c,v 1.39 1999/05/03 19:09:59 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -15,6 +15,7 @@
 #include <ctype.h>
 #include <stdio.h>
 #include <string.h>
+#include <stdarg.h>
 
 #include "postgres.h"
 
@@ -26,6 +27,7 @@
 #include "storage/fd.h"
 #include "fmgr.h"
 #include "utils/array.h"
+#include "utils/elog.h"
 
 #include "libpq/libpq-fs.h"
 #include "libpq/be-fsstubs.h"
@@ -614,7 +616,9 @@ array_out(ArrayType *v, Oid element_type)
 				i,
 				j,
 				k,
+#ifndef TCL_ARRAYS
 				l,
+#endif
 				indx[MAXDIM];
 	bool		dummy_bool;
 	int			ndim,
@@ -1274,6 +1278,156 @@ array_assgn(ArrayType *array,
 	return (char *) array;
 }
 
+/*
+ * array_map()
+ *
+ * Map an arbitrary function to an array and return a new array with
+ * same dimensions and the source elements transformed by fn().
+ */
+ArrayType *
+array_map(ArrayType *v,
+		  Oid type,
+		  char *(fn)(char *p, ...),
+		  Oid retType,
+		  int nargs,
+		  ...)
+{
+	ArrayType   *result;
+	void		*args[4];
+	char		**values;
+	char		*elt;
+	int			*dim;
+	int			ndim;
+	int			nitems;
+	int			i;
+	int			nbytes = 0;
+	int			inp_typlen;
+	bool		inp_typbyval;
+	int			typlen;
+	bool		typbyval;
+	char		typdelim;
+	Oid			typelem;
+	Oid			proc;
+	char	 	typalign;
+	char		*s;
+	char		*p;
+	va_list		ap;
+
+	/* Large objects not yet supported */
+	if (ARR_IS_LO(v) == true) {
+		elog(ERROR, "array_map: large objects not supported");
+	}
+
+	/* Check nargs */
+	if ((nargs < 0) || (nargs > 4)) {
+		elog(ERROR, "array_map: invalid nargs: %d", nargs);
+	}
+
+	/* Copy extra args to local variable */
+	va_start(ap, nargs);
+	for (i=0; i<nargs; i++) {
+		args[i] = (void *) va_arg(ap, char *);
+	}
+	va_end(ap);
+
+	/* Lookup source and result types. Unneeded variables are reused. */
+	system_cache_lookup(type, false, &inp_typlen, &inp_typbyval,
+						&typdelim, &typelem, &proc, &typalign);
+	system_cache_lookup(retType, false, &typlen, &typbyval,
+						&typdelim, &typelem, &proc, &typalign);
+
+	/* Allocate temporary array for new values */
+	ndim   = ARR_NDIM(v);
+	dim    = ARR_DIMS(v);
+	nitems = getNitems(ndim, dim);
+	values = (char **) palloc(nitems * sizeof(char *));
+	MemSet(values, 0, nitems * sizeof(char *));
+
+	/* Loop over source data */
+	s = (char *) ARR_DATA_PTR(v);
+	for (i=0; i<nitems; i++) {
+		/* Get source element */
+		if (inp_typbyval) {
+			switch (inp_typlen) {
+			case 1:
+				elt = (char *) ((int) (*(char *) s));
+				break;
+			case 2:
+				elt = (char *) ((int) (*(int16 *) s));
+				break;
+			case 3:
+			case 4:
+			default:
+				elt = (char *) (*(int32 *) s);
+				break;
+			}
+			s += inp_typlen;
+		} else {
+			elt = s;
+			if (inp_typlen > 0) {
+				s += inp_typlen;
+			} else {
+				s += INTALIGN(*(int32 *) s);
+			}
+		}
+
+		/*
+		 * Apply the given function to source elt and extra args.
+		 * nargs is the number of extra args taken by fn().
+		 */
+		switch (nargs) {
+		case 0:
+			p = (char *) (*fn) (elt);
+			break;
+		case 1:
+			p = (char *) (*fn) (elt, args[0]);
+			break;
+		case 2:
+			p = (char *) (*fn) (elt, args[0], args[1]);
+			break;
+		case 3:
+			p = (char *) (*fn) (elt, args[0], args[1], args[2]);
+			break;
+		case 4:
+		default:
+			p = (char *) (*fn) (elt, args[0], args[1], args[2], args[3]);
+			break;
+		}
+
+		/* Update values and total result size */
+		if (typbyval) {
+			values[i] = (char *) p;
+			nbytes += typlen;
+		} else {
+			int len;
+			len = ((typlen > 0) ? typlen : INTALIGN(*(int32 *) p));
+			/* Needed because _CopyArrayEls tries to pfree items */
+			if (p == elt) {
+				p = (char *) palloc(len);
+				memcpy(p, elt, len);
+			}
+			values[i] = (char *) p;
+			nbytes += len;
+		}
+	}
+
+	/* Allocate and initialize the result array */
+	nbytes += ARR_OVERHEAD(ndim);
+	result = (ArrayType *) palloc(nbytes);
+	MemSet(result, 0, nbytes);
+
+	memcpy((char *) result, (char *) &nbytes, sizeof(int));
+	memcpy((char *) ARR_NDIM_PTR(result), (char *) &ndim, sizeof(int));
+	memcpy((char *) ARR_DIMS(result), ARR_DIMS(v), 2 * ndim * sizeof(int));
+
+	/* Copy new values into the result array. values is pfreed. */
+	_CopyArrayEls((char **) values,
+				  ARR_DATA_PTR(result), nitems,
+				  typlen, typalign, typbyval);
+
+	return result;
+}
+
 /*-----------------------------------------------------------------------------
  * array_eq :
  *		  compares two arrays for equality
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 39ae06324839b1c5b32c45228fcb6c9a2767507a..4d88413a8e429b29f76b81600563a7654d74faf3 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -3,7 +3,7 @@
  *			  out of it's tuple
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.9 1999/04/29 15:52:01 wieck Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.10 1999/05/03 19:10:01 momjian Exp $
  *
  *	  This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -57,6 +57,7 @@
 #include "catalog/pg_opclass.h"
 #include "fmgr.h"
 
+#define BUFSIZE	8192
 
 /* ----------
  * Local data types
@@ -331,8 +332,8 @@ pg_get_indexdef(Oid indexrelid)
 	int		spirc;
 	int		len;
 	int		keyno;
-	char		buf[8192];
-	char		keybuf[8192];
+	char		buf[BUFSIZE];
+	char		keybuf[BUFSIZE];
 	char		*sep;
 
 	/* ----------
@@ -603,7 +604,7 @@ make_ruledef(HeapTuple ruletup, TupleDesc rulettc)
 	 * Allocate space for the returned rule definition text
 	 * ----------
 	 */
-	buf = palloc(8192);
+	buf = palloc(BUFSIZE);
 
 	/* ----------
 	 * Get the attribute values from the rules tuple
@@ -746,7 +747,7 @@ make_ruledef(HeapTuple ruletup, TupleDesc rulettc)
 static char *
 make_viewdef(HeapTuple ruletup, TupleDesc rulettc)
 {
-	char		buf[8192];
+	char		buf[BUFSIZE];
 	Query	   *query;
 	char		ev_type;
 	Oid			ev_class;
@@ -854,7 +855,7 @@ get_query_def(Query *query, QryHier *parentqh)
 static char *
 get_select_query_def(Query *query, QryHier *qh)
 {
-	char		buf[8192];
+	char		buf[BUFSIZE];
 	char	   *sep;
 	TargetEntry *tle;
 	RangeTblEntry *rte;
@@ -1024,7 +1025,7 @@ get_select_query_def(Query *query, QryHier *qh)
 static char *
 get_insert_query_def(Query *query, QryHier *qh)
 {
-	char		buf[8192];
+	char		buf[BUFSIZE];
 	char	   *sep;
 	TargetEntry *tle;
 	RangeTblEntry *rte;
@@ -1134,7 +1135,7 @@ get_insert_query_def(Query *query, QryHier *qh)
 static char *
 get_update_query_def(Query *query, QryHier *qh)
 {
-	char		buf[8192];
+	char		buf[BUFSIZE];
 	char	   *sep;
 	TargetEntry *tle;
 	RangeTblEntry *rte;
@@ -1187,7 +1188,7 @@ get_update_query_def(Query *query, QryHier *qh)
 static char *
 get_delete_query_def(Query *query, QryHier *qh)
 {
-	char		buf[8192];
+	char		buf[BUFSIZE];
 	RangeTblEntry *rte;
 
 	/* ----------
@@ -1221,7 +1222,7 @@ get_delete_query_def(Query *query, QryHier *qh)
 static char *
 get_rule_expr(QryHier *qh, int rt_index, Node *node, bool varprefix)
 {
-	char		buf[8192];
+	char		buf[BUFSIZE];
 
 	if (node == NULL)
 		return pstrdup("");
@@ -1408,7 +1409,7 @@ get_rule_expr(QryHier *qh, int rt_index, Node *node, bool varprefix)
 static char *
 get_func_expr(QryHier *qh, int rt_index, Expr *expr, bool varprefix)
 {
-	char		buf[8192];
+	char		buf[BUFSIZE];
 	HeapTuple	proctup;
 	Form_pg_proc procStruct;
 	List	   *l;
@@ -1564,7 +1565,7 @@ get_const_expr(Const *constval)
 	FmgrInfo	finfo_output;
 	char	   *extval;
 	bool		isnull = FALSE;
-	char		buf[8192];
+	char		buf[BUFSIZE];
 	char		namebuf[64];
 
 	if (constval->constisnull)
@@ -1601,7 +1602,7 @@ get_sublink_expr(QryHier *qh, int rt_index, Node *node, bool varprefix)
 	Expr       *expr;
 	List	   *l;
 	char	   *sep;
-	char       buf[8192];
+	char       buf[BUFSIZE];
 
 	buf[0] = '\0';
 
diff --git a/src/backend/utils/adt/varchar.c b/src/backend/utils/adt/varchar.c
index 8a06e6f4fd0cd4ce3c9a755798ae9149d45cf0ab..0aa8133b1319a85a01fc9ad775a343010c1bc438 100644
--- a/src/backend/utils/adt/varchar.c
+++ b/src/backend/utils/adt/varchar.c
@@ -7,14 +7,16 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.43 1999/02/13 23:19:35 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.44 1999/05/03 19:10:02 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include <stdio.h>				/* for sprintf() */
 #include <string.h>
 #include "postgres.h"
+#include "utils/array.h"
 #include "utils/builtins.h"
+#include "catalog/pg_type.h"
 
 #ifdef CYR_RECODE
 char	   *convertstr(char *, int, int);
@@ -200,6 +202,16 @@ bpchar(char *s, int32 len)
 	return result;
 }	/* bpchar() */
 
+/* _bpchar()
+ * Converts an array of char() type to a specific internal length.
+ * len is the length specified in () plus VARHDRSZ bytes.
+ */
+ArrayType *
+_bpchar(ArrayType *v, int32 len)
+{
+	return array_map(v, BPCHAROID, bpchar, BPCHAROID, 1, len);
+}
+
 
 /* bpchar_char()
  * Convert bpchar(1) to char.
@@ -396,6 +408,16 @@ varchar(char *s, int32 slen)
 	return result;
 }	/* varchar() */
 
+/* _varchar()
+ * Converts an array of varchar() type to the specified size.
+ * len is the length specified in () plus VARHDRSZ bytes.
+ */
+ArrayType *
+_varchar(ArrayType *v, int32 len)
+{
+	return array_map(v, VARCHAROID, varchar, VARCHAROID, 1, len);
+}
+
 
 /*****************************************************************************
  *	Comparison Functions used for bpchar
diff --git a/src/bin/psql/psql.c b/src/bin/psql/psql.c
index df0e9f425ba131caad4615bd393b56e37f6d1af6..6644da87ea808bc5eb92db14094d2636cffaa9db 100644
--- a/src/bin/psql/psql.c
+++ b/src/bin/psql/psql.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.176 1999/04/25 23:10:36 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.177 1999/05/03 19:10:08 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -115,7 +115,7 @@ static	char	   *has_client_encoding = 0;
 #define CMD_TERMINATE	2
 #define CMD_NEWEDIT		3
 
-#define MAX_QUERY_BUFFER 20000
+#define MAX_QUERY_BUFFER MAX_QUERY_SIZE
 
 #define COPYBUFSIZ	8192
 
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 76f9bbf816087972e592e86a656a46a2dcddef53..5b5687dfbd36a0b311d9e82576a6b259e24b182e 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_proc.h,v 1.96 1999/04/20 03:51:13 tgl Exp $
+ * $Id: pg_proc.h,v 1.97 1999/05/03 19:10:18 momjian Exp $
  *
  * NOTES
  *	  The script catalog/genbki.sh reads this file and generates .bki
@@ -1553,6 +1553,11 @@ DESCR("convert int8 to text");
 DATA(insert OID = 1289 (  text_int8		   PGUID 11 f t f 1 f 20 "25" 100 0 0 100  text_int8 - ));
 DESCR("convert text to int8");
 
+DATA(insert OID = 1290 (  _bpchar		   PGUID 11 f t f 2 f 1014 "1014 23" 100 0 0 100  _bpchar - ));
+DESCR("truncate _char()");
+DATA(insert OID = 1291 (  _varchar		   PGUID 11 f t f 2 f 1015 "1015 23" 100 0 0 100  _varchar - ));
+DESCR("truncate _varchar()");
+
 DATA(insert OID = 1297 (  timestamp_in	   PGUID 11 f t f 1 f 1296 "0" 100 0 0 100	timestamp_in - ));
 DESCR("(internal)");
 DATA(insert OID = 1298 (  timestamp_out    PGUID 11 f t f 1 f	23 "0" 100 0 0 100	timestamp_out - ));
diff --git a/src/include/catalog/pg_type.h b/src/include/catalog/pg_type.h
index 49d5e01183230d0d19a659b4aa5e78274b735ad5..aa8d703ad2ce47f51a61de12fc9a53f363bc2efa 100644
--- a/src/include/catalog/pg_type.h
+++ b/src/include/catalog/pg_type.h
@@ -7,7 +7,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_type.h,v 1.58 1999/03/28 02:01:39 tgl Exp $
+ * $Id: pg_type.h,v 1.59 1999/05/03 19:10:20 momjian Exp $
  *
  * NOTES
  *	  the genbki.sh script reads this file and generates .bki
@@ -327,6 +327,8 @@ DATA(insert OID = 1010 (  _tid		 PGUID -1  -1 f b t \054 0	27 array_in array_out
 DATA(insert OID = 1011 (  _xid		 PGUID -1  -1 f b t \054 0	28 array_in array_out array_in array_out i _null_ ));
 DATA(insert OID = 1012 (  _cid		 PGUID -1  -1 f b t \054 0	29 array_in array_out array_in array_out i _null_ ));
 DATA(insert OID = 1013 (  _oid8		 PGUID -1  -1 f b t \054 0	30 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1014 (  _bpchar	 PGUID -1  -1 f b t \054 0 1042 array_in array_out array_in array_out i _null_ ));
+DATA(insert OID = 1015 (  _varchar	 PGUID -1  -1 f b t \054 0 1043 array_in array_out array_in array_out i _null_ ));
 DATA(insert OID = 1017 (  _point	 PGUID -1  -1 f b t \054 0 600 array_in array_out array_in array_out d _null_ ));
 DATA(insert OID = 1018 (  _lseg		 PGUID -1  -1 f b t \054 0 601 array_in array_out array_in array_out d _null_ ));
 DATA(insert OID = 1019 (  _path		 PGUID -1  -1 f b t \054 0 602 array_in array_out array_in array_out d _null_ ));
diff --git a/src/include/libpq/pqcomm.h b/src/include/libpq/pqcomm.h
index 53542993d870461bfe55736c44c90e255fb325a7..12024b720f4ea307805f2dde2c9c945ac23f70ca 100644
--- a/src/include/libpq/pqcomm.h
+++ b/src/include/libpq/pqcomm.h
@@ -8,7 +8,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pqcomm.h,v 1.34 1999/04/25 03:19:13 tgl Exp $
+ * $Id: pqcomm.h,v 1.35 1999/05/03 19:10:24 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -27,6 +27,11 @@
 #include <netinet/in.h>
 #endif
 
+/*
+ * Internal send/receive buffers in libpq.
+ */
+#define PQ_BUFFER_SIZE 8192
+
 /* Define a generic socket address type. */
 
 typedef union SockAddr
diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h
index fa5397f070e8303de39ffaa81e48a36b5c1ecd98..1cec52a1a89629679585e1dba20f9a7b9456b3f4 100644
--- a/src/include/miscadmin.h
+++ b/src/include/miscadmin.h
@@ -11,7 +11,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: miscadmin.h,v 1.36 1999/03/17 22:53:30 momjian Exp $
+ * $Id: miscadmin.h,v 1.37 1999/05/03 19:10:09 momjian Exp $
  *
  * NOTES
  *	  some of the information in this file will be moved to
@@ -100,7 +100,8 @@ extern int	SortMem;
 
 extern Oid	LastOidProcessed;	/* for query rewrite */
 
-#define MAX_PARSE_BUFFER 8192
+/* #define MAX_QUERY_SIZE	 (BLCKSZ*2) */
+#define MAX_PARSE_BUFFER MAX_QUERY_SIZE
 
 /*
  *		default number of buffers in buffer pool
diff --git a/src/include/postgres.h b/src/include/postgres.h
index ab57059295f081fab5da4edcfc4a218e2b091fd5..1edaf853988c4f5102c72ef26541ccfdc8cbf438 100644
--- a/src/include/postgres.h
+++ b/src/include/postgres.h
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1995, Regents of the University of California
  *
- * $Id: postgres.h,v 1.21 1999/03/25 03:49:28 tgl Exp $
+ * $Id: postgres.h,v 1.22 1999/05/03 19:10:14 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -151,6 +151,7 @@ typedef uint32 CommandId;
  * ----------------
  */
 #define MAXPGPATH		128
+#define MAX_QUERY_SIZE	(BLCKSZ*2)
 
 #define STATUS_OK				(0)
 #define STATUS_ERROR			(-1)
diff --git a/src/include/utils/array.h b/src/include/utils/array.h
index 833727e07fb276d37ecdf9a54b05dfc310ad0018..7ea945bf5fb38e8997f45e3087e203facd5c8329 100644
--- a/src/include/utils/array.h
+++ b/src/include/utils/array.h
@@ -10,7 +10,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: array.h,v 1.15 1999/02/13 23:22:15 momjian Exp $
+ * $Id: array.h,v 1.16 1999/05/03 19:10:25 momjian Exp $
  *
  * NOTES
  *	  XXX the data array should be LONGALIGN'd -- notice that the array
@@ -103,7 +103,7 @@ typedef struct
 #define RETURN_NULL {*isNull = true; return(0); }
  /* #endif *//* irix5 */
 #define NAME_LEN	30
-#define MAX_BUFF_SIZE (1 << 13)
+#define MAX_BUFF_SIZE BLCKSZ
 
 typedef struct
 {
@@ -126,6 +126,8 @@ extern char *array_set(ArrayType *array, int n, int *indx, char *dataPtr,
 extern char *array_assgn(ArrayType *array, int n, int *upperIndx,
 			int *lowerIndx, ArrayType *newArr, int reftype,
 			int len, bool *isNull);
+extern ArrayType *array_map(ArrayType *v, Oid type, char *(fn)(char *p, ...),
+							Oid retType, int nargs, ...);
 extern int	array_eq(ArrayType *array1, ArrayType *array2);
 extern int _LOtransfer(char **destfd, int size, int nitems, char **srcfd,
 			int isSrcLO, int isDestLO);
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
index 47dbef4c67b8f7099aa88eff07f205b517e28060..71fb63c77fe77b502e94f99441eb1db46bc793c7 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: builtins.h,v 1.77 1999/03/15 03:24:31 tgl Exp $
+ * $Id: builtins.h,v 1.78 1999/05/03 19:10:31 momjian Exp $
  *
  * NOTES
  *	  This should normally only be included by fmgr.h.
@@ -23,6 +23,7 @@
 #define BUILTINS_H
 
 #include <storage/itemptr.h>
+#include <utils/array.h>
 #include <utils/geo_decls.h>
 #include <utils/datetime.h>
 #include <utils/nabstime.h>
@@ -411,6 +412,7 @@ time_t		datetime_timestamp(DateTime *datetime);
 extern char *bpcharin(char *s, int dummy, int32 atttypmod);
 extern char *bpcharout(char *s);
 extern char *bpchar(char *s, int32 slen);
+extern ArrayType *_bpchar(ArrayType *v, int32 slen);
 extern char *char_bpchar(int32 c);
 extern int32 bpchar_char(char *s);
 extern char *name_bpchar(NameData *s);
@@ -429,6 +431,7 @@ extern uint32 hashbpchar(struct varlena * key);
 extern char *varcharin(char *s, int dummy, int32 atttypmod);
 extern char *varcharout(char *s);
 extern char *varchar(char *s, int32 slen);
+extern ArrayType *_varchar(ArrayType *v, int32 slen);
 extern bool varchareq(char *arg1, char *arg2);
 extern bool varcharne(char *arg1, char *arg2);
 extern bool varcharlt(char *arg1, char *arg2);
diff --git a/src/interfaces/ecpg/preproc/Makefile b/src/interfaces/ecpg/preproc/Makefile
index e2025adccac5441330b5c15741d96e6cfd7e44e0..6952b078f84e10ee86f92a745148e895a299eb94 100644
--- a/src/interfaces/ecpg/preproc/Makefile
+++ b/src/interfaces/ecpg/preproc/Makefile
@@ -38,7 +38,9 @@ ecpg: $(OBJ)
 
 pgc.c: pgc.l
 	$(LEX) $<
-	mv lex.yy.c pgc.c
+	sed -e 's/#define YY_BUF_SIZE .*/#define YY_BUF_SIZE 65536/' \
+		<lex.yy.c >pgc.c
+	rm -f lex.yy.c
 
 preproc.o : preproc.h ../include/ecpgtype.h keywords.c c_keywords.c ecpg_keywords.c
 type.o : ../include/ecpgtype.h
diff --git a/src/interfaces/ecpg/preproc/pgc.l b/src/interfaces/ecpg/preproc/pgc.l
index 0ae219097855a4209407dda01f8babc0f29d5b02..44542cb83bf7b1982bb42579c8de3bffc760bfcf 100644
--- a/src/interfaces/ecpg/preproc/pgc.l
+++ b/src/interfaces/ecpg/preproc/pgc.l
@@ -28,6 +28,11 @@
 #include "preproc.h"
 #include "utils/builtins.h"
 
+#ifdef  YY_READ_BUF_SIZE
+#undef  YY_READ_BUF_SIZE
+#endif
+#define YY_READ_BUF_SIZE	MAX_PARSE_BUFFER
+
 /* some versions of lex define this as a macro */
 #if defined(yywrap)
 #undef yywrap
diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
index cfc3e36b7f98d86ad0bf9ab448016673b12dae4a..fb78b1ee37106482420b9ab83de0455508e9e56a 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.95 1999/03/29 08:19:36 ishii Exp $
+ *	  $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.96 1999/05/03 19:10:40 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -876,9 +876,9 @@ makeEmptyPGconn(void)
 	conn->asyncStatus = PGASYNC_IDLE;
 	conn->notifyList = DLNewList();
 	conn->sock = -1;
-	conn->inBufSize = 8192;
+	conn->inBufSize = PQ_BUFFER_SIZE;
 	conn->inBuffer = (char *) malloc(conn->inBufSize);
-	conn->outBufSize = 8192;
+	conn->outBufSize = PQ_BUFFER_SIZE;
 	conn->outBuffer = (char *) malloc(conn->outBufSize);
 	if (conn->inBuffer == NULL || conn->outBuffer == NULL)
 	{
diff --git a/src/interfaces/libpq/fe-print.c b/src/interfaces/libpq/fe-print.c
index fa358c70d4ef8ac9ce13476ed735d38786a80bb6..25e58bc9501bdeb6dd655cdd10b44b2e124914b3 100644
--- a/src/interfaces/libpq/fe-print.c
+++ b/src/interfaces/libpq/fe-print.c
@@ -9,7 +9,7 @@
  * didn't really belong there.
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-print.c,v 1.21 1999/04/25 18:16:47 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-print.c,v 1.22 1999/05/03 19:10:41 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -105,7 +105,7 @@ PQprint(FILE *fout,
 		int			usePipe = 0;
 		pqsigfunc	oldsigpipehandler = NULL;
 		char	   *pagerenv;
-		char		buf[8192 * 2 + 1];
+		char		buf[MAX_QUERY_SIZE + 1];
 
 		nTups = PQntuples(res);
 		if (!(fieldNames = (char **) calloc(nFields, sizeof(char *))))
diff --git a/src/interfaces/libpq/libpq-int.h b/src/interfaces/libpq/libpq-int.h
index dfc4dba8500a20c672786cd9781c72c86130ce61..aaeffa3459a2cad4c2fa2230686ebd952f42f7da 100644
--- a/src/interfaces/libpq/libpq-int.h
+++ b/src/interfaces/libpq/libpq-int.h
@@ -11,7 +11,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: libpq-int.h,v 1.6 1999/02/13 23:22:42 momjian Exp $
+ * $Id: libpq-int.h,v 1.7 1999/05/03 19:10:42 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -255,7 +255,7 @@ extern int	pqFlush(PGconn *conn);
 extern int	pqWait(int forRead, int forWrite, PGconn *conn);
 
 /* max length of message to send  */
-#define MAX_MESSAGE_LEN 8193
+#define MAX_MESSAGE_LEN MAX_QUERY_SIZE
 
 /* maximum number of fields in a tuple */
 #define MAX_FIELDS 512
diff --git a/src/interfaces/odbc/info.c b/src/interfaces/odbc/info.c
index 9e019dbba3c4d6f1942a92da50a2e79e85062756..d18620f69be94cdc8168382fd2920374986cab78 100644
--- a/src/interfaces/odbc/info.c
+++ b/src/interfaces/odbc/info.c
@@ -337,7 +337,7 @@ RETCODE result;
 
     case SQL_MAX_ROW_SIZE: /* ODBC 2.0 */
 		len = 4;
-        value = 8192;
+        value = BLCKSZ;
         break;
 
     case SQL_MAX_ROW_SIZE_INCLUDES_LONG: /* ODBC 2.0 */
@@ -348,9 +348,9 @@ RETCODE result;
         break;
 
     case SQL_MAX_STATEMENT_LEN: /* ODBC 2.0 */
-        /* maybe this should be 8192? */
+        /* maybe this should be 0? */
 		len = 4;
-        value = 0;
+        value = MAX_QUERY_SIZE;
         break;
 
     case SQL_MAX_TABLE_NAME_LEN: /* ODBC 1.0 */
diff --git a/src/interfaces/odbc/psqlodbc.h b/src/interfaces/odbc/psqlodbc.h
index 8b095e335d0ce60fcc628ae026219abacf4d1e12..6ab559d91ab104c0e89ee8556de75fd6f6b11147 100644
--- a/src/interfaces/odbc/psqlodbc.h
+++ b/src/interfaces/odbc/psqlodbc.h
@@ -49,7 +49,8 @@ typedef UInt4 Oid;
 #endif
 
 /* Limits */
-#define MAX_MESSAGE_LEN				8192
+#define MAX_QUERY_SIZE				(BLCKSZ*2)
+#define MAX_MESSAGE_LEN				MAX_QUERY_SIZE
 #define MAX_CONNECT_STRING			4096
 #define ERROR_MSG_LENGTH			4096
 #define FETCH_MAX					100		/* default number of rows to cache for declare/fetch */
diff --git a/src/interfaces/python/pgmodule.c b/src/interfaces/python/pgmodule.c
index 2dc8bf593645b9c0713af88be81e24169258d880..34c534e5ce8130cb1cc16cd73deb945d19ad0858 100644
--- a/src/interfaces/python/pgmodule.c
+++ b/src/interfaces/python/pgmodule.c
@@ -51,7 +51,7 @@ static char		*PyPgVersion = "2.2";
 #define CHECK_OPEN        1
 #define CHECK_CLOSE       2
 
-#define MAX_BUFFER_SIZE   8192	/* maximum transaction size */
+#define MAX_BUFFER_SIZE   MAX_QUERY_SIZE	/* maximum transaction size */
 
 #ifndef NO_DIRECT
 #define DIRECT_ACCESS     1		/* enables direct access functions */
diff --git a/src/test/regress/regress.c b/src/test/regress/regress.c
index d95ccb8bee7ef59a62786be301e7953c0a0363cd..9674c52d2d648a70997dc25c1f08d9fa0d8a1459 100644
--- a/src/test/regress/regress.c
+++ b/src/test/regress/regress.c
@@ -1,5 +1,5 @@
 /*
- * $Header: /cvsroot/pgsql/src/test/regress/regress.c,v 1.30 1999/02/21 03:49:55 scrappy Exp $
+ * $Header: /cvsroot/pgsql/src/test/regress/regress.c,v 1.31 1999/05/03 19:10:48 momjian Exp $
  */
 
 #include <float.h>				/* faked on sunos */
@@ -319,7 +319,7 @@ funny_dup17()
 	Relation	rel;
 	TupleDesc	tupdesc;
 	HeapTuple	tuple;
-	char		sql[8192];
+	char		sql[MAX_QUERY_SIZE];
 	char	   *when;
 	int			inserted;
 	int			selected = 0;
@@ -563,7 +563,7 @@ ttdummy()
 	{
 		void	   *pplan;
 		Oid		   *ctypes;
-		char		sql[8192];
+		char		sql[MAX_QUERY_SIZE];
 
 		/* allocate ctypes for preparation */
 		ctypes = (Oid *) palloc(natts * sizeof(Oid));