diff options
author | Bryan Henderson | 1996-11-24 05:58:57 +0000 |
---|---|---|
committer | Bryan Henderson | 1996-11-24 05:58:57 +0000 |
commit | 02db1f58cbd154527c2418e7b480dd887c09d307 (patch) | |
tree | 58ff6a945fd773a423be42b33b06f8f6aabac738 | |
parent | 9602150a04f64d0ea0d687c5693bf6b7ca3c759e (diff) |
Fix access through null pointer info->rule_action. Thanks Darren King.
-rw-r--r-- | src/backend/rewrite/rewriteHandler.c | 79 |
1 files changed, 38 insertions, 41 deletions
diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c index ee61d293deb..e4a52992217 100644 --- a/src/backend/rewrite/rewriteHandler.c +++ b/src/backend/rewrite/rewriteHandler.c @@ -6,7 +6,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.1.1.1 1996/07/09 06:21:51 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.2 1996/11/24 05:58:57 bryanh Exp $ * *------------------------------------------------------------------------- */ @@ -57,50 +57,47 @@ gatherRewriteMeta(Query *parsetree, info->rt_index = rt_index; info->event = event; info->instead_flag = *instead_flag; -/* info->rule_action = rule_action; this needs to be a copy here, I think! - jolly*/ info->rule_action = (Query*)copyObject(rule_action); info->rule_qual = (Node*)copyObject(rule_qual); - info->nothing = FALSE; - info->action = info->rule_action->commandType; if (info->rule_action == NULL) info->nothing = TRUE; - if (info->nothing) - return info; - - info->current_varno = rt_index; - info->rt = parsetree->rtable; - rt_length = length(info->rt); - info->rt = append(info->rt, info->rule_action->rtable); - - - info->new_varno = PRS2_NEW_VARNO + rt_length; - OffsetVarNodes(info->rule_action->qual, rt_length); - OffsetVarNodes((Node*)info->rule_action->targetList, rt_length); - OffsetVarNodes(info->rule_qual, rt_length); - ChangeVarNodes((Node*)info->rule_action->qual, - PRS2_CURRENT_VARNO+rt_length, rt_index); - ChangeVarNodes((Node*)info->rule_action->targetList, - PRS2_CURRENT_VARNO+rt_length, rt_index); - ChangeVarNodes(info->rule_qual, PRS2_CURRENT_VARNO+rt_length, rt_index); - - /* - * bug here about replace CURRENT -- sort of - * replace current is deprecated now so this code shouldn't really - * need to be so clutzy but..... - */ - if (info->action != CMD_SELECT) { /* i.e update XXXXX */ - int new_result_reln = 0; - result_reln = info->rule_action->resultRelation; - switch (result_reln) { - case PRS2_CURRENT_VARNO: new_result_reln = rt_index; - break; - case PRS2_NEW_VARNO: /* XXX */ - default: - new_result_reln = result_reln + rt_length; - break; - } - info->rule_action->resultRelation = new_result_reln; + else { + info->nothing = FALSE; + info->action = info->rule_action->commandType; + info->current_varno = rt_index; + info->rt = parsetree->rtable; + rt_length = length(info->rt); + info->rt = append(info->rt, info->rule_action->rtable); + + info->new_varno = PRS2_NEW_VARNO + rt_length; + OffsetVarNodes(info->rule_action->qual, rt_length); + OffsetVarNodes((Node*)info->rule_action->targetList, rt_length); + OffsetVarNodes(info->rule_qual, rt_length); + ChangeVarNodes((Node*)info->rule_action->qual, + PRS2_CURRENT_VARNO+rt_length, rt_index); + ChangeVarNodes((Node*)info->rule_action->targetList, + PRS2_CURRENT_VARNO+rt_length, rt_index); + ChangeVarNodes(info->rule_qual, + PRS2_CURRENT_VARNO+rt_length, rt_index); + + /* + * bug here about replace CURRENT -- sort of + * replace current is deprecated now so this code shouldn't really + * need to be so clutzy but..... + */ + if (info->action != CMD_SELECT) { /* i.e update XXXXX */ + int new_result_reln = 0; + result_reln = info->rule_action->resultRelation; + switch (result_reln) { + case PRS2_CURRENT_VARNO: new_result_reln = rt_index; + break; + case PRS2_NEW_VARNO: /* XXX */ + default: + new_result_reln = result_reln + rt_length; + break; + } + info->rule_action->resultRelation = new_result_reln; + } } - return info; } |