Changeset: 578b776df987 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=578b776df987
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/test/Triggers/Tests/trigger_projection.stable.out
Branch: unlock
Log Message:

pas the deleted rows to the trigger stack. We cannot access those
values once they got deleted.


diffs (135 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -5013,7 +5013,7 @@ rel2bin_update(backend *be, sql_rel *rel
 }
 
 static int
-sql_stack_add_deleted(mvc *sql, const char *name, sql_table *t, stmt *tids, 
int type)
+sql_stack_add_deleted(mvc *sql, const char *name, sql_table *t, stmt *tids, 
stmt **deleted_cols, int type)
 {
        /* Put single relation of updates and old values on to the stack */
        sql_rel *r = NULL;
@@ -5023,7 +5023,7 @@ sql_stack_add_deleted(mvc *sql, const ch
 
        ti->t = t;
        ti->tids = tids;
-       ti->updates = NULL;
+       ti->updates = deleted_cols;
        ti->type = type;
        ti->nn = name;
        for (n = t->columns.set->h; n; n = n->next) {
@@ -5039,7 +5039,7 @@ sql_stack_add_deleted(mvc *sql, const ch
 }
 
 static int
-sql_delete_triggers(backend *be, sql_table *t, stmt *tids, int time, int 
firing_type, int internal_type)
+sql_delete_triggers(backend *be, sql_table *t, stmt *tids, stmt 
**deleted_cols, int time, int firing_type, int internal_type)
 {
        mvc *sql = be->mvc;
        node *n;
@@ -5059,7 +5059,7 @@ sql_delete_triggers(backend *be, sql_tab
 
                        if (!o) o = "old";
 
-                       if(!sql_stack_add_deleted(sql, o, t, tids, 
internal_type)) {
+                       if(!sql_stack_add_deleted(sql, o, t, tids, 
deleted_cols, internal_type)) {
                                stack_pop_frame(sql);
                                return 0;
                        }
@@ -5167,6 +5167,7 @@ sql_delete(backend *be, sql_table *t, st
        mvc *sql = be->mvc;
        stmt *v = NULL, *s = NULL;
        list *l = sa_list(sql->sa);
+       stmt **deleted_cols = NULL;
 
        if (rows) {
                v = rows;
@@ -5174,14 +5175,28 @@ sql_delete(backend *be, sql_table *t, st
                v = stmt_tid(be, t, 0);
        }
 
+       /*  project all columns */
+       if (list_length(t->triggers.set) || t->p) {
+               int nr = 0;
+               deleted_cols = table_update_stmts(sql, t, &nr);
+               int i = 0;
+               for (node *n = t->columns.set->h; n; n = n->next, i++) {
+                       sql_column *c = n->data;
+                       stmt *s = stmt_col(be, c, v, v->partition);
+
+                       deleted_cols[i] = s;
+                       list_append(l, s);
+               }
+       }
+
 /* before */
        if (be->cur_append && !be->first_statement_generated) {
                for(sql_table *up = t->p ; up ; up = up->p) {
-                       if (!sql_delete_triggers(be, up, v, 0, 1, 3))
+                       if (!sql_delete_triggers(be, up, v, deleted_cols, 0, 1, 
3))
                                return sql_error(sql, 02, SQLSTATE(27000) 
"DELETE: triggers failed for table '%s'", up->base.name);
                }
        }
-       if (!sql_delete_triggers(be, t, v, 0, 1, 3))
+       if (!sql_delete_triggers(be, t, v, deleted_cols, 0, 1, 3))
                return sql_error(sql, 02, SQLSTATE(27000) "DELETE: triggers 
failed for table '%s'", t->base.name);
 
        if (!sql_delete_keys(be, t, v, l, "DELETE", 0))
@@ -5198,11 +5213,11 @@ sql_delete(backend *be, sql_table *t, st
 /* after */
        if (be->cur_append && !be->first_statement_generated) {
                for(sql_table *up = t->p ; up ; up = up->p) {
-                       if (!sql_delete_triggers(be, up, v, 1, 1, 3))
+                       if (!sql_delete_triggers(be, up, v, deleted_cols, 1, 1, 
3))
                                return sql_error(sql, 02, SQLSTATE(27000) 
"DELETE: triggers failed for table '%s'", up->base.name);
                }
        }
-       if (!sql_delete_triggers(be, t, v, 1, 1, 3))
+       if (!sql_delete_triggers(be, t, v, deleted_cols, 1, 1, 3))
                return sql_error(sql, 02, SQLSTATE(27000) "DELETE: triggers 
failed for table '%s'", t->base.name);
        if (rows)
                s = stmt_aggr(be, rows, NULL, NULL, sql_bind_func(sql->sa, 
sql->session->schema, "count", sql_bind_localtype("void"), NULL, F_AGGR), 1, 0, 
1);
@@ -5374,14 +5389,14 @@ sql_truncate(backend *be, sql_table *t, 
                /* before */
                if (be->cur_append && !be->first_statement_generated) {
                        for (sql_table *up = t->p ; up ; up = up->p) {
-                               if (!sql_delete_triggers(be, up, v, 0, 3, 4)) {
+                               if (!sql_delete_triggers(be, up, v, NULL, 0, 3, 
4)) {
                                        sql_error(sql, 02, SQLSTATE(27000) 
"TRUNCATE: triggers failed for table '%s'", up->base.name);
                                        error = 1;
                                        goto finalize;
                                }
                        }
                }
-               if (!sql_delete_triggers(be, next, v, 0, 3, 4)) {
+               if (!sql_delete_triggers(be, next, v, NULL, 0, 3, 4)) {
                        sql_error(sql, 02, SQLSTATE(27000) "TRUNCATE: triggers 
failed for table '%s'", next->base.name);
                        error = 1;
                        goto finalize;
@@ -5401,14 +5416,14 @@ sql_truncate(backend *be, sql_table *t, 
                /* after */
                if (be->cur_append && !be->first_statement_generated) {
                        for (sql_table *up = t->p ; up ; up = up->p) {
-                               if (!sql_delete_triggers(be, up, v, 1, 3, 4)) {
+                               if (!sql_delete_triggers(be, up, v, NULL, 1, 3, 
4)) {
                                        sql_error(sql, 02, SQLSTATE(27000) 
"TRUNCATE: triggers failed for table '%s'", up->base.name);
                                        error = 1;
                                        goto finalize;
                                }
                        }
                }
-               if (!sql_delete_triggers(be, next, v, 1, 3, 4)) {
+               if (!sql_delete_triggers(be, next, v, NULL, 1, 3, 4)) {
                        sql_error(sql, 02, SQLSTATE(27000) "TRUNCATE: triggers 
failed for table '%s'", next->base.name);
                        error = 1;
                        goto finalize;
diff --git a/sql/test/Triggers/Tests/trigger_projection.stable.out 
b/sql/test/Triggers/Tests/trigger_projection.stable.out
--- a/sql/test/Triggers/Tests/trigger_projection.stable.out
+++ b/sql/test/Triggers/Tests/trigger_projection.stable.out
@@ -1,4 +1,4 @@
-stdout of test 'trigger_projection` in directory 'sql/test/miscellaneous` 
itself:
+stdout of test 'trigger_projection` in directory 'sql/test/Triggers` itself:
 
 
 # 13:24:52 >  
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to