Changeset: dbe149c2877e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=dbe149c2877e
Modified Files:
        sql/backends/monet5/sql_rank.c
Branch: analytics
Log Message:

Ntile and nth_value single atom case handling.


diffs (173 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
@@ -476,28 +476,37 @@ SQLcume_dist(Client cntxt, MalBlkPtr mb,
                gdk_code = GDKanalyticalntile(r, b, p, o, TYPE_##TPE, ntile);   
                    \
        } while(0);
 
+#define NTILE_VALUE_SINGLE_IMP(TPE)                                            
         \
+       do {                                                                    
            \
+               TPE val = *(TPE*) ntile, *rres = (TPE*) res;                    
                \
+               if(!is_##TPE##_nil(val) && val < 1)                             
                \
+                       throw(SQL, "sql.ntile", SQLSTATE(42000) "ntile must be 
greater than zero"); \
+               *rres = (is_##TPE##_nil(val) || val > 1) ? TPE##_nil : *(TPE*) 
in;              \
+       } while(0);
+
 str
 SQLntile(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
+       int tp1, tp2;
+
        (void)cntxt;
        if (pci->argc != 5 || (getArgType(mb, pci, 3) != TYPE_bit && 
getBatType(getArgType(mb, pci, 3)) != TYPE_bit) ||
                (getArgType(mb, pci, 4) != TYPE_bit && 
getBatType(getArgType(mb, pci, 4)) != TYPE_bit)) {
                throw(SQL, "sql.ntile", SQLSTATE(42000) 
"ntile(:any_1,:number,:bit,:bit)");
        }
-       if (isaBatType(getArgType(mb, pci, 1))) {
+       tp1 = getArgType(mb, pci, 1), tp2 = getArgType(mb, pci, 2);
+       if (isaBatType(tp2))
+               throw(SQL, "sql.ntile", SQLSTATE(42000) "ntile first argument 
must a single atom");
+
+       if (isaBatType(tp1)) {
                BUN cnt;
                bat *res = getArgReference_bat(stk, pci, 0);
-               int tp2 = getArgType(mb, pci, 2);
                BAT *b = BATdescriptor(*getArgReference_bat(stk, pci, 1)), *p = 
NULL, *o = NULL, *r;
                if (!b)
                        throw(SQL, "sql.ntile", SQLSTATE(HY005) "Cannot access 
column descriptor");
                cnt = BATcount(b);
                gdk_return gdk_code;
 
-               if (isaBatType(tp2)) {
-                       BBPunfix(b->batCacheid);
-                       throw(SQL, "sql.ntile", SQLSTATE(42000) "ntile second 
argument must a single atom");
-               }
                switch (tp2) {
                        case TYPE_bte:
                                NTILE_IMP(bte)
@@ -529,14 +538,37 @@ SQLntile(Client cntxt, MalBlkPtr mb, Mal
                else
                        throw(SQL, "sql.ntile", SQLSTATE(HY001) "Unknown GDK 
error");
        } else {
-               int *res = getArgReference_int(stk, pci, 0);
+               ptr res = getArgReference_ptr(stk, pci, 0);
+               ptr in = getArgReference_ptr(stk, pci, 1);
+               ptr ntile = getArgReference_ptr(stk, pci, 2);
 
-               *res = 1;
+               switch (tp2) {
+                       case TYPE_bte:
+                               NTILE_VALUE_SINGLE_IMP(bte)
+                               break;
+                       case TYPE_sht:
+                               NTILE_VALUE_SINGLE_IMP(sht)
+                               break;
+                       case TYPE_int:
+                               NTILE_VALUE_SINGLE_IMP(int)
+                               break;
+                       case TYPE_lng:
+                               NTILE_VALUE_SINGLE_IMP(lng)
+                               break;
+#ifdef HAVE_HGE
+                       case TYPE_hge:
+                               NTILE_VALUE_SINGLE_IMP(hge)
+                               break;
+#endif
+                       default:
+                               throw(SQL, "sql.ntile", SQLSTATE(42000) "ntile 
not available for %s", ATOMname(tp2));
+               }
        }
        return MAL_SUCCEED;
 }
 
 #undef NTILE_IMP
+#undef NTILE_VALUE_SINGLE_IMP
 
 static str
 SQLanalytics_args(BAT **r, BAT **b, BAT **p, BAT **o, Client cntxt, MalBlkPtr 
mb, MalStkPtr stk, InstrPtr pci,
@@ -664,17 +696,30 @@ SQLlast_value(Client cntxt, MalBlkPtr mb
                gdk_code = GDKanalyticalnthvalue(r, b, p, o, cast_value, tp1);  
                        \
        } while(0);
 
+#define NTH_VALUE_SINGLE_IMP(TPE)                                              
                 \
+       do {                                                                    
                    \
+               TPE val = *(TPE*) nth, *rres = (TPE*) res;                      
                        \
+               if(!is_##TPE##_nil(val) && val < 1)                             
                        \
+                       throw(SQL, "sql.nth_value", SQLSTATE(42000) "nth_value 
must be greater than zero"); \
+               *rres = (is_##TPE##_nil(val) || val > 1) ? TPE##_nil : *(TPE*) 
in;                      \
+       } while(0);
+
 str
 SQLnth_value(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
+       int tp1, tp2;
+
        (void)cntxt;
        if (pci->argc != 9 || (getArgType(mb, pci, 3) != TYPE_bit && 
getBatType(getArgType(mb, pci, 3)) != TYPE_bit) ||
                (getArgType(mb, pci, 4) != TYPE_bit && 
getBatType(getArgType(mb, pci, 4)) != TYPE_bit)) {
                throw(SQL, "sql.nth_value", SQLSTATE(42000) 
"nth_value(:any_1,:number,:bit,:bit)");
        }
-       if (isaBatType(getArgType(mb, pci, 1))) {
+       tp1 = getArgType(mb, pci, 1), tp2 = getArgType(mb, pci, 2);
+       if (isaBatType(tp2))
+               throw(SQL, "sql.nth_value", SQLSTATE(42000) "nth_value second 
argument must a single atom");
+
+       if (isaBatType(tp1)) {
                BUN cnt;
-               int tp1 = getBatType(getArgType(mb, pci, 1)), tp2 = 
getArgType(mb, pci, 2);
                bat *res = getArgReference_bat(stk, pci, 0);
                BAT *b = BATdescriptor(*getArgReference_bat(stk, pci, 1)), *p = 
NULL, *o = NULL, *r;
                if (!b)
@@ -682,11 +727,7 @@ SQLnth_value(Client cntxt, MalBlkPtr mb,
                cnt = BATcount(b);
                gdk_return gdk_code;
 
-               if (isaBatType(tp2)) {
-                       BBPunfix(b->batCacheid);
-                       throw(SQL, "sql.nth_value", SQLSTATE(42000) "nth_value 
first argument must a single atom");
-               }
-
+               tp1 = getBatType(tp1);
                switch (tp2) {
                        case TYPE_bte:
                                NTH_VALUE_IMP(bte)
@@ -718,14 +759,37 @@ SQLnth_value(Client cntxt, MalBlkPtr mb,
                else
                        throw(SQL, "sql.nth_value", SQLSTATE(HY001) "Unknown 
GDK error");
        } else {
-               int *res = getArgReference_int(stk, pci, 0);
+               ptr res = getArgReference_ptr(stk, pci, 0);
+               ptr in = getArgReference_ptr(stk, pci, 1);
+               ptr nth = getArgReference_ptr(stk, pci, 2);
 
-               *res = 1;
+               switch (tp2) {
+                       case TYPE_bte:
+                               NTH_VALUE_SINGLE_IMP(bte)
+                               break;
+                       case TYPE_sht:
+                               NTH_VALUE_SINGLE_IMP(sht)
+                               break;
+                       case TYPE_int:
+                               NTH_VALUE_SINGLE_IMP(int)
+                               break;
+                       case TYPE_lng:
+                               NTH_VALUE_SINGLE_IMP(lng)
+                               break;
+#ifdef HAVE_HGE
+                       case TYPE_hge:
+                               NTH_VALUE_SINGLE_IMP(hge)
+                               break;
+#endif
+                       default:
+                               throw(SQL, "sql.nth_value", SQLSTATE(42000) 
"nth_value not available for %s", ATOMname(tp2));
+               }
        }
        return MAL_SUCCEED;
 }
 
 #undef NTH_VALUE_IMP
+#undef NTH_VALUE_SINGLE_IMP
 
 str
 SQLmin(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to