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