From 691dc282f81ff2333837b33f8517bfc08e31f37c Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Mon, 19 Jan 1998 02:37:51 +0000 Subject: [PATCH] Fix for SELECT INTO TABLE for varchar(). --- src/backend/executor/execMain.c | 4 ++- src/backend/executor/execUtils.c | 49 +++++++++++++++++++++++++++++- src/include/catalog/pg_attribute.h | 10 +++++- src/include/catalog/pg_type.h | 5 ++- src/include/executor/executor.h | 4 ++- 5 files changed, 67 insertions(+), 5 deletions(-) diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index ecfc4d9a95..ba3275f346 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 8d93ecf9cc..9b02eb7f0e 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 0c43065b8e..24810e82d4 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 087dc7f4b4..e324a785a3 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 68550ff2aa..5837b7bf5f 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);