Changeset: 0a97056b6c89 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0a97056b6c89
Modified Files:
        sql/server/rel_exp.c
Branch: Oct2020
Log Message:

Set operations are projections, so don't search an expression recursively 
further on one of these relations. Also don't do duplicate work


diffs (53 lines):

diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -1682,46 +1682,20 @@ rel_find_exp_and_corresponding_rel(sql_r
                case op_right:
                case op_full:
                case op_join:
+               case op_semi:
+               case op_anti:
                        ne = rel_find_exp_and_corresponding_rel(rel->l, e, res, 
under_join);
-                       if (!ne)
+                       if (!ne && is_join(rel->op))
                                ne = rel_find_exp_and_corresponding_rel(rel->r, 
e, res, under_join);
                        if (ne && under_join)
                                *under_join = true;
                        break;
                case op_table:
-                       if (rel->exps && e->type == e_column && e->l && 
exps_bind_column2(rel->exps, e->l, e->r, NULL))
-                               ne = e;
-                       if (ne && res)
-                               *res = rel;
-                       break;
-               case op_union:
-               case op_except:
-               case op_inter:
-               {
-                       if (rel->l)
-                               ne = rel_find_exp_and_corresponding_rel(rel->l, 
e, res, under_join);
-                       else if (rel->exps && e->l) {
-                               ne = exps_bind_column2(rel->exps, e->l, e->r, 
NULL);
-                               if (ne && res)
-                                       *res = rel;
-                       } else if (rel->exps) {
-                               ne = exps_bind_column(rel->exps, e->r, NULL, 
NULL, 1);
-                               if (ne && res)
-                                       *res = rel;
-                       }
-               }
-               break;
                case op_basetable:
-                       if (rel->exps && e->type == e_column && e->l)
-                               ne = exps_bind_column2(rel->exps, e->l, e->r, 
NULL);
-                       if (ne && res)
-                               *res = rel;
                        break;
                default:
                        if (!is_project(rel->op) && rel->l)
                                ne = rel_find_exp_and_corresponding_rel(rel->l, 
e, res, under_join);
-                       if (ne && (rel->op == op_semi || rel->op == op_anti) && 
under_join)
-                               *under_join = true;
                }
        }
        return ne;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to