aboutsummaryrefslogtreecommitdiff
path: root/src/backend/rewrite/rewriteHandler.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2003-08-11 23:04:50 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2003-08-11 23:04:50 +0000
commit302f1a86dc1125f681b9a3b3509d1be7e33b0e4f (patch)
tree9d31b15b5e5dac59aee0ce26597306a491512c31 /src/backend/rewrite/rewriteHandler.c
parent730b3a150238578505638ab2331bf569c89d8f7b (diff)
downloadpostgresql-302f1a86dc1125f681b9a3b3509d1be7e33b0e4f.tar.gz
postgresql-302f1a86dc1125f681b9a3b3509d1be7e33b0e4f.zip
Rewriter and planner should use only resno, not resname, to identify
target columns in INSERT and UPDATE targetlists. Don't rely on resname to be accurate in ruleutils, either. This fixes bug reported by Donald Fraser, in which renaming a column referenced in a rule did not work very well.
Diffstat (limited to 'src/backend/rewrite/rewriteHandler.c')
-rw-r--r--src/backend/rewrite/rewriteHandler.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c
index e8f3c185d16..d0ca89ee6ab 100644
--- a/src/backend/rewrite/rewriteHandler.c
+++ b/src/backend/rewrite/rewriteHandler.c
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.128 2003/08/08 21:41:56 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.129 2003/08/11 23:04:49 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -48,7 +48,8 @@ static Query *rewriteRuleAction(Query *parsetree,
static List *adjustJoinTreeList(Query *parsetree, bool removert, int rt_index);
static void rewriteTargetList(Query *parsetree, Relation target_relation);
static TargetEntry *process_matched_tle(TargetEntry *src_tle,
- TargetEntry *prior_tle);
+ TargetEntry *prior_tle,
+ const char *attrName);
static void markQueryForUpdate(Query *qry, bool skipOldNew);
static List *matchLocks(CmdType event, RuleLock *rulelocks,
int varno, Query *parsetree);
@@ -312,8 +313,7 @@ rewriteTargetList(Query *parsetree, Relation target_relation)
continue;
/*
- * Look for targetlist entries matching this attr. We match by
- * resno, but the resname should match too.
+ * Look for targetlist entries matching this attr.
*
* Junk attributes are not candidates to be matched.
*/
@@ -324,9 +324,8 @@ rewriteTargetList(Query *parsetree, Relation target_relation)
if (!resdom->resjunk && resdom->resno == attrno)
{
- Assert(strcmp(resdom->resname,
- NameStr(att_tup->attname)) == 0);
- new_tle = process_matched_tle(old_tle, new_tle);
+ new_tle = process_matched_tle(old_tle, new_tle,
+ NameStr(att_tup->attname));
/* keep scanning to detect multiple assignments to attr */
}
}
@@ -424,11 +423,12 @@ rewriteTargetList(Query *parsetree, Relation target_relation)
* Convert a matched TLE from the original tlist into a correct new TLE.
*
* This routine detects and handles multiple assignments to the same target
- * attribute.
+ * attribute. (The attribute name is needed only for error messages.)
*/
static TargetEntry *
process_matched_tle(TargetEntry *src_tle,
- TargetEntry *prior_tle)
+ TargetEntry *prior_tle,
+ const char *attrName)
{
Resdom *resdom = src_tle->resdom;
Node *priorbottom;
@@ -456,7 +456,7 @@ process_matched_tle(TargetEntry *src_tle,
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("multiple assignments to same attribute \"%s\"",
- resdom->resname)));
+ attrName)));
/*
* Prior TLE could be a nest of ArrayRefs if we do this more than
@@ -470,7 +470,7 @@ process_matched_tle(TargetEntry *src_tle,
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("multiple assignments to same attribute \"%s\"",
- resdom->resname)));
+ attrName)));
/*
* Looks OK to nest 'em.