Changeset: 4592f95b53ff for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4592f95b53ff Modified Files: sql/backends/monet5/rel_bin.c sql/backends/monet5/sql_gencode.c sql/backends/monet5/sql_statement.h sql/benchmarks/tpch/Tests/02-explain.stable.out sql/benchmarks/tpch/Tests/03-explain.stable.out sql/benchmarks/tpch/Tests/10-explain.stable.out sql/benchmarks/tpch/Tests/18-explain.stable.out sql/benchmarks/tpch/Tests/21-explain.stable.out sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out Branch: Oct2014 Log Message:
properly call firstn with distinct True (only when realy needed) diffs (truncated from 341 to 300 lines): 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 @@ -2286,13 +2286,13 @@ rel2bin_project( mvc *sql, sql_rel *rel, */ if (topn && rel->r) { list *oexps = rel->r, *npl = sa_list(sql->sa); - /* distinct, topn returns atleast N (unique) */ + /* distinct, topn returns atleast N (unique groups) */ int distinct = need_distinct(rel); stmt *limit = NULL, *lpiv = NULL, *lgid = NULL; for (n=oexps->h; n; n = n->next) { sql_exp *orderbycole = n->data; - int inc = distinct || n->next; + int last = (n->next == NULL); stmt *orderbycolstmt = exp_bin(sql, orderbycole, sub, psub, NULL, NULL, NULL, NULL); @@ -2300,21 +2300,20 @@ rel2bin_project( mvc *sql, sql_rel *rel, return NULL; if (!limit) { /* topn based on a single column */ - limit = stmt_limit(sql->sa, orderbycolstmt, stmt_atom_wrd(sql->sa, 0), l, LIMIT_DIRECTION(is_ascending(orderbycole), 1, inc)); + limit = stmt_limit(sql->sa, orderbycolstmt, stmt_atom_wrd(sql->sa, 0), l, LIMIT_FLAG(distinct, is_ascending(orderbycole), last, 1)); } else { /* topn based on 2 columns */ - limit = stmt_limit2(sql->sa, orderbycolstmt, lpiv, lgid, stmt_atom_wrd(sql->sa, 0), l, LIMIT_DIRECTION(is_ascending(orderbycole), 1, inc)); + limit = stmt_limit2(sql->sa, orderbycolstmt, lpiv, lgid, stmt_atom_wrd(sql->sa, 0), l, LIMIT_FLAG(distinct, is_ascending(orderbycole), last, 1)); } if (!limit) return NULL; - lpiv = stmt_result(sql->sa, limit, 0); - lgid = stmt_result(sql->sa, limit, 1); + lpiv = limit; + if (!last) { + lpiv = stmt_result(sql->sa, limit, 0); + lgid = stmt_result(sql->sa, limit, 1); + } } - if (!distinct) /* ready to project */ - limit = lpiv; - else /* TODO */ - limit = lpiv; - + limit = lpiv; for ( n=pl->h ; n; n = n->next) list_append(npl, stmt_project(sql->sa, limit, column(sql->sa, n->data))); psub = stmt_list(sql->sa, npl); @@ -2584,7 +2583,7 @@ rel2bin_topn( mvc *sql, sql_rel *rel, li o = stmt_atom_wrd(sql->sa, 0); sc = column(sql->sa, sc); - limit = stmt_limit(sql->sa, stmt_alias(sql->sa, sc, tname, cname), o, l, LIMIT_DIRECTION(0,0,0)); + limit = stmt_limit(sql->sa, stmt_alias(sql->sa, sc, tname, cname), o, l, LIMIT_FLAG(0,0,0,0)); for ( ; n; n = n->next) { stmt *sc = 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 @@ -1018,9 +1018,10 @@ static int c = k; } if (s->flag&1) { - int topn = 0, flag = s->flag, grps = flag & 2; - - flag >>= 2; + int topn = 0, flag = s->flag; + int last = (flag & 2); + int dir = (flag & 4); + int distinct = (flag & 8); q = newStmt1(mb, calcRef, "+"); q = pushArgument(mb, q, offset); @@ -1030,7 +1031,7 @@ static int topn = getDestVar(q); q = newStmt(mb, algebraRef, firstnRef); - if (grps) /* we need the groups for the next firstn */ + if (!last) /* we need the groups for the next firstn */ q = pushReturn(mb, q, newTmpVariable(mb, TYPE_any)); q = pushArgument(mb, q, c); if (p) @@ -1038,13 +1039,14 @@ static int if (g) q = pushArgument(mb, q, g); q = pushArgument(mb, q, topn); - q = pushBit(mb, q, flag != 0); -/* TODO: pass "distinct" flag somehow */ q = pushBit(mb, q, 1); + q = pushBit(mb, q, dir != 0); + q = pushBit(mb, q, distinct?1:0); if (q == NULL) return -1; s->nr = getArg(q, 0); - renameVariable(mb, getArg(q, 1), "r1_%d", s->nr); + if (!last) + renameVariable(mb, getArg(q, 1), "r1_%d", s->nr); l = getDestVar(q); } else { q = newStmt1(mb, calcRef, "+"); diff --git a/sql/backends/monet5/sql_statement.h b/sql/backends/monet5/sql_statement.h --- a/sql/backends/monet5/sql_statement.h +++ b/sql/backends/monet5/sql_statement.h @@ -225,11 +225,14 @@ extern stmt *stmt_reverse(sql_allocator extern stmt *stmt_mirror(sql_allocator *sa, stmt *s); extern stmt *stmt_result(sql_allocator *sa, stmt *s, int nr); -/* dir: direction of the ordering, ie 1 Ascending, 0 decending - * order: is order important or not (topn vs slice) - * before_project(or distinct): intermediate step (or after this distinct is still needed) or last step (ie and no distinct) */ -#define LIMIT_DIRECTION(dir,order,before_project) \ - (dir<<2)+(before_project<<1)+(order) +/* + * distinct: compute topn on unique groups + * dir: direction of the ordering, ie 1 Ascending, 0 decending + * last: intermediate step or last step + * order: is order important or not (firstn vs slice) + */ +#define LIMIT_FLAG(distinct,dir,last,order) \ + ((distinct<<3)+(dir<<2)+(last<<1)+(order)) extern stmt *stmt_limit(sql_allocator *sa, stmt *s, stmt *offset, stmt *limit, int direction); extern stmt *stmt_limit2(sql_allocator *sa, stmt *s, stmt *piv, stmt *gid, stmt *offset, stmt *limit, int direction); extern stmt *stmt_sample(sql_allocator *sa, stmt *s, stmt *sample); diff --git a/sql/benchmarks/tpch/Tests/02-explain.stable.out b/sql/benchmarks/tpch/Tests/02-explain.stable.out --- a/sql/benchmarks/tpch/Tests/02-explain.stable.out +++ b/sql/benchmarks/tpch/Tests/02-explain.stable.out @@ -163,7 +163,7 @@ function user.s2_1{autoCommit=true}(A0:i X_157:bat[:oid,:bit] := batcalc.==(X_153,X_155); X_158 := algebra.subselect(X_157,true,true,true,true,false); X_351 := algebra.leftfetchjoin(X_158,r1_183); - r1_287:bat[:oid,:int] := algebra.leftfetchjoinPath(X_351,r1_177,X_134); + X_160:bat[:oid,:int] := algebra.leftfetchjoinPath(X_351,r1_177,X_134); X_161 := sql.bind(X_6,"sys","supplier","s_name",0); (X_166,r1_227) := sql.bind(X_6,"sys","supplier","s_name",2); X_169 := sql.bind(X_6,"sys","supplier","s_name",1); @@ -179,15 +179,15 @@ function user.s2_1{autoCommit=true}(A0:i X_187 := sql.bind(X_6,"sys","supplier","s_acctbal",1); X_188 := sql.projectdelta(X_32,X_181,X_183,r1_255,X_187); X_189:bat[:oid,:lng] := algebra.leftfetchjoinPath(X_351,r1_177,X_125,X_101,r1_122,X_188); - (X_190,r1_273) := algebra.firstn(X_189,100:wrd,false,true); - (X_194,r1_279) := algebra.firstn(X_180,X_190,r1_273,100:wrd,true,true); - (X_196,r1_283) := algebra.firstn(X_172,X_194,r1_279,100:wrd,true,true); - X_198 := algebra.firstn(r1_287,X_196,r1_283,100:wrd,true,true); + (X_190,r1_273) := algebra.firstn(X_189,100:wrd,false,false); + (X_193,r1_278) := algebra.firstn(X_180,X_190,r1_273,100:wrd,true,false); + (X_196,r1_283) := algebra.firstn(X_172,X_193,r1_278,100:wrd,true,false); + X_198 := algebra.firstn(X_160,X_196,r1_283,100:wrd,true,false); X_223 := sql.bind(X_6,"sys","part","p_mfgr",0); (X_228,r1_325) := sql.bind(X_6,"sys","part","p_mfgr",2); X_231 := sql.bind(X_6,"sys","part","p_mfgr",1); X_232 := sql.projectdelta(X_90,X_223,X_228,r1_325,X_231); - X_199 := algebra.leftfetchjoin(X_198,r1_287); + X_199 := algebra.leftfetchjoin(X_198,X_160); X_200 := algebra.leftfetchjoin(X_198,X_172); X_201 := algebra.leftfetchjoin(X_198,X_180); X_202 := algebra.leftfetchjoin(X_198,X_189); diff --git a/sql/benchmarks/tpch/Tests/03-explain.stable.out b/sql/benchmarks/tpch/Tests/03-explain.stable.out --- a/sql/benchmarks/tpch/Tests/03-explain.stable.out +++ b/sql/benchmarks/tpch/Tests/03-explain.stable.out @@ -108,7 +108,7 @@ function user.s2_1{autoCommit=true}(A0:b (X_84,r1_103,r2_103) := group.subgroup(X_83); (X_87,r1_106,r2_106) := group.subgroup(X_72,X_84); (X_90,r1_109,r2_109) := group.subgroupdone(X_63,X_87); - r1_156 := algebra.leftfetchjoin(r1_109,X_63); + X_93 := algebra.leftfetchjoin(r1_109,X_63); X_94 := sql.bind(X_6,"sys","lineitem","l_extendedprice",0); (X_96,r1_115) := sql.bind(X_6,"sys","lineitem","l_extendedprice",2); X_99 := sql.bind(X_6,"sys","lineitem","l_extendedprice",1); @@ -123,9 +123,9 @@ function user.s2_1{autoCommit=true}(A0:b X_115:bat[:oid,:lng] := batcalc.-(X_102,X_114); X_116:bat[:oid,:lng] := batcalc.*(X_101,X_115); X_117:bat[:oid,:lng] := aggr.subsum(X_116,X_90,r1_109,true,true); - (X_120,r1_151) := algebra.firstn(X_117,10:wrd,false,true); - X_123 := algebra.firstn(r1_156,X_120,r1_151,10:wrd,true,true); - X_124 := algebra.leftfetchjoin(X_123,r1_156); + (X_120,r1_151) := algebra.firstn(X_117,10:wrd,false,false); + X_123 := algebra.firstn(X_93,X_120,r1_151,10:wrd,true,false); + X_124 := algebra.leftfetchjoin(X_123,X_93); X_125 := algebra.leftfetchjoin(X_123,X_117); (X_126,r1_159,r2_159) := algebra.subsort(X_125,true,false); (X_129,r1_162,r2_162) := algebra.subsort(X_124,r1_159,r2_159,false,false); diff --git a/sql/benchmarks/tpch/Tests/10-explain.stable.out b/sql/benchmarks/tpch/Tests/10-explain.stable.out --- a/sql/benchmarks/tpch/Tests/10-explain.stable.out +++ b/sql/benchmarks/tpch/Tests/10-explain.stable.out @@ -130,9 +130,9 @@ function user.s2_1{autoCommit=true}(A0:b X_115:bat[:oid,:lng] := batcalc.*(X_101,X_114); X_116:bat[:oid,:lng] := aggr.subsum(X_115,X_87,r1_103,true,true); (X_91,r1_115) := algebra.join(X_90,X_82); - r1_160 := algebra.leftfetchjoin(X_91,X_116); - X_120 := algebra.firstn(r1_160,20:wrd,false,true); - X_122 := algebra.leftfetchjoin(X_120,r1_160); + X_118 := algebra.leftfetchjoin(X_91,X_116); + X_120 := algebra.firstn(X_118,20:wrd,false,false); + X_122 := algebra.leftfetchjoin(X_120,X_118); (X_123,r1_163,r2_163) := algebra.subsort(X_122,true,false); X_255 := algebra.leftfetchjoin(r1_163,X_120); X_126:bat[:oid,:int] := algebra.leftfetchjoinPath(X_255,X_91,X_90); diff --git a/sql/benchmarks/tpch/Tests/18-explain.stable.out b/sql/benchmarks/tpch/Tests/18-explain.stable.out --- a/sql/benchmarks/tpch/Tests/18-explain.stable.out +++ b/sql/benchmarks/tpch/Tests/18-explain.stable.out @@ -124,19 +124,19 @@ function user.s2_1{autoCommit=true}(A0:l (X_92,r1_121) := sql.bind(X_3,"sys","orders","o_orderdate",2); X_94 := sql.bind(X_3,"sys","orders","o_orderdate",1); X_95 := sql.delta(X_90,X_92,r1_121,X_94); - r1_150:bat[:oid,:date] := algebra.leftfetchjoin(X_211,X_95); + X_96:bat[:oid,:date] := algebra.leftfetchjoin(X_211,X_95); X_97 := sql.bind(X_3,"sys","orders","o_totalprice",0); (X_101,r1_131) := sql.bind(X_3,"sys","orders","o_totalprice",2); X_104 := sql.bind(X_3,"sys","orders","o_totalprice",1); X_106 := sql.delta(X_97,X_101,r1_131,X_104); X_107:bat[:oid,:lng] := algebra.leftfetchjoin(X_211,X_106); - (X_108,r1_144) := algebra.firstn(X_107,100:wrd,false,true); - X_112 := algebra.firstn(r1_150,X_108,r1_144,100:wrd,true,true); - X_113 := algebra.leftfetchjoin(X_112,r1_150); - X_114 := algebra.leftfetchjoin(X_112,X_107); + (X_108,r1_144) := algebra.firstn(X_107,100:wrd,false,false); + X_111 := algebra.firstn(X_96,X_108,r1_144,100:wrd,true,false); + X_113 := algebra.leftfetchjoin(X_111,X_96); + X_114 := algebra.leftfetchjoin(X_111,X_107); (X_115,r1_153,r2_153) := algebra.subsort(X_114,true,false); (X_118,r1_156,r2_156) := algebra.subsort(X_113,r1_153,r2_153,false,false); - X_212 := algebra.leftfetchjoin(r1_156,X_112); + X_212 := algebra.leftfetchjoin(r1_156,X_111); X_121 := sql.bind(X_3,"sys","customer","c_name",0); (X_124,r1_162) := sql.bind(X_3,"sys","customer","c_name",2); X_127 := sql.bind(X_3,"sys","customer","c_name",1); @@ -145,11 +145,11 @@ function user.s2_1{autoCommit=true}(A0:l X_132 := algebra.subslice(X_129,0:wrd,99:wrd); X_133 := algebra.leftfetchjoin(X_132,X_129); X_213 := algebra.leftfetchjoin(X_132,r1_156); - X_151:bat[:oid,:lng] := algebra.leftfetchjoinPath(X_213,X_112,X_88,X_84,X_149); + X_151:bat[:oid,:lng] := algebra.leftfetchjoinPath(X_213,X_111,X_88,X_84,X_149); X_137:bat[:oid,:lng] := algebra.leftfetchjoin(X_213,X_114); X_136:bat[:oid,:date] := algebra.leftfetchjoin(X_213,X_113); - X_135:bat[:oid,:int] := algebra.leftfetchjoinPath(X_213,X_112,X_88,X_86); - X_134:bat[:oid,:int] := algebra.leftfetchjoinPath(X_213,X_112,X_88,X_84,X_79); + X_135:bat[:oid,:int] := algebra.leftfetchjoinPath(X_213,X_111,X_88,X_86); + X_134:bat[:oid,:int] := algebra.leftfetchjoinPath(X_213,X_111,X_88,X_84,X_79); X_152 := sql.resultSet(6,1,X_133); sql.rsColumn(X_152,"sys.customer","c_name","varchar",25,0,X_133); sql.rsColumn(X_152,"sys.customer","c_custkey","int",32,0,X_134); diff --git a/sql/benchmarks/tpch/Tests/21-explain.stable.out b/sql/benchmarks/tpch/Tests/21-explain.stable.out --- a/sql/benchmarks/tpch/Tests/21-explain.stable.out +++ b/sql/benchmarks/tpch/Tests/21-explain.stable.out @@ -172,18 +172,18 @@ function user.s2_1{autoCommit=true}(A0:s X_179 := sql.delta(X_169,X_174,r1_224,X_177); X_180:bat[:oid,:str] := algebra.leftfetchjoinPath(X_168,X_258,r1_69,X_61,X_179); (X_181,r1_235,r2_235) := group.subgroupdone(X_180); - r1_249 := algebra.leftfetchjoin(r1_235,X_180); + X_184 := algebra.leftfetchjoin(r1_235,X_180); X_185:bat[:oid,:wrd] := aggr.subcount(X_181,X_181,r1_235,false); - (X_187,r1_245) := algebra.firstn(X_185,100:wrd,false,true); - X_189 := algebra.firstn(r1_249,X_187,r1_245,100:wrd,true,true); - X_191 := algebra.leftfetchjoin(X_189,r1_249); - X_192 := algebra.leftfetchjoin(X_189,X_185); - (X_193,r1_253,r2_253) := algebra.subsort(X_192,true,false); - (X_197,r1_257,r2_257) := algebra.subsort(X_191,r1_253,r2_253,false,false); - X_200 := algebra.leftfetchjoin(r1_257,X_191); + (X_187,r1_245) := algebra.firstn(X_185,100:wrd,false,false); + X_189 := algebra.firstn(X_184,X_187,r1_245,100:wrd,true,false); + X_192 := algebra.leftfetchjoin(X_189,X_184); + X_193 := algebra.leftfetchjoin(X_189,X_185); + (X_194,r1_254,r2_254) := algebra.subsort(X_193,true,false); + (X_197,r1_257,r2_257) := algebra.subsort(X_192,r1_254,r2_254,false,false); + X_200 := algebra.leftfetchjoin(r1_257,X_192); X_202 := algebra.subslice(X_200,0:wrd,99:wrd); X_203 := algebra.leftfetchjoin(X_202,X_200); - X_204:bat[:oid,:wrd] := algebra.leftfetchjoinPath(X_202,r1_257,X_192); + X_204:bat[:oid,:wrd] := algebra.leftfetchjoinPath(X_202,r1_257,X_193); X_205 := sql.resultSet(2,1,X_203); sql.rsColumn(X_205,"sys.supplier","s_name","varchar",25,0,X_203); sql.rsColumn(X_205,"sys.L1","numwait","wrd",64,0,X_204); diff --git a/sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out b/sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out --- a/sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out +++ b/sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out @@ -303,14 +303,14 @@ function user.s11_1{autoCommit=true}():v (X_9,r1_9) := sql.bind(X_2,"sys","oblo","a",2); X_12 := sql.bind(X_2,"sys","oblo","a",1); X_14 := sql.delta(X_6,X_9,r1_9,X_12); - r1_21 := algebra.leftfetchjoin(X_3,X_14); + X_15 := algebra.leftfetchjoin(X_3,X_14); X_16 := calc.wrd(0:wrd); X_18 := calc.wrd(2:wrd); X_20 := calc.+(X_16,X_18); - X_21 := algebra.firstn(r1_21,X_20,true,true); - X_22 := algebra.leftfetchjoin(X_21,r1_21); - (X_23,r1_23,r2_23) := algebra.subsort(X_22,false,false); - X_27 := algebra.leftfetchjoin(r1_23,X_22); + X_21 := algebra.firstn(X_15,X_20,true,false); + X_23 := algebra.leftfetchjoin(X_21,X_15); + (X_24,r1_24,r2_24) := algebra.subsort(X_23,false,false); + X_27 := algebra.leftfetchjoin(r1_24,X_23); X_28 := calc.wrd(0:wrd); X_29 := calc.wrd(2:wrd); X_30 := calc.+(X_28,X_29); @@ -335,16 +335,16 @@ function user.s12_1{autoCommit=true}():v (X_9,r1_9) := sql.bind(X_2,"sys","oblo","a",2); X_12 := sql.bind(X_2,"sys","oblo","a",1); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list