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