Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit4140c2f

Browse files
author
Thomas G. Lockhart
committed
Add support for the CASE statement in the rewrite handling.
Allows (at least some) rules and views.Still some trouble (crashes) with target CASE columns spanning tables, but lots now works.
1 parent2b189aa commit4140c2f

File tree

6 files changed

+250
-13
lines changed

6 files changed

+250
-13
lines changed

‎src/backend/nodes/outfuncs.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.49 1998/12/04 15:33:33 thomas Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.50 1998/12/14 00:01:47 thomas Exp $
1111
*
1212
* NOTES
1313
* Every (plan) node in POSTGRES has an associated "out" routine which
@@ -1702,7 +1702,7 @@ _outCaseWhen(StringInfo str, CaseWhen *node)
17021702
{
17031703
charbuf[500];
17041704

1705-
sprintf(buf,":when ");
1705+
sprintf(buf,"WHEN ");
17061706
appendStringInfo(str,buf);
17071707
_outNode(str,node->expr);
17081708
sprintf(buf," :then ");

‎src/backend/nodes/readfuncs.c

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.39 1998/11/22 10:48:40 vadim Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.40 1998/12/14 00:01:47 thomas Exp $
1111
*
1212
* NOTES
1313
* Most of the read functions for plan nodes are tested. (In fact, they
@@ -786,6 +786,50 @@ _readExpr()
786786
returnlocal_node;
787787
}
788788

789+
/* ----------------
790+
*_readCaseExpr
791+
*
792+
*CaseExpr is a subclass of Node
793+
* ----------------
794+
*/
795+
staticCaseExpr*
796+
_readCaseExpr()
797+
{
798+
CaseExpr*local_node;
799+
char*token;
800+
intlength;
801+
802+
local_node=makeNode(CaseExpr);
803+
804+
local_node->args=nodeRead(true);
805+
token=lsptok(NULL,&length);/* eat :default */
806+
local_node->defresult=nodeRead(true);
807+
808+
returnlocal_node;
809+
}
810+
811+
/* ----------------
812+
*_readCaseWhen
813+
*
814+
*CaseWhen is a subclass of Node
815+
* ----------------
816+
*/
817+
staticCaseWhen*
818+
_readCaseWhen()
819+
{
820+
CaseWhen*local_node;
821+
char*token;
822+
intlength;
823+
824+
local_node=makeNode(CaseWhen);
825+
826+
local_node->expr=nodeRead(true);
827+
token=lsptok(NULL,&length);/* eat :then */
828+
local_node->result=nodeRead(true);
829+
830+
returnlocal_node;
831+
}
832+
789833
/* ----------------
790834
*_readVar
791835
*
@@ -2037,6 +2081,10 @@ parsePlanString(void)
20372081
return_value=_readSortClause();
20382082
elseif (!strncmp(token,"GROUPCLAUSE",length))
20392083
return_value=_readGroupClause();
2084+
elseif (!strncmp(token,"CASE",length))
2085+
return_value=_readCaseExpr();
2086+
elseif (!strncmp(token,"WHEN",length))
2087+
return_value=_readCaseWhen();
20402088
else
20412089
elog(ERROR,"badly formatted planstring \"%.10s\"...\n",token);
20422090

‎src/backend/optimizer/plan/setrefs.c

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.28 1998/10/08 18:29:29 momjian Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.29 1998/12/14 00:02:10 thomas Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -303,7 +303,7 @@ replace_clause_joinvar_refs(Expr *clause,
303303
{
304304
temp= (List*)replace_joinvar_refs((Var*)clause,
305305
outer_tlist,inner_tlist);
306-
if (temp)
306+
if (temp!=NULL)
307307
returntemp;
308308
elseif (clause!=NULL)
309309
return (List*)clause;
@@ -402,6 +402,33 @@ replace_clause_joinvar_refs(Expr *clause,
402402
inner_tlist);
403403
return (List*)clause;
404404
}
405+
elseif (IsA(clause,CaseExpr))
406+
{
407+
((CaseExpr*)clause)->args=
408+
(List*)replace_subclause_joinvar_refs(((CaseExpr*)clause)->args,
409+
outer_tlist,
410+
inner_tlist);
411+
412+
((CaseExpr*)clause)->defresult=
413+
(Node*)replace_clause_joinvar_refs((Expr*) ((CaseExpr*)clause)->defresult,
414+
outer_tlist,
415+
inner_tlist);
416+
return (List*)clause;
417+
}
418+
elseif (IsA(clause,CaseWhen))
419+
{
420+
((CaseWhen*)clause)->expr=
421+
(Node*)replace_clause_joinvar_refs((Expr*) ((CaseWhen*)clause)->expr,
422+
outer_tlist,
423+
inner_tlist);
424+
425+
((CaseWhen*)clause)->result=
426+
(Node*)replace_clause_joinvar_refs((Expr*) ((CaseWhen*)clause)->result,
427+
outer_tlist,
428+
inner_tlist);
429+
return (List*)clause;
430+
}
431+
405432
/* shouldn't reach here */
406433
elog(ERROR,"replace_clause_joinvar_refs: unsupported clause %d",
407434
nodeTag(clause));

‎src/backend/rewrite/rewriteHandler.c

Lines changed: 93 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*
77
*
88
* IDENTIFICATION
9-
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.26 1998/12/04 15:34:36 thomas Exp $
9+
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.27 1998/12/14 00:02:16 thomas Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -1457,6 +1457,34 @@ apply_RIR_adjust_sublevel(Node *node, int sublevels_up)
14571457
}
14581458
break;
14591459

1460+
caseT_CaseExpr:
1461+
{
1462+
CaseExpr*exp= (CaseExpr*)node;
1463+
1464+
apply_RIR_adjust_sublevel(
1465+
(Node*)(exp->args),
1466+
sublevels_up);
1467+
1468+
apply_RIR_adjust_sublevel(
1469+
(Node*)(exp->defresult),
1470+
sublevels_up);
1471+
}
1472+
break;
1473+
1474+
caseT_CaseWhen:
1475+
{
1476+
CaseWhen*exp= (CaseWhen*)node;
1477+
1478+
apply_RIR_adjust_sublevel(
1479+
(Node*)(exp->expr),
1480+
sublevels_up);
1481+
1482+
apply_RIR_adjust_sublevel(
1483+
(Node*)(exp->result),
1484+
sublevels_up);
1485+
}
1486+
break;
1487+
14601488
default:
14611489
elog(NOTICE,"unknown node tag %d in attribute_used()",nodeTag(node));
14621490
elog(NOTICE,"Node is: %s",nodeToString(node));
@@ -1691,6 +1719,50 @@ apply_RIR_view(Node **nodePtr, int rt_index, RangeTblEntry *rte, List *tlist, in
16911719
}
16921720
break;
16931721

1722+
caseT_CaseExpr:
1723+
{
1724+
CaseExpr*exp= (CaseExpr*)node;
1725+
1726+
apply_RIR_view(
1727+
(Node**)(&(exp->args)),
1728+
rt_index,
1729+
rte,
1730+
tlist,
1731+
modified,
1732+
sublevels_up);
1733+
1734+
apply_RIR_view(
1735+
(Node**)(&(exp->defresult)),
1736+
rt_index,
1737+
rte,
1738+
tlist,
1739+
modified,
1740+
sublevels_up);
1741+
}
1742+
break;
1743+
1744+
caseT_CaseWhen:
1745+
{
1746+
CaseWhen*exp= (CaseWhen*)node;
1747+
1748+
apply_RIR_view(
1749+
(Node**)(&(exp->expr)),
1750+
rt_index,
1751+
rte,
1752+
tlist,
1753+
modified,
1754+
sublevels_up);
1755+
1756+
apply_RIR_view(
1757+
(Node**)(&(exp->result)),
1758+
rt_index,
1759+
rte,
1760+
tlist,
1761+
modified,
1762+
sublevels_up);
1763+
}
1764+
break;
1765+
16941766
default:
16951767
elog(NOTICE,"unknown node tag %d in apply_RIR_view()",nodeTag(node));
16961768
elog(NOTICE,"Node is: %s",nodeToString(node));
@@ -1885,7 +1957,27 @@ fireRIRonSubselect(Node *node)
18851957
break;
18861958

18871959
caseT_CaseExpr:
1960+
{
1961+
CaseExpr*exp= (CaseExpr*)node;
1962+
1963+
fireRIRonSubselect(
1964+
(Node*)(exp->args));
1965+
1966+
fireRIRonSubselect(
1967+
(Node*)(exp->defresult));
1968+
}
1969+
break;
1970+
18881971
caseT_CaseWhen:
1972+
{
1973+
CaseWhen*exp= (CaseWhen*)node;
1974+
1975+
fireRIRonSubselect(
1976+
(Node*)(exp->expr));
1977+
1978+
fireRIRonSubselect(
1979+
(Node*)(exp->result));
1980+
}
18891981
break;
18901982

18911983
caseT_Query:

‎src/backend/rewrite/rewriteManip.c

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*
77
*
88
* IDENTIFICATION
9-
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteManip.c,v 1.22 1998/10/21 16:21:26 momjian Exp $
9+
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteManip.c,v 1.23 1998/12/14 00:02:17 thomas Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -191,6 +191,38 @@ OffsetVarNodes(Node *node, int offset, int sublevels_up)
191191
}
192192
break;
193193

194+
caseT_CaseExpr:
195+
{
196+
CaseExpr*exp= (CaseExpr*)node;
197+
198+
OffsetVarNodes(
199+
(Node*)(exp->args),
200+
offset,
201+
sublevels_up);
202+
203+
OffsetVarNodes(
204+
(Node*)(exp->defresult),
205+
offset,
206+
sublevels_up);
207+
}
208+
break;
209+
210+
caseT_CaseWhen:
211+
{
212+
CaseWhen*exp= (CaseWhen*)node;
213+
214+
OffsetVarNodes(
215+
(Node*)(exp->expr),
216+
offset,
217+
sublevels_up);
218+
219+
OffsetVarNodes(
220+
(Node*)(exp->result),
221+
offset,
222+
sublevels_up);
223+
}
224+
break;
225+
194226
default:
195227
elog(NOTICE,"unknown node tag %d in OffsetVarNodes()",nodeTag(node));
196228
elog(NOTICE,"Node is: %s",nodeToString(node));
@@ -377,6 +409,42 @@ ChangeVarNodes(Node *node, int rt_index, int new_index, int sublevels_up)
377409
}
378410
break;
379411

412+
caseT_CaseExpr:
413+
{
414+
CaseExpr*exp= (CaseExpr*)node;
415+
416+
ChangeVarNodes(
417+
(Node*)(exp->args),
418+
rt_index,
419+
new_index,
420+
sublevels_up);
421+
422+
ChangeVarNodes(
423+
(Node*)(exp->defresult),
424+
rt_index,
425+
new_index,
426+
sublevels_up);
427+
}
428+
break;
429+
430+
caseT_CaseWhen:
431+
{
432+
CaseWhen*exp= (CaseWhen*)node;
433+
434+
ChangeVarNodes(
435+
(Node*)(exp->expr),
436+
rt_index,
437+
new_index,
438+
sublevels_up);
439+
440+
ChangeVarNodes(
441+
(Node*)(exp->result),
442+
rt_index,
443+
new_index,
444+
sublevels_up);
445+
}
446+
break;
447+
380448
default:
381449
elog(NOTICE,"unknown node tag %d in ChangeVarNodes()",nodeTag(node));
382450
elog(NOTICE,"Node is: %s",nodeToString(node));

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp