Changeset: 8169a8e7f097 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/8169a8e7f097
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/server/rel_dump.c
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_optimizer.c
        sql/server/rel_select.c
        sql/storage/store.c
Branch: antipush
Log Message:

Merged with default


diffs (truncated from 756 to 300 lines):

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
@@ -1294,12 +1294,13 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                                list_append(l, es);
                        }
                }
-               if (f->func->rel)
-                       s = stmt_func(be, stmt_list(be, l), sa_strdup(sql->sa, 
f->func->base.name), f->func->rel, (f->func->type == F_UNION));
-               else
-                       s = stmt_Nop(be, stmt_list(be, l), sel, f);
-               if (!s)
+               if (f->func->rel) {
+                       if (!(s = stmt_func(be, stmt_list(be, l), 
sa_strdup(sql->sa, f->func->base.name), f->func->rel, (f->func->type == 
F_UNION))))
+                               return NULL;
+                       f->func->rel = s->op4.rel; /* f->func->rel may get 
rewritten */
+               } else if (!(s = stmt_Nop(be, stmt_list(be, l), sel, f))) {
                        return NULL;
+               }
        }       break;
        case e_aggr: {
                list *attr = e->l;
@@ -2166,18 +2167,6 @@ rel2bin_table(backend *be, sql_rel *rel,
                                        s = stmt_alias(be, s, rnme, a->name);
                                        list_append(l, s);
                                }
-#if 0
-                               if (list_length(f->res) == 
list_length(f->func->res) + 1) {
-                                       assert(0);
-                                       /* add missing %TID% column */
-                                       sql_subtype *t = f->res->t->data;
-                                       stmt *s = stmt_rs_column(be, psub, i, 
t);
-                                       const char *rnme = 
exp_find_rel_name(op);
-
-                                       s = stmt_alias(be, s, rnme, TID);
-                                       list_append(l, s);
-                               }
-#endif
                        }
                }
                assert(rel->flag != TABLE_PROD_FUNC || !sub || !(sub->nrcols));
@@ -2195,7 +2184,7 @@ rel2bin_table(backend *be, sql_rel *rel,
                sub = stmt_list(be, l);
                if (!(sub = stmt_func(be, sub, sa_strdup(sql->sa, nme), rel->l, 
0)))
                        return NULL;
-               fr = rel->l;
+               fr = rel->l = sub->op4.rel; /* rel->l may get rewritten */
                l = sa_list(sql->sa);
                for(i = 0, n = rel->exps->h; n; n = n->next, i++ ) {
                        sql_exp *c = n->data;
diff --git a/sql/backends/monet5/sql_execute.c 
b/sql/backends/monet5/sql_execute.c
--- a/sql/backends/monet5/sql_execute.c
+++ b/sql/backends/monet5/sql_execute.c
@@ -774,20 +774,16 @@ RAstatement(Client c, MalBlkPtr mb, MalS
                return RAcommit_statement(be, 
createException(SQL,"RAstatement",SQLSTATE(HY013) MAL_MALLOC_FAIL));
        refs = sa_list(m->sa);
        rel = rel_read(m, *expr, &pos, refs);
+       if (*opt && rel)
+               rel = sql_processrelation(m, rel, 1, 1);
        if (!rel) {
                if (strlen(m->errstr) > 6 && m->errstr[5] == '!')
                        msg = createException(SQL, "RAstatement", "%s", 
m->errstr);
                else
                        msg = createException(SQL, "RAstatement", 
SQLSTATE(42000) "%s", m->errstr);
        } else {
-
-               if (*opt && rel)
-                       rel = sql_processrelation(m, rel, 1, 1);
-
-               if ((msg = MSinitClientPrg(c, sql_private_module_name, "test")) 
!= MAL_SUCCEED) {
-                       rel_destroy(rel);
+               if ((msg = MSinitClientPrg(c, sql_private_module_name, "test")) 
!= MAL_SUCCEED)
                        return RAcommit_statement(be, msg);
-               }
 
                /* generate MAL code, ignoring any code generation error */
                setVarType(c->curprg->def, 0, 0);
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
@@ -3408,17 +3408,17 @@ stmt_func(backend *be, stmt *ops, const 
        if (ops && ops->nr < 0)
                return NULL;
 
-       p = find_prop(rel->p, PROP_REMOTE);
-       if (p)
+       if ((p = find_prop(rel->p, PROP_REMOTE)))
                rel->p = prop_remove(rel->p, p);
-       rel = sql_processrelation(be->mvc, rel, 1, 1);
+       if (!(rel = sql_processrelation(be->mvc, rel, 1, 1)))
+               return NULL;
        if (p) {
                p->p = rel->p;
                rel->p = p;
        }
 
        if (monet5_create_relational_function(be->mvc, mod, name, rel, ops, 
NULL, 1) < 0)
-                return NULL;
+               return NULL;
 
        if (f_union)
                q = newStmt(mb, batmalRef, multiplexRef);
diff --git a/sql/server/rel_distribute.c b/sql/server/rel_distribute.c
--- a/sql/server/rel_distribute.c
+++ b/sql/server/rel_distribute.c
@@ -190,7 +190,6 @@ replica(visitor *v, sql_rel *rel)
 static sql_rel *
 distribute(visitor *v, sql_rel *rel)
 {
-       sql_rel *l = rel->l, *r = rel->r;
        prop *p, *pl, *pr;
 
        /* for merge statement join, ignore the multiple references */
@@ -204,6 +203,7 @@ distribute(visitor *v, sql_rel *rel)
                        return rel;
                }
        }
+       sql_rel *l = rel->l, *r = rel->r; /* look on left and right relations 
after possibly doing rel_copy */
 
        switch (rel->op) {
        case op_basetable: {
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
@@ -972,6 +972,31 @@ parse_atom(mvc *sql, char *r, int *pos, 
 }
 
 static sql_exp*
+function_error_string(mvc *sql, const char *schema, const char *fname, list 
*exps, bool found, sql_ftype type)
+{
+       char *arg_list = NULL, *F = NULL, *fn = NULL;
+
+       FUNC_TYPE_STR(type, F, fn)
+
+       (void) F;
+       if (!list_empty(exps)) {
+               for (node *n = exps->h; n ; n = n->next) {
+                       sql_subtype *t = exp_subtype(n->data);
+                       char *tpe = t ? sql_subtype_string(sql->ta, t) : "?";
+
+                       if (arg_list) {
+                               arg_list = sa_message(sql->ta, "%s, %s", 
arg_list, tpe);
+                       } else {
+                               arg_list = tpe;
+                       }
+               }
+       }
+       return sql_error(sql, ERR_NOTFOUND, SQLSTATE(42000) "%s %s 
%s%s%s'%s'(%s)",
+                                       found ? "Insufficient privileges for" : 
"No such", fn, schema ? "'":"", schema ? schema : "",
+                                       schema ? "'.":"", fname, arg_list ? 
arg_list : "");
+}
+
+static sql_exp*
 exp_read(mvc *sql, sql_rel *lrel, sql_rel *rrel, list *top_exps, char *r, int 
*pos, int grp, int in_cmp)
 {
        int f = -1, old, d=0, s=0, unique = 0, no_nils = 0, quote = 0, 
zero_if_empty = 0, sem = 0, anti = 0;
@@ -1187,9 +1212,9 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                                a = sql_bind_func(sql, tname, cname, 
sql_bind_localtype("void"), NULL, F_AGGR); /* count(*) */
                        }
                        if (!a)
-                               return sql_error(sql, ERR_NOTFOUND, 
SQLSTATE(42000) "Aggregate '%s%s%s %d' not found\n", tname ? tname : "", tname 
? "." : "", cname, list_length(exps));
+                               return function_error_string(sql, tname, cname, 
exps, false, F_AGGR);
                        if (!execute_priv(sql, a->func))
-                               return sql_error(sql, -1, SQLSTATE(42000) 
"Aggregate: no privilege to call aggregate '%s%s%s %d'\n", tname ? tname : "", 
tname ? "." : "", cname, list_length(exps));
+                               return function_error_string(sql, tname, cname, 
exps, true, F_AGGR);
                        exp = exp_aggr( sql->sa, exps, a, unique, no_nils, 
CARD_ATOM, 1);
                        if (zero_if_empty)
                                set_zero_if_empty(exp);
@@ -1199,7 +1224,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                                /* these functions are bound on a different way 
*/
                                if ((f = sql_find_func(sql, NULL, cname, 2, 
F_FUNC, NULL))) {
                                        if (!execute_priv(sql, f->func))
-                                               return sql_error(sql, -1, 
SQLSTATE(42000) "Function: no privilege to call function '%s%s%s %d'\n", tname 
? tname : "", tname ? "." : "", cname, nops);
+                                               return 
function_error_string(sql, tname, cname, exps, true, F_FUNC);
                                        sql_exp *res = exps->t->data;
                                        sql_subtype *restype = exp_subtype(res);
                                        f->res->h->data = 
sql_create_subtype(sql->sa, restype->type, restype->digits, restype->scale);
@@ -1231,7 +1256,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                                }
 
                                if (f && !execute_priv(sql, f->func))
-                                       return sql_error(sql, -1, 
SQLSTATE(42000) "Function: no privilege to call function '%s%s%s %d'\n", tname 
? tname : "", tname ? "." : "", cname, nops);
+                                       return function_error_string(sql, 
tname, cname, exps, true, F_FUNC);
                                /* apply scale fixes if needed */
                                if (f && f->func->type != F_ANALYTIC) {
                                        if (list_length(exps) == 1) {
@@ -1311,7 +1336,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                                        }
                                }
                        } else {
-                               return sql_error(sql, ERR_NOTFOUND, 
SQLSTATE(42000) "Function '%s%s%s %d' not found\n", tname ? tname : "", tname ? 
"." : "", cname, nops);
+                               return function_error_string(sql, tname, cname, 
exps, false, F_FUNC);
                        }
                }
        }
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
@@ -2971,73 +2971,6 @@ exp_sum_scales(sql_subfunc *f, sql_exp *
        }
 }
 
-list *
-check_arguments_and_find_largest_any_type(mvc *sql, sql_rel *rel, list *exps, 
sql_subfunc *sf, int maybe_zero_or_one)
-{
-       list *nexps = new_exp_list(sql->sa);
-       sql_subtype *atp = NULL, super, *res = !list_empty(sf->res) ? 
sf->res->h->data: NULL;
-       unsigned int rdigits = 0; /* used for res of type char and varchar */
-
-       /* find largest any type argument */
-       for (node *n = exps->h, *m = sf->func->ops->h; n && m; n = n->next, m = 
m->next) {
-               sql_arg *a = m->data;
-               sql_exp *e = n->data;
-               sql_subtype *t = exp_subtype(e);
-
-               if (a->type.type->eclass == EC_ANY) {
-                       if (t && atp) {
-                               result_datatype(&super, t, atp);
-                               atp = &super;
-                       } else if (t) {
-                               atp = t;
-                       }
-               }
-       }
-       if (atp && atp->type->localtype == TYPE_void) /* NULL */
-               atp = sql_bind_localtype("str");
-       for (node *n = exps->h, *m = sf->func->ops->h; n && m; n = n->next, m = 
m->next) {
-               sql_arg *a = m->data;
-               sql_exp *e = n->data;
-               sql_subtype *ntp = &a->type, *t = exp_subtype(e);
-
-               if (a->type.type->eclass == EC_ANY && atp)
-                       ntp = sql_create_subtype(sql->sa, atp->type, 
atp->digits, atp->scale);
-               else if (t && ntp->digits == 0 && 
(!strcmp(a->type.type->base.name, "char") || !strcmp(a->type.type->base.name, 
"varchar")))
-                       ntp = sql_create_subtype(sql->sa, a->type.type, 
type_digits_to_char_digits(t), 0);
-               if (!(e = exp_check_type(sql, ntp, rel, e, type_equal)))
-                       return NULL;
-               if (maybe_zero_or_one && e->card > CARD_ATOM) {
-                       sql_subfunc *zero_or_one = sql_bind_func(sql, "sys", 
"zero_or_one", exp_subtype(e), NULL, F_AGGR);
-                       e = exp_aggr1(sql->sa, e, zero_or_one, 0, 0, CARD_ATOM, 
has_nil(e));
-               }
-               append(nexps, e);
-
-               /* for (var)char returning functions the output type will be 
the biggest string found except for fix_scale cases */
-               if (res && res->digits == 0 && (t = exp_subtype(e)) && 
(!strcmp(res->type->base.name, "char") || !strcmp(res->type->base.name, 
"varchar"))) {
-                       unsigned int tdigits = type_digits_to_char_digits(t);
-                       if (sf->func->fix_scale == DIGITS_ADD) {
-                               unsigned int nvalue = rdigits + tdigits;
-                               if (nvalue < rdigits || nvalue >= (unsigned 
int) INT32_MAX)
-                                       return sql_error(sql, 02, 
SQLSTATE(42000) "SELECT: output number of digits for %s is too large", 
sf->func->base.name);
-                               rdigits = nvalue;
-                       } else if (sf->func->fix_scale == INOUT) {
-                               if (n == exps->h)
-                                       rdigits = tdigits;
-                       } else {
-                               rdigits = sql_max(rdigits, tdigits);
-                       }
-               }
-       }
-       /* dirty hack */
-       if (sf->func->type != F_PROC && sf->func->type != F_UNION && 
sf->func->type != F_LOADER && res) {
-               if (res->type->eclass == EC_ANY && atp)
-                       sf->res->h->data = sql_create_subtype(sql->sa, 
atp->type, atp->digits, atp->scale);
-               else if (res->digits == 0 && (!strcmp(res->type->base.name, 
"char") || !strcmp(res->type->base.name, "varchar")))
-                       res->digits = rdigits;
-       }
-       return nexps;
-}
-
 int
 exp_aggr_is_count(sql_exp *e)
 {
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -197,7 +197,6 @@ extern atom *exp_flatten(mvc *sql, sql_e
 
 extern sql_exp *exp_scale_algebra(mvc *sql, sql_subfunc *f, sql_rel *rel, 
sql_exp *l, sql_exp *r);
 extern void exp_sum_scales(sql_subfunc *f, sql_exp *l, sql_exp *r);
-extern list *check_arguments_and_find_largest_any_type(mvc *sql, sql_rel *rel, 
list *exps, sql_subfunc *sf, int maybe_zero_or_one);
 
 extern int exp_aggr_is_count(sql_exp *e);
 extern list *check_distinct_exp_names(mvc *sql, list *exps);
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
@@ -1675,8 +1675,7 @@ check_projection_on_foreignside(sql_rel 
 static sql_rel *
 rel_simplify_project_fk_join(mvc *sql, sql_rel *r, list *pexps, list 
*orderexps, int *changes)
 {
-       sql_rel *rl = r->l;
-       sql_rel *rr = r->r;
+       sql_rel *rl = r->l, *rr = r->r, *nr = NULL;
        sql_exp *je, *le, *nje, *re;
        int fk_left = 1;
 
@@ -1711,22 +1710,38 @@ rel_simplify_project_fk_join(mvc *sql, s
 
        (*changes)++;
        /* if the foreign key column doesn't have NULL values, then return it */
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to