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]

Reply via email to