Changeset: c49492bbffa4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/c49492bbffa4
Modified Files:
sql/server/rel_select.c
Branch: default
Log Message:
Reduce code complexity by checking every individual try for privilege. For the
last attempt, check input's number of digits (fixes char(0) cases)
diffs (261 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
@@ -3732,6 +3732,16 @@ static sql_exp *
} else
a = sql_bind_func_(sql, sname, aname, exp_types(sql->sa, exps),
F_AGGR, false);
+ if (a) {
+ found = true;
+ if (!execute_priv(sql, a->func))
+ a = NULL;
+ } else {
+ /* reset error */
+ sql->session->status = 0;
+ sql->errstr[0] = '\0';
+ }
+
if (!a && list_length(exps) > 1) {
sql_subtype *t1 = exp_subtype(exps->h->data);
a = sql_bind_member(sql, sname, aname,
exp_subtype(exps->h->data), F_AGGR, list_length(exps), false, NULL);
@@ -3740,114 +3750,133 @@ static sql_exp *
&((sql_arg*)a->func->ops->h->data)->type,
&((sql_arg*)a->func->ops->h->next->data)->type) != 0) ) {
if (a) {
- node *n, *op = a->func->ops->h;
- list *nexps = sa_list(sql->sa);
-
- for (n = exps->h ; a && op && n; op = op->next,
n = n->next ) {
- sql_arg *arg = op->data;
- sql_exp *e = n->data;
-
- e = exp_check_type(sql, &arg->type,
*rel, e, type_equal); /* rel is a valid pointer */
- if (!e)
- a = NULL;
- list_append(nexps, e);
- }
- if (a && list_length(nexps)) /* count(col) has
|exps| != |nexps| */
+ list *nexps = NULL;
+ found = true; /* something was found */
+
+ if (!execute_priv(sql, a->func)) {
+ a = NULL;
+ } else if (!list_empty(exps) && !(nexps =
check_arguments_and_find_largest_any_type(sql, *rel, exps, a, 0))) {
+ a = NULL;
+ /* reset error */
+ sql->session->status = 0;
+ sql->errstr[0] = '\0';
+ found = false; /* reset found */
+ } else
exps = nexps;
+ } else {
+ /* reset error */
+ sql->session->status = 0;
+ sql->errstr[0] = '\0';
}
} else {
- sql_exp *l = exps->h->data, *ol = l;
- sql_exp *r = exps->h->next->data, *or = r;
+ sql_exp *l = exps->h->data, *ol = l, *r =
exps->h->next->data, *or = r;
sql_subtype *t2 = exp_subtype(r);
- a = NULL; /* reset a */
- if (rel_convert_types(sql, *rel, *rel, &l, &r, 1/*fix
scale*/, type_equal) >= 0){
+ if (!a) {
+ /* reset error */
+ sql->session->status = 0;
+ sql->errstr[0] = '\0';
+ }
+ a = NULL;
+ if (rel_convert_types(sql, *rel, *rel, &l, &r, 1/*fix
scale*/, type_equal) >= 0) {
list *tps = sa_list(sql->sa);
t1 = exp_subtype(l);
list_append(tps, t1);
t2 = exp_subtype(r);
list_append(tps, t2);
- a = sql_bind_func_(sql, sname, aname, tps,
F_AGGR, false);
- }
- if (!a) {
+
+ if ((a = sql_bind_func_(sql, sname, aname, tps,
F_AGGR, false))) {
+ found = true;
+ if (!execute_priv(sql, a->func))
+ a = NULL;
+ else
+ exps =
list_append(list_append(sa_list(sql->sa),l),r);
+ } else {
+ /* reset error */
+ sql->session->status = 0;
+ sql->errstr[0] = '\0';
+ }
+ if (!a) {
+ l = ol;
+ r = or;
+ }
+ } else {
+ /* reset error */
sql->session->status = 0;
sql->errstr[0] = '\0';
-
- l = ol;
- r = or;
- } else {
- list *nexps = sa_list(sql->sa);
-
- append(nexps,l);
- append(nexps,r);
- exps = nexps;
}
}
}
- if (!a) { /* find aggr + convert */
+ if (!a && !list_empty(exps)) { /* find aggr + convert */
/* try larger numeric type */
- node *n;
list *nexps = sa_list(sql->sa);
-
- for (n = exps->h ; n; n = n->next ) {
+ for (node *n = exps->h ; n; n = n->next ) {
sql_exp *e = n->data;
/* cast up, for now just dec to double */
- e = exp_numeric_supertype(sql, e);
- if (!e)
+ if (!(e = exp_numeric_supertype(sql, e)))
break;
list_append(nexps, e);
}
- a = sql_bind_func_(sql, sname, aname, exp_types(sql->sa,
nexps), F_AGGR, false);
- if (a && list_length(nexps)) /* count(col) has |exps| !=
|nexps| */
- exps = nexps;
- if (!a) {
- list *aggrs = sql_find_funcs(sql, sname, aname,
list_length(exps), F_AGGR, false);
-
- if (!list_empty(aggrs)) {
- found = true;
- int type_misses = 0;
-
- for (node *m = aggrs->h ; m; m = m->next) {
- list *nexps = sa_list(sql->sa);
- node *n, *op;
- a = (sql_subfunc *) m->data;
- op = a->func->ops->h;
-
- if (!execute_priv(sql, a->func))
- a = NULL;
- for (n = exps->h ; a && op && n; op =
op->next, n = n->next ) {
- sql_arg *arg = op->data;
- sql_exp *e = n->data;
-
- e = exp_check_type(sql,
&arg->type, *rel, e, type_equal); /* rel is a valid pointer */
- if (!e) {
- a = NULL;
- type_misses++;
- }
- list_append(nexps, e);
- }
- if (a) {
- if (list_length(nexps)) /*
count(col) has |exps| != |nexps| */
- exps = nexps;
- /* reset error */
- sql->session->status = 0;
- sql->errstr[0] = '\0';
- break;
- }
+ if (list_length(nexps) == list_length(exps)) { /* was able to
upcast every input */
+ a = sql_bind_func_(sql, sname, aname,
exp_types(sql->sa, nexps), F_AGGR, false);
+
+ if (a) {
+ found = true; /* something was found */
+ if (!execute_priv(sql, a->func))
+ a = NULL;
+ else if (!list_empty(exps) && !(nexps =
check_arguments_and_find_largest_any_type(sql, *rel, exps, a, 0))) {
+ a = NULL;
+ /* reset error */
+ sql->session->status = 0;
+ sql->errstr[0] = '\0';
+ found = false; /* reset found */
+ } else
+ exps = nexps;
+ } else {
+ /* reset error */
+ sql->session->status = 0;
+ sql->errstr[0] = '\0';
+ }
+ } else {
+ /* reset convert error */
+ sql->session->status = 0;
+ sql->errstr[0] = '\0';
+ }
+ }
+ if (!a) {
+ list *aggrs = sql_find_funcs(sql, sname, aname,
list_length(exps), F_AGGR, false);
+
+ if (!list_empty(aggrs)) {
+ for (node *m = aggrs->h ; m; m = m->next) {
+ list *nexps = NULL;
+ a = (sql_subfunc *) m->data;
+ found = true; /* something was found */
+
+ if (!execute_priv(sql, a->func)) {
+ a = NULL;
+ } else if (!list_empty(exps) && !(nexps =
check_arguments_and_find_largest_any_type(sql, *rel, exps, a, 0))) {
+ a = NULL;
+ /* reset error */
+ sql->session->status = 0;
+ sql->errstr[0] = '\0';
+ found = false; /* reset found */
+ } else {
+ exps = nexps;
+ break;
}
- found &= !type_misses; /* if 'a' was found but
the types didn't match don't give permission error */
}
- }
- }
- found |= a != NULL;
- if (a && execute_priv(sql, a->func)) {
+ } else {
+ /* reset error */
+ sql->session->status = 0;
+ sql->errstr[0] = '\0';
+ }
+ }
+ if (a) {
bool hasnil = have_nil(exps) || (strcmp(aname, "count") != 0 &&
(!groupby || list_empty(groupby->r))); /* for global case, the aggregate may
return NULL */
sql_exp *e = exp_aggr(sql->sa, exps, a, distinct, no_nil,
groupby?groupby->card:CARD_ATOM, hasnil);
- sql->session->status = 0; /* if the function was not found
clean the error */
- sql->errstr[0] = '\0';
if (!groupby)
return e;
if (all_freevar)
@@ -3863,18 +3892,15 @@ static sql_exp *
return e;
}
return e;
- } else {
- char *type = "unknown";
- char *uaname = SA_NEW_ARRAY(sql->ta, char, strlen(aname) + 1);
-
- if (exps->h) {
- sql_exp *e = exps->h->data;
- type = exp_subtype(e)->type->base.name;
- }
-
- return sql_error(sql, ERR_NOTFOUND, SQLSTATE(42000) "%s: %s
aggregate %s%s%s'%s'(%s)", toUpperCopy(uaname, aname), found ? "insufficient
privileges for" : "no such",
- sname ? "'":"", sname ? sname
: "", sname ? "'.":"", aname, type);
- }
+ }
+ char *type = "unknown", *uaname = SA_NEW_ARRAY(sql->ta, char,
strlen(aname) + 1);
+
+ if (!list_empty(exps)) {
+ sql_exp *e = exps->h->data;
+ type = exp_subtype(e)->type->base.name;
+ }
+ return sql_error(sql, ERR_NOTFOUND, SQLSTATE(42000) "%s: %s aggregate
%s%s%s'%s'(%s)", toUpperCopy(uaname, aname), found ? "insufficient privileges
for" : "no such",
+ sname ? "'":"", sname ? sname : "",
sname ? "'.":"", aname, type);
}
static sql_exp *
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]