Changeset: 9566b3ef32ed for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9566b3ef32ed
Modified Files:
        sql/server/rel_dump.c
        sql/server/rel_propagate.c
Branch: Jun2020
Log Message:

When attempting to update columns of children tables in a merge table, check 
for permissions


diffs (67 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
@@ -1472,12 +1472,16 @@ rel_read(mvc *sql, char *r, int *pos, li
 
                for (node *n = rel->exps->h ; n ; n = n->next) {
                        sql_exp *e = (sql_exp *) n->data;
-                       sql_column *c = mvc_bind_column(sql, t, exp_name(e));
+                       const char *cname = exp_name(e);
+
+                       if (strcmp(cname, TID) != 0) { /* Skip TID column */
+                               sql_column *c = mvc_bind_column(sql, t, cname);
 
-                       if (!c)
-                               return sql_error(sql, -1, SQLSTATE(42S22) 
"UPDATE: no such column '%s.%s'\n", t->base.name, exp_name(e));
-                       if (!(e = update_check_column(sql, t, c, e, rrel, 
c->base.name, "UPDATE")))
-                               return NULL;
+                               if (!c)
+                                       return sql_error(sql, -1, 
SQLSTATE(42S22) "UPDATE: no such column '%s.%s'\n", t->base.name, cname);
+                               if (!(e = update_check_column(sql, t, c, e, 
rrel, c->base.name, "UPDATE")))
+                                       return NULL;
+                       }
                        list_append(nexps, e);
                }
 
diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c
--- a/sql/server/rel_propagate.c
+++ b/sql/server/rel_propagate.c
@@ -622,20 +622,35 @@ rel_generate_subupdates(mvc *sql, sql_re
                sql_part *pt = (sql_part *) n->data;
                sql_table *sub = find_sql_table(t->s, pt->base.name);
                sql_rel *s1, *dup = NULL;
-               list *uexps = exps_copy(sql, rel->exps);
+               list *uexps = exps_copy(sql, rel->exps), *checked_updates = 
new_exp_list(sql->sa);
 
                if (!update_allowed(sql, sub, sub->base.name, "UPDATE", 
"update", 0))
                        return NULL;
 
+               for (node *n = uexps->h ; n ; n = n->next) {
+                       sql_exp *e = (sql_exp *) n->data;
+                       const char *cname = exp_name(e);
+
+                       if (strcmp(cname, TID) != 0) { /* Skip TID column */
+                               sql_column *c = mvc_bind_column(sql, sub, 
cname);
+
+                               if (!c)
+                                       return sql_error(sql, 02, 
SQLSTATE(42S22) "UPDATE: no such column '%s.%s'\n", sub->base.name, cname);
+                               if (!(e = update_check_column(sql, sub, c, e, 
rel, c->base.name, "UPDATE")))
+                                       return NULL;
+                       }
+                       list_append(checked_updates, e);
+               }
+
                if (rel->r) {
                        dup = rel_copy(sql, rel->r, 1);
                        dup = rel_change_base_table(sql, dup, t, sub);
                }
 
-               for (node *ne = uexps->h ; ne ; ne = ne->next)
+               for (node *ne = checked_updates->h ; ne ; ne = ne->next)
                        ne->data = exp_change_column_table(sql, (sql_exp*) 
ne->data, t, sub);
 
-               s1 = rel_update(sql, rel_basetable(sql, sub, sub->base.name), 
dup, NULL, uexps);
+               s1 = rel_update(sql, rel_basetable(sql, sub, sub->base.name), 
dup, NULL, checked_updates);
                if (just_one == 0) {
                        sel = rel_list(sql->sa, sel, s1);
                } else {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to