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

Reply via email to