Changeset: f6971e8244d5 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f6971e8244d5 Modified Files: monetdb5/optimizer/opt_prelude.c monetdb5/optimizer/opt_prelude.h monetdb5/optimizer/opt_support.c sql/backends/monet5/rel_bin.c sql/backends/monet5/sql_gencode.c sql/benchmarks/ssbm/Tests/01-explain.stable.out.int128 sql/benchmarks/ssbm/Tests/02-explain.stable.out.int128 sql/benchmarks/ssbm/Tests/03-explain.stable.out.int128 sql/benchmarks/ssbm/Tests/04-explain.stable.out.int128 sql/benchmarks/ssbm/Tests/05-explain.stable.out.int128 sql/benchmarks/ssbm/Tests/06-explain.stable.out.int128 sql/benchmarks/ssbm/Tests/07-explain.stable.out.int128 sql/benchmarks/ssbm/Tests/08-explain.stable.out.int128 sql/benchmarks/ssbm/Tests/09-explain.stable.out.int128 sql/benchmarks/ssbm/Tests/10-explain.stable.out.int128 sql/benchmarks/ssbm/Tests/11-explain.stable.out.int128 sql/benchmarks/ssbm/Tests/12-explain.stable.out.int128 sql/benchmarks/ssbm/Tests/13-explain.stable.out.int128 sql/benchmarks/tpch/Tests/02-explain.stable.out sql/benchmarks/tpch/Tests/03-explain.stable.out.int128 sql/benchmarks/tpch/Tests/04-explain.stable.out sql/benchmarks/tpch/Tests/05-explain.stable.out.int128 sql/benchmarks/tpch/Tests/07-explain.stable.out.int128 sql/benchmarks/tpch/Tests/08-explain.stable.out.int128 sql/benchmarks/tpch/Tests/09-explain.stable.out.int128 sql/benchmarks/tpch/Tests/10-explain.stable.out.int128 sql/benchmarks/tpch/Tests/11-explain.stable.out.int128 sql/benchmarks/tpch/Tests/12-explain.stable.out.int128 sql/benchmarks/tpch/Tests/13-explain.stable.out sql/benchmarks/tpch/Tests/14-explain.stable.out.int128 sql/benchmarks/tpch/Tests/15-explain.stable.out.int128 sql/benchmarks/tpch/Tests/16-explain.stable.out sql/benchmarks/tpch/Tests/17-explain.stable.out.int128 sql/benchmarks/tpch/Tests/18-explain.stable.out.int128 sql/benchmarks/tpch/Tests/19-explain.stable.out.int128 sql/benchmarks/tpch/Tests/20-explain.stable.out.int128 sql/benchmarks/tpch/Tests/21-explain.stable.out sql/benchmarks/tpch/Tests/22-explain.stable.out.int128 Branch: default Log Message:
fixed typo (ie properly pass 'nil' == 'nil' semantics, fixes old bug 3040 (null except null) properly find sub*joins (now including theta,band,anti and range joins) diffs (truncated from 3305 to 300 lines): diff --git a/monetdb5/optimizer/opt_prelude.c b/monetdb5/optimizer/opt_prelude.c --- a/monetdb5/optimizer/opt_prelude.c +++ b/monetdb5/optimizer/opt_prelude.c @@ -121,6 +121,7 @@ str thetajoinRef; str subjoinRef; str subantijoinRef; str subbandjoinRef; +str subrangejoinRef; str subthetajoinRef; str kdifferenceRef; str kunionRef; @@ -373,6 +374,7 @@ void optimizerInit(void) subjoinRef = putName("subjoin",7); subantijoinRef = putName("subantijoin",11); subbandjoinRef = putName("subbandjoin",11); + subrangejoinRef = putName("subrangejoin",12); subthetajoinRef = putName("subthetajoin",12); jsonRef = putName("json",4); kdifferenceRef= putName("kdifference",11); diff --git a/monetdb5/optimizer/opt_prelude.h b/monetdb5/optimizer/opt_prelude.h --- a/monetdb5/optimizer/opt_prelude.h +++ b/monetdb5/optimizer/opt_prelude.h @@ -119,6 +119,7 @@ opt_export str thetajoinRef; opt_export str subjoinRef; opt_export str subantijoinRef; opt_export str subbandjoinRef; +opt_export str subrangejoinRef; opt_export str subthetajoinRef; opt_export str kdifferenceRef; opt_export str kunionRef; diff --git a/monetdb5/optimizer/opt_support.c b/monetdb5/optimizer/opt_support.c --- a/monetdb5/optimizer/opt_support.c +++ b/monetdb5/optimizer/opt_support.c @@ -878,14 +878,12 @@ int isDiffOp(InstrPtr p){ int isMatJoinOp(InstrPtr p){ return (getModuleId(p) == algebraRef && (getFunctionId(p) == crossRef || + getFunctionId(p) == joinRef || getFunctionId(p) == subjoinRef || - getFunctionId(p) == joinRef || - getFunctionId(p) == antijoinRef || /* is not mat save */ getFunctionId(p) == subantijoinRef || /* is not mat save */ - getFunctionId(p) == thetajoinRef || getFunctionId(p) == subthetajoinRef || - getFunctionId(p) == bandjoinRef || - getFunctionId(p) == subbandjoinRef) + getFunctionId(p) == subbandjoinRef || + getFunctionId(p) == subrangejoinRef) ); } diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c --- a/sql/backends/monet5/rel_bin.c +++ b/sql/backends/monet5/rel_bin.c @@ -1996,7 +1996,7 @@ rel2bin_except( mvc *sql, sql_rel *rel, /* now find the matching groups */ - /* TODO change to leftjoin semantics to keep those in A not in B */ + /* TODO change to left outer join semantics to keep those in A not in B */ /* would need outerjoin eqjoin and outer project code, cleans up following mess */ for (n = left->op4.lval->h, m = right->op4.lval->h; n && m; n = n->next, m = m->next) { stmt *l = column(sql->sa, n->data); 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 @@ -1253,10 +1253,10 @@ static int return -1; k = getDestVar(q); } else { - char *cmd = "subselect"; + char *cmd = subselectRef; if (s->flag != cmp_equal && s->flag != cmp_notequal) - cmd = "thetasubselect"; + cmd = thetasubselectRef; if (get_cmp(s) == cmp_filter) { node *n; @@ -1304,7 +1304,7 @@ static int switch (s->flag) { case cmp_equal:{ - q = newStmt1(mb, algebraRef, cmd); + q = newStmt2(mb, algebraRef, cmd); q = pushArgument(mb, q, l); if (sub > 0) q = pushArgument(mb, q, sub); @@ -1318,7 +1318,7 @@ static int break; } case cmp_notequal:{ - q = newStmt1(mb, algebraRef, cmd); + q = newStmt2(mb, algebraRef, cmd); q = pushArgument(mb, q, l); if (sub > 0) q = pushArgument(mb, q, sub); @@ -1332,7 +1332,7 @@ static int break; } case cmp_lt: - q = newStmt1(mb, algebraRef, cmd); + q = newStmt2(mb, algebraRef, cmd); q = pushArgument(mb, q, l); if (sub > 0) q = pushArgument(mb, q, sub); @@ -1342,7 +1342,7 @@ static int return -1; break; case cmp_lte: - q = newStmt1(mb, algebraRef, cmd); + q = newStmt2(mb, algebraRef, cmd); q = pushArgument(mb, q, l); if (sub > 0) q = pushArgument(mb, q, sub); @@ -1352,7 +1352,7 @@ static int return -1; break; case cmp_gt: - q = newStmt1(mb, algebraRef, cmd); + q = newStmt2(mb, algebraRef, cmd); q = pushArgument(mb, q, l); if (sub > 0) q = pushArgument(mb, q, sub); @@ -1362,7 +1362,7 @@ static int return -1; break; case cmp_gte: - q = newStmt1(mb, algebraRef, cmd); + q = newStmt2(mb, algebraRef, cmd); q = pushArgument(mb, q, l); if (sub > 0) q = pushArgument(mb, q, sub); @@ -1389,7 +1389,7 @@ static int int r1 = -1, r2 = -1, rs = 0; bit anti = (s->flag & ANTI) ? TRUE : FALSE; bit swapped = (s->flag & SWAPPED) ? TRUE : FALSE; - char *cmd = (s->type == st_uselect2) ? "subselect" : "subrangejoin"; + char *cmd = (s->type == st_uselect2) ? subselectRef : subrangejoinRef; int sub = -1; if (l < 0) @@ -1476,7 +1476,7 @@ static int if ((r2 = _dumpstmt(sql, mb, s->op3)) < 0) return -1; } - q = newStmt1(mb, algebraRef, cmd); + q = newStmt2(mb, algebraRef, cmd); if (s->type == st_join2) q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any)); q = pushArgument(mb, q, l); @@ -1641,7 +1641,7 @@ static int q = pushArgument(mb, q, r); q = pushNil(mb, q, TYPE_bat); q = pushNil(mb, q, TYPE_bat); - q = pushBit(mb, q, TRUE); + q = pushBit(mb, q, FALSE); q = pushNil(mb, q, TYPE_lng); if (q == NULL) return -1; @@ -1653,7 +1653,7 @@ static int q = pushArgument(mb, q, r); q = pushNil(mb, q, TYPE_bat); q = pushNil(mb, q, TYPE_bat); - q = pushBit(mb, q, FALSE); + q = pushBit(mb, q, TRUE); q = pushNil(mb, q, TYPE_lng); if (q == NULL) return -1; diff --git a/sql/benchmarks/ssbm/Tests/01-explain.stable.out.int128 b/sql/benchmarks/ssbm/Tests/01-explain.stable.out.int128 --- a/sql/benchmarks/ssbm/Tests/01-explain.stable.out.int128 +++ b/sql/benchmarks/ssbm/Tests/01-explain.stable.out.int128 @@ -67,7 +67,7 @@ function user.s2_1{autoCommit=true}(A0:i X_103 := algebra.subselect(X_42,X_33,A0,A0,true,true,false); X_44 := sql.subdelta(X_100,X_33,X_39,X_101,X_103); X_46 := X_44; - (X_47,r1_59) := algebra.subjoin(X_32,X_46,nil:BAT,nil:BAT,true,nil:lng); + (X_47,r1_59) := algebra.subjoin(X_32,X_46,nil:BAT,nil:BAT,false,nil:lng); X_51:bat[:oid,:int] := sql.bind(X_6,"sys","lineorder","lo_extendedprice",0); (X_54,r1_66) := sql.bind(X_6,"sys","lineorder","lo_extendedprice",2); X_56:bat[:oid,:int] := sql.bind(X_6,"sys","lineorder","lo_extendedprice",1); diff --git a/sql/benchmarks/ssbm/Tests/02-explain.stable.out.int128 b/sql/benchmarks/ssbm/Tests/02-explain.stable.out.int128 --- a/sql/benchmarks/ssbm/Tests/02-explain.stable.out.int128 +++ b/sql/benchmarks/ssbm/Tests/02-explain.stable.out.int128 @@ -67,7 +67,7 @@ function user.s2_1{autoCommit=true}(A0:i X_103 := algebra.subselect(X_42,X_33,A0,A0,true,true,false); X_44 := sql.subdelta(X_100,X_33,X_39,X_101,X_103); X_46 := X_44; - (X_47,r1_60) := algebra.subjoin(X_32,X_46,nil:BAT,nil:BAT,true,nil:lng); + (X_47,r1_60) := algebra.subjoin(X_32,X_46,nil:BAT,nil:BAT,false,nil:lng); X_51:bat[:oid,:int] := sql.bind(X_7,"sys","lineorder","lo_extendedprice",0); (X_54,r1_67) := sql.bind(X_7,"sys","lineorder","lo_extendedprice",2); X_56:bat[:oid,:int] := sql.bind(X_7,"sys","lineorder","lo_extendedprice",1); diff --git a/sql/benchmarks/ssbm/Tests/03-explain.stable.out.int128 b/sql/benchmarks/ssbm/Tests/03-explain.stable.out.int128 --- a/sql/benchmarks/ssbm/Tests/03-explain.stable.out.int128 +++ b/sql/benchmarks/ssbm/Tests/03-explain.stable.out.int128 @@ -74,7 +74,7 @@ function user.s2_1{autoCommit=true}(A0:i X_118 := algebra.subselect(X_43,X_50,A0,A0,true,true,false); X_53 := sql.subdelta(X_115,X_50,X_40,X_116,X_118); X_54 := X_53; - (X_55,r1_71) := algebra.subjoin(X_33,X_54,nil:BAT,nil:BAT,true,nil:lng); + (X_55,r1_71) := algebra.subjoin(X_33,X_54,nil:BAT,nil:BAT,false,nil:lng); X_59:bat[:oid,:int] := sql.bind(X_8,"sys","lineorder","lo_extendedprice",0); (X_62,r1_78) := sql.bind(X_8,"sys","lineorder","lo_extendedprice",2); X_65:bat[:oid,:int] := sql.bind(X_8,"sys","lineorder","lo_extendedprice",1); diff --git a/sql/benchmarks/ssbm/Tests/04-explain.stable.out.int128 b/sql/benchmarks/ssbm/Tests/04-explain.stable.out.int128 --- a/sql/benchmarks/ssbm/Tests/04-explain.stable.out.int128 +++ b/sql/benchmarks/ssbm/Tests/04-explain.stable.out.int128 @@ -49,14 +49,14 @@ function user.s2_1{autoCommit=true}(A0:s X_16 := sql.projectdelta(X_5,X_8,X_11,r1_11,X_14); X_19:bat[:oid,:str] := sql.bind(X_4,"sys","part","p_category",0); X_17:bat[:oid,:oid] := sql.tid(X_4,"sys","part"); - X_165 := algebra.subselect(X_19,X_17,A0,A0,true,true,false); + X_166 := algebra.subselect(X_19,X_17,A0,A0,true,true,false); (X_21,r1_22) := sql.bind(X_4,"sys","part","p_category",2); - X_166 := algebra.subselect(r1_22,nil:bat[:oid,:oid],A0,A0,true,true,false); + X_167 := algebra.subselect(r1_22,nil:bat[:oid,:oid],A0,A0,true,true,false); X_23:bat[:oid,:str] := sql.bind(X_4,"sys","part","p_category",1); - X_168 := algebra.subselect(X_23,X_17,A0,A0,true,true,false); - X_24 := sql.subdelta(X_165,X_17,X_21,X_166,X_168); + X_169 := algebra.subselect(X_23,X_17,A0,A0,true,true,false); + X_24 := sql.subdelta(X_166,X_17,X_21,X_167,X_169); X_26 := X_24; - (X_27,r1_31) := algebra.subjoin(X_16,X_26,nil:BAT,nil:BAT,true,nil:lng); + (X_27,r1_31) := algebra.subjoin(X_16,X_26,nil:BAT,nil:BAT,false,nil:lng); X_31:bat[:oid,:oid] := sql.bind_idxbat(X_4,"sys","lineorder","lineorder_lo_suppkey_fkey",0); (X_33,r1_37) := sql.bind_idxbat(X_4,"sys","lineorder","lineorder_lo_suppkey_fkey",2); X_37:bat[:oid,:oid] := sql.bind_idxbat(X_4,"sys","lineorder","lineorder_lo_suppkey_fkey",1); @@ -64,54 +64,54 @@ function user.s2_1{autoCommit=true}(A0:s X_39 := algebra.leftfetchjoin(X_27,X_38); X_42:bat[:oid,:str] := sql.bind(X_4,"sys","supplier","s_region",0); X_40:bat[:oid,:oid] := sql.tid(X_4,"sys","supplier"); - X_169 := algebra.subselect(X_42,X_40,A1,A1,true,true,false); + X_170 := algebra.subselect(X_42,X_40,A1,A1,true,true,false); (X_45,r1_50) := sql.bind(X_4,"sys","supplier","s_region",2); - X_170 := algebra.subselect(r1_50,nil:bat[:oid,:oid],A1,A1,true,true,false); + X_171 := algebra.subselect(r1_50,nil:bat[:oid,:oid],A1,A1,true,true,false); X_48:bat[:oid,:str] := sql.bind(X_4,"sys","supplier","s_region",1); - X_172 := algebra.subselect(X_48,X_40,A1,A1,true,true,false); - X_50 := sql.subdelta(X_169,X_40,X_45,X_170,X_172); + X_173 := algebra.subselect(X_48,X_40,A1,A1,true,true,false); + X_50 := sql.subdelta(X_170,X_40,X_45,X_171,X_173); X_52 := X_50; - (X_53,r1_61) := algebra.subjoin(X_39,X_52,nil:BAT,nil:BAT,true,nil:lng); - X_173 := algebra.leftfetchjoin(X_53,X_27); - X_55:bat[:oid,:oid] := sql.bind_idxbat(X_4,"sys","lineorder","lineorder_lo_orderdate_fkey",0); - (X_57,r1_65) := sql.bind_idxbat(X_4,"sys","lineorder","lineorder_lo_orderdate_fkey",2); - X_59:bat[:oid,:oid] := sql.bind_idxbat(X_4,"sys","lineorder","lineorder_lo_orderdate_fkey",1); - X_60 := sql.projectdelta(X_5,X_55,X_57,r1_65,X_59); - X_61:bat[:oid,:oid] := algebra.leftfetchjoin(X_173,X_60); - X_62:bat[:oid,:oid] := sql.tid(X_4,"sys","dwdate"); - (X_65,r1_75) := algebra.subjoin(X_61,X_62,nil:BAT,nil:BAT,true,nil:lng); - X_174 := algebra.leftfetchjoin(X_65,X_53); - X_69:bat[:oid,:str] := sql.bind(X_4,"sys","part","p_brand1",0); - (X_73,r1_83) := sql.bind(X_4,"sys","part","p_brand1",2); - X_76:bat[:oid,:str] := sql.bind(X_4,"sys","part","p_brand1",1); - X_78 := sql.projectdelta(X_24,X_69,X_73,r1_83,X_76); - X_79:bat[:oid,:str] := algebra.leftfetchjoinPath(X_174,r1_31,X_78); - X_80:bat[:oid,:int] := sql.bind(X_4,"sys","dwdate","d_year",0); - (X_82,r1_96) := sql.bind(X_4,"sys","dwdate","d_year",2); - X_84:bat[:oid,:int] := sql.bind(X_4,"sys","dwdate","d_year",1); - X_85 := sql.projectdelta(X_62,X_80,X_82,r1_96,X_84); - X_86 := algebra.leftfetchjoin(r1_75,X_85); - (X_87,r1_102,r2_102) := group.subgroup(X_86); - (X_90,r1_105,r2_105) := group.subgroupdone(X_79,X_87); - X_93 := algebra.leftfetchjoin(r1_105,X_79); - X_94 := algebra.leftfetchjoin(r1_105,X_86); - X_102:bat[:oid,:int] := sql.bind(X_4,"sys","lineorder","lo_revenue",0); - (X_107,r1_122) := sql.bind(X_4,"sys","lineorder","lo_revenue",2); - X_110:bat[:oid,:int] := sql.bind(X_4,"sys","lineorder","lo_revenue",1); - X_112 := sql.projectdelta(X_5,X_102,X_107,r1_122,X_110); - X_113:bat[:oid,:int] := algebra.leftfetchjoinPath(X_174,X_27,X_112); - X_114:bat[:oid,:hge] := aggr.subsum(X_113,X_90,r1_105,true,true); - (X_95,r1_110,r2_110) := algebra.subsort(X_94,false,false); - (X_99,r1_114,r2_114) := algebra.subsort(X_93,r1_110,r2_110,false,false); - X_116 := algebra.leftfetchjoin(r1_114,X_114); - X_118 := algebra.leftfetchjoin(r1_114,X_93); - X_117 := algebra.leftfetchjoin(r1_114,X_94); - X_119 := sql.resultSet(3,1,X_116); - sql.rsColumn(X_119,"sys.L1","L1","hugeint",32,0,X_116); - sql.rsColumn(X_119,"sys.dwdate","d_year","int",32,0,X_117); - sql.rsColumn(X_119,"sys.part","p_brand1","clob",0,0,X_118); - X_134 := io.stdout(); - sql.exportResult(X_134,X_119); + (X_53,r1_61) := algebra.subjoin(X_39,X_52,nil:BAT,nil:BAT,false,nil:lng); + X_174 := algebra.leftfetchjoin(X_53,X_27); + X_56:bat[:oid,:oid] := sql.bind_idxbat(X_4,"sys","lineorder","lineorder_lo_orderdate_fkey",0); + (X_58,r1_66) := sql.bind_idxbat(X_4,"sys","lineorder","lineorder_lo_orderdate_fkey",2); + X_60:bat[:oid,:oid] := sql.bind_idxbat(X_4,"sys","lineorder","lineorder_lo_orderdate_fkey",1); + X_61 := sql.projectdelta(X_5,X_56,X_58,r1_66,X_60); + X_62:bat[:oid,:oid] := algebra.leftfetchjoin(X_174,X_61); + X_63:bat[:oid,:oid] := sql.tid(X_4,"sys","dwdate"); + (X_66,r1_76) := algebra.subjoin(X_62,X_63,nil:BAT,nil:BAT,false,nil:lng); + X_175 := algebra.leftfetchjoin(X_66,X_53); + X_70:bat[:oid,:str] := sql.bind(X_4,"sys","part","p_brand1",0); + (X_74,r1_84) := sql.bind(X_4,"sys","part","p_brand1",2); + X_77:bat[:oid,:str] := sql.bind(X_4,"sys","part","p_brand1",1); + X_79 := sql.projectdelta(X_24,X_70,X_74,r1_84,X_77); + X_80:bat[:oid,:str] := algebra.leftfetchjoinPath(X_175,r1_31,X_79); + X_81:bat[:oid,:int] := sql.bind(X_4,"sys","dwdate","d_year",0); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list