Changeset: 244b2576dfc8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=244b2576dfc8
Modified Files:
        sql/server/rel_rel.c
        sql/server/rel_rel.h
        sql/server/rel_select.c
        sql/test/BugTracker-2011/Tests/crash_on_alias.Bug-2798.stable.out
        sql/test/BugTracker-2011/Tests/crash_on_alias.Bug-2798.stable.out.int128
        sql/test/BugTracker-2017/Tests/all_minus_count_star.Bug-6297.stable.out
Branch: Jun2020
Log Message:

Don't re-invent the wheel. Call exps_any_match to find if any of the 
expressions match


diffs (170 lines):

diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -716,63 +716,6 @@ rel_join_add_exp( sql_allocator *sa, sql
                rel->card = e->card;
 }
 
-static sql_exp * exps_match(sql_exp *m, sql_exp *e);
-
-static int
-explists_match(list *m, list *e)
-{
-       node *nm,*ne;
-
-       if (!m || !e)
-               return (m==e);
-       if (list_length(m) != list_length(e))
-               return 0;
-       for (nm = m->h, ne = e->h; nm && ne; nm = nm->next, ne = ne->next) {
-               if (!exps_match(nm->data, ne->data))
-                       return 0;
-       }
-       return 1;
-}
-
-static sql_exp *
-exps_match(sql_exp *m, sql_exp *e)
-{
-       if (m->type != e->type)
-               return NULL;
-       switch (m->type) {
-       case e_column:
-               if (strcmp(m->r, e->r) == 0) {
-                       if (m->l && e->l && (strcmp(m->l, e->l) == 0))
-                               return m;
-                       else if (!m->l && !e->l)
-                               return m;
-               }
-               break;
-       case e_aggr:
-               if (m->f == e->f && explists_match(m->l, e->l))
-                       return m;
-               break;
-       default:
-               return NULL;
-       }
-       return NULL;
-}
-
-sql_exp *
-exps_find_match_exp(list *l, sql_exp *e)
-{
-       node *n;
-       if (!l || !list_length(l))
-               return NULL;
-
-       for (n = l->h; n; n = n->next){
-               sql_exp *m = n->data;
-               if (exps_match(m,e))
-                       return m;
-       }
-       return NULL;
-}
-
 sql_exp *
 rel_groupby_add_aggr(mvc *sql, sql_rel *rel, sql_exp *e)
 {
@@ -781,7 +724,7 @@ rel_groupby_add_aggr(mvc *sql, sql_rel *
        if (list_empty(rel->r))
                rel->card = e->card = CARD_ATOM;
 
-       if ((m=exps_find_match_exp(rel->exps, e)) == NULL) {
+       if ((m=exps_any_match(rel->exps, e)) == NULL) {
                if (!exp_name(e))
                        exp_label(sql->sa, e, ++sql->label);
                append(rel->exps, e);
diff --git a/sql/server/rel_rel.h b/sql/server/rel_rel.h
--- a/sql/server/rel_rel.h
+++ b/sql/server/rel_rel.h
@@ -121,7 +121,6 @@ extern sql_rel *rel_return_zero_or_one(m
 extern sql_rel *rel_zero_or_one(mvc *sql, sql_rel *rel, exp_kind ek);
 
 extern list *rel_dependencies(mvc *sql, sql_rel *r);
-extern sql_exp * exps_find_match_exp(list *l, sql_exp *e);
 
 typedef struct visitor {
        int changes;
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -1102,7 +1102,7 @@ rel_column_ref(sql_query *query, sql_rel
                                if (is_groupby(outer->op) && !is_sql_aggr(f)) {
                                        exp = rel_groupby_add_aggr(sql, outer, 
exp);
                                        exp->card = CARD_ATOM;
-                               } else if (is_groupby(outer->op) && 
is_sql_aggr(f) && exps_find_match_exp(outer->exps, exp))
+                               } else if (is_groupby(outer->op) && 
is_sql_aggr(f) && exps_any_match(outer->exps, exp))
                                        exp = exp_ref(sql, exp);
                                else
                                        exp->card = CARD_ATOM;
@@ -1171,7 +1171,7 @@ rel_column_ref(sql_query *query, sql_rel
                                if (is_groupby(outer->op) && !is_sql_aggr(f)) {
                                        exp = rel_groupby_add_aggr(sql, outer, 
exp);
                                        exp->card = CARD_ATOM;
-                               } else if (is_groupby(outer->op) && 
is_sql_aggr(f) && exps_find_match_exp(outer->exps, exp))
+                               } else if (is_groupby(outer->op) && 
is_sql_aggr(f) && exps_any_match(outer->exps, exp))
                                        exp = exp_ref(sql, exp);
                                else
                                        exp->card = CARD_ATOM;
diff --git a/sql/test/BugTracker-2011/Tests/crash_on_alias.Bug-2798.stable.out 
b/sql/test/BugTracker-2011/Tests/crash_on_alias.Bug-2798.stable.out
--- a/sql/test/BugTracker-2011/Tests/crash_on_alias.Bug-2798.stable.out
+++ b/sql/test/BugTracker-2011/Tests/crash_on_alias.Bug-2798.stable.out
@@ -33,8 +33,8 @@ stdout of test 'crash_on_alias.Bug-2798`
 project (
 | group by (
 | | table(sys.dbg) [ "dbg"."a", "dbg"."b" ] COUNT 
-| ) [ "dbg"."a" as "d" ] [ "d", sys.sum no nil ("dbg"."b") as "%1"."%1", 
"%1"."%1" as "%2"."%2" ]
-) [ "d", "%1"."%1", sys.sql_mul(sys.sql_div("%2"."%2", tinyint "2" as 
"%3"."%3"), tinyint "2") as "f" ]
+| ) [ "dbg"."a" as "d" ] [ "d", sys.sum no nil ("dbg"."b") as "%1"."%1" ]
+) [ "d", "%1"."%1", sys.sql_mul(sys.sql_div("%1"."%1", tinyint "2" as 
"%2"."%2"), tinyint "2") as "f" ]
 #set optimizer = 'sequential_pipe';
 #set optimizer = 'default_pipe';
 #SELECT a as d, SUM(b), (2 * (SUM(b) / (SELECT 2))) as f FROM dbg GROUP BY d;
@@ -57,8 +57,8 @@ project (
 project (
 | group by (
 | | table(sys.dbg) [ "dbg"."a", "dbg"."b" ] COUNT 
-| ) [ "dbg"."a" as "d" ] [ "d", sys.sum no nil ("dbg"."b") as "%1"."%1", 
"%1"."%1" as "%2"."%2" ]
-) [ "d", "%1"."%1" as "e", sys.sql_mul(sys.sql_div("%2"."%2", tinyint "2" as 
"%3"."%3"), tinyint "2") as "f" ]
+| ) [ "dbg"."a" as "d" ] [ "d", sys.sum no nil ("dbg"."b") as "%1"."%1" ]
+) [ "d", "%1"."%1" as "e", sys.sql_mul(sys.sql_div("%1"."%1", tinyint "2" as 
"%2"."%2"), tinyint "2") as "f" ]
 #set optimizer = 'sequential_pipe';
 #set optimizer = 'default_pipe';
 #SELECT a as d, SUM(b) as e, (2 * (SUM(b) / (SELECT 2))) as f FROM dbg GROUP 
BY d;
diff --git 
a/sql/test/BugTracker-2011/Tests/crash_on_alias.Bug-2798.stable.out.int128 
b/sql/test/BugTracker-2011/Tests/crash_on_alias.Bug-2798.stable.out.int128
--- a/sql/test/BugTracker-2011/Tests/crash_on_alias.Bug-2798.stable.out.int128
+++ b/sql/test/BugTracker-2011/Tests/crash_on_alias.Bug-2798.stable.out.int128
@@ -33,8 +33,8 @@ stdout of test 'crash_on_alias.Bug-2798`
 project (
 | group by (
 | | table(sys.dbg) [ "dbg"."a", "dbg"."b" ] COUNT 
-| ) [ "dbg"."a" as "d" ] [ "d", sys.sum no nil ("dbg"."b") as "%1"."%1", 
"%1"."%1" as "%2"."%2" ]
-) [ "d", "%1"."%1", sys.sql_mul(sys.sql_div("%2"."%2", tinyint "2" as 
"%3"."%3"), tinyint "2") as "f" ]
+| ) [ "dbg"."a" as "d" ] [ "d", sys.sum no nil ("dbg"."b") as "%1"."%1" ]
+) [ "d", "%1"."%1", sys.sql_mul(sys.sql_div("%1"."%1", tinyint "2" as 
"%2"."%2"), tinyint "2") as "f" ]
 #set optimizer = 'sequential_pipe';
 #set optimizer = 'default_pipe';
 #SELECT a as d, SUM(b), (2 * (SUM(b) / (SELECT 2))) as f FROM dbg GROUP BY d;
@@ -57,8 +57,8 @@ project (
 project (
 | group by (
 | | table(sys.dbg) [ "dbg"."a", "dbg"."b" ] COUNT 
-| ) [ "dbg"."a" as "d" ] [ "d", sys.sum no nil ("dbg"."b") as "%1"."%1", 
"%1"."%1" as "%2"."%2" ]
-) [ "d", "%1"."%1" as "e", sys.sql_mul(sys.sql_div("%2"."%2", tinyint "2" as 
"%3"."%3"), tinyint "2") as "f" ]
+| ) [ "dbg"."a" as "d" ] [ "d", sys.sum no nil ("dbg"."b") as "%1"."%1" ]
+) [ "d", "%1"."%1" as "e", sys.sql_mul(sys.sql_div("%1"."%1", tinyint "2" as 
"%2"."%2"), tinyint "2") as "f" ]
 #set optimizer = 'sequential_pipe';
 #set optimizer = 'default_pipe';
 #SELECT a as d, SUM(b) as e, (2 * (SUM(b) / (SELECT 2))) as f FROM dbg GROUP 
BY d;
diff --git 
a/sql/test/BugTracker-2017/Tests/all_minus_count_star.Bug-6297.stable.out 
b/sql/test/BugTracker-2017/Tests/all_minus_count_star.Bug-6297.stable.out
--- a/sql/test/BugTracker-2017/Tests/all_minus_count_star.Bug-6297.stable.out
+++ b/sql/test/BugTracker-2017/Tests/all_minus_count_star.Bug-6297.stable.out
@@ -74,7 +74,7 @@ stdout of test 'all_minus_count_star.Bug
 #CREATE TABLE tab1(col0 INTEGER, col1 INTEGER, col2 INTEGER);
 #CREATE TABLE tab2(col0 INTEGER, col1 INTEGER, col2 INTEGER);
 #SELECT ALL - CAST(COUNT ( * ) AS INT) + - 12 * - CAST(COUNT ( * ) AS INT) AS 
col2 FROM tab2, tab1 AS cor0;
-% sys. # table_name
+% . # table_name
 % col2 # name
 % bigint # type
 % 1 # length
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to