diff options
Diffstat (limited to 'src/backend/optimizer/util/clauses.c')
-rw-r--r-- | src/backend/optimizer/util/clauses.c | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index 322aeba1ce3..f9906cffc04 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.45 1999/08/10 03:00:15 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.46 1999/08/12 04:32:54 tgl Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -666,38 +666,39 @@ get_rels_atts(Node *clause, *-------------------- */ void -CommuteClause(Node *clause) +CommuteClause(Expr *clause) { - Node *temp; - Oper *commu; - Form_pg_operator commuTup; HeapTuple heapTup; + Form_pg_operator commuTup; + Oper *commu; + Node *temp; - if (!is_opclause(clause)) - elog(ERROR, "CommuteClause: applied to non-operator clause"); + if (!is_opclause((Node *) clause) || + length(clause->args) != 2) + elog(ERROR, "CommuteClause: applied to non-binary-operator clause"); heapTup = (HeapTuple) - get_operator_tuple(get_commutator(((Oper *) ((Expr *) clause)->oper)->opno)); + get_operator_tuple(get_commutator(((Oper *) clause->oper)->opno)); if (heapTup == (HeapTuple) NULL) elog(ERROR, "CommuteClause: no commutator for operator %u", - ((Oper *) ((Expr *) clause)->oper)->opno); + ((Oper *) clause->oper)->opno); commuTup = (Form_pg_operator) GETSTRUCT(heapTup); commu = makeOper(heapTup->t_data->t_oid, commuTup->oprcode, commuTup->oprresult, - ((Oper *) ((Expr *) clause)->oper)->opsize, + ((Oper *) clause->oper)->opsize, NULL); /* * re-form the clause in-place! */ - ((Expr *) clause)->oper = (Node *) commu; - temp = lfirst(((Expr *) clause)->args); - lfirst(((Expr *) clause)->args) = lsecond(((Expr *) clause)->args); - lsecond(((Expr *) clause)->args) = temp; + clause->oper = (Node *) commu; + temp = lfirst(clause->args); + lfirst(clause->args) = lsecond(clause->args); + lsecond(clause->args) = temp; } |