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
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list