Changeset: 1fb86b27531b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1fb86b27531b
Modified Files:
sql/server/rel_updates.c
Branch: default
Log Message:
small cleanup of merge code
diffs (83 lines):
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -1458,6 +1458,11 @@ merge_into_table(sql_query *query, dlist
if (rel_name(joined) && strcmp(bt_name, rel_name(joined)) == 0)
return sql_error(sql, 02, SQLSTATE(42000) "MERGE: '%s' on both
sides of the joining condition", bt_name);
+ join_rel = rel_crossproduct(sql->sa, bt, joined, op_left);
+ if (!(join_rel = rel_logical_exp(query, join_rel, search_cond,
sql_where | sql_join | sql_merge)))
+ return NULL;
+ set_processed(join_rel);
+
for (dnode *m = merge_list->h; m; m = m->next) {
symbol *sym = m->data.sym, *opt_search, *action;
tokens token = sym->token;
@@ -1475,18 +1480,13 @@ merge_into_table(sql_query *query, dlist
processed |= MERGE_UPDATE_DELETE;
rel_base_use_tid(sql, bt);
+
+ if ((processed & MERGE_INSERT) == MERGE_INSERT)
+ join_rel = rel_dup(join_rel);
+
if (uptdel == SQL_UPDATE) {
if (!update_allowed(sql, t, tname, "MERGE",
"update", 0))
return NULL;
- if ((processed & MERGE_INSERT) == MERGE_INSERT)
{
- join_rel = rel_dup(join_rel);
- } else {
- join_rel = rel_crossproduct(sql->sa,
bt, joined, op_left);
- if (!(join_rel = rel_logical_exp(query,
join_rel, search_cond, sql_where | sql_join | sql_merge)))
- return NULL;
- set_processed(join_rel);
- }
-
sel_rel = join_rel;
if (opt_search && !(sel_rel =
rel_logical_exp(query, sel_rel, opt_search, sql_where | sql_merge)))
return NULL;
@@ -1495,15 +1495,6 @@ merge_into_table(sql_query *query, dlist
} else if (uptdel == SQL_DELETE) {
if (!update_allowed(sql, t, tname, "MERGE",
"delete", 1))
return NULL;
- if ((processed & MERGE_INSERT) == MERGE_INSERT)
{
- join_rel = rel_dup(join_rel);
- } else {
- join_rel = rel_crossproduct(sql->sa,
bt, joined, op_left);
- if (!(join_rel = rel_logical_exp(query,
join_rel, search_cond, sql_where | sql_join | sql_merge)))
- return NULL;
- set_processed(join_rel);
- }
-
sql_exp *ne = exp_column(sql->sa, bt_name, TID,
sql_fetch_localtype(TYPE_oid), CARD_MULTI, 0, 1, 1);
ne->nid = rel_base_nid(bt, NULL);
ne->alias.label = ne->nid;
@@ -1523,25 +1514,18 @@ merge_into_table(sql_query *query, dlist
return sql_error(sql, 02, SQLSTATE(42000)
"MERGE: only one WHEN NOT MATCHED clause is allowed");
processed |= MERGE_INSERT;
+ if ((processed & MERGE_UPDATE_DELETE) ==
MERGE_UPDATE_DELETE)
+ join_rel = rel_dup(join_rel);
+
assert(action->token == SQL_INSERT);
if (!insert_allowed(sql, t, tname, "MERGE", "insert"))
return NULL;
- if ((processed & MERGE_UPDATE_DELETE) ==
MERGE_UPDATE_DELETE) {
- join_rel = rel_dup(join_rel);
- } else {
- join_rel = rel_crossproduct(sql->sa, bt,
joined, op_left);
- if (!(join_rel = rel_logical_exp(query,
join_rel, search_cond, sql_where | sql_join | sql_merge)))
- return NULL;
- set_processed(join_rel);
- }
-
sel_rel = join_rel;
if (opt_search && !(sel_rel = rel_logical_exp(query,
sel_rel, opt_search, sql_where | sql_merge)))
return NULL;
extra_project = rel_project(sql->sa, sel_rel,
rel_projections(sql, joined, NULL, 1, 0));
if (!(insert = merge_generate_inserts(query, t,
extra_project, sts->h->data.lval, sts->h->next->data.sym)))
return NULL;
-
sql_rel *ibt = rel_dup(bt);
rel_base_use_all(query->sql, ibt);
ibt = rewrite_basetable(query->sql, ibt, false);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]