Changeset: 3d33e0899e64 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3d33e0899e64
Modified Files:
sql/rel.txt
sql/src/server/rel_bin.c
sql/src/server/rel_dump.c
sql/src/server/rel_exp.c
sql/src/server/rel_exp.h
sql/src/server/rel_select.c
sql/src/test/BugTracker-2010/Tests/All
sql/src/test/BugTracker-2010/Tests/values_type_cast.Bug-2735.sql
sql/src/test/BugTracker-2010/Tests/values_type_cast.Bug-2735.stable.err
sql/src/test/BugTracker-2010/Tests/values_type_cast.Bug-2735.stable.out
sql/src/test/Tests/crashme.timeout
sql/src/test/bugs/Tests/select_from_values.stable.out
Branch: default
Log Message:
re-implemented 'values'. Solves bug 2735 (and bugs related to large
value lists, which crashed because of too deep recursion).
diffs (truncated from 337 to 300 lines):
diff -r 81b96a91de34 -r 3d33e0899e64 sql/rel.txt
--- a/sql/rel.txt Fri Dec 03 13:59:15 2010 +0100
+++ b/sql/rel.txt Fri Dec 03 20:55:11 2010 +0100
@@ -69,6 +69,8 @@
or
-> r parameter ( ->r = varname, ->type = subtype, ->flag = level)
or
+ -> f list of atom expressions
+ or
-> numbered variable ( ->flag = nr, ->type = subtype)
e_convert
diff -r 81b96a91de34 -r 3d33e0899e64 sql/src/server/rel_bin.c
--- a/sql/src/server/rel_bin.c Fri Dec 03 13:59:15 2010 +0100
+++ b/sql/src/server/rel_bin.c Fri Dec 03 20:55:11 2010 +0100
@@ -225,6 +225,23 @@
return handle_in_exps( sql, ce, nl, left, right, grp, 1, 1);
}
+static stmt *
+value_list( mvc *sql, list *vals)
+{
+ node *n;
+ stmt *s;
+
+ /* create bat append values */
+ s = stmt_temp(sql->sa, exp_subtype(vals->h->data));
+ for( n = vals->h; n; n = n->next) {
+ sql_exp *e = n->data;
+ stmt *i = exp_bin(sql, e, NULL, NULL, NULL, NULL);
+
+ s = stmt_append(sql->sa, s, i);
+ }
+ return s;
+}
+
stmt *
exp_bin(mvc *sql, sql_exp *e, stmt *left, stmt *right, group *grp, stmt *sel)
{
@@ -242,6 +259,8 @@
s = stmt_atom(sql->sa, atom_dup(sql->sa, a));
} else if (e->r) { /* parameters */
s = stmt_var(sql->sa, sa_strdup(sql->sa, e->r),
e->tpe.type?&e->tpe:NULL, 0, e->flag);
+ } else if (e->f) { /* values */
+ s = value_list(sql, e->f);
} else { /* arguments */
s = stmt_varnr(sql->sa, e->flag,
e->tpe.type?&e->tpe:NULL);
}
diff -r 81b96a91de34 -r 3d33e0899e64 sql/src/server/rel_dump.c
--- a/sql/src/server/rel_dump.c Fri Dec 03 13:59:15 2010 +0100
+++ b/sql/src/server/rel_dump.c Fri Dec 03 20:55:11 2010 +0100
@@ -110,6 +110,9 @@
if (e->r) { /* named parameters */
char *name = e->r;
mnstr_printf(fout, "%s", name);
+ } else if (e->f) { /* values list */
+ list *l = e->f;
+ exp_print(sql, fout, l->h->data, depth, 0, 0);
} else { /* numbered arguments */
mnstr_printf(fout, "A%d", e->flag);
}
diff -r 81b96a91de34 -r 3d33e0899e64 sql/src/server/rel_exp.c
--- a/sql/src/server/rel_exp.c Fri Dec 03 13:59:15 2010 +0100
+++ b/sql/src/server/rel_exp.c Fri Dec 03 20:55:11 2010 +0100
@@ -239,6 +239,15 @@
}
sql_exp *
+exp_values(sql_allocator *sa, list *exps)
+{
+ sql_exp *e = exp_create(sa, e_atom);
+ e->card = CARD_MULTI;
+ e->f = exps;
+ return e;
+}
+
+sql_exp *
exp_alias(sql_allocator *sa, char *arname, char *acname, char *org_rname, char
*org_cname, sql_subtype *t, int card, int has_nils, int intern)
{
sql_exp *e = exp_create(sa, e_column);
diff -r 81b96a91de34 -r 3d33e0899e64 sql/src/server/rel_exp.h
--- a/sql/src/server/rel_exp.h Fri Dec 03 13:59:15 2010 +0100
+++ b/sql/src/server/rel_exp.h Fri Dec 03 20:55:11 2010 +0100
@@ -55,6 +55,8 @@
extern sql_exp * exp_atom_ptr(sql_allocator *sa, void *s);
extern sql_exp * exp_atom_ref(sql_allocator *sa, int i, sql_subtype *tpe);
extern sql_exp * exp_param(sql_allocator *sa, char *name, sql_subtype *tpe,
int frame);
+extern sql_exp * exp_values(sql_allocator *sa, list *exps);
+
extern sql_exp * exp_column(sql_allocator *sa, char *rname, char *name,
sql_subtype *t, int card, int has_nils, int intern);
extern sql_exp * exp_alias(sql_allocator *sa, char *arname, char *acname, char
*org_rname, char *org_cname, sql_subtype *t, int card, int has_nils, int
intern);
extern void exp_setname(sql_allocator *sa, sql_exp *e, char *rname, char *name
);
diff -r 81b96a91de34 -r 3d33e0899e64 sql/src/server/rel_select.c
--- a/sql/src/server/rel_select.c Fri Dec 03 13:59:15 2010 +0100
+++ b/sql/src/server/rel_select.c Fri Dec 03 20:55:11 2010 +0100
@@ -1329,6 +1329,8 @@
dlist *rowlist = tableref->data.lval;
symbol *optname = rowlist->t->data.sym;
dnode *o;
+ node *m;
+ list *exps = list_new(sql->sa);
exp_kind ek = {type_value, card_value, TRUE};
if (!rowlist->h)
@@ -1339,33 +1341,56 @@
dlist *values = o->data.lval;
if (r && list_length(r->exps) != dlist_length(values)) {
- rel_destroy(r);
return sql_error(sql, 02, "VALUES: number of values
doesn't match");
} else {
- sql_rel *i = NULL;
- list *exps = new_exp_list(sql->sa);
dnode *n;
- for (n = values->h; n; n = n->next) {
- sql_rel *r = NULL;
+ if (list_empty(exps)) {
+ for (n = values->h; n; n = n->next) {
+ sql_exp *vals = exp_values(sql->sa,
list_new(sql->sa));
+ list_append(exps, vals);
+ exp_label(sql->sa, vals, ++sql->label);
+ }
+ }
+ for (n = values->h, m = exps->h; n && m;
+ n = n->next, m = m->next) {
+ sql_exp *vals = m->data;
+ list *vals_list = vals->f;
sql_exp *e = rel_value_exp(sql, NULL,
n->data.sym, sql_sel, ek);
- if (!e) {
- rel_destroy(r);
+ if (!e)
return NULL;
- }
- if (!e->name)
- exp_label(sql->sa, e, ++sql->label);
- list_append(exps, e);
- }
- i = rel_project(sql->sa, NULL, exps);
- if (r) {
- r = rel_setop(sql->sa, r, i, op_union);
- r->exps = rel_projections(sql, r, NULL, 1, 1);
- } else {
- r = i;
+ list_append(vals_list, e);
}
}
}
+ /* loop to check types */
+ for (m = exps->h; m; m = m->next) {
+ node *n;
+ sql_exp *vals = m->data;
+ list *vals_list = vals->f;
+ list *nexps = list_new(sql->sa);
+
+ /* first get super type */
+ vals->tpe = *exp_subtype(vals_list->h->data);
+
+ for (n = vals_list->h; n; n = n->next) {
+ sql_exp *e = n->data;
+ sql_subtype super;
+
+ supertype(&super, &vals->tpe, exp_subtype(e));
+ vals->tpe = super;
+ }
+ for (n = vals_list->h; n; n = n->next) {
+ sql_exp *e = n->data;
+
+ e = rel_check_type(sql, &vals->tpe, e, type_equal);
+ if (!e)
+ return NULL;
+ append(nexps, e);
+ }
+ vals->f = nexps;
+ }
+ r = rel_project(sql->sa, NULL, exps);
set_processed(r);
rel_table_optname(sql, r, optname);
return r;
diff -r 81b96a91de34 -r 3d33e0899e64 sql/src/test/BugTracker-2010/Tests/All
--- a/sql/src/test/BugTracker-2010/Tests/All Fri Dec 03 13:59:15 2010 +0100
+++ b/sql/src/test/BugTracker-2010/Tests/All Fri Dec 03 20:55:11 2010 +0100
@@ -76,3 +76,4 @@
values.Bug-2726
select_from_seq.Bug-2730
huge_nr_of_columns.Bug-2609
+values_type_cast.Bug-2735
diff -r 81b96a91de34 -r 3d33e0899e64
sql/src/test/BugTracker-2010/Tests/values_type_cast.Bug-2735.sql
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/BugTracker-2010/Tests/values_type_cast.Bug-2735.sql Fri Dec
03 20:55:11 2010 +0100
@@ -0,0 +1,1 @@
+select * from ( values(100,1), (200,2)) as bla;
diff -r 81b96a91de34 -r 3d33e0899e64
sql/src/test/BugTracker-2010/Tests/values_type_cast.Bug-2735.stable.err
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/BugTracker-2010/Tests/values_type_cast.Bug-2735.stable.err
Fri Dec 03 20:55:11 2010 +0100
@@ -0,0 +1,81 @@
+stderr of test 'values_type_cast.Bug-2735` in directory
'src/test/BugTracker-2010` itself:
+
+
+# 20:48:21 >
+# 20:48:21 > mserver5
"--config=/ufs/niels/scratch/MonetDB/Linux-x86_64/etc/monetdb5.conf" --debug=10
--set gdk_nr_threads=4 --set
"monet_mod_path=/ufs/niels/scratch/MonetDB/Linux-x86_64/lib/MonetDB5:/ufs/niels/scratch/MonetDB/Linux-x86_64/lib/MonetDB5/lib:/ufs/niels/scratch/MonetDB/Linux-x86_64/lib/MonetDB5/bin"
--set "gdk_dbfarm=/ufs/niels/scratch/MonetDB/Linux-x86_64/var/MonetDB5/dbfarm"
--set mapi_open=true --set xrpc_open=true --set mapi_port=37366 --set
xrpc_port=44438 --set monet_prompt= --trace --forcemito --set mal_listing=2
"--dbname=mTests_src_test_BugTracker-2010" --set mal_listing=0 ; echo ; echo
Over..
+# 20:48:21 >
+
+# builtin opt gdk_arch = 64bitx86_64-unknown-linux-gnu
+# builtin opt gdk_version = 1.41.0
+# builtin opt prefix = /ufs/niels/scratch/MonetDB/Linux-x86_64
+# builtin opt exec_prefix = ${prefix}
+# builtin opt gdk_dbname = demo
+# builtin opt gdk_dbfarm = ${prefix}/var/MonetDB/dbfarm
+# builtin opt gdk_debug = 0
+# builtin opt gdk_alloc_map = no
+# builtin opt gdk_vmtrim = yes
+# builtin opt monet_admin = adm
+# builtin opt monet_prompt = >
+# builtin opt monet_welcome = yes
+# builtin opt monet_mod_path = ${exec_prefix}/lib/MonetDB
+# builtin opt monet_daemon = no
+# builtin opt host = localhost
+# builtin opt mapi_port = 50000
+# builtin opt mapi_clients = 2
+# builtin opt mapi_open = false
+# builtin opt mapi_autosense = false
+# builtin opt default_pipe =
inline,remap,evaluate,costModel,coercions,emptySet,aliases,mitosis,mergetable,deadcode,commonTerms,joinPath,reorder,deadcode,reduce,dataflow,history,multiplex,garbageCollector
+# builtin opt minimal_pipe = inline,remap,deadcode,multiplex,garbageCollector
+# builtin opt sql_optimizer = default_pipe
+# builtin opt sql_debug = 0
+# builtin opt standoff_ns =
+# builtin opt standoff_start = start
+# builtin opt standoff_end = end
+# config opt prefix = /ufs/niels/scratch/MonetDB/Linux-x86_64
+# config opt config = ${prefix}/etc/monetdb5.conf
+# config opt prefix = /ufs/niels/scratch/MonetDB/Linux-x86_64
+# config opt exec_prefix = ${prefix}
+# config opt gdk_dbfarm = ${prefix}/var/MonetDB5/dbfarm
+# config opt monet_mod_path =
${exec_prefix}/lib/MonetDB5:${exec_prefix}/lib/MonetDB5/lib:${exec_prefix}/lib/MonetDB5/bin
+# config opt mero_pidfile = ${prefix}/var/run/MonetDB/merovingian.pid
+# config opt mero_controlport = 50001
+# config opt no_mitosis_pipe =
inline,remap,evaluate,costModel,coercions,emptySet,aliases,mergetable,deadcode,commonTerms,joinPath,reorder,deadcode,reduce,dataflow,history,multiplex,garbageCollector
+# config opt sequential_pipe =
inline,remap,evaluate,costModel,coercions,emptySet,aliases,mergetable,deadcode,commonTerms,joinPath,reorder,deadcode,reduce,history,multiplex,garbageCollector
+# config opt nov2009_pipe =
inline,remap,evaluate,costModel,coercions,emptySet,aliases,mergetable,deadcode,constants,commonTerms,joinPath,deadcode,reduce,dataflow,history,multiplex,garbageCollector
+# config opt replication_pipe =
inline,remap,evaluate,costModel,coercions,emptySet,aliases,mergetable,deadcode,constants,commonTerms,joinPath,deadcode,reduce,dataflow,history,replication,multiplex,garbageCollector
+# config opt accumulator_pipe =
inline,remap,evaluate,costModel,coercions,emptySet,aliases,mergetable,deadcode,constants,commonTerms,joinPath,deadcode,reduce,accumulators,dataflow,history,multiplex,garbageCollector
+# config opt recycler_pipe =
inline,remap,evaluate,costModel,coercions,emptySet,aliases,deadcode,constants,commonTerms,joinPath,deadcode,recycle,reduce,dataflow,history,multiplex,garbageCollector
+# config opt cracker_pipe =
inline,remap,evaluate,costModel,coercions,emptySet,aliases,selcrack,deadcode,constants,commonTerms,joinPath,deadcode,reduce,dataflow,history,multiplex,garbageCollector
+# config opt sidcrack_pipe =
inline,remap,evaluate,costModel,coercions,emptySet,aliases,sidcrack,deadcode,constants,commonTerms,joinPath,deadcode,reduce,dataflow,history,multiplex,garbageCollector
+# config opt datacell_pipe =
inline,remap,evaluate,costModel,coercions,emptySet,aliases,deadcode,constants,commonTerms,joinPath,datacell,deadcode,reduce,dataflow,history,multiplex,garbageCollector
+# config opt octopus_pipe =
inline,remap,evaluate,costModel,coercions,emptySet,aliases,mitosis,mergetable,deadcode,constants,commonTerms,joinPath,deadcode,octopus,reduce,dataflow,history,multiplex,garbageCollector
+# config opt tarantula_pipe =
inline,remap,evaluate,costModel,coercions,emptySet,aliases,mitosis,mergetable,deadcode,constants,commonTerms,joinPath,tarantula,deadcode,reduce,dataflow,history,multiplex,garbageCollector
+# config opt mapreduce_pipe =
inline,remap,evaluate,costModel,coercions,emptySet,aliases,mapreduce,mergetable,deadcode,commonTerms,joinPath,reorder,deadcode,reduce,dataflow,history,multiplex,garbageCollector
+# config opt datacyclotron_pipe =
inline,remap,evaluate,costModel,coercions,emptySet,aliases,datacyclotron,mergetable,deadcode,commonTerms,joinPath,reorder,deadcode,reduce,dataflow,history,replication,multiplex,garbageCollector
+# config opt derive_pipe =
inline,remap,evaluate,costModel,coercions,emptySet,aliases,mitosis,mergetable,deadcode,commonTerms,derivePath,joinPath,reorder,deadcode,reduce,dataflow,history,multiplex,garbageCollector
+# config opt dictionary_pipe =
inline,remap,dictionary,evaluate,costModel,coercions,emptySet,aliases,mergetable,deadcode,constants,commonTerms,joinPath,deadcode,reduce,dataflow,history,multiplex,garbageCollector
+# config opt compression_pipe =
inline,remap,evaluate,costModel,coercions,emptySet,aliases,mergetable,deadcode,constants,commonTerms,joinPath,deadcode,reduce,dataflow,compression,dataflow,history,multiplex,garbageCollector
+# cmdline opt config =
/ufs/niels/scratch/MonetDB/Linux-x86_64/etc/monetdb5.conf
+# cmdline opt gdk_nr_threads = 4
+# cmdline opt monet_mod_path =
/ufs/niels/scratch/MonetDB/Linux-x86_64/lib/MonetDB5:/ufs/niels/scratch/MonetDB/Linux-x86_64/lib/MonetDB5/lib:/ufs/niels/scratch/MonetDB/Linux-x86_64/lib/MonetDB5/bin
+# cmdline opt gdk_dbfarm =
/ufs/niels/scratch/MonetDB/Linux-x86_64/var/MonetDB5/dbfarm
+# cmdline opt mapi_open = true
+# cmdline opt xrpc_open = true
+# cmdline opt mapi_port = 37366
+# cmdline opt xrpc_port = 44438
+# cmdline opt monet_prompt =
+# cmdline opt mal_listing = 2
+# cmdline opt gdk_dbname = mTests_src_test_BugTracker-2010
+# cmdline opt mal_listing = 0
+#warning: please don't forget to set your vault key!
+#(see /ufs/niels/scratch/MonetDB/Linux-x86_64/etc/monetdb5.conf)
+
+# 20:48:21 >
+# 20:48:21 > mclient -lsql -ftest -i -e --host=alf --port=37366
+# 20:48:21 >
+
+
+# 20:48:21 >
+# 20:48:21 > Done.
+# 20:48:21 >
+
diff -r 81b96a91de34 -r 3d33e0899e64
sql/src/test/BugTracker-2010/Tests/values_type_cast.Bug-2735.stable.out
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/BugTracker-2010/Tests/values_type_cast.Bug-2735.stable.out
Fri Dec 03 20:55:11 2010 +0100
@@ -0,0 +1,38 @@
+stdout of test 'values_type_cast.Bug-2735` in directory
'src/test/BugTracker-2010` itself:
+
+
+# 20:48:21 >
+# 20:48:21 > mserver5
"--config=/ufs/niels/scratch/MonetDB/Linux-x86_64/etc/monetdb5.conf" --debug=10
--set gdk_nr_threads=4 --set
"monet_mod_path=/ufs/niels/scratch/MonetDB/Linux-x86_64/lib/MonetDB5:/ufs/niels/scratch/MonetDB/Linux-x86_64/lib/MonetDB5/lib:/ufs/niels/scratch/MonetDB/Linux-x86_64/lib/MonetDB5/bin"
--set "gdk_dbfarm=/ufs/niels/scratch/MonetDB/Linux-x86_64/var/MonetDB5/dbfarm"
--set mapi_open=true --set xrpc_open=true --set mapi_port=37366 --set
xrpc_port=44438 --set monet_prompt= --trace --forcemito --set mal_listing=2
"--dbname=mTests_src_test_BugTracker-2010" --set mal_listing=0 ; echo ; echo
Over..
+# 20:48:21 >
+
+# MonetDB server v5.23.0, based on kernel v1.41.0
+# Not released
+# Serving database 'mTests_src_test_BugTracker-2010', using 4 threads
+# Compiled for x86_64-unknown-linux-gnu/64bit with 64bit OIDs dynamically
linked
+# Found 7.753 GiB available main-memory.
+# Copyright (c) 1993-July 2008 CWI.
+# Copyright (c) August 2008-2010 MonetDB B.V., all rights reserved
+# Visit http://monetdb.cwi.nl/ for further information
+# Listening for connection requests on mapi:monetdb://alf.ins.cwi.nl:37366/
+# MonetDB/SQL module v2.41.0 loaded
+
+Ready.
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list