|
8 | 8 | *
|
9 | 9 | *
|
10 | 10 | * IDENTIFICATION
|
11 |
| - * $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.216 2006/08/02 01:59:46 joe Exp $ |
| 11 | + * $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.217 2006/08/04 14:09:51 tgl Exp $ |
12 | 12 | *
|
13 | 13 | * HISTORY
|
14 | 14 | * AUTHORDATEMAJOR EVENT
|
@@ -2092,6 +2092,58 @@ eval_const_expressions_mutator(Node *node,
|
2092 | 2092 | newfselect->resulttypmod=fselect->resulttypmod;
|
2093 | 2093 | return (Node*)newfselect;
|
2094 | 2094 | }
|
| 2095 | +if (IsA(node,BooleanTest)) |
| 2096 | +{ |
| 2097 | +BooleanTest*btest= (BooleanTest*)node; |
| 2098 | +BooleanTest*newbtest; |
| 2099 | +Node*arg; |
| 2100 | + |
| 2101 | +arg=eval_const_expressions_mutator((Node*)btest->arg, |
| 2102 | +context); |
| 2103 | +if (arg&&IsA(arg,Const)) |
| 2104 | +{ |
| 2105 | +Const*carg= (Const*)arg; |
| 2106 | +boolresult; |
| 2107 | + |
| 2108 | +switch (btest->booltesttype) |
| 2109 | +{ |
| 2110 | +caseIS_TRUE: |
| 2111 | +result= (!carg->constisnull&& |
| 2112 | +DatumGetBool(carg->constvalue)); |
| 2113 | +break; |
| 2114 | +caseIS_NOT_TRUE: |
| 2115 | +result= (carg->constisnull|| |
| 2116 | + !DatumGetBool(carg->constvalue)); |
| 2117 | +break; |
| 2118 | +caseIS_FALSE: |
| 2119 | +result= (!carg->constisnull&& |
| 2120 | + !DatumGetBool(carg->constvalue)); |
| 2121 | +break; |
| 2122 | +caseIS_NOT_FALSE: |
| 2123 | +result= (carg->constisnull|| |
| 2124 | +DatumGetBool(carg->constvalue)); |
| 2125 | +break; |
| 2126 | +caseIS_UNKNOWN: |
| 2127 | +result=carg->constisnull; |
| 2128 | +break; |
| 2129 | +caseIS_NOT_UNKNOWN: |
| 2130 | +result= !carg->constisnull; |
| 2131 | +break; |
| 2132 | +default: |
| 2133 | +elog(ERROR,"unrecognized booltesttype: %d", |
| 2134 | + (int)btest->booltesttype); |
| 2135 | +result= false;/* keep compiler quiet */ |
| 2136 | +break; |
| 2137 | +} |
| 2138 | + |
| 2139 | +returnmakeBoolConst(result, false); |
| 2140 | +} |
| 2141 | + |
| 2142 | +newbtest=makeNode(BooleanTest); |
| 2143 | +newbtest->arg= (Expr*)arg; |
| 2144 | +newbtest->booltesttype=btest->booltesttype; |
| 2145 | +return (Node*)newbtest; |
| 2146 | +} |
2095 | 2147 |
|
2096 | 2148 | /*
|
2097 | 2149 | * For any node type not handled above, we recurse using
|
|