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]

Reply via email to