aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>1998-01-19 02:37:51 +0000
committerBruce Momjian <bruce@momjian.us>1998-01-19 02:37:51 +0000
commit691dc282f81ff2333837b33f8517bfc08e31f37c (patch)
tree9988d36fbe570b855f2d85f12a45ac17264642cb
parent8169769ee5104d4bde9a713beefdd133658f3a0f (diff)
downloadpostgresql-691dc282f81ff2333837b33f8517bfc08e31f37c.tar.gz
postgresql-691dc282f81ff2333837b33f8517bfc08e31f37c.zip
Fix for SELECT INTO TABLE for varchar().
-rw-r--r--src/backend/executor/execMain.c4
-rw-r--r--src/backend/executor/execUtils.c49
-rw-r--r--src/include/catalog/pg_attribute.h10
-rw-r--r--src/include/catalog/pg_type.h5
-rw-r--r--src/include/executor/executor.h4
5 files changed, 67 insertions, 5 deletions
diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c
index ecfc4d9a952..ba3275f346a 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 8d93ecf9cc0..9b02eb7f0e2 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 0c43065b8e1..24810e82d41 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 087dc7f4b42..e324a785a3c 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 68550ff2aaf..5837b7bf5fe 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);