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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list