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