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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list