diff options
author | Kevin Grittner <kgrittn@postgresql.org> | 2013-11-04 14:45:18 -0600 |
---|---|---|
committer | Kevin Grittner <kgrittn@postgresql.org> | 2013-11-04 14:45:18 -0600 |
commit | 5b6ee03a31ee695b8e57e27bb1cd82b4f0bb2ef0 (patch) | |
tree | 843ac061ed1504990a2676d698aca7b8671f8add /src/backend/rewrite/rewriteDefine.c | |
parent | e843d12ebc6cfea9704eca5da62a78ac34ad2602 (diff) | |
download | postgresql-5b6ee03a31ee695b8e57e27bb1cd82b4f0bb2ef0.tar.gz postgresql-5b6ee03a31ee695b8e57e27bb1cd82b4f0bb2ef0.zip |
Fix breakage of MV column name list usage.
Per bug report from Tomonari Katsumata.
Back-patch to 9.3.
Diffstat (limited to 'src/backend/rewrite/rewriteDefine.c')
-rw-r--r-- | src/backend/rewrite/rewriteDefine.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c index 87ec979b852..4d39724ce53 100644 --- a/src/backend/rewrite/rewriteDefine.c +++ b/src/backend/rewrite/rewriteDefine.c @@ -43,7 +43,7 @@ static void checkRuleResultList(List *targetList, TupleDesc resultDesc, - bool isSelect); + bool isSelect, bool requireColumnNameMatch); static bool setRuleCheckAsUser_walker(Node *node, Oid *context); static void setRuleCheckAsUser_Query(Query *qry, Oid userid); @@ -358,7 +358,9 @@ DefineQueryRewrite(char *rulename, */ checkRuleResultList(query->targetList, RelationGetDescr(event_relation), - true); + true, + event_relation->rd_rel->relkind != + RELKIND_MATVIEW); /* * ... there must not be another ON SELECT rule already ... @@ -484,7 +486,7 @@ DefineQueryRewrite(char *rulename, errmsg("RETURNING lists are not supported in non-INSTEAD rules"))); checkRuleResultList(query->returningList, RelationGetDescr(event_relation), - false); + false, false); } } @@ -616,15 +618,20 @@ DefineQueryRewrite(char *rulename, * Verify that targetList produces output compatible with a tupledesc * * The targetList might be either a SELECT targetlist, or a RETURNING list; - * isSelect tells which. (This is mostly used for choosing error messages, - * but also we don't enforce column name matching for RETURNING.) + * isSelect tells which. This is used for choosing error messages. + * + * A SELECT targetlist may optionally require that column names match. */ static void -checkRuleResultList(List *targetList, TupleDesc resultDesc, bool isSelect) +checkRuleResultList(List *targetList, TupleDesc resultDesc, bool isSelect, + bool requireColumnNameMatch) { ListCell *tllist; int i; + /* Only a SELECT may require a column name match. */ + Assert(isSelect || !requireColumnNameMatch); + i = 0; foreach(tllist, targetList) { @@ -660,7 +667,7 @@ checkRuleResultList(List *targetList, TupleDesc resultDesc, bool isSelect) (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot convert relation containing dropped columns to view"))); - if (isSelect && strcmp(tle->resname, attname) != 0) + if (requireColumnNameMatch && strcmp(tle->resname, attname) != 0) ereport(ERROR, (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), errmsg("SELECT rule's target entry %d has different column name from \"%s\"", i, attname))); |