aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor/execUtils.c
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>1997-05-31 16:52:19 +0000
committerBruce Momjian <bruce@momjian.us>1997-05-31 16:52:19 +0000
commitc3a960ad8a1c8c528ab70d561ca8b3c67866b0d0 (patch)
tree1c8aa06a84324f6601a64323219334ea14969e42 /src/backend/executor/execUtils.c
parentad01dd270df1c1011b16e79a4b510e8b4670fb58 (diff)
downloadpostgresql-c3a960ad8a1c8c528ab70d561ca8b3c67866b0d0.tar.gz
postgresql-c3a960ad8a1c8c528ab70d561ca8b3c67866b0d0.zip
Fix for SELECT * INTO TABLE for char(), varchar() fields.
Diffstat (limited to 'src/backend/executor/execUtils.c')
-rw-r--r--src/backend/executor/execUtils.c70
1 files changed, 69 insertions, 1 deletions
diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c
index bd315db65cd..ac985537678 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;
+ }
+}