diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c
index ecfc4d9a952b8456410a5773aae615ed08b68841..ba3275f346a369035a047a3733adcdfec01144ae 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.39 1998/01/16 23:19:49 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.40 1998/01/19 02:37:32 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -563,6 +563,8 @@ InitPlan(CmdType operation, Query *parseTree, Plan *plan, EState *estate)
 				 */
 				tupdesc = CreateTupleDescCopy(tupType);
 
+				setAtttypmodForCreateTable(tupdesc, targetList, rangeTable);
+
 				intoRelationId = heap_create_with_catalog(intoName, tupdesc);
 
 				FreeTupleDesc(tupdesc);
diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c
index 8d93ecf9cc07651c8cce7b0e65cae3d3493b6f72..9b02eb7f0e21892bff96466db3e9cca3656b4c36 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.24 1998/01/16 23:19:52 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/executor/execUtils.c,v 1.25 1998/01/19 02:37:33 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1177,3 +1177,50 @@ ExecInsertIndexTuples(TupleTableSlot *slot,
 	if (econtext != NULL)
 		pfree(econtext);
 }
+
+/* ----------------------------------------------------------------
+ * setAtttyplenForCreateTable -
+ *	  called when we do a SELECT * INTO TABLE tab
+ *	  needed for attributes that have atttypmod like bpchar and
+ *	  varchar
+ * ----------------------------------------------------------------
+ */
+void
+setAtttypmodForCreateTable(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 (USE_ATTTYPMOD(tupType->attrs[varno]->atttypid))
+		{
+			expr = tle->expr;
+			if (expr && IsA(expr, Var))
+			{
+				Var		   *var;
+				RangeTblEntry *rtentry;
+				Relation	rd;
+
+				var = (Var *) expr;
+				rtentry = rt_fetch(var->varnoold, rangeTable);
+				rd = heap_open(rtentry->relid);
+				/* set length to that defined in relation */
+				tupType->attrs[varno]->atttypmod =
+					(*rd->rd_att->attrs[var->varoattno - 1]).atttypmod;
+				heap_close(rd);
+			}
+			else
+				elog(ERROR, "setAtttypmodForCreateTable: can't get atttypmod for field (for length, etc.)");
+		}
+		tl = lnext(tl);
+	}
+}
+
diff --git a/src/include/catalog/pg_attribute.h b/src/include/catalog/pg_attribute.h
index 0c43065b8e1426f518b750fc9b12855773bb83d6..24810e82d41d7d85869c037ebf1479f5f83dcf22 100644
--- a/src/include/catalog/pg_attribute.h
+++ b/src/include/catalog/pg_attribute.h
@@ -7,7 +7,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_attribute.h,v 1.22 1998/01/16 23:20:49 momjian Exp $
+ * $Id: pg_attribute.h,v 1.23 1998/01/19 02:37:45 momjian Exp $
  *
  * NOTES
  *	  the genbki.sh script reads this file and generates .bki
@@ -89,6 +89,14 @@ CATALOG(pg_attribute) BOOTSTRAP
 	/*
 	 * atttypmod records type-specific modifications supplied at table
      * creation time.
+     * This is not integrated into all areas of the source.  It is in
+	 * TypeName to pass typmod info from the parser during table creation
+	 * time, and it is used in the parser when converting a string to a
+	 * typed constant associated with a variable.  We also have a hack in
+	 * execMain.c/execUtils.c that uses atttypmod to properly create tables
+	 * for SELECT * INTO TABLE test2 FROM test;
+	 * One day, we may add this to Resdom, and pass it through all areas.
+	 * 1998/1/18 bjm
 	 */
 
 	bool		attbyval;
diff --git a/src/include/catalog/pg_type.h b/src/include/catalog/pg_type.h
index 087dc7f4b423e4714b67a04f1851c626b0b7c6f0..e324a785a3cee43baa7eeb030d1457020072f086 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.26 1997/11/26 04:50:47 momjian Exp $
+ * $Id: pg_type.h,v 1.27 1998/01/19 02:37:47 momjian Exp $
  *
  * NOTES
  *	  the genbki.sh script reads this file and generates .bki
@@ -364,6 +364,9 @@ DATA(insert OID = 1296 ( timestamp	 PGUID	4  19 t b t \054 0	0 timestamp_in time
 DESCR("limited-range ISO-format date and time");
 #define TIMESTAMPOID	1296
 
+
+#define USE_ATTTYPMOD(typeid)	((typeid) == BPCHAROID || (typeid) == VARCHAROID)
+
 /*
  * prototypes for functions in pg_type.c
  */
diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h
index 68550ff2aafdf2745abe8024220d05fa6b5a49e7..5837b7bf5fef6dd3c90fdc568f9325e1bc82e65a 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.17 1998/01/14 15:48:43 momjian Exp $
+ * $Id: executor.h,v 1.18 1998/01/19 02:37:51 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -120,6 +120,8 @@ extern TupleDesc ExecTypeFromTL(List *targetList);
 extern void ResetTupleCount(void);
 extern void ExecAssignNodeBaseInfo(EState *estate, CommonState *basenode,
 					   Plan *parent);
+extern void setAtttypmodForCreateTable(TupleDesc tupType, List *targetList,
+							List *rangeTable);
 extern void ExecAssignExprContext(EState *estate, CommonState *commonstate);
 extern void ExecAssignResultType(CommonState *commonstate,
 					 TupleDesc tupDesc);