Changeset: 00ab6503524c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=00ab6503524c
Modified Files:
        sql/server/rel_propagate.c
        sql/server/rel_updates.c
        
sql/test/BugTracker-2017/Tests/delete_from_merge_table.Bug-3743.stable.err
        
sql/test/BugTracker-2017/Tests/delete_from_merge_table.Bug-3743.stable.out
Branch: default
Log Message:

With partitioned tables handling addition, we can now support delete statements 
in non-partitioned tables as well. This fixes bug 3743.


diffs (91 lines):

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
@@ -881,21 +881,25 @@ rel_propagate(mvc *sql, sql_rel *rel, in
                                propagate = rel->l;
                        }
                }
-               if(isRangePartitionTable(t) || isListPartitionTable(t)) {
+               if(isMergeTable(t)) {
                        assert(list_length(t->members.set) > 0);
                        if(is_delete(propagate->op) || 
is_truncate(propagate->op)) { //propagate deletions to the partitions
                                sql->caching = 0;
                                rel = rel_propagate_delete(sql, rel, t, 
changes);
-                       } else if(is_insert(propagate->op)) { //on inserts 
create a selection for each partition
-                               sql->caching = 0;
-                               if(isSubtable) {
-                                       rel->l = rel_propagate_insert(sql, 
propagate, t, changes);
+                       } else if(isRangePartitionTable(t) || 
isListPartitionTable(t)) {
+                               if(is_insert(propagate->op)) { //on inserts 
create a selection for each partition
+                                       sql->caching = 0;
+                                       if(isSubtable) {
+                                               rel->l = 
rel_propagate_insert(sql, propagate, t, changes);
+                                       } else {
+                                               rel = rel_propagate_insert(sql, 
rel, t, changes);
+                                       }
+                               } else if(is_update(propagate->op)) { //for 
updates propagate like in deletions
+                                       sql->caching = 0;
+                                       rel = rel_propagate_update(sql, rel, t, 
changes);
                                } else {
-                                       rel = rel_propagate_insert(sql, rel, t, 
changes);
+                                       assert(0);
                                }
-                       } else if(is_update(propagate->op)) { //for updates 
propagate like in deletions
-                               sql->caching = 0;
-                               rel = rel_propagate_update(sql, rel, t, 
changes);
                        } else {
                                assert(0);
                        }
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
@@ -439,8 +439,10 @@ update_allowed(mvc *sql, sql_table *t, c
                return sql_error(sql, 02, SQLSTATE(42S02) "%s: no such table 
'%s'", op, tname);
        } else if (isView(t)) {
                return sql_error(sql, 02, SQLSTATE(42000) "%s: cannot %s view 
'%s'", op, opname, tname);
-       } else if (isNonPartitionedTable(t)) {
+       } else if (isNonPartitionedTable(t) && is_delete == 0) {
                return sql_error(sql, 02, SQLSTATE(42000) "%s: cannot %s merge 
table '%s'", op, opname, tname);
+       } else if (isNonPartitionedTable(t) && is_delete != 0 && 
cs_size(&t->members) == 0) {
+               return sql_error(sql, 02, SQLSTATE(42000) "%s: cannot %s merge 
table '%s' has no partitions set", op, opname, tname);
        } else if ((isRangePartitionTable(t) || isListPartitionTable(t)) && 
cs_size(&t->members) == 0) {
                return sql_error(sql, 02, SQLSTATE(42000) "%s: %s partitioned 
table '%s' has no partitions set", op, isListPartitionTable(t)?"list":"range", 
tname);
        } else if (isRemote(t)) {
diff --git 
a/sql/test/BugTracker-2017/Tests/delete_from_merge_table.Bug-3743.stable.err 
b/sql/test/BugTracker-2017/Tests/delete_from_merge_table.Bug-3743.stable.err
--- a/sql/test/BugTracker-2017/Tests/delete_from_merge_table.Bug-3743.stable.err
+++ b/sql/test/BugTracker-2017/Tests/delete_from_merge_table.Bug-3743.stable.err
@@ -29,18 +29,6 @@ stderr of test 'delete_from_merge_table.
 # 17:32:34 >  "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-19147" "--port=31497"
 # 17:32:34 >  
 
-MAPI  = (monetdb) /var/tmp/mtest-8392/.s.monetdb.34552
-QUERY = delete from tt where t = 1;
-ERROR = !DELETE FROM: cannot delete from merge table 'tt'
-CODE  = 42000
-MAPI  = (monetdb) /var/tmp/mtest-30274/.s.monetdb.37685
-QUERY = delete from tt where t = 2;
-ERROR = !DELETE FROM: cannot delete from merge table 'tt'
-CODE  = 42000
-MAPI  = (monetdb) /var/tmp/mtest-30274/.s.monetdb.37685
-QUERY = delete from tt;
-ERROR = !DELETE FROM: cannot delete from merge table 'tt'
-CODE  = 42000
 
 # 17:32:35 >  
 # 17:32:35 >  "Done."
diff --git 
a/sql/test/BugTracker-2017/Tests/delete_from_merge_table.Bug-3743.stable.out 
b/sql/test/BugTracker-2017/Tests/delete_from_merge_table.Bug-3743.stable.out
--- a/sql/test/BugTracker-2017/Tests/delete_from_merge_table.Bug-3743.stable.out
+++ b/sql/test/BugTracker-2017/Tests/delete_from_merge_table.Bug-3743.stable.out
@@ -81,6 +81,12 @@ Ready.
 % 1 # length
 [ 1    ]
 [ 2    ]
+#delete from tt where t = 1;
+[ 1    ]
+#delete from tt where t = 2;
+[ 1    ]
+#delete from tt;
+[ 0    ]
 #drop table tt cascade;
 #drop table t1 cascade;
 #drop table t2 cascade;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to