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