Changeset: ec1787ef7291 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ec1787ef7291
Modified Files:
sql/server/rel_dump.c
sql/server/rel_select.c
sql/server/rel_select.h
Branch: Mar2025
Log Message:
made views available over monetdb proto loader
diffs (86 lines):
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
@@ -18,6 +18,7 @@
#include "rel_rel.h"
#include "rel_basetable.h"
#include "rel_exp.h"
+#include "rel_unnest.h"
#include "rel_updates.h"
#include "rel_select.h"
#include "rel_remote.h"
@@ -2217,15 +2218,45 @@ rel_read(mvc *sql, char *r, int *pos, li
return sql_error(sql, -1,
SQLSTATE(42000) "Remote tables not supported under remote connections\n");
if (isReplicaTable(t))
return sql_error(sql, -1,
SQLSTATE(42000) "Replica tables not supported under remote connections\n");
- rel = rel_basetable(sql, t, tname);
- if (!table_privs(sql, t, PRIV_SELECT)) {
- rel_base_disallow(rel);
- if (rel_base_has_column_privileges(sql,
rel) == 0)
- return sql_error(sql, -1,
SQLSTATE(42000) "Access denied for %s to table '%s.%s'\n",
+ bool allowed = true;
+ if (!table_privs(sql, t, PRIV_SELECT))
+ allowed = false;
+ if (isView(t)) {
+ rel = rel_parse(sql, t->s, t->query,
m_instantiate);
+ rel = rel_unnest(sql, rel);
+
+ if (!rel)
+ return NULL;
+ /* Rename columns of the rel_parse relation */
+ set_processed(rel);
+ if (is_mset(rel->op) ||
is_simple_project(rel->op) || (is_groupby(rel->op) && !list_empty(rel->r))) {
+ /* it's unsafe to set the
projection names because of possible dependent sorting/grouping columns */
+ rel = rel_project(sql->sa, rel,
rel_projections(sql, rel, NULL, 0, 0));
+ set_processed(rel);
+ }
+ for (node *n =
ol_first_node(t->columns), *m = rel->exps->h; n && m; n = n->next, m = m->next)
{
+ sql_column *c = n->data;
+ sql_exp *e = m->data;
+
+ m->data = e =
exp_check_type(sql, &c->type, NULL, e, type_equal);
+ exp_setname(sql, e, tname,
c->base.name);
+ set_basecol(e);
+ }
+ list_hash_clear(rel->exps);
+ if (rel && !allowed && t->query && (rel
= rel_reduce_on_column_privileges(sql, rel, t)) == NULL)
+ return sql_error(sql, 02,
SQLSTATE(42000) "SELECT: access denied for %s to view '%s.%s'",
get_string_global_var(sql, "current_user"), t->s->base.name, tname);
+ rel = rel_project(sql->sa, rel, NULL);
+ } else {
+ rel = rel_basetable(sql, t, tname);
+ if (!allowed) {
+ rel_base_disallow(rel);
+ if
(rel_base_has_column_privileges(sql, rel) == 0)
+ return sql_error(sql,
-1, SQLSTATE(42000) "Access denied for %s to table '%s.%s'\n",
get_string_global_var(sql, "current_user"), s->base.name, tname);
+ }
+ rel_base_use_all(sql, rel);
+ rel = rewrite_basetable(sql, rel);
}
- rel_base_use_all(sql, rel);
- rel = rewrite_basetable(sql, rel);
if (!r[*pos])
return rel;
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
@@ -1216,7 +1216,7 @@ check_is_lateral(symbol *tableref)
}
}
-static sql_rel *
+sql_rel *
rel_reduce_on_column_privileges(mvc *sql, sql_rel *rel, sql_table *t)
{
list *exps = sa_list(sql->sa);
diff --git a/sql/server/rel_select.h b/sql/server/rel_select.h
--- a/sql/server/rel_select.h
+++ b/sql/server/rel_select.h
@@ -35,5 +35,6 @@ extern sql_rel *table_ref(sql_query *que
extern sql_exp *find_table_function(mvc *sql, char *sname, char *fname, list
*exps, list *tl, sql_ftype type);
extern sql_rel *rel_loader_function(sql_query* query, symbol* s, list *fexps,
sql_subfunc **loader_function);
extern list *check_arguments_and_find_largest_any_type(mvc *sql, sql_rel *rel,
list *exps, sql_subfunc *sf, int maybe_zero_or_one, bool internal /*or second
compile */);
+extern sql_rel *rel_reduce_on_column_privileges(mvc *sql, sql_rel *rel,
sql_table *t);
#endif /*_REL_SELECT_H_*/
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]