aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/parse_target.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/parser/parse_target.c')
-rw-r--r--src/backend/parser/parse_target.c44
1 files changed, 23 insertions, 21 deletions
diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c
index 4aa961ed456..271645573e0 100644
--- a/src/backend/parser/parse_target.c
+++ b/src/backend/parser/parse_target.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.7 1998/01/20 05:04:26 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/parse_target.c,v 1.8 1998/02/10 04:01:57 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -25,6 +25,7 @@
#include "parser/parse_relation.h"
#include "parser/parse_target.h"
#include "utils/builtins.h"
+#include "utils/lsyscache.h"
static List *expandAllTables(ParseState *pstate);
static char *figureColname(Node *expr, Node *resval);
@@ -54,7 +55,7 @@ transformTargetList(ParseState *pstate, List *targetlist)
{
Node *expr;
Oid type_id;
- int type_len;
+ int type_mod;
char *identname;
char *resname;
@@ -67,11 +68,14 @@ transformTargetList(ParseState *pstate, List *targetlist)
*/
expr = transformIdent(pstate, (Node *) res->val, EXPR_COLUMN_FIRST);
type_id = exprType(expr);
- type_len = typeLen(typeidType(type_id));
+ if (nodeTag(expr) == T_Var)
+ type_mod = ((Var *)expr)->vartypmod;
+ else
+ type_mod = -1;
resname = (res->name) ? res->name : identname;
tent->resdom = makeResdom((AttrNumber) pstate->p_last_resno++,
(Oid) type_id,
- (Size) type_len,
+ type_mod,
resname,
(Index) 0,
(Oid) 0,
@@ -190,7 +194,7 @@ transformTargetList(ParseState *pstate, List *targetlist)
case T_Attr:
{
Oid type_id;
- int type_len;
+ int type_mod;
Attr *att = (Attr *) res->val;
Node *result;
char *attrname;
@@ -253,8 +257,7 @@ transformTargetList(ParseState *pstate, List *targetlist)
/*
- * Target item is fully specified: ie.
- * relation.attribute
+ * Target item is fully specified: ie. relation.attribute
*/
result = ParseNestedFuncOrColumn(pstate, att, &pstate->p_last_resno,EXPR_COLUMN_FIRST);
handleTargetColname(pstate, &res->name, att->relname, attrname);
@@ -273,14 +276,17 @@ transformTargetList(ParseState *pstate, List *targetlist)
result = (Node *) make_array_ref(result, att->indirection);
}
type_id = exprType(result);
- type_len = typeLen(typeidType(type_id));
+ if (nodeTag(result) == T_Var)
+ type_mod = ((Var *)result)->vartypmod;
+ else
+ type_mod = -1;
/* move to last entry */
while (lnext(attrs) != NIL)
attrs = lnext(attrs);
resname = (res->name) ? res->name : strVal(lfirst(attrs));
resnode = makeResdom((AttrNumber) pstate->p_last_resno++,
(Oid) type_id,
- (Size) type_len,
+ type_mod,
resname,
(Index) 0,
(Oid) 0,
@@ -326,8 +332,7 @@ make_targetlist_expr(ParseState *pstate,
{
Oid type_id,
attrtype;
- int type_len,
- attrlen,
+ int type_mod,
attrtypmod;
int resdomno;
Relation rd;
@@ -339,12 +344,10 @@ make_targetlist_expr(ParseState *pstate,
elog(ERROR, "make_targetlist_expr: invalid use of NULL expression");
type_id = exprType(expr);
- if (type_id == InvalidOid)
- {
- type_len = 0;
- }
+ if (nodeTag(expr) == T_Var)
+ type_mod = ((Var *)expr)->vartypmod;
else
- type_len = typeLen(typeidType(type_id));
+ type_mod = -1;
/* Processes target columns that will be receiving results */
if (pstate->p_is_insert || pstate->p_is_update)
@@ -361,7 +364,6 @@ make_targetlist_expr(ParseState *pstate,
attrtype = attnumTypeId(rd, resdomno);
if ((arrayRef != NIL) && (lfirst(arrayRef) == NIL))
attrtype = GetArrayElementType(attrtype);
- attrlen = typeLen(typeidType(attrtype));
attrtypmod = rd->rd_att->attrs[resdomno - 1]->atttypmod;
#if 0
if (Input_is_string && Typecast_ok)
@@ -438,7 +440,7 @@ make_targetlist_expr(ParseState *pstate,
else
expr = (Node *) parser_typecast2(expr,
type_id,
- typeidType(attrtype),
+ typeidType(attrtype),
attrtypmod);
}
else
@@ -486,20 +488,20 @@ make_targetlist_expr(ParseState *pstate,
lowerIndexpr,
(Expr *) expr);
attrtype = attnumTypeId(rd, resdomno);
- attrlen = typeLen(typeidType(attrtype));
+ attrtypmod = get_atttypmod(rd->rd_id, resdomno);
}
}
else
{
resdomno = pstate->p_last_resno++;
attrtype = type_id;
- attrlen = type_len;
+ attrtypmod = type_mod;
}
tent = makeNode(TargetEntry);
resnode = makeResdom((AttrNumber) resdomno,
(Oid) attrtype,
- (Size) attrlen,
+ attrtypmod,
colname,
(Index) 0,
(Oid) 0,