Changeset: d5dd594db6c5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d5dd594db6c5
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_optimizer.c
        sql/backends/monet5/sql_optimizer.h
        sql/server/rel_updates.c
        sql/test/BugTracker-2018/Tests/truncate_bam_tables.Bug-6543.stable.err
        sql/test/BugTracker-2018/Tests/truncate_bam_tables.Bug-6543.stable.out
        
sql/test/BugTracker-2018/Tests/truncate_sys_netcdf_tables.Bug-6543.stable.err
        
sql/test/BugTracker-2018/Tests/truncate_sys_netcdf_tables.Bug-6543.stable.out
        sql/test/BugTracker-2018/Tests/truncate_sys_tables.Bug-6543.stable.err
        sql/test/BugTracker-2018/Tests/truncate_sys_tables.Bug-6543.stable.out
Branch: Mar2018
Log Message:

Fixes for bugs 6543 and 6544


diffs (truncated from 527 to 300 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
@@ -17,6 +17,7 @@
 #include "rel_updates.h"
 #include "rel_optimizer.h"
 #include "sql_env.h"
+#include "sql_optimizer.h"
 
 #define OUTER_ZERO 64
 
@@ -207,7 +208,7 @@ static stmt *column(backend *be, stmt *v
        return val;
 }
 
-static stmt *Column(backend *be, stmt *val )
+static stmt *create_const_column(backend *be, stmt *val )
 {
        if (val->nrcols == 0)
                val = const_column(be, val);
@@ -1895,7 +1896,7 @@ rel2bin_join(backend *be, sql_rel *rel, 
 
                /* as append isn't save, we append to a new copy */
                if (rel->op == op_left || rel->op == op_full || rel->op == 
op_right)
-                       s = Column(be, s);
+                       s = create_const_column(be, s);
                if (rel->op == op_left || rel->op == op_full)
                        s = stmt_append(be, s, stmt_project(be, ld, c));
                if (rel->op == op_right || rel->op == op_full) 
@@ -1912,7 +1913,7 @@ rel2bin_join(backend *be, sql_rel *rel, 
 
                /* as append isn't save, we append to a new copy */
                if (rel->op == op_left || rel->op == op_full || rel->op == 
op_right)
-                       s = Column(be, s);
+                       s = create_const_column(be, s);
                if (rel->op == op_left || rel->op == op_full) 
                        s = stmt_append(be, s, stmt_const(be, ld, 
(c->flag&OUTER_ZERO)?stmt_atom_lng(be, 0):stmt_atom(be, atom_general(sql->sa, 
tail_type(c), NULL))));
                if (rel->op == op_right || rel->op == op_full) 
@@ -2170,7 +2171,7 @@ rel2bin_union(backend *be, sql_rel *rel,
                const char *nme = column_name(sql->sa, c1);
                stmt *s;
 
-               s = stmt_append(be, Column(be, c1), c2);
+               s = stmt_append(be, create_const_column(be, c1), c2);
                s = stmt_alias(be, s, rnme, nme);
                list_append(l, s);
        }
@@ -4616,7 +4617,12 @@ check_for_foreign_key_references(mvc *sq
                                                k = l->data;
                                                /* make sure it is not a self 
referencing key */
                                                if (k->t != t && !cascade) {
-                                                       *error = sql_error(sql, 
02, SQLSTATE(42000) "TRUNCATE: FOREIGN KEY %s.%s depends on %s", 
k->t->base.name, k->base.name, t->base.name);
+                                                       node *n = 
t->columns.set->h;
+                                                       sql_column *c = n->data;
+                                                       
if(SQLgetColumnSize(sql->session->tr, c, 2) > 0) {
+                                                               *error = 
sql_error(sql, 02, SQLSTATE(42000) "TRUNCATE: FOREIGN KEY %s.%s depends on %s", 
k->t->base.name, k->base.name, t->base.name);
+                                                               return;
+                                                       }
                                                } else if(k->t != t) {
                                                        found = 0;
                                                        for (node_check = list; 
node_check; node_check = node_check->next) {
@@ -4625,7 +4631,10 @@ check_for_foreign_key_references(mvc *sq
                                                                }
                                                        }
                                                        if(!found) {
-                                                               new_node = 
(struct tablelist*) GDKmalloc(sizeof(struct tablelist));
+                                                               if((new_node = 
MNEW(struct tablelist)) == NULL) {
+                                                                       *error 
= sql_error(sql, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL);
+                                                                       return;
+                                                               }
                                                                new_node->table 
= k->t;
                                                                new_node->next 
= NULL;
                                                                
next_append->next = new_node;
@@ -4655,14 +4664,17 @@ sql_truncate(backend *be, sql_table *t, 
        sql_trans *tr = sql->session->tr;
        node *n = NULL;
 
-       struct tablelist* new_list = (struct tablelist*) 
GDKmalloc(sizeof(struct tablelist)), *list_node, *aux;
+       struct tablelist* new_list = MNEW(struct tablelist), *list_node, *aux;
+       if(!new_list) {
+               error = sql_error(sql, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL);
+               goto finalize;
+       }
+
        new_list->table = t;
        new_list->next = NULL;
        check_for_foreign_key_references(sql, new_list, new_list, t, cascade, 
&error);
-
-       if(error) {
+       if(error)
                goto finalize;
-       }
 
        for (list_node = new_list; list_node; list_node = list_node->next) {
                next = list_node->table;
@@ -4673,6 +4685,10 @@ sql_truncate(backend *be, sql_table *t, 
                                col = n->data;
                                if (col->def && (seq_pos = strstr(col->def, 
next_value_for))) {
                                        seq_name = _STRDUP(seq_pos + 
(strlen(next_value_for) - strlen("seq_")));
+                                       if(!seq_name) {
+                                               error = sql_error(sql, 02, 
SQLSTATE(HY001) MAL_MALLOC_FAIL);
+                                               goto finalize;
+                                       }
                                        seq_name[strlen(seq_name)-1] = '\0';
                                        seq = find_sql_sequence(sche, seq_name);
                                        if (seq) {
@@ -4705,15 +4721,14 @@ sql_truncate(backend *be, sql_table *t, 
                        return sql_error(sql, 02, SQLSTATE(42000) "TRUNCATE: 
triggers failed for table '%s'", next->base.name);
        }
 
-       finalize:
-               for (list_node = new_list; list_node;) {
-                       aux = list_node->next;
-                       GDKfree(list_node);
-                       list_node = aux;
-               }
-               if(error) {
-                       return error;
-               }
+finalize:
+       for (list_node = new_list; list_node;) {
+               aux = list_node->next;
+               _DELETE(list_node);
+               list_node = aux;
+       }
+       if(error)
+               return error;
 
        return ret;
 }
diff --git a/sql/backends/monet5/sql_optimizer.c 
b/sql/backends/monet5/sql_optimizer.c
--- a/sql/backends/monet5/sql_optimizer.c
+++ b/sql/backends/monet5/sql_optimizer.c
@@ -25,7 +25,7 @@
 /* calculate the footprint for optimizer pipe line choices
  * and identify empty columns upfront for just in time optimizers.
  */
-static lng
+lng
 SQLgetColumnSize(sql_trans *tr, sql_column *c, int access)
 {
        lng size = 0;
diff --git a/sql/backends/monet5/sql_optimizer.h 
b/sql/backends/monet5/sql_optimizer.h
--- a/sql/backends/monet5/sql_optimizer.h
+++ b/sql/backends/monet5/sql_optimizer.h
@@ -11,7 +11,7 @@
 #include "sql.h"
 
 //#define _SQL_OPTIMIZER_DEBUG
-
+sql5_export lng SQLgetColumnSize(sql_trans *tr, sql_column *c, int access);
 sql5_export str SQLoptimizeQuery(Client c, MalBlkPtr mb);
 sql5_export str SQLoptimizeFunction(Client c, MalBlkPtr mb);
 sql5_export void SQLaddQueryToCache(Client c);
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
@@ -395,7 +395,9 @@ insert_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 (isMergeTable(t)) {
+       } /*else if (t->system) {
+               return sql_error(sql, 02, SQLSTATE(42000) "%s: cannot %s system 
table '%s'", op, opname, tname);
+       }*/ else if (isMergeTable(t)) {
                return sql_error(sql, 02, SQLSTATE(42000) "%s: cannot %s merge 
table '%s'", op, opname, tname);
        } else if (isStream(t)) {
                return sql_error(sql, 02, SQLSTATE(42000) "%s: cannot %s stream 
'%s'", op, opname, tname);
@@ -426,6 +428,8 @@ 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 (is_delete == 2 && t->system) {
+               return sql_error(sql, 02, SQLSTATE(42000) "%s: cannot %s system 
table '%s'", op, opname, tname);
        } else if (isMergeTable(t)) {
                return sql_error(sql, 02, SQLSTATE(42000) "%s: cannot %s merge 
table '%s'", op, opname, tname);
        } else if (isStream(t)) {
diff --git 
a/sql/test/BugTracker-2018/Tests/truncate_bam_tables.Bug-6543.stable.err 
b/sql/test/BugTracker-2018/Tests/truncate_bam_tables.Bug-6543.stable.err
--- a/sql/test/BugTracker-2018/Tests/truncate_bam_tables.Bug-6543.stable.err
+++ b/sql/test/BugTracker-2018/Tests/truncate_bam_tables.Bug-6543.stable.err
@@ -29,6 +29,26 @@ stderr of test 'truncate_bam_tables.Bug-
 # 17:33:23 >  "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-9315" "--port=34912"
 # 17:33:23 >  
 
+MAPI  = (monetdb) /var/tmp/mtest-20187/.s.monetdb.39345
+QUERY = TRUNCATE TABLE bam.sq;
+ERROR = !TRUNCATE: cannot truncate system table 'sq'
+CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-20187/.s.monetdb.39345
+QUERY = TRUNCATE TABLE bam.rg;
+ERROR = !TRUNCATE: cannot truncate system table 'rg'
+CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-20187/.s.monetdb.39345
+QUERY = TRUNCATE TABLE bam.pg;
+ERROR = !TRUNCATE: cannot truncate system table 'pg'
+CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-20187/.s.monetdb.39345
+QUERY = TRUNCATE TABLE bam.export;
+ERROR = !TRUNCATE: cannot truncate system table 'export'
+CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-20187/.s.monetdb.39345
+QUERY = TRUNCATE TABLE bam.files;
+ERROR = !TRUNCATE: cannot truncate system table 'files'
+CODE  = 42000
 
 # 17:33:23 >  
 # 17:33:23 >  "Done."
diff --git 
a/sql/test/BugTracker-2018/Tests/truncate_bam_tables.Bug-6543.stable.out 
b/sql/test/BugTracker-2018/Tests/truncate_bam_tables.Bug-6543.stable.out
--- a/sql/test/BugTracker-2018/Tests/truncate_bam_tables.Bug-6543.stable.out
+++ b/sql/test/BugTracker-2018/Tests/truncate_bam_tables.Bug-6543.stable.out
@@ -74,8 +74,6 @@ Ready.
 % boolean # type
 % 5 # length
 [ false        ]
-#TRUNCATE TABLE bam.sq;
-[ 0    ]
 #SELECT (COUNT(*) > 0) AS has_rows FROM bam.sq;
 % bam.L4 # table_name
 % has_rows # name
@@ -88,8 +86,6 @@ Ready.
 % boolean # type
 % 5 # length
 [ false        ]
-#TRUNCATE TABLE bam.rg;
-[ 0    ]
 #SELECT (COUNT(*) > 0) AS has_rows FROM bam.rg;
 % bam.L4 # table_name
 % has_rows # name
@@ -102,8 +98,6 @@ Ready.
 % boolean # type
 % 5 # length
 [ false        ]
-#TRUNCATE TABLE bam.pg;
-[ 0    ]
 #SELECT (COUNT(*) > 0) AS has_rows FROM bam.pg;
 % bam.L4 # table_name
 % has_rows # name
@@ -116,8 +110,6 @@ Ready.
 % boolean # type
 % 5 # length
 [ false        ]
-#TRUNCATE TABLE bam.export;
-[ 0    ]
 #SELECT (COUNT(*) > 0) AS has_rows FROM bam.export;
 % bam.L4 # table_name
 % has_rows # name
@@ -130,8 +122,6 @@ Ready.
 % boolean # type
 % 5 # length
 [ false        ]
-#TRUNCATE TABLE bam.files;
-[ 0    ]
 #SELECT (COUNT(*) > 0) AS has_rows FROM bam.files;
 % bam.L4 # table_name
 % has_rows # name
diff --git 
a/sql/test/BugTracker-2018/Tests/truncate_sys_netcdf_tables.Bug-6543.stable.err 
b/sql/test/BugTracker-2018/Tests/truncate_sys_netcdf_tables.Bug-6543.stable.err
--- 
a/sql/test/BugTracker-2018/Tests/truncate_sys_netcdf_tables.Bug-6543.stable.err
+++ 
b/sql/test/BugTracker-2018/Tests/truncate_sys_netcdf_tables.Bug-6543.stable.err
@@ -27,6 +27,26 @@ stderr of test 'truncate_sys_netcdf_tabl
 # 17:32:24 >  "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-8577" "--port=36366"
 # 17:32:24 >  
 
+MAPI  = (monetdb) /var/tmp/mtest-20187/.s.monetdb.39345
+QUERY = TRUNCATE TABLE sys.netcdf_vars;
+ERROR = !TRUNCATE: cannot truncate system table 'netcdf_vars'
+CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-20187/.s.monetdb.39345
+QUERY = TRUNCATE TABLE sys.netcdf_vardim;
+ERROR = !TRUNCATE: cannot truncate system table 'netcdf_vardim'
+CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-20187/.s.monetdb.39345
+QUERY = TRUNCATE TABLE sys.netcdf_files;
+ERROR = !TRUNCATE: cannot truncate system table 'netcdf_files'
+CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-20187/.s.monetdb.39345
+QUERY = TRUNCATE TABLE sys.netcdf_dims;
+ERROR = !TRUNCATE: cannot truncate system table 'netcdf_dims'
+CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-20187/.s.monetdb.39345
+QUERY = TRUNCATE TABLE sys.netcdf_attrs;
+ERROR = !TRUNCATE: cannot truncate system table 'netcdf_attrs'
+CODE  = 42000
 
 # 17:32:24 >  
 # 17:32:24 >  "Done."
diff --git 
a/sql/test/BugTracker-2018/Tests/truncate_sys_netcdf_tables.Bug-6543.stable.out 
b/sql/test/BugTracker-2018/Tests/truncate_sys_netcdf_tables.Bug-6543.stable.out
--- 
a/sql/test/BugTracker-2018/Tests/truncate_sys_netcdf_tables.Bug-6543.stable.out
+++ 
b/sql/test/BugTracker-2018/Tests/truncate_sys_netcdf_tables.Bug-6543.stable.out
@@ -30,8 +30,6 @@ Ready.
 % boolean # type
 % 5 # length
 [ false        ]
-#TRUNCATE TABLE sys.netcdf_vars;
-[ 0    ]
 #SELECT (COUNT(*) > 0) AS has_rows FROM sys.netcdf_vars;
 % sys.L4 # table_name
 % has_rows # name
@@ -44,8 +42,6 @@ Ready.
 % boolean # type
 % 5 # length
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to