Changeset: 5a8a62a9f0b5 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5a8a62a9f0b5
Added Files:
        sql/test/BugTracker-2012/Tests/bug_large-insert-Bug.2960.sql
        sql/test/BugTracker-2012/Tests/bug_large-insert-Bug.2960.stable.err
        sql/test/BugTracker-2012/Tests/bug_large-insert-Bug.2960.stable.out
Modified Files:
        sql/backends/monet5/UDF/Tests/udf-fuse.stable.out
        sql/backends/monet5/UDF/Tests/udf-reverse.stable.out
        sql/server/rel_select.c
        sql/server/rel_updates.c
        sql/server/sql_parser.y
        sql/server/sql_rel2bin.c
        sql/server/sql_statement.c
        
sql/test/BugDay_2005-10-06_2.9.3/Tests/union_limitation.SF-921992.stable.out
        sql/test/BugTracker-2009/Tests/POWER_vs_prod.SF-2596114.stable.out
        
sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out
        
sql/test/BugTracker-2010/Tests/group-by_ordered_column.Bug-2564.stable.out
        sql/test/BugTracker-2011/Tests/func_iter_vs_bulk.Bug-2826.stable.out
        sql/test/BugTracker-2012/Tests/All
        sql/test/BugTracker/Tests/explain.SF-1739353.stable.out
        sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
        sql/test/ssqq/Tests/insert_query.stable.out
        sql/test/ssqq/Tests/insert_queue.stable.out
        sql/test/ssqq/insert_queue.sql
Branch: Apr2012
Log Message:

fixed problem with deep recursion, when loading/inserting lots of values
using values (),() etc. This fixes bug 2960


diffs (truncated from 5661 to 300 lines):

diff --git a/sql/backends/monet5/UDF/Tests/udf-fuse.stable.out 
b/sql/backends/monet5/UDF/Tests/udf-fuse.stable.out
--- a/sql/backends/monet5/UDF/Tests/udf-fuse.stable.out
+++ b/sql/backends/monet5/UDF/Tests/udf-fuse.stable.out
@@ -29,8 +29,8 @@ Ready.
 % clob # type
 % 76 # length
 function user.s0_1{autoCommit=true}(A0:bte,A1:bte):void;
-    X_5 := udf.fuse(A0,A1);
-    sql.exportValue(1,".","fuse_single_value":str,"smallint",16,0,6,X_5,"");
+    X_4 := udf.fuse(A0,A1);
+    sql.exportValue(1,".","fuse_single_value":str,"smallint",16,0,6,X_4,"");
 end s0_1;
 # optimizer.mitosis()
 # optimizer.dataflow()
@@ -46,8 +46,8 @@ end s0_1;
 % clob # type
 % 71 # length
 function user.s2_1{autoCommit=true}(A0:sht,A1:sht):void;
-    X_5 := udf.fuse(A0,A1);
-    sql.exportValue(1,".","fuse_single_value":str,"int",32,0,6,X_5,"");
+    X_4 := udf.fuse(A0,A1);
+    sql.exportValue(1,".","fuse_single_value":str,"int",32,0,6,X_4,"");
 end s2_1;
 # optimizer.mitosis()
 # optimizer.dataflow()
@@ -63,8 +63,8 @@ end s2_1;
 % clob # type
 % 74 # length
 function user.s4_1{autoCommit=true}(A0:int,A1:int):void;
-    X_5 := udf.fuse(A0,A1);
-    sql.exportValue(1,".","fuse_single_value":str,"bigint",64,0,6,X_5,"");
+    X_4 := udf.fuse(A0,A1);
+    sql.exportValue(1,".","fuse_single_value":str,"bigint",64,0,6,X_4,"");
 end s4_1;
 # optimizer.mitosis()
 # optimizer.dataflow()
@@ -96,30 +96,30 @@ end s4_1;
 % .explain # table_name
 % mal # name
 % clob # type
-% 65 # length
+% 66 # length
 function user.s11_1{autoCommit=true}():void;
     X_2 := sql.mvc();
-    X_12:bat[:oid,:bte]  := sql.bind(X_2,"sys","udf_fuse","a",0);
-    X_10:bat[:oid,:bte]  := sql.bind(X_2,"sys","udf_fuse","a",2);
-    X_14 := algebra.kdifference(X_12,X_10);
-    X_15 := algebra.kunion(X_14,X_10);
-    X_9:bat[:oid,:bte]  := sql.bind(X_2,"sys","udf_fuse","a",1);
-    X_16 := algebra.kunion(X_15,X_9);
-    X_5:bat[:oid,:oid]  := sql.bind_dbat(X_2,"sys","udf_fuse",1);
-    X_8 := bat.reverse(X_5);
-    X_17 := algebra.kdifference(X_16,X_8);
-    X_21:bat[:oid,:bte]  := sql.bind(X_2,"sys","udf_fuse","b",0);
+    X_3:bat[:oid,:bte]  := sql.bind(X_2,"sys","udf_fuse","a",0);
+    X_8:bat[:oid,:bte]  := sql.bind(X_2,"sys","udf_fuse","a",2);
+    X_10 := algebra.kdifference(X_3,X_8);
+    X_11 := algebra.kunion(X_10,X_8);
+    X_12:bat[:oid,:bte]  := sql.bind(X_2,"sys","udf_fuse","a",1);
+    X_14 := algebra.kunion(X_11,X_12);
+    X_15:bat[:oid,:oid]  := sql.bind_dbat(X_2,"sys","udf_fuse",1);
+    X_16 := bat.reverse(X_15);
+    X_17 := algebra.kdifference(X_14,X_16);
+    X_18:bat[:oid,:bte]  := sql.bind(X_2,"sys","udf_fuse","b",0);
     X_20:bat[:oid,:bte]  := sql.bind(X_2,"sys","udf_fuse","b",2);
-    X_22 := algebra.kdifference(X_21,X_20);
-    X_23 := algebra.kunion(X_22,X_20);
-    X_19:bat[:oid,:bte]  := sql.bind(X_2,"sys","udf_fuse","b",1);
-    X_24 := algebra.kunion(X_23,X_19);
-    X_25 := algebra.kdifference(X_24,X_8);
+    X_21 := algebra.kdifference(X_18,X_20);
+    X_22 := algebra.kunion(X_21,X_20);
+    X_23:bat[:oid,:bte]  := sql.bind(X_2,"sys","udf_fuse","b",1);
+    X_24 := algebra.kunion(X_22,X_23);
+    X_25 := algebra.kdifference(X_24,X_16);
     X_26:bat[:oid,:sht]  := batudf.fuse(X_17,X_25);
-    X_27 := sql.resultSet(1,1,X_26);
-    sql.rsColumn(X_27,"sys.","fuse_a":str,"smallint",16,0,X_26);
-    X_33 := io.stdout();
-    sql.exportResult(X_33,X_27);
+    X_28 := sql.resultSet(1,1,X_26);
+    sql.rsColumn(X_28,"sys.","fuse_a","smallint",16,0,X_26);
+    X_34 := io.stdout();
+    sql.exportResult(X_34,X_28);
 end s11_1;
 # optimizer.mitosis()
 # optimizer.dataflow()
@@ -127,30 +127,30 @@ end s11_1;
 % .explain # table_name
 % mal # name
 % clob # type
-% 65 # length
+% 66 # length
 function user.s12_1{autoCommit=true}():void;
     X_2 := sql.mvc();
-    X_12:bat[:oid,:sht]  := sql.bind(X_2,"sys","udf_fuse","c",0);
-    X_10:bat[:oid,:sht]  := sql.bind(X_2,"sys","udf_fuse","c",2);
-    X_14 := algebra.kdifference(X_12,X_10);
-    X_15 := algebra.kunion(X_14,X_10);
-    X_9:bat[:oid,:sht]  := sql.bind(X_2,"sys","udf_fuse","c",1);
-    X_16 := algebra.kunion(X_15,X_9);
-    X_5:bat[:oid,:oid]  := sql.bind_dbat(X_2,"sys","udf_fuse",1);
-    X_8 := bat.reverse(X_5);
-    X_17 := algebra.kdifference(X_16,X_8);
-    X_21:bat[:oid,:sht]  := sql.bind(X_2,"sys","udf_fuse","d",0);
+    X_3:bat[:oid,:sht]  := sql.bind(X_2,"sys","udf_fuse","c",0);
+    X_8:bat[:oid,:sht]  := sql.bind(X_2,"sys","udf_fuse","c",2);
+    X_10 := algebra.kdifference(X_3,X_8);
+    X_11 := algebra.kunion(X_10,X_8);
+    X_12:bat[:oid,:sht]  := sql.bind(X_2,"sys","udf_fuse","c",1);
+    X_14 := algebra.kunion(X_11,X_12);
+    X_15:bat[:oid,:oid]  := sql.bind_dbat(X_2,"sys","udf_fuse",1);
+    X_16 := bat.reverse(X_15);
+    X_17 := algebra.kdifference(X_14,X_16);
+    X_18:bat[:oid,:sht]  := sql.bind(X_2,"sys","udf_fuse","d",0);
     X_20:bat[:oid,:sht]  := sql.bind(X_2,"sys","udf_fuse","d",2);
-    X_22 := algebra.kdifference(X_21,X_20);
-    X_23 := algebra.kunion(X_22,X_20);
-    X_19:bat[:oid,:sht]  := sql.bind(X_2,"sys","udf_fuse","d",1);
-    X_24 := algebra.kunion(X_23,X_19);
-    X_25 := algebra.kdifference(X_24,X_8);
+    X_21 := algebra.kdifference(X_18,X_20);
+    X_22 := algebra.kunion(X_21,X_20);
+    X_23:bat[:oid,:sht]  := sql.bind(X_2,"sys","udf_fuse","d",1);
+    X_24 := algebra.kunion(X_22,X_23);
+    X_25 := algebra.kdifference(X_24,X_16);
     X_26:bat[:oid,:int]  := batudf.fuse(X_17,X_25);
-    X_27 := sql.resultSet(1,1,X_26);
-    sql.rsColumn(X_27,"sys.","fuse_c":str,"int",32,0,X_26);
-    X_33 := io.stdout();
-    sql.exportResult(X_33,X_27);
+    X_28 := sql.resultSet(1,1,X_26);
+    sql.rsColumn(X_28,"sys.","fuse_c","int",32,0,X_26);
+    X_34 := io.stdout();
+    sql.exportResult(X_34,X_28);
 end s12_1;
 # optimizer.mitosis()
 # optimizer.dataflow()
@@ -158,30 +158,30 @@ end s12_1;
 % .explain # table_name
 % mal # name
 % clob # type
-% 65 # length
+% 66 # length
 function user.s13_1{autoCommit=true}():void;
     X_2 := sql.mvc();
-    X_12:bat[:oid,:int]  := sql.bind(X_2,"sys","udf_fuse","e",0);
-    X_10:bat[:oid,:int]  := sql.bind(X_2,"sys","udf_fuse","e",2);
-    X_14 := algebra.kdifference(X_12,X_10);
-    X_15 := algebra.kunion(X_14,X_10);
-    X_9:bat[:oid,:int]  := sql.bind(X_2,"sys","udf_fuse","e",1);
-    X_16 := algebra.kunion(X_15,X_9);
-    X_5:bat[:oid,:oid]  := sql.bind_dbat(X_2,"sys","udf_fuse",1);
-    X_8 := bat.reverse(X_5);
-    X_17 := algebra.kdifference(X_16,X_8);
-    X_21:bat[:oid,:int]  := sql.bind(X_2,"sys","udf_fuse","f",0);
+    X_3:bat[:oid,:int]  := sql.bind(X_2,"sys","udf_fuse","e",0);
+    X_8:bat[:oid,:int]  := sql.bind(X_2,"sys","udf_fuse","e",2);
+    X_10 := algebra.kdifference(X_3,X_8);
+    X_11 := algebra.kunion(X_10,X_8);
+    X_12:bat[:oid,:int]  := sql.bind(X_2,"sys","udf_fuse","e",1);
+    X_14 := algebra.kunion(X_11,X_12);
+    X_15:bat[:oid,:oid]  := sql.bind_dbat(X_2,"sys","udf_fuse",1);
+    X_16 := bat.reverse(X_15);
+    X_17 := algebra.kdifference(X_14,X_16);
+    X_18:bat[:oid,:int]  := sql.bind(X_2,"sys","udf_fuse","f",0);
     X_20:bat[:oid,:int]  := sql.bind(X_2,"sys","udf_fuse","f",2);
-    X_22 := algebra.kdifference(X_21,X_20);
-    X_23 := algebra.kunion(X_22,X_20);
-    X_19:bat[:oid,:int]  := sql.bind(X_2,"sys","udf_fuse","f",1);
-    X_24 := algebra.kunion(X_23,X_19);
-    X_25 := algebra.kdifference(X_24,X_8);
+    X_21 := algebra.kdifference(X_18,X_20);
+    X_22 := algebra.kunion(X_21,X_20);
+    X_23:bat[:oid,:int]  := sql.bind(X_2,"sys","udf_fuse","f",1);
+    X_24 := algebra.kunion(X_22,X_23);
+    X_25 := algebra.kdifference(X_24,X_16);
     X_26:bat[:oid,:lng]  := batudf.fuse(X_17,X_25);
-    X_27 := sql.resultSet(1,1,X_26);
-    sql.rsColumn(X_27,"sys.","fuse_e":str,"bigint",64,0,X_26);
-    X_33 := io.stdout();
-    sql.exportResult(X_33,X_27);
+    X_28 := sql.resultSet(1,1,X_26);
+    sql.rsColumn(X_28,"sys.","fuse_e","bigint",64,0,X_26);
+    X_34 := io.stdout();
+    sql.exportResult(X_34,X_28);
 end s13_1;
 # optimizer.mitosis()
 # optimizer.dataflow()
diff --git a/sql/backends/monet5/UDF/Tests/udf-reverse.stable.out 
b/sql/backends/monet5/UDF/Tests/udf-reverse.stable.out
--- a/sql/backends/monet5/UDF/Tests/udf-reverse.stable.out
+++ b/sql/backends/monet5/UDF/Tests/udf-reverse.stable.out
@@ -50,8 +50,8 @@ Ready.
 % clob # type
 % 74 # length
 function user.s0_1{autoCommit=true}(A0:str):void;
-    X_4 := udf.reverse(A0);
-    sql.exportValue(1,".","reverse_single_value":str,"clob",0,0,4,X_4,"");
+    X_3 := udf.reverse(A0);
+    sql.exportValue(1,".","reverse_single_value":str,"clob",0,0,4,X_3,"");
 end s0_1;
 #select reverse('MonetDB');
 % . # table_name
@@ -81,21 +81,21 @@ end s0_1;
 % .explain # table_name
 % mal # name
 % clob # type
-% 68 # length
+% 69 # length
 function user.s7_1{autoCommit=true}():void;
     X_2 := sql.mvc();
-    X_13:bat[:oid,:str]  := sql.bind(X_2,"sys","udf_reverse","x",0);
-    X_11:bat[:oid,:str]  := sql.bind(X_2,"sys","udf_reverse","x",2);
-    X_15 := algebra.kdifference(X_13,X_11);
-    X_16 := algebra.kunion(X_15,X_11);
-    X_10:bat[:oid,:str]  := sql.bind(X_2,"sys","udf_reverse","x",1);
-    X_17 := algebra.kunion(X_16,X_10);
-    X_6:bat[:oid,:oid]  := sql.bind_dbat(X_2,"sys","udf_reverse",1);
-    X_9 := bat.reverse(X_6);
-    X_18 := algebra.kdifference(X_17,X_9);
-    X_19:bat[:oid,:str]  := batudf.reverse(X_18);
-    X_20 := sql.resultSet(1,1,X_19);
-    sql.rsColumn(X_20,"sys.","reverse_x","clob",0,0,X_19);
+    X_3:bat[:oid,:str]  := sql.bind(X_2,"sys","udf_reverse","x",0);
+    X_8:bat[:oid,:str]  := sql.bind(X_2,"sys","udf_reverse","x",2);
+    X_10 := algebra.kdifference(X_3,X_8);
+    X_11 := algebra.kunion(X_10,X_8);
+    X_12:bat[:oid,:str]  := sql.bind(X_2,"sys","udf_reverse","x",1);
+    X_14 := algebra.kunion(X_11,X_12);
+    X_15:bat[:oid,:oid]  := sql.bind_dbat(X_2,"sys","udf_reverse",1);
+    X_16 := bat.reverse(X_15);
+    X_17 := algebra.kdifference(X_14,X_16);
+    X_18:bat[:oid,:str]  := batudf.reverse(X_17);
+    X_20 := sql.resultSet(1,1,X_18);
+    sql.rsColumn(X_20,"sys.","reverse_x":str,"clob",0,0,X_18);
     X_24 := io.stdout();
     sql.exportResult(X_24,X_20);
 end s7_1;
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -1888,7 +1888,7 @@ exp_convert_inplace(mvc *sql, sql_subtyp
        atom *a;
 
        /* exclude named variables */
-       if (exp->type != e_atom || exp->l /* atoms */ || exp->r /* named */ ||
+       if (exp->type != e_atom || exp->l /* atoms */ || exp->r /* named */ || 
exp->f /* list */ ||
                (t->scale && t->type->eclass != EC_FLT))
                return NULL;
 
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
@@ -304,6 +304,7 @@ rel_insert_table(mvc *sql, sql_table *t,
 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);
@@ -361,6 +362,8 @@ insert_into(mvc *sql, dlist *qname, dlis
                dlist *rowlist = val_or_q->data.lval;
                dlist *values;
                dnode *o;
+               list *exps = new_exp_list(sql->sa);
+               sql_rel *inner = NULL;
 
                if (!rowlist->h) {
                        r = rel_project(sql->sa, NULL, NULL);
@@ -368,40 +371,57 @@ insert_into(mvc *sql, dlist *qname, dlis
                                collist = NULL;
                }
 
-               for (o = rowlist->h; o; o = o->next) {
+               for (o = rowlist->h; o; o = o->next, rowcount++) {
                        values = o->data.lval;
 
                        if (dlist_length(values) != list_length(collist)) {
                                return sql_error(sql, 02, "21S01!INSERT INTO: 
number of values doesn't match number of columns of table '%s'", tname);
                        } else {
-                               sql_rel *inner = NULL;
-                               sql_rel *i = NULL;
-                               list *exps = new_exp_list(sql->sa);
                                dnode *n;
+                               node *v;
 
-                               for (n = values->h, m = collist->h; n && m; n = 
n->next, m = m->next) {
-                                       sql_column *c = m->data;
-                                       sql_rel *r = NULL;
-                                       sql_exp *ins = insert_value(sql, c, &r, 
n->data.sym);
-                                       if (!ins)
-                                               return NULL;
-                                       if (r && inner)
-                                               inner = 
rel_crossproduct(sql->sa, inner,r, op_join);
-                                       else if (r) 
-                                               inner = r;
-                                       if (!ins->name)
-                                               exp_label(sql->sa, ins, 
++sql->label);
-                                       list_append(exps, ins);
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to