diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c
index 6d513b6a1d636b9cab679baf40fd0c0604e894ea..fd4f5fe68408c778344657ff878f3218dafb135b 100644
--- a/src/backend/executor/execMain.c
+++ b/src/backend/executor/execMain.c
@@ -26,7 +26,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.12 1997/04/02 04:04:11 vadim Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.13 1997/05/31 16:52:00 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -530,6 +530,9 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate)
 		 */
 		intoName = parseTree->into;
 		archiveMode = 'n';
+
+		/* fixup to prevent zero-length columns in create */
+		setVarAttrLenForCreateTable(tupType, targetList, rangeTable);
 		
 		intoRelationId = heap_create(intoName,
 					     intoName, /* not used */
@@ -537,6 +540,8 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate)
 					     DEFAULT_SMGR,
 					     tupType);
 		
+		resetVarAttrLenForCreateTable(tupType);
+
 		/* ----------------
 		 *  XXX rather than having to call setheapoverride(true)
 		 *	and then back to false, we should change the
diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c
index bd315db65cd152b5249e497bb877b618f5adf95b..ac9855376789cf89c2402328545b5895654cd99c 100644
--- a/src/backend/executor/execUtils.c
+++ b/src/backend/executor/execUtils.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/executor/execUtils.c,v 1.7 1997/01/10 09:58:53 vadim Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/executor/execUtils.c,v 1.8 1997/05/31 16:52:02 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -55,6 +55,8 @@
 #include "catalog/index.h"
 #include "catalog/catname.h"
 #include "catalog/pg_proc.h"
+#include "catalog/pg_type.h"
+#include "parser/parsetree.h"
 
 /* ----------------------------------------------------------------
  *      global counters for number of tuples processed, retrieved,
@@ -1122,3 +1124,69 @@ ExecInsertIndexTuples(TupleTableSlot *slot,
     }
     if (econtext != NULL) pfree(econtext);
 }
+
+/* ----------------------------------------------------------------
+ * setVarAttrLenForCreateTable -
+ *    called when we do a SELECT * INTO TABLE tab
+ *    needed for attributes that have a defined length, like bpchar and
+ *    varchar
+ * ----------------------------------------------------------------
+ */
+void
+setVarAttrLenForCreateTable(TupleDesc tupType, List *targetList,
+							List *rangeTable)
+{
+    List 		*tl;
+    TargetEntry		*tle;
+    Node 		*expr;
+    int			varno;
+
+    tl = targetList;
+
+    for (varno = 0; varno < tupType->natts; varno++) {
+	tle = lfirst(tl);
+
+	if (tupType->attrs[varno]->atttypid == BPCHAROID ||
+	    tupType->attrs[varno]->atttypid == VARCHAROID) {
+	    expr = tle->expr;
+	    if (expr && IsA(expr,Var)) {
+		Var		*var;
+		RangeTblEntry	*rtentry;
+		Relation	rd;
+
+		var = (Var *)expr;
+		rtentry = rt_fetch(var->varno, rangeTable);
+		rd = heap_open(rtentry->relid);
+			/* set length to that defined in relation */
+		tupType->attrs[varno]->attlen =
+				(*rd->rd_att->attrs[var->varattno-1]).attlen;
+		heap_close(rd);
+	    }
+	    else
+		elog(WARN, "setVarAttrLenForCreateTable: can't get length for variable-length field");
+        }
+	tl = lnext(tl);
+    }
+}
+
+
+/* ----------------------------------------------------------------
+ * resetVarAttrLenForCreateTable -
+ *    called when we do a SELECT * INTO TABLE tab
+ *    needed for attributes that have a defined length, like bpchar and
+ *    varchar
+ *    resets length to -1 for those types
+ * ----------------------------------------------------------------
+ */
+void
+resetVarAttrLenForCreateTable(TupleDesc tupType)
+{
+    int			varno;
+
+    for (varno = 0; varno < tupType->natts; varno++) {
+	if (tupType->attrs[varno]->atttypid == BPCHAROID ||
+	    tupType->attrs[varno]->atttypid == VARCHAROID)
+		/* set length to original -1 */
+	    tupType->attrs[varno]->attlen = -1;
+    }
+}
diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h
index 3bf8324c25440544003aed81202206f7c80b3085..c3a58716c535d0cbca8fbd860e714f7193c49584 100644
--- a/src/include/executor/executor.h
+++ b/src/include/executor/executor.h
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: executor.h,v 1.7 1996/12/26 17:53:40 momjian Exp $
+ * $Id: executor.h,v 1.8 1997/05/31 16:52:19 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -174,6 +174,9 @@ extern IndexTuple ExecFormIndexTuple(HeapTuple heapTuple,
 	Relation heapRelation, Relation indexRelation, IndexInfo *indexInfo);
 extern void ExecInsertIndexTuples(TupleTableSlot *slot, ItemPointer tupleid,
 				      EState *estate, bool is_update);
+extern void resetVarAttrLenForCreateTable(TupleDesc tupType);
+extern void setVarAttrLenForCreateTable(TupleDesc tupType,
+			List *targetList, List *rangeTable);
 
 
 /* ----------------------------------------------------------------