Commit dec354ca authored by Tom Lane's avatar Tom Lane

Fix a number of places that made faulty assumptions about

what is_opclause will accept.
parent 55000398
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/clausesel.c,v 1.17 1999/02/13 23:16:15 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/clausesel.c,v 1.18 1999/02/15 01:06:57 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -206,7 +206,7 @@ compute_selec(Query *root, List *clauses, List *or_selectivities) ...@@ -206,7 +206,7 @@ compute_selec(Query *root, List *clauses, List *or_selectivities)
Cost s1 = 0; Cost s1 = 0;
List *clause = lfirst(clauses); List *clause = lfirst(clauses);
if (clauses == NULL) if (clause == NULL)
s1 = 1.0; s1 = 1.0;
else if (IsA(clause, Param)) else if (IsA(clause, Param))
{ {
...@@ -351,7 +351,7 @@ compute_selec(Query *root, List *clauses, List *or_selectivities) ...@@ -351,7 +351,7 @@ compute_selec(Query *root, List *clauses, List *or_selectivities)
* an 'or' clause, but rather that of the single clause. * an 'or' clause, but rather that of the single clause.
*/ */
if (length(clauses) < 2) if (lnext(clauses) == NIL)
return s1; return s1;
else else
{ {
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/indxpath.c,v 1.44 1999/02/13 23:16:16 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/indxpath.c,v 1.45 1999/02/15 01:06:57 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -324,25 +324,25 @@ match_index_orclause(RelOptInfo *rel, ...@@ -324,25 +324,25 @@ match_index_orclause(RelOptInfo *rel,
{ {
clause = lfirst(clist); clause = lfirst(clist);
if (is_opclause(clause) && if (is_opclause(clause))
op_class(((Oper *) ((Expr *) clause)->oper)->opno, {
xclass, index->relam) && Expr *left = (Expr *) get_leftop((Expr *) clause);
((match_index_to_operand(indexkey, Expr *right = (Expr *) get_rightop((Expr *) clause);
(Expr *) get_leftop((Expr *) clause), if (left && right &&
rel, op_class(((Oper *) ((Expr *) clause)->oper)->opno,
index) && xclass, index->relam) &&
IsA(get_rightop((Expr *) clause), Const)) || ((IsA(right, Const) &&
(match_index_to_operand(indexkey, match_index_to_operand(indexkey, left, rel, index)) ||
(Expr *) get_rightop((Expr *) clause), (IsA(left, Const) &&
rel, match_index_to_operand(indexkey, right, rel, index))))
index) && lfirst(matching_indices) = lcons(index,
IsA(get_leftop((Expr *) clause), Const)))) lfirst(matching_indices));
lfirst(matching_indices) = lcons(index, lfirst(matching_indices)); }
matching_indices = lnext(matching_indices); matching_indices = lnext(matching_indices);
} }
return index_list;
return index_list;
} }
/**************************************************************************** /****************************************************************************
...@@ -1019,6 +1019,7 @@ clause_pred_clause_test(Expr *predicate, Node *clause) ...@@ -1019,6 +1019,7 @@ clause_pred_clause_test(Expr *predicate, Node *clause)
/* Check the basic form; for now, only allow the simplest case */ /* Check the basic form; for now, only allow the simplest case */
if (!is_opclause(clause) || if (!is_opclause(clause) ||
!IsA(clause_var, Var) || !IsA(clause_var, Var) ||
clause_const == NULL ||
!IsA(clause_const, Const) || !IsA(clause_const, Const) ||
!IsA(predicate->oper, Oper) || !IsA(predicate->oper, Oper) ||
!IsA(pred_var, Var) || !IsA(pred_var, Var) ||
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.46 1999/02/13 23:16:27 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.47 1999/02/15 01:06:58 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -780,6 +780,7 @@ switch_outer(List *clauses) ...@@ -780,6 +780,7 @@ switch_outer(List *clauses)
{ {
clause = lfirst(i); clause = lfirst(i);
op = (Node *) get_rightop(clause); op = (Node *) get_rightop(clause);
Assert(op != (Node*) NULL);
if (IsA(op, ArrayRef)) if (IsA(op, ArrayRef))
op = ((ArrayRef *) op)->refexpr; op = ((ArrayRef *) op)->refexpr;
Assert(IsA(op, Var)); Assert(IsA(op, Var));
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/initsplan.c,v 1.24 1999/02/14 04:56:50 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/initsplan.c,v 1.25 1999/02/15 01:06:58 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -367,13 +367,30 @@ set_joininfo_mergeable_hashable(List *rel_list) ...@@ -367,13 +367,30 @@ set_joininfo_mergeable_hashable(List *rel_list)
static MergeOrder * static MergeOrder *
mergejoinop(Expr *clause) mergejoinop(Expr *clause)
{ {
Oid leftOp, Var *left,
*right;
Oid opno,
leftOp,
rightOp; rightOp;
bool sortable; bool sortable;
sortable = op_mergejoinable(((Oper *) clause->oper)->opno, if (!is_opclause((Node*) clause))
(get_leftop(clause))->vartype, return NULL;
(get_rightop(clause))->vartype,
left = get_leftop(clause);
right = get_rightop(clause);
/* caution: is_opclause accepts more than I do, so check it */
if (!right)
return NULL; /* unary opclauses need not apply */
if (!IsA(left, Var) || !IsA(right, Var))
return NULL;
opno = ((Oper *) clause->oper)->opno;
sortable = op_mergejoinable(opno,
left->vartype,
right->vartype,
&leftOp, &leftOp,
&rightOp); &rightOp);
...@@ -381,11 +398,11 @@ mergejoinop(Expr *clause) ...@@ -381,11 +398,11 @@ mergejoinop(Expr *clause)
{ {
MergeOrder *morder = makeNode(MergeOrder); MergeOrder *morder = makeNode(MergeOrder);
morder->join_operator = ((Oper *) clause->oper)->opno; morder->join_operator = opno;
morder->left_operator = leftOp; morder->left_operator = leftOp;
morder->right_operator = rightOp; morder->right_operator = rightOp;
morder->left_type = (get_leftop(clause))->vartype; morder->left_type = left->vartype;
morder->right_type = (get_rightop(clause))->vartype; morder->right_type = right->vartype;
return morder; return morder;
} }
else else
...@@ -401,7 +418,22 @@ mergejoinop(Expr *clause) ...@@ -401,7 +418,22 @@ mergejoinop(Expr *clause)
static Oid static Oid
hashjoinop(Expr *clause) hashjoinop(Expr *clause)
{ {
return (op_hashjoinable(((Oper *) clause->oper)->opno, Var *left,
(get_leftop(clause))->vartype, *right;
(get_rightop(clause))->vartype));
if (!is_opclause((Node*) clause))
return InvalidOid;
left = get_leftop(clause);
right = get_rightop(clause);
/* caution: is_opclause accepts more than I do, so check it */
if (!right)
return InvalidOid; /* unary opclauses need not apply */
if (!IsA(left, Var) || !IsA(right, Var))
return InvalidOid;
return op_hashjoinable(((Oper *) clause->oper)->opno,
left->vartype,
right->vartype);
} }
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.39 1999/02/13 23:16:33 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.40 1999/02/15 01:06:58 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -290,6 +290,8 @@ replace_clause_joinvar_refs(Expr *clause, ...@@ -290,6 +290,8 @@ replace_clause_joinvar_refs(Expr *clause,
{ {
List *temp = NULL; List *temp = NULL;
if (clause == NULL)
return NULL;
if (IsA(clause, Var)) if (IsA(clause, Var))
{ {
temp = (List *) replace_joinvar_refs((Var *) clause, temp = (List *) replace_joinvar_refs((Var *) clause,
...@@ -586,6 +588,8 @@ replace_result_clause(Node *clause, ...@@ -586,6 +588,8 @@ replace_result_clause(Node *clause,
{ {
List *t; List *t;
if (clause == NULL)
return;
if (IsA(clause, Var)) if (IsA(clause, Var))
{ {
TargetEntry *subplanVar; TargetEntry *subplanVar;
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepqual.c,v 1.13 1999/02/13 23:16:37 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepqual.c,v 1.14 1999/02/15 01:06:59 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -106,10 +106,17 @@ find_nots(Expr *qual) ...@@ -106,10 +106,17 @@ find_nots(Expr *qual)
if (is_opclause((Node *) qual)) if (is_opclause((Node *) qual))
{ {
return (make_clause(qual->opType, qual->oper, Expr *left = (Expr *) get_leftop(qual);
lcons(find_nots((Expr *) get_leftop(qual)), Expr *right = (Expr *) get_rightop(qual);
lcons(find_nots((Expr *) get_rightop(qual)), if (right)
NIL)))); return make_clause(qual->opType, qual->oper,
lcons(find_nots(left),
lcons(find_nots(right),
NIL)));
else
return make_clause(qual->opType, qual->oper,
lcons(find_nots(left),
NIL));
} }
else if (and_clause((Node *) qual)) else if (and_clause((Node *) qual))
{ {
...@@ -155,12 +162,17 @@ normalize(Expr *qual) ...@@ -155,12 +162,17 @@ normalize(Expr *qual)
if (is_opclause((Node *) qual)) if (is_opclause((Node *) qual))
{ {
Expr *expr = (Expr *) qual; Expr *left = (Expr *) get_leftop(qual);
Expr *right = (Expr *) get_rightop(qual);
return (make_clause(expr->opType, expr->oper, if (right)
lcons(normalize((Expr *) get_leftop(qual)), return make_clause(qual->opType, qual->oper,
lcons(normalize((Expr *) get_rightop(qual)), lcons(normalize(left),
NIL)))); lcons(normalize(right),
NIL)));
else
return make_clause(qual->opType, qual->oper,
lcons(normalize(left),
NIL));
} }
else if (and_clause((Node *) qual)) else if (and_clause((Node *) qual))
{ {
...@@ -217,10 +229,17 @@ qual_cleanup(Expr *qual) ...@@ -217,10 +229,17 @@ qual_cleanup(Expr *qual)
if (is_opclause((Node *) qual)) if (is_opclause((Node *) qual))
{ {
return ((List *) make_clause(qual->opType, qual->oper, Expr *left = (Expr *) get_leftop(qual);
lcons(qual_cleanup((Expr *) get_leftop(qual)), Expr *right = (Expr *) get_rightop(qual);
lcons(qual_cleanup((Expr *) get_rightop(qual)), if (right)
NIL)))); return (List *) make_clause(qual->opType, qual->oper,
lcons(qual_cleanup(left),
lcons(qual_cleanup(right),
NIL)));
else
return (List *) make_clause(qual->opType, qual->oper,
lcons(qual_cleanup(left),
NIL));
} }
else if (and_clause((Node *) qual)) else if (and_clause((Node *) qual))
{ {
...@@ -276,10 +295,17 @@ pull_args(Expr *qual) ...@@ -276,10 +295,17 @@ pull_args(Expr *qual)
if (is_opclause((Node *) qual)) if (is_opclause((Node *) qual))
{ {
return (make_clause(qual->opType, qual->oper, Expr *left = (Expr *) get_leftop(qual);
lcons(pull_args((Expr *) get_leftop(qual)), Expr *right = (Expr *) get_rightop(qual);
lcons(pull_args((Expr *) get_rightop(qual)), if (right)
NIL)))); return make_clause(qual->opType, qual->oper,
lcons(pull_args(left),
lcons(pull_args(right),
NIL)));
else
return make_clause(qual->opType, qual->oper,
lcons(pull_args(left),
NIL));
} }
else if (and_clause((Node *) qual)) else if (and_clause((Node *) qual))
{ {
...@@ -384,7 +410,7 @@ push_nots(Expr *qual) ...@@ -384,7 +410,7 @@ push_nots(Expr *qual)
0, NULL); 0, NULL);
op->op_fcache = (FunctionCache *) NULL; op->op_fcache = (FunctionCache *) NULL;
return (make_opclause(op, get_leftop(qual), get_rightop(qual))); return make_opclause(op, get_leftop(qual), get_rightop(qual));
} }
else else
return make_notclause(qual); return make_notclause(qual);
...@@ -511,10 +537,17 @@ remove_ands(Expr *qual) ...@@ -511,10 +537,17 @@ remove_ands(Expr *qual)
return NIL; return NIL;
if (is_opclause((Node *) qual)) if (is_opclause((Node *) qual))
{ {
return ((List *) make_clause(qual->opType, qual->oper, Expr *left = (Expr *) get_leftop(qual);
lcons(remove_ands((Expr *) get_leftop(qual)), Expr *right = (Expr *) get_rightop(qual);
lcons(remove_ands((Expr *) get_rightop(qual)), if (right)
NIL)))); return (List *) make_clause(qual->opType, qual->oper,
lcons(remove_ands(left),
lcons(remove_ands(right),
NIL)));
else
return (List *) make_clause(qual->opType, qual->oper,
lcons(remove_ands(left),
NIL));
} }
else if (and_clause((Node *) qual)) else if (and_clause((Node *) qual))
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment