Changeset: f10cf4b23480 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f10cf4b23480
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_statement.c
        sql/server/rel_select.c
Branch: noce
Log Message:

Merge with default branch.


diffs (truncated from 2028 to 300 lines):

diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c
--- a/gdk/gdk_calc.c
+++ b/gdk/gdk_calc.c
@@ -319,11 +319,6 @@ BATcalcnot(BAT *b, BAT *s, BAT *r)
        bn->tnonil = nils == 0;
        bn->tkey = b->tkey && nils <= 1;
 
-       if (nils != 0 && !b->tnil) {
-               b->tnil = true;
-               b->batDirtydesc = true;
-       }
-
        TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
                  ",r=" ALGOOPTBATFMT " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
                  ALGOBATPAR(b), ALGOOPTBATPAR(s),
@@ -449,11 +444,6 @@ BATcalcnegate(BAT *b, BAT *s, BAT *r)
        bn->tnonil = nils == 0;
        bn->tkey = b->tkey && nils <= 1;
 
-       if (nils != 0 && !b->tnil) {
-               b->tnil = true;
-               b->batDirtydesc = true;
-       }
-
        TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
                  ",r=" ALGOOPTBATFMT " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
                  ALGOBATPAR(b), ALGOOPTBATPAR(s),
@@ -589,11 +579,6 @@ BATcalcabsolute(BAT *b, BAT *s, BAT *r)
        bn->tnil = nils != 0;
        bn->tnonil = nils == 0;
 
-       if (nils && !b->tnil) {
-               b->tnil = true;
-               b->batDirtydesc = true;
-       }
-
        TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
                  ",r=" ALGOOPTBATFMT " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
                  ALGOBATPAR(b), ALGOOPTBATPAR(s),
@@ -728,11 +713,6 @@ BATcalciszero(BAT *b, BAT *s, BAT *r)
        bn->tnil = nils != 0;
        bn->tnonil = nils == 0;
 
-       if (nils != 0 && !b->tnil) {
-               b->tnil = true;
-               b->batDirtydesc = true;
-       }
-
        TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
                  ",r=" ALGOOPTBATFMT " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
                  ALGOBATPAR(b), ALGOOPTBATPAR(s),
@@ -871,11 +851,6 @@ BATcalcsign(BAT *b, BAT *s, BAT *r)
        bn->tnil = nils != 0;
        bn->tnonil = nils == 0;
 
-       if (nils != 0 && !b->tnil) {
-               b->tnil = true;
-               b->batDirtydesc = true;
-       }
-
        TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
                  ",r=" ALGOOPTBATFMT " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
                  ALGOBATPAR(b), ALGOOPTBATPAR(s),
@@ -3809,15 +3784,6 @@ BATcalcincrdecr(BAT *b, BAT *s, BAT *r, 
        bn->tnil = nils != 0;
        bn->tnonil = nils == 0;
 
-       if (nils && !b->tnil) {
-               b->tnil = true;
-               b->batDirtydesc = true;
-       }
-       if (nils == 0 && !b->tnonil) {
-               b->tnonil = true;
-               b->batDirtydesc = true;
-       }
-
        TRC_DEBUG(ALGO, "%s: b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
                  ",r=" ALGOOPTBATFMT " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
                  func, ALGOBATPAR(b), ALGOOPTBATPAR(s),
diff --git a/monetdb5/modules/mal/sysmon.c b/monetdb5/modules/mal/sysmon.c
--- a/monetdb5/modules/mal/sysmon.c
+++ b/monetdb5/modules/mal/sysmon.c
@@ -31,13 +31,14 @@ SYSMONqueue(Client cntxt, MalBlkPtr mb, 
        bat *w = getArgReference_bat(stk,pci,7);
        bat *m = getArgReference_bat(stk,pci,8);
        lng qtag;
-       int wrk, mem, sz;
+       int wrk, mem;
+       BUN sz;
        timestamp tsn;
        str msg = MAL_SUCCEED;
 
        (void) cntxt;
        (void) mb;
-       sz = qsize;     // reserve space for all tuples in QRYqueue
+       sz = (BUN) qsize;       // reserve space for all tuples in QRYqueue
        tag = COLnew(0, TYPE_lng, sz, TRANSIENT);
        sessionid = COLnew(0, TYPE_int, sz, TRANSIENT);
        user = COLnew(0, TYPE_str, sz, TRANSIENT);
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -779,7 +779,8 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                }
                assert(!e->r);
                if (exps) {
-                       int nrcols = 0, single_value = (fe->card <= CARD_ATOM);
+                       unsigned nrcols = 0;
+                       int single_value = (fe->card <= CARD_ATOM);
                        int push_cond_exec = 0, coalesce = 0;
                        stmt *ncond = NULL;
 
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -2625,7 +2625,7 @@ stmt_catalog(backend *be, int type, stmt
 void
 stmt_set_nrcols(stmt *s)
 {
-       int nrcols = 0;
+       unsigned nrcols = 0;
        int key = 1;
        node *n;
        list *l = s->op4.lval;
diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -107,7 +107,7 @@ static int convert_matrix[EC_MAX][EC_MAX
 /* EC_FLT */           { 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 
0 },
 /* EC_TIME */          { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 
0 },
 /* EC_TIME_TZ */       { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 
0 },
-/* EC_DATE */          { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 3, 0, 
0 },
+/* EC_DATE */          { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 0, 
0 },
 /* EC_TSTAMP */                { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 
1, 2, 0, 0 },
 /* EC_TSTAMP_TZ */     { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 
0 },
 /* EC_GEOM */          { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 
0 },
diff --git a/sql/server/CMakeLists.txt b/sql/server/CMakeLists.txt
--- a/sql/server/CMakeLists.txt
+++ b/sql/server/CMakeLists.txt
@@ -9,7 +9,7 @@
 BISON_TARGET(sqlparser
   sql_parser.y
   ${CMAKE_CURRENT_BINARY_DIR}/sql_parser.tab.c
-  COMPILE_FLAGS "-d -p sql -r all"
+  COMPILE_FLAGS "-d -p sql"
   DEFINES_FILE ${CMAKE_CURRENT_BINARY_DIR}/sql_parser.tab.h)
 
 add_library(sqlserver STATIC)
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -924,10 +924,22 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                        if (!(rexps = read_exps(sql, lrel, rrel, pexps, r, pos, 
'(', 0)))
                                return NULL;
                        if (filter) {
-                               sql_subfunc *func = sql_find_func(sql->sa, 
mvc_bind_schema(sql, "sys"), fname, 1+list_length(exps), F_FILT, NULL);
-                               if (!func)
+                               sql_subfunc *func = NULL;
+                               list *tl = sa_list(sql->sa);
+
+                               for (node *n = lexps->h; n; n = n->next){
+                                       sql_exp *e = n->data;
+
+                                       list_append(tl, exp_subtype(e));
+                               }
+                               for (node *n = rexps->h; n; n = n->next){
+                                       sql_exp *e = n->data;
+       
+                                       list_append(tl, exp_subtype(e));
+                               }
+
+                               if (!(func = sql_bind_func_(sql->sa, 
mvc_bind_schema(sql, "sys"), fname, tl, F_FILT)))
                                        return sql_error(sql, -1, 
SQLSTATE(42000) "Filter: missing function '%s'\n", fname);
-
                                return exp_filter(sql->sa, lexps, rexps, func, 
anti);
                        }
                        return exp_or(sql->sa, lexps, rexps, anti);
@@ -1028,20 +1040,33 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                if (tname && !s)
                        return sql_error(sql, -1, SQLSTATE(42000) "Schema %s 
not found\n", tname);
                if (grp) {
-                       if (exps && exps->h)
-                               a = sql_bind_func(sql->sa, s, cname, 
exp_subtype(exps->h->data), NULL, F_AGGR);
-                       else
+                       if (exps && exps->h) {
+                               list *ops = sa_list(sql->sa);
+                               for( n = exps->h; n; n = n->next)
+                                       append(ops, exp_subtype(n->data));
+                               a = sql_bind_func_(sql->sa, s, cname, ops, 
F_AGGR);
+                       } else {
                                a = sql_bind_func(sql->sa, s, cname, 
sql_bind_localtype("void"), NULL, F_AGGR); /* count(*) */
+                       }
                        if (!a)
-                               return sql_error(sql, -1, SQLSTATE(42000) 
"Aggregate %s%s%s not found\n", tname ? tname : "", tname ? "." : "", cname);
+                               return sql_error(sql, -1, SQLSTATE(42000) 
"Aggregate '%s%s%s %d' not found\n", tname ? tname : "", tname ? "." : "", 
cname, list_length(exps));
                        exp = exp_aggr( sql->sa, exps, a, unique, no_nils, 
CARD_ATOM, 1);
                        if (zero_if_empty)
                                set_zero_if_empty(exp);
                } else {
+                       int nops = list_length(exps);
                        list *ops = sa_list(sql->sa);
                        for( n = exps->h; n; n = n->next)
                                append(ops, exp_subtype(n->data));
+
                        f = sql_bind_func_(sql->sa, s, cname, ops, F_FUNC);
+                       if (!f)
+                               f = sql_bind_func_(sql->sa, s, cname, ops, 
F_ANALYTIC);
+                       if (!f && list_length(ops) > 1) {
+                               list_remove_node(ops, ops->t);
+                               list_remove_node(ops, ops->t); /* some window 
functions require don't include the bounds on their definition, ugh */
+                               f = sql_bind_func_(sql->sa, s, cname, ops, 
F_ANALYTIC);
+                       }
 
                        /* fix scale of mul function, other type casts are 
explicit */
                        if (f && f->func->fix_scale == SCALE_MUL && 
list_length(exps) == 2) {
@@ -1072,7 +1097,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                        if (f)
                                exp = exp_op( sql->sa, exps, f);
                        else
-                               return sql_error(sql, -1, SQLSTATE(42000) 
"Function: missing '%s.%s %d'\n", tname, cname, list_length(ops));
+                               return sql_error(sql, -1, SQLSTATE(42000) 
"Function '%s%s%s %d' not found\n", tname ? tname : "", tname ? "." : "", 
cname, nops);
                }
        }
 
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -1491,6 +1491,7 @@ rel_push_func_down(visitor *v, sql_rel *
                        sql_rel *nrel;
                        sql_rel *l = rel->l, *ol = l;
                        sql_rel *r = rel->r, *or = r;
+                       visitor nv = { .sql = v->sql, .parent = v->parent };
 
                        /* we need a full projection, group by's and unions 
cannot be extended
                         * with more expressions */
@@ -1510,13 +1511,9 @@ rel_push_func_down(visitor *v, sql_rel *
                        }
                        nrel = rel_project(v->sql->sa, rel, 
rel_projections(v->sql, rel, NULL, 1, 1));
 
-                       int old_changes = v->changes;
-                       v->changes = 0;
-                       if (!(exps = exps_push_single_func_down(v, rel, l, r, 
exps))) {
-                               v->changes = old_changes;
+                       if (!(exps = exps_push_single_func_down(&nv, rel, l, r, 
exps)))
                                return NULL;
-                       }
-                       if (v->changes) {
+                       if (nv.changes) {
                                rel = nrel;
                        } else {
                                if (l != ol)
@@ -1524,7 +1521,7 @@ rel_push_func_down(visitor *v, sql_rel *
                                if (is_joinop(rel->op) && r != or)
                                        rel->r = or;
                        }
-                       v->changes += old_changes;
+                       v->changes += nv.changes;
                }
        }
        if (rel->op == op_project && rel->l && rel->exps) {
@@ -1826,18 +1823,15 @@ rel_simplify_fk_joins(visitor *v, sql_re
 static list *
 sum_limit_offset(mvc *sql, sql_rel *rel)
 {
-       list *nexps = new_exp_list(sql->sa);
-       sql_subtype *lng = sql_bind_localtype("lng");
-       sql_subfunc *add;
-
        /* for sample we always propagate */
        if (is_sample(rel->op))
                return exps_copy(sql, rel->exps);
        /* if the expression list only consists of a limit expression, we copy 
it */
        if (list_length(rel->exps) == 1 && rel->exps->h->data)
-               return append(nexps, rel->exps->h->data);
-       add = sql_bind_func_result(sql->sa, sql->session->schema, "sql_add", 
F_FUNC, lng, 2, lng, lng);
-       return append(nexps, exp_op(sql->sa, rel->exps, add));
+               return list_append(sa_list(sql->sa), rel->exps->h->data);
+       sql_subtype *lng = sql_bind_localtype("lng");
+       sql_subfunc *add = sql_bind_func_result(sql->sa, sql->session->schema, 
"sql_add", F_FUNC, lng, 2, lng, lng);
+       return list_append(sa_list(sql->sa), exp_op(sql->sa, rel->exps, add));
 }
 
 static int
@@ -1968,7 +1962,7 @@ rel_push_topn_and_sample_down(visitor *v
                        }
                }
 
-               if (r && need_distinct(r))
+               if (r && is_simple_project(r->op) && need_distinct(r))
                        return rel;
 
                /* push topn/sample under projections */
@@ -1995,24 +1989,28 @@ rel_push_topn_and_sample_down(visitor *v
                        sql_rel *u = r, *x;
                        sql_rel *ul = u->l;
                        sql_rel *ur = u->r;
-
-                       /* only push topn once */
+                       bool changed = false;
+
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to