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