Changeset: 69f28ddcd705 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=69f28ddcd705 Modified Files: monetdb5/optimizer/opt_pushselect.c sql/backends/monet5/sql.mx sql/backends/monet5/sql_gencode.c sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out sql/test/BugTracker/Tests/explain.SF-1739353.stable.out sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out Branch: Feb2013 Log Message:
fixed bug in concurrent use of updated data. diffs (279 lines): diff --git a/monetdb5/optimizer/opt_pushselect.c b/monetdb5/optimizer/opt_pushselect.c --- a/monetdb5/optimizer/opt_pushselect.c +++ b/monetdb5/optimizer/opt_pushselect.c @@ -111,7 +111,7 @@ OPTpushselectImplementation(Client cntxt return 0; OPTDEBUGpushselect - mnstr_printf(cntxt->fdout,"#Range select optimizer started\n"); + mnstr_printf(cntxt->fdout,"#Push select optimizer started\n"); (void) stk; (void) pci; vars= (int*) GDKmalloc(sizeof(int)* mb->vtop); @@ -370,9 +370,10 @@ OPTpushselectImplementation(Client cntxt setFunctionId(u, subdeltaRef); getArg(u, 0) = getArg(p,0); getArg(u, 1) = getArg(r,0); - getArg(u, 2) = getArg(q,2); /* update ids */ - getArg(u, 3) = getArg(s,0); - getArg(u, 4) = getArg(t,0); + getArg(u, 2) = getArg(p,2); /* pre-cands */ + getArg(u, 3) = getArg(q,2); /* update ids */ + getArg(u, 4) = getArg(s,0); + u = pushArgument(mb, u, getArg(t,0)); pushInstruction(mb,u); freeInstruction(p); continue; diff --git a/sql/backends/monet5/sql.mx b/sql/backends/monet5/sql.mx --- a/sql/backends/monet5/sql.mx +++ b/sql/backends/monet5/sql.mx @@ -250,7 +250,7 @@ command projectdelta( subselect:bat[:oid address DELTAproject comment "Return column bat with delta's applied."; -command subdelta ( col:bat[:oid,:oid], uid:bat[:oid,:oid], uval:bat[:oid,:oid], ins:bat[:oid,:oid] ) :bat[:oid,:oid] +command subdelta ( col:bat[:oid,:oid], cand:bat[:oid,:oid], uid:bat[:oid,:oid], uval:bat[:oid,:oid], ins:bat[:oid,:oid] ) :bat[:oid,:oid] address DELTAsub comment "Return a single bat of subselected delta."; @@ -262,7 +262,7 @@ command projectdelta( subselect:bat[:oid address DELTAproject2 comment "Return column bat with delta's applied."; -command subdelta ( col:bat[:oid,:oid], uid:bat[:oid,:oid], uval:bat[:oid,:oid]) :bat[:oid,:oid] +command subdelta ( col:bat[:oid,:oid], cand:bat[:oid,:oid], uid:bat[:oid,:oid], uval:bat[:oid,:oid]) :bat[:oid,:oid] address DELTAsub2 comment "Return a single bat of subselected delta."; @@ -1329,10 +1329,10 @@ sql5_export str mvc_clear_table_wrap(Cli sql5_export str mvc_delete_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); sql5_export str TID(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); sql5_export str DELTAbat(bat *result, bat *col, bat *uid, bat *uval, bat *ins); -sql5_export str DELTAsub(bat *result, bat *col, bat *uid, bat *uval, bat *ins); +sql5_export str DELTAsub(bat *result, bat *col, bat *cid, bat *uid, bat *uval, bat *ins); sql5_export str DELTAproject(bat *result, bat *subselect, bat *col, bat *uid, bat *uval, bat *ins); sql5_export str DELTAbat2(bat *result, bat *col, bat *uid, bat *uval); -sql5_export str DELTAsub2(bat *result, bat *col, bat *uid, bat *uval); +sql5_export str DELTAsub2(bat *result, bat *col, bat *cid, bat *uid, bat *uval); sql5_export str DELTAproject2(bat *result, bat *subselect, bat *col, bat *uid, bat *uval); sql5_export str mvc_result_row_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); sql5_export str mvc_result_file_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); @@ -3451,9 +3451,9 @@ DELTAbat2(bat *result, bat *col, bat *ui } str -DELTAsub2(bat *result, bat *col, bat *uid, bat *uval) -{ - return DELTAsub(result, col, uid, uval, NULL); +DELTAsub2(bat *result, bat *col, bat *cid, bat *uid, bat *uval) +{ + return DELTAsub(result, col, cid, uid, uval, NULL); } str @@ -3513,7 +3513,7 @@ DELTAbat(bat *result, bat *col, bat *uid } str -DELTAsub(bat *result, bat *col, bat *uid, bat *uval, bat *ins) +DELTAsub(bat *result, bat *col, bat *cid, bat *uid, bat *uval, bat *ins) { BAT *c, *cminu, *u_id, *u_val, *u, *i = NULL, *res; @@ -3543,7 +3543,7 @@ DELTAsub(bat *result, bat *col, bat *uid u_id = BATdescriptor(*uid); cminu = BATkdiff(BATmirror(c), BATmirror(u_id)); BBPunfix(c->batCacheid); - c = BATmirror(BATmark(cminu, 0)); + res = c = BATmirror(BATmark(cminu, 0)); BBPunfix(cminu->batCacheid); if ((u_val = BATdescriptor(*uval)) == NULL) { @@ -3552,17 +3552,44 @@ DELTAsub(bat *result, bat *col, bat *uid throw(MAL, "sql.delta", RUNTIME_OBJECT_MISSING); } u = BATleftfetchjoin(u_val, u_id, BATcount(u_val)); + BBPunfix(u_val->batCacheid); BBPunfix(u_id->batCacheid); - BBPunfix(u_val->batCacheid); + if (BATcount(u)) { /* check selected updated values against candidates */ + BAT *c_ids = BATdescriptor(*cid); + + cminu = BATsemijoin(BATmirror(u), BATmirror(c_ids)); + BBPunfix(c_ids->batCacheid); + BBPunfix(u->batCacheid); + u = BATmirror(cminu); + } res = BATappend(c, u, TRUE); BBPunfix(u->batCacheid); + + u = BATsort(BATmirror(res)); + BBPunfix(res->batCacheid); + res = BATmirror(BATmark(u, 0)); + BBPunfix(u->batCacheid); } if (i) { i = BATdescriptor(*ins); + if (BATcount(u_id)) { + u_id = BATdescriptor(*uid); + cminu = BATkdiff(BATmirror(i), BATmirror(u_id)); + BBPunfix(i->batCacheid); + BBPunfix(u_id->batCacheid); + i = BATmirror(BATmark(cminu, 0)); + BBPunfix(cminu->batCacheid); + } res = BATappend(res, i, TRUE); BBPunfix(i->batCacheid); - } + + u = BATsort(BATmirror(res)); + BBPunfix(res->batCacheid); + res = BATmirror(BATmark(u, 0)); + BBPunfix(u->batCacheid); + } + BATkey(BATmirror(res),TRUE); BBPkeepref(*result = res->batCacheid); return MAL_SUCCEED; } diff --git a/sql/backends/monet5/sql_gencode.c b/sql/backends/monet5/sql_gencode.c --- a/sql/backends/monet5/sql_gencode.c +++ b/sql/backends/monet5/sql_gencode.c @@ -617,38 +617,6 @@ multiplex2(MalBlkPtr mb, char *mod, char return q; } -#if 0 -static InstrPtr -dump_crossproduct(MalBlkPtr mb, int l, int r) -{ - int z; - InstrPtr q; - - q = newStmt1(mb, calcRef, "int"); - q = pushInt(mb, q, 0); - z = getDestVar(q); - - q = newStmt2(mb, algebraRef, projectRef); - q = pushArgument(mb, q, r); - q = pushArgument(mb, q, z); - r = getDestVar(q); - - q = newStmt2(mb, batRef, reverseRef); - q = pushArgument(mb, q, r); - r = getDestVar(q); - - q = newStmt2(mb, algebraRef, projectRef); - q = pushArgument(mb, q, l); - q = pushArgument(mb, q, z); - l = getDestVar(q); - - q = newStmt2(mb, algebraRef, crossRef); - q = pushArgument(mb, q, l); - q = pushArgument(mb, q, r); - return q; -} -#endif - static InstrPtr multiplexN(MalBlkPtr mb, char *mod, char *name) { diff --git a/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out b/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out --- a/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out +++ b/sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out @@ -39,7 +39,7 @@ function user.s0_1(A0:str):void; X_46 := algebra.likesubselect(r1_9,A0,"",false); X_12 := sql.bind(X_2,"sys","functions","name",1); X_47 := algebra.likesubselect(X_12,X_3,A0,"",false); - X_15 := sql.subdelta(X_45,X_9,X_46,X_47); + X_15 := sql.subdelta(X_45,X_3,X_9,X_46,X_47); X_17 := sql.projectdelta(X_15,X_6,X_9,r1_9,X_12); X_18 := sql.bind(X_2,"sys","functions","func",0); (X_20,r1_28) := sql.bind(X_2,"sys","functions","func",2); @@ -65,7 +65,7 @@ function user.s1_1(A0:str):void; X_46 := algebra.likesubselect(r1_9,A0,"",true); X_12 := sql.bind(X_2,"sys","functions","name",1); X_47 := algebra.likesubselect(X_12,X_3,A0,"",true); - X_15 := sql.subdelta(X_45,X_9,X_46,X_47); + X_15 := sql.subdelta(X_45,X_3,X_9,X_46,X_47); X_17 := sql.projectdelta(X_15,X_6,X_9,r1_9,X_12); X_18 := sql.bind(X_2,"sys","functions","func",0); (X_20,r1_28) := sql.bind(X_2,"sys","functions","func",2); @@ -91,7 +91,7 @@ function user.s2_1(A0:str):void; X_46 := algebra.ilikesubselect(r1_9,A0,"",false); X_12 := sql.bind(X_2,"sys","functions","name",1); X_47 := algebra.ilikesubselect(X_12,X_3,A0,"",false); - X_15 := sql.subdelta(X_45,X_9,X_46,X_47); + X_15 := sql.subdelta(X_45,X_3,X_9,X_46,X_47); X_17 := sql.projectdelta(X_15,X_6,X_9,r1_9,X_12); X_18 := sql.bind(X_2,"sys","functions","func",0); (X_20,r1_28) := sql.bind(X_2,"sys","functions","func",2); @@ -117,7 +117,7 @@ function user.s3_1(A0:str):void; X_46 := algebra.ilikesubselect(r1_9,A0,"",true); X_12 := sql.bind(X_2,"sys","functions","name",1); X_47 := algebra.ilikesubselect(X_12,X_3,A0,"",true); - X_15 := sql.subdelta(X_45,X_9,X_46,X_47); + X_15 := sql.subdelta(X_45,X_3,X_9,X_46,X_47); X_17 := sql.projectdelta(X_15,X_6,X_9,r1_9,X_12); X_18 := sql.bind(X_2,"sys","functions","func",0); (X_20,r1_28) := sql.bind(X_2,"sys","functions","func",2); @@ -165,7 +165,7 @@ function user.s4_1(A0:str):void; X_53 := algebra.likesubselect(r1_9,X_49,"",false,false); X_12 := sql.bind(X_2,"sys","functions","name",1); X_54 := algebra.likesubselect(X_12,X_3,X_49,"",false,false); - X_14 := sql.subdelta(X_52,X_9,X_53,X_54); + X_14 := sql.subdelta(X_52,X_3,X_9,X_53,X_54); X_15 := sql.projectdelta(X_14,X_6,X_9,r1_9,X_12); X_16 := sql.bind(X_2,"sys","functions","func",0); (X_18,r1_35) := sql.bind(X_2,"sys","functions","func",2); @@ -193,7 +193,7 @@ function user.s5_1(A0:str):void; X_54 := algebra.likesubselect(r1_9,X_49,"",false,true); X_12 := sql.bind(X_2,"sys","functions","name",1); X_55 := algebra.likesubselect(X_12,X_3,X_49,"",false,true); - X_14 := sql.subdelta(X_53,X_9,X_54,X_55); + X_14 := sql.subdelta(X_53,X_3,X_9,X_54,X_55); X_15 := sql.projectdelta(X_14,X_6,X_9,r1_9,X_12); X_16 := sql.bind(X_2,"sys","functions","func",0); (X_18,r1_35) := sql.bind(X_2,"sys","functions","func",2); @@ -221,7 +221,7 @@ function user.s6_1(A0:str):void; X_54 := algebra.likesubselect(r1_9,X_49,"",true,false); X_12 := sql.bind(X_2,"sys","functions","name",1); X_55 := algebra.likesubselect(X_12,X_3,X_49,"",true,false); - X_14 := sql.subdelta(X_53,X_9,X_54,X_55); + X_14 := sql.subdelta(X_53,X_3,X_9,X_54,X_55); X_15 := sql.projectdelta(X_14,X_6,X_9,r1_9,X_12); X_16 := sql.bind(X_2,"sys","functions","func",0); (X_18,r1_35) := sql.bind(X_2,"sys","functions","func",2); @@ -249,7 +249,7 @@ function user.s7_1(A0:str):void; X_53 := algebra.likesubselect(r1_9,X_49,"",true,true); X_12 := sql.bind(X_2,"sys","functions","name",1); X_54 := algebra.likesubselect(X_12,X_3,X_49,"",true,true); - X_14 := sql.subdelta(X_52,X_9,X_53,X_54); + X_14 := sql.subdelta(X_52,X_3,X_9,X_53,X_54); X_15 := sql.projectdelta(X_14,X_6,X_9,r1_9,X_12); X_16 := sql.bind(X_2,"sys","functions","func",0); (X_18,r1_35) := sql.bind(X_2,"sys","functions","func",2); diff --git a/sql/test/BugTracker/Tests/explain.SF-1739353.stable.out b/sql/test/BugTracker/Tests/explain.SF-1739353.stable.out --- a/sql/test/BugTracker/Tests/explain.SF-1739353.stable.out +++ b/sql/test/BugTracker/Tests/explain.SF-1739353.stable.out @@ -36,7 +36,7 @@ Operation successful | X_59 := algebra.subselect(r1_12,2:sht,2:sht,true,true,true); | | X_15 := sql.bind(X_2,"sys","_tables","type",1); | | X_60 := algebra.subselect(X_15,X_6,2:sht,2:sht,true,true,true); | -| X_17 := sql.subdelta(X_58,X_12,X_59,X_60); | +| X_17 := sql.subdelta(X_58,X_6,X_12,X_59,X_60); | | X_18 := sql.bind(X_2,"sys","_tables","name",0); | | (X_20,r1_28) := sql.bind(X_2,"sys","_tables","name",2); | | X_22 := sql.bind(X_2,"sys","_tables","name",1); | diff --git a/sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out b/sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out --- a/sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out +++ b/sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out @@ -60,7 +60,7 @@ Operation successful | X_65 := algebra.subselect(r1_12,2:sht,2:sht,true,true,true); | | X_15 := sql.bind(X_2,"sys","_tables","type",1); | | X_66 := algebra.subselect(X_15,X_6,2:sht,2:sht,true,true,true); | -| X_17 := sql.subdelta(X_64,X_12,X_65,X_66); | +| X_17 := sql.subdelta(X_64,X_6,X_12,X_65,X_66); | | X_18 := sql.bind(X_2,"sys","_tables","id",0); | | (X_20,r1_28) := sql.bind(X_2,"sys","_tables","id",2); | | X_22 := sql.bind(X_2,"sys","_tables","id",1); | _______________________________________________ checkin-list mailing list checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list