Changeset: 9330e22ca6e7 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9330e22ca6e7
Added Files:
        sql/test/mergetables/Tests/crash0.stable.err
        sql/test/mergetables/Tests/crash0.stable.out
Modified Files:
        sql/server/rel_updates.c
        sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
        sql/test/mergetables/Tests/crash0.sql
Branch: default
Log Message:

added output for test crash0


diffs (truncated from 376 to 300 lines):

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
@@ -290,19 +290,106 @@ rel_insert_table(mvc *sql, sql_table *t,
        return rel_insert(sql, rel_basetable(sql, t, name), inserts);
 }
 
+
+static list *
+check_table_columns(mvc *sql, sql_table *t, dlist *columns, char *op, char 
*tname)
+{
+       list *collist;
+
+       if (columns) {
+               dnode *n;
+
+               collist = sa_list(sql->sa);
+               for (n = columns->h; n; n = n->next) {
+                       sql_column *c = mvc_bind_column(sql, t, n->data.sval);
+
+                       if (c) {
+                               list_append(collist, c);
+                       } else {
+                               return sql_error(sql, 02, "42S22!%s INTO: no 
such column '%s.%s'", op, tname, n->data.sval);
+                       }
+               }
+       } else {
+               collist = t->columns.set;
+       }
+       return collist;
+}
+
+static list *
+rel_inserts(mvc *sql, sql_table *t, sql_rel *r, list *collist, size_t rowcount)
+{
+       int len, i;
+       sql_exp **inserts = insert_exp_array(sql, t, &len);
+       list *exps = NULL;
+       node *n, *m;
+
+       if (r->exps) {
+               for (n = r->exps->h, m = collist->h; n && m; n = n->next, m = 
m->next) {
+                       sql_column *c = m->data;
+                       sql_exp *e = n->data;
+       
+                       inserts[c->colnr] = rel_check_type(sql, &c->type, e, 
type_equal);
+               }
+       }
+       for (i = 0; i < len; i++) {
+               if (!inserts[i]) {
+                       for (m = t->columns.set->h; m; m = m->next) {
+                               sql_column *c = m->data;
+
+                               if (c->colnr == i) {
+                                       size_t j = 0;
+                                       sql_exp *exps = NULL;
+
+                                       for(j = 0; j < rowcount; j++) {
+                                               sql_exp *e = NULL;
+
+                                               if (c->def) {
+                                                       char *q = 
sa_message(sql->sa, "select %s;", c->def);
+                                                       e = rel_parse_val(sql, 
q, sql->emode);
+                                                       if (!e || (e = 
rel_check_type(sql, &c->type, e, type_equal)) == NULL)
+                                                               return NULL;
+                                               } else {
+                                                       atom *a = 
atom_general(sql->sa, &c->type, NULL);
+                                                       e = exp_atom(sql->sa, 
a);
+                                               }
+                                               if (!e) 
+                                                       return sql_error(sql, 
02, "INSERT INTO: column '%s' has no valid default value", c->base.name);
+                                               if (exps) {
+                                                       list *vals_list = 
exps->f;
+                       
+                                                       list_append(vals_list, 
e);
+                                               }
+                                               if (!exps && j+1 < rowcount) {
+                                                       exps = 
exp_values(sql->sa, sa_list(sql->sa));
+                                                       exps->tpe = c->type;
+                                                       exp_label(sql->sa, 
exps, ++sql->label);
+                                               }
+                                               if (!exps)
+                                                       exps = e;
+                                       }
+                                       inserts[i] = exps;
+                               }
+                       }
+                       assert(inserts[i]);
+               }
+       }
+       /* now rewrite project exps in proper table order */
+       exps = new_exp_list(sql->sa);
+       for (i = 0; i<len; i++) 
+               list_append(exps, inserts[i]);
+       return exps;
+}
+
 static sql_rel *
 insert_into(mvc *sql, dlist *qname, dlist *columns, symbol *val_or_q)
 {
        size_t rowcount = 1;
-       int i, len = 0;
        char *sname = qname_schema(qname);
        char *tname = qname_table(qname);
        sql_schema *s = NULL;
        sql_table *t = NULL;
-       list *collist = NULL, *exps;
+       list *collist = NULL;
        sql_rel *r = NULL;
-       sql_exp **inserts;
-       node *n, *m;
 
        if (sname && !(s=mvc_bind_schema(sql, sname))) {
                (void) sql_error(sql, 02, "3F000!INSERT INTO: no such schema 
'%s'", sname);
@@ -330,23 +417,8 @@ insert_into(mvc *sql, dlist *qname, dlis
        if (!table_privs(sql, t, PRIV_INSERT)) {
                return sql_error(sql, 02, "INSERT INTO: insufficient privileges 
for user '%s' to insert into table '%s'", stack_get_string(sql, 
"current_user"), tname);
        }
-       if (columns) {
-               dnode *n;
 
-               collist = sa_list(sql->sa);
-               for (n = columns->h; n; n = n->next) {
-                       sql_column *c = mvc_bind_column(sql, t, n->data.sval);
-
-                       if (c) {
-                               list_append(collist, c);
-                       } else {
-                               return sql_error(sql, 02, "42S22!INSERT INTO: 
no such column '%s.%s'", tname, n->data.sval);
-                       }
-               }
-       } else {
-               collist = t->columns.set;
-       }
-
+       collist = check_table_columns(sql, t, columns, "INSERT", tname);
        if (val_or_q->token == SQL_VALUES) {
                dlist *rowlist = val_or_q->data.lval;
                dlist *values;
@@ -367,7 +439,7 @@ insert_into(mvc *sql, dlist *qname, dlis
                                return sql_error(sql, 02, "21S01!INSERT INTO: 
number of values doesn't match number of columns of table '%s'", tname);
                        } else {
                                dnode *n;
-                               node *v;
+                               node *v, *m;
 
                                if (o->next && list_empty(exps)) {
                                        for (n = values->h, m = collist->h; n 
&& m; n = n->next, m = m->next) {
@@ -427,64 +499,7 @@ insert_into(mvc *sql, dlist *qname, dlis
           (!r->exps && collist)) 
                return sql_error(sql, 02, "21S01!INSERT INTO: query result 
doesn't match number of columns in table '%s'", tname);
 
-       inserts = insert_exp_array(sql, t, &len);
-
-       if (r->exps) {
-               for (n = r->exps->h, m = collist->h; n && m; n = n->next, m = 
m->next) {
-                       sql_column *c = m->data;
-                       sql_exp *e = n->data;
-       
-                       inserts[c->colnr] = rel_check_type(sql, &c->type, e, 
type_equal);
-               }
-       }
-
-       for (i = 0; i < len; i++) {
-               if (!inserts[i]) {
-                       for (m = t->columns.set->h; m; m = m->next) {
-                               sql_column *c = m->data;
-
-                               if (c->colnr == i) {
-                                       size_t j = 0;
-                                       sql_exp *exps = NULL;
-
-                                       for(j = 0; j < rowcount; j++) {
-                                               sql_exp *e = NULL;
-
-                                               if (c->def) {
-                                                       char *q = 
sa_message(sql->sa, "select %s;", c->def);
-                                                       e = rel_parse_val(sql, 
q, sql->emode);
-                                                       if (!e || (e = 
rel_check_type(sql, &c->type, e, type_equal)) == NULL)
-                                                               return NULL;
-                                               } else {
-                                                       atom *a = 
atom_general(sql->sa, &c->type, NULL);
-                                                       e = exp_atom(sql->sa, 
a);
-                                               }
-                                               if (!e) 
-                                                       return sql_error(sql, 
02, "INSERT INTO: column '%s' has no valid default value", c->base.name);
-                                               if (exps) {
-                                                       list *vals_list = 
exps->f;
-                       
-                                                       list_append(vals_list, 
e);
-                                               }
-                                               if (!exps && j+1 < rowcount) {
-                                                       exps = 
exp_values(sql->sa, sa_list(sql->sa));
-                                                       exps->tpe = c->type;
-                                                       exp_label(sql->sa, 
exps, ++sql->label);
-                                               }
-                                               if (!exps)
-                                                       exps = e;
-                                       }
-                                       inserts[i] = exps;
-                               }
-                       }
-                       assert(inserts[i]);
-               }
-       }
-       /* now rewrite project exps in proper table order */
-       exps = new_exp_list(sql->sa);
-       for (i = 0; i<len; i++) 
-               list_append(exps, inserts[i]);
-       r->exps = exps;
+       r->exps = rel_inserts(sql, t, r, collist, rowcount);
        return rel_insert_table(sql, t, tname, r);
 }
 
@@ -1097,7 +1112,7 @@ rel_import(mvc *sql, sql_table *t, char 
 }
 
 static sql_rel *
-copyfrom(mvc *sql, dlist *qname, dlist *files, dlist *seps, dlist *nr_offset, 
str null_string, int locked, int constraint)
+copyfrom(mvc *sql, dlist *qname, dlist *columns, dlist *files, dlist *seps, 
dlist *nr_offset, str null_string, int locked, int constraint)
 {
        sql_rel *rel = NULL;
        char *sname = qname_schema(qname);
@@ -1110,6 +1125,7 @@ copyfrom(mvc *sql, dlist *qname, dlist *
        char *ns = (null_string)?null_string:"null";
        lng nr = (nr_offset)?nr_offset->h->data.l_val:-1;
        lng offset = (nr_offset)?nr_offset->h->next->data.l_val:0;
+       list *collist;
 
        assert(!nr_offset || nr_offset->h->type == type_lng);
        assert(!nr_offset || nr_offset->h->next->type == type_lng);
@@ -1192,7 +1208,9 @@ copyfrom(mvc *sql, dlist *qname, dlist *
        }
        if (!rel)
                return rel;
-       rel = rel_insert_table(sql, t, t->base.name, rel);
+       collist = check_table_columns(sql, t, columns, "COPY", tname);
+       rel->exps = rel_inserts(sql, t, rel, collist, 1);
+       rel = rel_insert_table(sql, t, tname, rel);
        if (rel && locked)
                rel->flag |= UPD_LOCKED;
        if (rel && !constraint)
@@ -1410,7 +1428,7 @@ rel_updates(mvc *sql, symbol *s)
        {
                dlist *l = s->data.lval;
 
-               ret = copyfrom(sql, l->h->data.lval, l->h->next->data.lval, 
l->h->next->next->data.lval, l->h->next->next->next->data.lval, 
l->h->next->next->next->next->data.sval, 
l->h->next->next->next->next->next->data.i_val, 
l->h->next->next->next->next->next->next->data.i_val);
+               ret = copyfrom(sql, l->h->data.lval, l->h->next->data.lval, 
l->h->next->next->data.lval, l->h->next->next->next->data.lval, 
l->h->next->next->next->next->data.lval, 
l->h->next->next->next->next->next->data.sval, 
l->h->next->next->next->next->next->next->data.i_val, 
l->h->next->next->next->next->next->next->next->data.i_val);
                sql->type = Q_UPDATE;
        }
                break;
diff --git 
a/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out 
b/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
--- a/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
+++ b/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
@@ -34,7 +34,7 @@ insert(
 | union (
 | | table sys.copyfrom(varchar "sys", varchar "cm_tmp", varchar "|", varchar 
"\n", varchar "NULL", varchar "null", varchar "/file1", bigint "-1", bigint 
"0", int "0"),  [ cm_tmp.i ] COUNT ,
 | | table sys.copyfrom(varchar "sys", varchar "cm_tmp", varchar "|", varchar 
"\n", varchar "NULL", varchar "null", varchar "/file2", bigint "-1", bigint 
"0", int "0"),  [ cm_tmp.i ] COUNT 
-| ) [  ]
+| ) [ int "NULL" ]
 )
 
 # 08:59:53 >  
diff --git a/sql/test/mergetables/Tests/crash0.sql 
b/sql/test/mergetables/Tests/crash0.sql
--- a/sql/test/mergetables/Tests/crash0.sql
+++ b/sql/test/mergetables/Tests/crash0.sql
@@ -19,7 +19,4 @@ ALTER TABLE complete ADD TABLE cpart1;
 ALTER TABLE complete ADD TABLE cpart2;
 ALTER TABLE complete SET READ ONLY;
 
-DROP TABLE complete;
-DROP TABLE cpart1;
-DROP TABLE cpart2;
-ABORT;
+rollback;
diff --git a/sql/test/mergetables/Tests/crash0.stable.err 
b/sql/test/mergetables/Tests/crash0.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/mergetables/Tests/crash0.stable.err
@@ -0,0 +1,40 @@
+stderr of test 'crash0` in directory 'sql/test/mergetables` itself:
+
+
+# 23:02:05 >  
+# 23:02:05 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=35320" "--set" 
"mapi_usock=/var/tmp/mtest-15880/.s.monetdb.35320" "--set" "monet_prompt=" 
"--forcemito" "--set" "mal_listing=2" 
"--dbpath=/home/niels/scratch/monetdb/Linux-x86_64/var/MonetDB/mTests_sql_test_mergetables"
 "--set" "mal_listing=0" "--set" "embedded_r=yes"
+# 23:02:05 >  
+
+# builtin opt  gdk_dbpath = 
/home/niels/scratch/monetdb/Linux-x86_64/var/monetdb5/dbfarm/demo
+# builtin opt  gdk_debug = 0
+# builtin opt  gdk_vmtrim = no
+# builtin opt  monet_prompt = >
+# builtin opt  monet_daemon = no
+# builtin opt  mapi_port = 50000
+# builtin opt  mapi_open = false
+# builtin opt  mapi_autosense = false
+# builtin opt  sql_optimizer = default_pipe
+# builtin opt  sql_debug = 0
+# cmdline opt  gdk_nr_threads = 0
+# cmdline opt  mapi_open = true
+# cmdline opt  mapi_port = 35320
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to