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