MonetDB: Jul2017 - push selects through left/right outer joins (...

2017-08-06 Thread Niels Nes
Changeset: d40bfa2c133a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d40bfa2c133a
Modified Files:
sql/server/rel_select.c
Branch: Jul2017
Log Message:

push selects through left/right outer joins (when allowed)


diffs (26 lines):

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
@@ -1542,8 +1542,20 @@ rel_filter(mvc *sql, sql_rel *rel, list 
return rel_select(sql->sa, rel, e);
 
if (/*is_semi(rel->op) ||*/ is_outerjoin(rel->op)) {
-   rel_join_add_exp(sql->sa, rel, e);
-   return rel;
+   if ((is_left(rel->op) || is_full(rel->op)) && 
rel_find_exp(rel->l, l->h->data)) {
+   rel_join_add_exp(sql->sa, rel, e);
+   return rel;
+   } else if ((is_right(rel->op) || is_full(rel->op)) && 
rel_find_exp(rel->r, l->h->data)) {
+   rel_join_add_exp(sql->sa, rel, e);
+   return rel;
+   }
+   if (is_left(rel->op) && rel_find_exp(rel->r, 
l->h->data)) {
+   rel->r = rel_push_select(sql, rel->r, L, e);
+   return rel;
+   } else if (is_right(rel->op) && rel_find_exp(rel->l, 
l->h->data)) {
+   rel->l = rel_push_select(sql, rel->l, L, e);
+   return rel;
+   }
}
/* push select into the given relation */
return rel_push_select(sql, rel, L, e);
___
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list


MonetDB: Jul2017 - fixes for bug 6385, ie check for a aggregate ...

2017-08-06 Thread Niels Nes
Changeset: 517019db709e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=517019db709e
Modified Files:
sql/benchmarks/tpch/load.sh
sql/server/rel_select.c
sql/test/BugTracker-2017/Tests/All

sql/test/BugTracker-2017/Tests/aggr_udf_with_more_than_2params.Bug-6385.sql
Branch: Jul2017
Log Message:

fixes for bug 6385, ie check for a aggregate earlier (also improved the
error in case of a missing aggregate function)


diffs (120 lines):

diff --git a/sql/benchmarks/tpch/load.sh b/sql/benchmarks/tpch/load.sh
--- a/sql/benchmarks/tpch/load.sh
+++ b/sql/benchmarks/tpch/load.sh
@@ -24,8 +24,8 @@ SF='sf-0.01'
 #SF='sf-5'
 
 dir=`echo $SF | tr '[a-z]' '[A-Z]'`
-$SQL < c.sql
-#$SQL < c.sql-primary-foreign
-cat load-$SF-LOCKED.sql$T | sed -e s+PWD+$PWD/$dir+ | $SQL 
-#cat load-$SF.sql$T | sed -e s+PWD+$PWD/$dir+ | $SQL
+#$SQL < c.sql
+$SQL < c.sql-primary-foreign
+#cat load-$SF-LOCKED.sql$T | sed -e s+PWD+$PWD/$dir+ | $SQL 
+cat load-$SF.sql$T | sed -e s+PWD+$PWD/$dir+ | $SQL
 #$SQL < alter.sql
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
@@ -2944,8 +2944,15 @@ rel_unop(mvc *sql, sql_rel **rel, symbol
sql->session->status = 0;
sql->errstr[0] = '\0';
e = rel_value_exp(sql, rel, l->next->data.sym, fs, iek);
-   if (!e)
+   if (!e) {
+   if (!f && *rel && (*rel)->card == CARD_AGGR) {
+   /* reset error */
+   sql->session->status = 0;
+   sql->errstr[0] = '\0';
+   return sql_error(sql, 02, "SELECT: no such aggregate 
'%s'", fname);
+   }
return NULL;
+   }
 
t = exp_subtype(e);
if (!t) {
@@ -3229,8 +3236,14 @@ rel_binop(mvc *sql, sql_rel **rel, symbo
 
l = rel_value_exp(sql, rel, dl->next->data.sym, f, iek);
r = rel_value_exp(sql, rel, dl->next->next->data.sym, f, iek);
-   if (!l && !r)
+   if (!l || !r)
sf = find_func(sql, s, fname, 2, F_AGGR, NULL);
+   if (!sf && (!l || !r) && *rel && (*rel)->card == CARD_AGGR) {
+   /* reset error */
+   sql->session->status = 0;
+   sql->errstr[0] = '\0';
+   return sql_error(sql, 02, "SELECT: no such aggregate '%s'", 
fname);
+   }
if (!l && !r && sf) { /* possibly we cannot resolve the argument as the 
function maybe an aggregate */
/* reset error */
sql->session->status = 0;
@@ -3294,26 +3307,43 @@ rel_nop(mvc *sql, sql_rel **rel, symbol 
char *sname = qname_schema(l->data.lval);
sql_schema *s = sql->session->schema;
exp_kind iek = {type_value, card_column, FALSE};
+   int err = 0;
 
for (; ops; ops = ops->next, nr_args++) {
sql_exp *e = rel_value_exp(sql, rel, ops->data.sym, fs, iek);
sql_subtype *tpe;
 
if (!e) 
-   return NULL;
+   err = 1;
append(exps, e);
-   tpe = exp_subtype(e);
-   if (!nr_args)
-   obj_type = tpe;
-   append(tl, tpe);
+   if (e) {
+   tpe = exp_subtype(e);
+   if (!nr_args)
+   obj_type = tpe;
+   append(tl, tpe);
+   }
}
if (sname)
s = mvc_bind_schema(sql, sname);

/* first try aggregate */
f = find_func(sql, s, fname, nr_args, F_AGGR, NULL);
-   if (f)
+   if (!f && err && *rel && (*rel)->card == CARD_AGGR) {
+   /* reset error */
+   sql->session->status = 0;
+   sql->errstr[0] = '\0';
+   return sql_error(sql, 02, "SELECT: no such aggregate '%s'", 
fname);
+   }
+   if (f) {
+   if (err) {
+   /* reset error */
+   sql->session->status = 0;
+   sql->errstr[0] = '\0';
+   }
return _rel_aggr(sql, rel, 0, s, fname, l->next->data.lval->h, 
fs);
+   }
+   if (err)
+   return NULL;
return _rel_nop(sql, s, fname, tl, exps, obj_type, nr_args, ek);
 
 }
diff --git a/sql/test/BugTracker-2017/Tests/All 
b/sql/test/BugTracker-2017/Tests/All
--- a/sql/test/BugTracker-2017/Tests/All
+++ b/sql/test/BugTracker-2017/Tests/All
@@ -62,4 +62,4 @@ crash-select_after_MAL_error.Bug-6332
 handle-values-subqueries.Bug-6336
 spurious_errors.Bug-6344
 caching_stats_bug.6374
-aggr_udf_with_more_than_2params.Bug-6385
+HAVE_LIBPY?aggr_udf_with_more_than_2params.Bug-6385
diff --git 
a/sql/test/BugTracker-2017/Tests/aggr_udf_with_more_than_2params.Bug-6385.sql 
b/sql/test/BugTracker-2017/Tests/aggr_udf_with_more_than_2params.Bug-6385.sql
--- 
a/sql/test/BugTracker-2017/Tests/aggr_udf_with_more_th