Changeset: 71b7852e735d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/71b7852e735d
Modified Files:
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_updates.c
Branch: nested
Log Message:

fix delete from composite/multiset tables


diffs (46 lines):

diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -4542,3 +4542,15 @@ free_exp(allocator *sa, sql_exp *e)
        }
        _free_exp_internal(sa, e);
 }
+
+list *
+filter_exps_by_localtype(list *res, list *exps, int8_t localtype)
+{
+       for (node *n = exps->h; n; n=n->next) {
+               sql_exp *e = n->data;
+               sql_subtype *t = exp_subtype(e);
+               if (t->type->localtype == localtype)
+                       list_append(res, e);
+       }
+       return res;
+}
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -250,5 +250,6 @@ extern void free_exps(allocator *sa, lis
 
 extern int exp_is_rename(sql_exp *e);
 extern int exp_is_useless_rename(sql_exp *e);
+extern list *filter_exps_by_localtype(list *res, list *exps, int8_t localtype);
 
 #endif /* _REL_EXP_H_ */
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
@@ -1410,7 +1410,12 @@ delete_table(sql_query *query, dlist *qn
                        if (!(r = rel_logical_exp(query, r, opt_where, 
sql_where)))
                                return NULL;
                        e = exp_column(sql->sa, rel_name(r), TID, 
sql_fetch_localtype(TYPE_oid), CARD_MULTI, 0, 1, 1);
-                       e->nid = rel_base_nid(bt, NULL);
+                       if (t->multiset || t->composite) {
+                               sql_exp *te = 
list_fetch(filter_exps_by_localtype(sa_list(sql->sa), ((sql_rel*)r->l)->exps, 
TYPE_oid), 0);
+                               e->nid = te? te->nid : rel_base_nid(bt, NULL);
+                       } else {
+                               e->nid = rel_base_nid(bt, NULL);
+                       }
                        e->alias.label = e->nid;
                        r = rel_project(sql->sa, r, 
list_append(new_exp_list(sql->sa), e));
                        r = rel_delete(sql->sa, rel_dup(bt), r);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to