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

Reply via email to