1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-15 19:21:59 +03:00

Implement CASE expression.

This commit is contained in:
Thomas G. Lockhart
1998-12-04 15:34:49 +00:00
parent 19740e2fff
commit bedd04a551
17 changed files with 779 additions and 110 deletions

View File

@ -6,7 +6,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.25 1998/10/21 16:21:24 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.26 1998/12/04 15:34:36 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@ -39,7 +39,6 @@
#include "catalog/pg_type.h"
static RewriteInfo *gatherRewriteMeta(Query *parsetree,
Query *rule_action,
Node *rule_qual,
@ -55,17 +54,6 @@ static SubLink *modifyAggregMakeSublink(Expr *origexp, Query *parsetree);
static void modifyAggregQual(Node **nodePtr, Query *parsetree);
static Query *fireRIRrules(Query *parsetree);
@ -293,6 +281,46 @@ rangeTableEntry_used(Node *node, int rt_index, int sublevels_up)
}
break;
case T_CaseExpr:
{
CaseExpr *exp = (CaseExpr *)node;
if (rangeTableEntry_used(
(Node *)(exp->args),
rt_index,
sublevels_up))
return TRUE;
if (rangeTableEntry_used(
(Node *)(exp->defresult),
rt_index,
sublevels_up))
return TRUE;
return FALSE;
}
break;
case T_CaseWhen:
{
CaseWhen *when = (CaseWhen *)node;
if (rangeTableEntry_used(
(Node *)(when->expr),
rt_index,
sublevels_up))
return TRUE;
if (rangeTableEntry_used(
(Node *)(when->result),
rt_index,
sublevels_up))
return TRUE;
return FALSE;
}
break;
case T_Query:
{
Query *qry = (Query *)node;
@ -1055,10 +1083,12 @@ modifyAggregMakeSublink(Expr *origexp, Query *parsetree)
Expr *exp = copyObject(origexp);
if (nodeTag(nth(0, exp->args)) == T_Aggreg)
{
if (nodeTag(nth(1, exp->args)) == T_Aggreg)
elog(ERROR, "rewrite: comparision of 2 aggregate columns not supported");
else
elog(ERROR, "rewrite: aggregate column of view must be at rigth side in qual");
}
aggreg = (Aggreg *)nth(1, exp->args);
target = (Var *)(aggreg->target);
@ -1189,6 +1219,33 @@ modifyAggregQual(Node **nodePtr, Query *parsetree)
}
break;
case T_CaseExpr:
{
/* We're calling recursively,
* and this routine knows how to handle lists
* so let it do the work to handle the WHEN clauses... */
modifyAggregQual(
(Node **)(&(((CaseExpr *)node)->args)),
parsetree);
modifyAggregQual(
(Node **)(&(((CaseExpr *)node)->defresult)),
parsetree);
}
break;
case T_CaseWhen:
{
modifyAggregQual(
(Node **)(&(((CaseWhen *)node)->expr)),
parsetree);
modifyAggregQual(
(Node **)(&(((CaseWhen *)node)->result)),
parsetree);
}
break;
case T_Iter:
{
Iter *iter = (Iter *)node;
@ -1827,6 +1884,10 @@ fireRIRonSubselect(Node *node)
}
break;
case T_CaseExpr:
case T_CaseWhen:
break;
case T_Query:
{
Query *qry = (Query *)node;