Changeset: add5b4ca1e6d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=add5b4ca1e6d
Removed Files:
        sql/test/analytics/Tests/analytics01.sql
Modified Files:
        sql/backends/monet5/sql_rank.c
        sql/test/BugTracker/Tests/rank_over.SF-1691098.test
        sql/test/Tests/rank.test
        sql/test/analytics/Tests/analytics01.test
Branch: default
Log Message:

Merged with Oct2020


diffs (truncated from 1253 to 300 lines):

diff --git a/sql/backends/monet5/sql_rank.c b/sql/backends/monet5/sql_rank.c
--- a/sql/backends/monet5/sql_rank.c
+++ b/sql/backends/monet5/sql_rank.c
@@ -315,9 +315,9 @@ SQLrank(Client cntxt, MalBlkPtr mb, MalS
                                        goto bailout;
                                }
                                np = (bit*)Tloc(p, 0);
-                               for(j=1,k=1; rp<end; k++, np++, rp++) {
+                               for(j=1; rp<end; np++, rp++) {
                                        if (*np)
-                                               j=k=1;
+                                               j=1;
                                        *rp = j;
                                }
                        }
@@ -334,11 +334,10 @@ SQLrank(Client cntxt, MalBlkPtr mb, MalS
                                        *rp = j;
                                }
                        } else { /* single value, ie no ordering */
-                               int icnt = (int) cnt;
-                               for(j=1; j<=icnt; j++, rp++)
-                                       *rp = j;
+                               for(; rp<end; rp++)
+                                       *rp = 1;
                                r->tsorted = true;
-                               r->tkey = true;
+                               r->trevsorted = true;
                        }
                }
                BATsetcount(r, cnt);
@@ -432,11 +431,10 @@ SQLdense_rank(Client cntxt, MalBlkPtr mb
                                        *rp = j;
                                }
                        } else { /* single value, ie no ordering */
-                               int icnt = (int) cnt;
-                               for(j=1; j<=icnt; j++, rp++)
-                                       *rp = j;
+                               for(; rp<end; rp++)
+                                       *rp = 1;
                                r->tsorted = true;
-                               r->tkey = true;
+                               r->trevsorted = true;
                        }
                }
                BATsetcount(r, cnt);
@@ -472,10 +470,10 @@ SQLpercent_rank(Client cntxt, MalBlkPtr 
        }
        (void)cntxt;
        if (isaBatType(getArgType(mb, pci, 1))) {
-               BUN cnt;
+               BUN ncnt, cnt;
                int j, k;
                dbl *rp, *end, cnt_cast;
-               bit *np, *no;
+               bit *np, *np2, *no, *no2;
 
                res = getArgReference_bat(stk, pci, 0);
                if (!(b = BATdescriptor(*getArgReference_bat(stk, pci, 1)))) {
@@ -489,7 +487,6 @@ SQLpercent_rank(Client cntxt, MalBlkPtr 
                r->tsorted = r->trevsorted = BATcount(b) <= 1;
 
                cnt = BATcount(b);
-               cnt_cast = (dbl) (cnt - 1);
                rp = (dbl*)Tloc(r, 0);
                end = rp + cnt;
                if (isaBatType(getArgType(mb, pci, 2))) {
@@ -499,25 +496,46 @@ SQLpercent_rank(Client cntxt, MalBlkPtr 
                                        goto bailout;
                                }
                                np = (bit*)Tloc(p, 0);
-                               no = (bit*)Tloc(o, 0);
-                               for(j=0,k=0; rp<end; k++, np++, no++, rp++) {
-                                       if (*np)
-                                               j=k=0;
-                                       if (*no)
-                                               j=k;
-                                       *rp = j / cnt_cast;
+                               np2 = np + BATcount(p);
+                               no2 = no = (bit*)Tloc(o, 0);
+
+                               for (; np<np2; np++, no++) {
+                                       if (*np) {
+                                               ncnt = no - no2;
+                                               if (ncnt == 1) {
+                                                       for (; no2<no; no2++, 
rp++)
+                                                               *rp = 0.0;
+                                               } else {
+                                                       cnt_cast = (dbl) (ncnt 
- 1);
+                                                       j = 0;
+                                                       k = 0;
+                                                       for (; no2<no; k++, 
no2++, rp++) {
+                                                               if (*no2)
+                                                                       j=k;
+                                                               *rp = j / 
cnt_cast;
+                                                       }
+                                               }
+                                       }
+                               }
+                               ncnt = no - no2;
+                               if (ncnt == 1) {
+                                       for (; no2<no; no2++, rp++)
+                                               *rp = 0.0;
+                               } else {
+                                       cnt_cast = (dbl) (ncnt - 1);
+                                       j = 0;
+                                       k = 0;
+                                       for (; no2<no; k++, no2++, rp++) {
+                                               if (*no2)
+                                                       j=k;
+                                               *rp = j / cnt_cast;
+                                       }
                                }
                        } else { /* single value, ie no ordering */
-                               if (!(p = 
BATdescriptor(*getArgReference_bat(stk, pci, 2)))) {
-                                       msg = createException(SQL, 
"sql.percent_rank", SQLSTATE(HY005) "Cannot access column descriptor");
-                                       goto bailout;
-                               }
-                               np = (bit*)Tloc(p, 0);
-                               for(j=0; rp<end; np++, rp++) {
-                                       if (*np)
-                                               j=0;
-                                       *rp = j / cnt_cast;
-                               }
+                               for(; rp<end; rp++)
+                                       *rp = 0.0;
+                               r->tsorted = true;
+                               r->trevsorted = true;
                        }
                } else { /* single value, ie no partitions */
                        if (isaBatType(getArgType(mb, pci, 3))) {
@@ -526,14 +544,23 @@ SQLpercent_rank(Client cntxt, MalBlkPtr 
                                        goto bailout;
                                }
                                no = (bit*)Tloc(o, 0);
-                               for(j=0,k=0; rp<end; k++, no++, rp++) {
-                                       if (*no)
-                                               j=k;
-                                       *rp = j / cnt_cast;
+
+                               if (cnt == 1) {
+                                       for (; rp<end; rp++)
+                                               *rp = 0.0;
+                                       r->tsorted = true;
+                                       r->trevsorted = true;
+                               } else {
+                                       cnt_cast = (dbl) (cnt - 1);
+                                       for(j=0,k=0; rp<end; k++, no++, rp++) {
+                                               if (*no)
+                                                       j=k;
+                                               *rp = j / cnt_cast;
+                                       }
                                }
-                       } else { /* single value, ie no ordering - the outcome 
will always be 0 */
+                       } else { /* single value, ie no ordering */
                                for(; rp<end; rp++)
-                                       *rp = 0;
+                                       *rp = 0.0;
                                r->tsorted = true;
                                r->trevsorted = true;
                        }
@@ -544,7 +571,7 @@ SQLpercent_rank(Client cntxt, MalBlkPtr 
        } else {
                dbl *res = getArgReference_dbl(stk, pci, 0);
 
-               *res = 1;
+               *res = 0.0;
        }
 
 bailout:
@@ -611,7 +638,7 @@ SQLcume_dist(Client cntxt, MalBlkPtr mb,
                                                        }
                                                }
                                                for (; bo1 < bo2; bo1++, rb++)
-                                                       *rb = 1;
+                                                       *rb = 1.0;
                                        }
                                }
                                j = 0;
@@ -626,11 +653,11 @@ SQLcume_dist(Client cntxt, MalBlkPtr mb,
                                        }
                                }
                                for (; bo1 < bo2; bo1++, rb++)
-                                       *rb = 1;
+                                       *rb = 1.0;
                        } else { /* single value, ie no ordering */
                                rp = rb + BATcount(b);
                                for (; rb<rp; rb++)
-                                       *rb = 1;
+                                       *rb = 1.0;
                                r->tsorted = true;
                                r->trevsorted = true;
                        }
@@ -652,11 +679,11 @@ SQLcume_dist(Client cntxt, MalBlkPtr mb,
                                        }
                                }
                                for (; bo1 < bo2; bo1++, rb++)
-                                       *rb = 1;
+                                       *rb = 1.0;
                        } else { /* single value, ie no ordering */
                                rp = rb + BATcount(b);
                                for (; rb<rp; rb++)
-                                       *rb = 1;
+                                       *rb = 1.0;
                                r->tsorted = true;
                                r->trevsorted = true;
                        }
@@ -667,7 +694,7 @@ SQLcume_dist(Client cntxt, MalBlkPtr mb,
        } else {
                dbl *res = getArgReference_dbl(stk, pci, 0);
 
-               *res = 1;
+               *res = 1.0;
        }
 
 bailout:
diff --git a/sql/test/BugTracker/Tests/rank_over.SF-1691098.test 
b/sql/test/BugTracker/Tests/rank_over.SF-1691098.test
--- a/sql/test/BugTracker/Tests/rank_over.SF-1691098.test
+++ b/sql/test/BugTracker/Tests/rank_over.SF-1691098.test
@@ -23,37 +23,37 @@ query I rowsort
 select RANK () OVER () as foo from rankbug
 ----
 1
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-2
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-3
-30
-31
-32
-4
-5
-6
-7
-8
-9
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
 
 statement ok
 drop table rankbug
diff --git a/sql/test/Tests/rank.test b/sql/test/Tests/rank.test
--- a/sql/test/Tests/rank.test
+++ b/sql/test/Tests/rank.test
@@ -37,10 +37,18 @@ select count(*) from ranktest
 ----
 27
 
-query I rowsort
+query I nosort
 select ROW_NUMBER() over () as foo from ranktest order by foo
 ----
 1
+2
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to