Changeset: 538f587f2c55 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=538f587f2c55
Added Files:
        sql/test/analytics/Tests/analytics19.sql
        sql/test/analytics/Tests/analytics19.stable.err
        sql/test/analytics/Tests/analytics19.stable.out
Modified Files:
        clients/Tests/MAL-signatures.stable.out
        clients/Tests/MAL-signatures.stable.out.int128
        clients/Tests/exports.stable.out
        gdk/gdk_analytic.h
        gdk/gdk_analytic_func.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_rank.c
        sql/backends/monet5/sql_rank.h
        sql/common/sql_types.c
        sql/test/analytics/Tests/All
        sql/test/sys-schema/Tests/systemfunctions.stable.out.int128
Branch: oscar
Log Message:

Implemented avg window function with the same output type as the input one 
(needed for decimals and intervals)


diffs (truncated from 610 to 300 lines):

diff --git a/clients/Tests/MAL-signatures.stable.out 
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -9701,6 +9701,10 @@ stdout of test 'MAL-signatures` in direc
 [ "batsql",    "avg",  "pattern batsql.avg(X_1:bat[:int], X_2:bat[:lng], 
X_3:bat[:lng]):bat[:dbl] ",   "SQLavg;",      ""      ]
 [ "batsql",    "avg",  "pattern batsql.avg(X_1:bat[:lng], X_2:bat[:lng], 
X_3:bat[:lng]):bat[:dbl] ",   "SQLavg;",      ""      ]
 [ "batsql",    "avg",  "pattern batsql.avg(X_1:bat[:sht], X_2:bat[:lng], 
X_3:bat[:lng]):bat[:dbl] ",   "SQLavg;",      ""      ]
+[ "batsql",    "avg",  "pattern batsql.avg(X_1:bat[:bte], X_2:bat[:lng], 
X_3:bat[:lng]):bat[:bte] ",   "SQLavginteger;",       ""      ]
+[ "batsql",    "avg",  "pattern batsql.avg(X_1:bat[:int], X_2:bat[:lng], 
X_3:bat[:lng]):bat[:int] ",   "SQLavginteger;",       ""      ]
+[ "batsql",    "avg",  "pattern batsql.avg(X_1:bat[:lng], X_2:bat[:lng], 
X_3:bat[:lng]):bat[:lng] ",   "SQLavginteger;",       ""      ]
+[ "batsql",    "avg",  "pattern batsql.avg(X_1:bat[:sht], X_2:bat[:lng], 
X_3:bat[:lng]):bat[:sht] ",   "SQLavginteger;",       ""      ]
 [ "batsql",    "corr", "pattern batsql.corr(X_1:bat[:bte], X_2:bat[:bte], 
X_3:bat[:lng], X_4:bat[:lng]):bat[:dbl] ",   "SQLcorr;",     ""      ]
 [ "batsql",    "corr", "pattern batsql.corr(X_1:bat[:bte], X_2:bte, 
X_3:bat[:lng], X_4:bat[:lng]):bat[:dbl] ", "SQLcorr;",     ""      ]
 [ "batsql",    "corr", "pattern batsql.corr(X_1:bat[:dbl], X_2:bat[:dbl], 
X_3:bat[:lng], X_4:bat[:lng]):bat[:dbl] ",   "SQLcorr;",     ""      ]
@@ -12420,6 +12424,10 @@ stdout of test 'MAL-signatures` in direc
 [ "sql",       "avg",  "pattern sql.avg(X_1:int, X_2:lng, X_3:lng):dbl ",      
"SQLavg;",      ""      ]
 [ "sql",       "avg",  "pattern sql.avg(X_1:lng, X_2:lng, X_3:lng):dbl ",      
"SQLavg;",      ""      ]
 [ "sql",       "avg",  "pattern sql.avg(X_1:sht, X_2:lng, X_3:lng):dbl ",      
"SQLavg;",      ""      ]
+[ "sql",       "avg",  "pattern sql.avg(X_1:bte, X_2:lng, X_3:lng):bte ",      
"SQLavginteger;",       ""      ]
+[ "sql",       "avg",  "pattern sql.avg(X_1:int, X_2:lng, X_3:lng):int ",      
"SQLavginteger;",       ""      ]
+[ "sql",       "avg",  "pattern sql.avg(X_1:lng, X_2:lng, X_3:lng):lng ",      
"SQLavginteger;",       ""      ]
+[ "sql",       "avg",  "pattern sql.avg(X_1:sht, X_2:lng, X_3:lng):sht ",      
"SQLavginteger;",       ""      ]
 [ "sql",       "bind", "pattern sql.bind(X_1:int, X_2:str, X_3:str, X_4:str, 
X_5:int):bat[:any_1] ",   "mvc_bind_wrap;",       ""      ]
 [ "sql",       "bind", "pattern sql.bind(X_1:int, X_2:str, X_3:str, X_4:str, 
X_5:int, X_6:int, X_7:int):bat[:any_1] ", "mvc_bind_wrap;",       ""      ]
 [ "sql",       "bind", "pattern sql.bind(X_2:int, X_3:str, X_4:str, X_5:str, 
X_6:int) (X_0:bat[:oid], X_1:bat[:any_1]) ",      "mvc_bind_wrap;",       ""    
  ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128 
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -13723,6 +13723,11 @@ stdout of test 'MAL-signatures` in direc
 [ "batsql",    "avg",  "pattern batsql.avg(X_1:bat[:int], X_2:bat[:lng], 
X_3:bat[:lng]):bat[:dbl] ",   "SQLavg;",      ""      ]
 [ "batsql",    "avg",  "pattern batsql.avg(X_1:bat[:lng], X_2:bat[:lng], 
X_3:bat[:lng]):bat[:dbl] ",   "SQLavg;",      ""      ]
 [ "batsql",    "avg",  "pattern batsql.avg(X_1:bat[:sht], X_2:bat[:lng], 
X_3:bat[:lng]):bat[:dbl] ",   "SQLavg;",      ""      ]
+[ "batsql",    "avg",  "pattern batsql.avg(X_1:bat[:bte], X_2:bat[:lng], 
X_3:bat[:lng]):bat[:bte] ",   "SQLavginteger;",       ""      ]
+[ "batsql",    "avg",  "pattern batsql.avg(X_1:bat[:hge], X_2:bat[:lng], 
X_3:bat[:lng]):bat[:hge] ",   "SQLavginteger;",       ""      ]
+[ "batsql",    "avg",  "pattern batsql.avg(X_1:bat[:int], X_2:bat[:lng], 
X_3:bat[:lng]):bat[:int] ",   "SQLavginteger;",       ""      ]
+[ "batsql",    "avg",  "pattern batsql.avg(X_1:bat[:lng], X_2:bat[:lng], 
X_3:bat[:lng]):bat[:lng] ",   "SQLavginteger;",       ""      ]
+[ "batsql",    "avg",  "pattern batsql.avg(X_1:bat[:sht], X_2:bat[:lng], 
X_3:bat[:lng]):bat[:sht] ",   "SQLavginteger;",       ""      ]
 [ "batsql",    "corr", "pattern batsql.corr(X_1:bat[:bte], X_2:bat[:bte], 
X_3:bat[:lng], X_4:bat[:lng]):bat[:dbl] ",   "SQLcorr;",     ""      ]
 [ "batsql",    "corr", "pattern batsql.corr(X_1:bat[:bte], X_2:bte, 
X_3:bat[:lng], X_4:bat[:lng]):bat[:dbl] ", "SQLcorr;",     ""      ]
 [ "batsql",    "corr", "pattern batsql.corr(X_1:bat[:dbl], X_2:bat[:dbl], 
X_3:bat[:lng], X_4:bat[:lng]):bat[:dbl] ",   "SQLcorr;",     ""      ]
@@ -17137,6 +17142,11 @@ stdout of test 'MAL-signatures` in direc
 [ "sql",       "avg",  "pattern sql.avg(X_1:int, X_2:lng, X_3:lng):dbl ",      
"SQLavg;",      ""      ]
 [ "sql",       "avg",  "pattern sql.avg(X_1:lng, X_2:lng, X_3:lng):dbl ",      
"SQLavg;",      ""      ]
 [ "sql",       "avg",  "pattern sql.avg(X_1:sht, X_2:lng, X_3:lng):dbl ",      
"SQLavg;",      ""      ]
+[ "sql",       "avg",  "pattern sql.avg(X_1:bte, X_2:lng, X_3:lng):bte ",      
"SQLavginteger;",       ""      ]
+[ "sql",       "avg",  "pattern sql.avg(X_1:hge, X_2:lng, X_3:lng):hge ",      
"SQLavginteger;",       ""      ]
+[ "sql",       "avg",  "pattern sql.avg(X_1:int, X_2:lng, X_3:lng):int ",      
"SQLavginteger;",       ""      ]
+[ "sql",       "avg",  "pattern sql.avg(X_1:lng, X_2:lng, X_3:lng):lng ",      
"SQLavginteger;",       ""      ]
+[ "sql",       "avg",  "pattern sql.avg(X_1:sht, X_2:lng, X_3:lng):sht ",      
"SQLavginteger;",       ""      ]
 [ "sql",       "bind", "pattern sql.bind(X_1:int, X_2:str, X_3:str, X_4:str, 
X_5:int):bat[:any_1] ",   "mvc_bind_wrap;",       ""      ]
 [ "sql",       "bind", "pattern sql.bind(X_1:int, X_2:str, X_3:str, X_4:str, 
X_5:int, X_6:int, X_7:int):bat[:any_1] ", "mvc_bind_wrap;",       ""      ]
 [ "sql",       "bind", "pattern sql.bind(X_2:int, X_3:str, X_4:str, X_5:str, 
X_6:int) (X_0:bat[:oid], X_1:bat[:any_1]) ",      "mvc_bind_wrap;",       ""    
  ]
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -239,6 +239,7 @@ gdk_return GDKanalytical_str_group_conca
 gdk_return GDKanalytical_variance_pop(BAT *r, BAT *b, BAT *s, BAT *e, int tpe);
 gdk_return GDKanalytical_variance_samp(BAT *r, BAT *b, BAT *s, BAT *e, int 
tpe);
 gdk_return GDKanalyticalavg(BAT *r, BAT *b, BAT *s, BAT *e, int tpe);
+gdk_return GDKanalyticalavginteger(BAT *r, BAT *b, BAT *s, BAT *e, int tpe);
 gdk_return GDKanalyticalcount(BAT *r, BAT *b, BAT *s, BAT *e, const bit 
*restrict ignore_nils, int tpe);
 gdk_return GDKanalyticaldiff(BAT *r, BAT *b, BAT *p, int tpe);
 gdk_return GDKanalyticalfirst(BAT *r, BAT *b, BAT *s, BAT *e, int tpe);
diff --git a/gdk/gdk_analytic.h b/gdk/gdk_analytic.h
--- a/gdk/gdk_analytic.h
+++ b/gdk/gdk_analytic.h
@@ -35,6 +35,7 @@ gdk_export gdk_return GDKanalyticalcount
 gdk_export gdk_return GDKanalyticalsum(BAT *r, BAT *b, BAT *s, BAT *e, int 
tp1, int tp2);
 gdk_export gdk_return GDKanalyticalprod(BAT *r, BAT *b, BAT *s, BAT *e, int 
tp1, int tp2);
 gdk_export gdk_return GDKanalyticalavg(BAT *r, BAT *b, BAT *s, BAT *e, int 
tpe);
+gdk_export gdk_return GDKanalyticalavginteger(BAT *r, BAT *b, BAT *s, BAT *e, 
int tpe);
 
 gdk_export gdk_return GDKanalytical_stddev_samp(BAT *r, BAT *b, BAT *s, BAT 
*e, int tpe);
 gdk_export gdk_return GDKanalytical_stddev_pop(BAT *r, BAT *b, BAT *s, BAT *e, 
int tpe);
diff --git a/gdk/gdk_analytic_func.c b/gdk/gdk_analytic_func.c
--- a/gdk/gdk_analytic_func.c
+++ b/gdk/gdk_analytic_func.c
@@ -1665,7 +1665,97 @@ GDKanalyticalavg(BAT *r, BAT *b, BAT *s,
                ANALYTICAL_AVERAGE_CALC_FP(dbl);
                break;
        default:
-               GDKerror("average of type %s unsupported.\n", ATOMname(tpe));
+               GDKerror("average of type %s to dbl unsupported.\n", 
ATOMname(tpe));
+               return GDK_FAIL;
+       }
+       BATsetcount(r, cnt);
+       r->tnonil = !has_nils;
+       r->tnil = has_nils;
+       return GDK_SUCCEED;
+}
+
+#ifdef TRUNCATE_NUMBERS
+#define ANALYTICAL_AVERAGE_INT_CALC_FINALIZE(avg, rem, ncnt) \
+       do {
+               if (rem > 0 && avg < 0) { \
+                       avg++; \
+                       rem -= ncnt; \
+               }
+       } while(0)
+#else
+#define ANALYTICAL_AVERAGE_INT_CALC_FINALIZE(avg, rem, ncnt) \
+       do { \
+               if (rem > 0) { \
+                       if (avg < 0) { \
+                               if (2*rem > ncnt) { \
+                                       avg++; \
+                                       rem -= ncnt; \
+                               } \
+                       } else { \
+                               if (2*rem >= ncnt) { \
+                                       avg++; \
+                                       rem -= ncnt; \
+                               } \
+                       } \
+               } \
+       } while(0)
+#endif
+
+#define ANALYTICAL_AVERAGE_INT_CALC(TPE)                       \
+       do {                                                            \
+               TPE *bp = (TPE*)Tloc(b, 0), *restrict rb = (TPE *) Tloc(r, 0), 
*bs, *be, v, avg = 0;    \
+               for (; i < cnt; i++) {                          \
+                       bs = bp + start[i];                             \
+                       be = bp + end[i];                               \
+                       for (; bs < be; bs++) {                         \
+                               v = *bs;                                \
+                               if (!is_##TPE##_nil(v)) \
+                                       AVERAGE_ITER(TPE, v, avg, rem, ncnt); \
+                       }       \
+                       if (ncnt == 0) {        \
+                               has_nils = true; \
+                               rb[i] = TPE##_nil; \
+                       } else { \
+                               ANALYTICAL_AVERAGE_INT_CALC_FINALIZE(avg, rem, 
ncnt); \
+                               rb[i] = avg; \
+                       } \
+                       rem = 0; \
+                       ncnt = 0; \
+                       avg = 0; \
+               }       \
+       } while (0)
+
+gdk_return
+GDKanalyticalavginteger(BAT *r, BAT *b, BAT *s, BAT *e, int tpe)
+{
+       bool has_nils = false;
+       BUN i = 0, cnt = BATcount(b);
+       lng *restrict start, *restrict end, rem = 0, ncnt = 0;
+
+       assert(s && e);
+       start = (lng *) Tloc(s, 0);
+       end = (lng *) Tloc(e, 0);
+
+       switch (tpe) {
+       case TYPE_bte:
+               ANALYTICAL_AVERAGE_INT_CALC(bte);
+               break;
+       case TYPE_sht:
+               ANALYTICAL_AVERAGE_INT_CALC(sht);
+               break;
+       case TYPE_int:
+               ANALYTICAL_AVERAGE_INT_CALC(int);
+               break;
+       case TYPE_lng:
+               ANALYTICAL_AVERAGE_INT_CALC(lng);
+               break;
+#ifdef HAVE_HGE
+       case TYPE_hge:
+               ANALYTICAL_AVERAGE_INT_CALC(hge);
+               break;
+#endif
+       default:
+               GDKerror("average of type %s to %s unsupported.\n", 
ATOMname(tpe), ATOMname(tpe));
                return GDK_FAIL;
        }
        BATsetcount(r, cnt);
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -6212,6 +6212,8 @@ static mel_func sql_init_funcs[] = {
  pattern("batsql", "sum", SQLsum, false, "return the sum of groups", args(1,4, 
batarg("",dbl),batarg("b",dbl),batarg("s",lng),batarg("e",lng))),
  pattern("sql", "prod", SQLprod, false, "return the product of groups", 
args(1,4, arg("",dbl),arg("b",dbl),arg("s",lng),arg("e",lng))),
  pattern("batsql", "prod", SQLprod, false, "return the product of groups", 
args(1,4, batarg("",dbl),batarg("b",dbl),batarg("s",lng),batarg("e",lng))),
+ pattern("sql", "avg", SQLavginteger, false, "return the average of groups", 
args(1,4, arg("",bte),arg("b",bte),arg("s",lng),arg("e",lng))),
+ pattern("batsql", "avg", SQLavginteger, false, "return the average of 
groups", args(1,4, 
batarg("",bte),batarg("b",bte),batarg("s",lng),batarg("e",lng))),
  pattern("sql", "avg", SQLavg, false, "return the average of groups", 
args(1,4, arg("",dbl),arg("b",bte),arg("s",lng),arg("e",lng))),
  pattern("batsql", "avg", SQLavg, false, "return the average of groups", 
args(1,4, batarg("",dbl),batarg("b",bte),batarg("s",lng),batarg("e",lng))),
  pattern("sql", "stdev", SQLstddev_samp, false, "return the standard deviation 
sample of groups", args(1,4, 
arg("",dbl),arg("b",bte),arg("s",lng),arg("e",lng))),
@@ -6234,6 +6236,8 @@ static mel_func sql_init_funcs[] = {
  pattern("batsql", "corr", SQLcorr, false, "return the correlation value of 
groups", args(1,5, 
batarg("",dbl),batarg("b",bte),arg("c",bte),batarg("s",lng),batarg("e",lng))),
  pattern("batsql", "corr", SQLcorr, false, "return the correlation value of 
groups", args(1,5, 
batarg("",dbl),arg("b",bte),batarg("c",bte),arg("s",lng),arg("e",lng))),
  pattern("batsql", "corr", SQLcorr, false, "return the correlation value of 
groups", args(1,5, 
batarg("",dbl),batarg("b",bte),batarg("c",bte),batarg("s",lng),batarg("e",lng))),
+ pattern("sql", "avg", SQLavginteger, false, "return the average of groups", 
args(1,4, arg("",sht),arg("b",sht),arg("s",lng),arg("e",lng))),
+ pattern("batsql", "avg", SQLavginteger, false, "return the average of 
groups", args(1,4, 
batarg("",sht),batarg("b",sht),batarg("s",lng),batarg("e",lng))),
  pattern("sql", "avg", SQLavg, false, "return the average of groups", 
args(1,4, arg("",dbl),arg("b",sht),arg("s",lng),arg("e",lng))),
  pattern("batsql", "avg", SQLavg, false, "return the average of groups", 
args(1,4, batarg("",dbl),batarg("b",sht),batarg("s",lng),batarg("e",lng))),
  pattern("sql", "stdev", SQLstddev_samp, false, "return the standard deviation 
sample of groups", args(1,4, 
arg("",dbl),arg("b",sht),arg("s",lng),arg("e",lng))),
@@ -6256,6 +6260,8 @@ static mel_func sql_init_funcs[] = {
  pattern("batsql", "corr", SQLcorr, false, "return the correlation value of 
groups", args(1,5, 
batarg("",dbl),batarg("b",sht),arg("c",sht),batarg("s",lng),batarg("e",lng))),
  pattern("batsql", "corr", SQLcorr, false, "return the correlation value of 
groups", args(1,5, 
batarg("",dbl),arg("b",sht),batarg("c",sht),arg("s",lng),arg("e",lng))),
  pattern("batsql", "corr", SQLcorr, false, "return the correlation value of 
groups", args(1,5, 
batarg("",dbl),batarg("b",sht),batarg("c",sht),batarg("s",lng),batarg("e",lng))),
+ pattern("sql", "avg", SQLavginteger, false, "return the average of groups", 
args(1,4, arg("",int),arg("b",int),arg("s",lng),arg("e",lng))),
+ pattern("batsql", "avg", SQLavginteger, false, "return the average of 
groups", args(1,4, 
batarg("",int),batarg("b",int),batarg("s",lng),batarg("e",lng))),
  pattern("sql", "avg", SQLavg, false, "return the average of groups", 
args(1,4, arg("",dbl),arg("b",int),arg("s",lng),arg("e",lng))),
  pattern("batsql", "avg", SQLavg, false, "return the average of groups", 
args(1,4, batarg("",dbl),batarg("b",int),batarg("s",lng),batarg("e",lng))),
  pattern("sql", "stdev", SQLstddev_samp, false, "return the standard deviation 
sample of groups", args(1,4, 
arg("",dbl),arg("b",int),arg("s",lng),arg("e",lng))),
@@ -6278,6 +6284,8 @@ static mel_func sql_init_funcs[] = {
  pattern("batsql", "corr", SQLcorr, false, "return the correlation value of 
groups", args(1,5, 
batarg("",dbl),batarg("b",int),arg("c",int),batarg("s",lng),batarg("e",lng))),
  pattern("batsql", "corr", SQLcorr, false, "return the correlation value of 
groups", args(1,5, 
batarg("",dbl),arg("b",int),batarg("c",int),arg("s",lng),arg("e",lng))),
  pattern("batsql", "corr", SQLcorr, false, "return the correlation value of 
groups", args(1,5, 
batarg("",dbl),batarg("b",int),batarg("c",int),batarg("s",lng),batarg("e",lng))),
+ pattern("sql", "avg", SQLavginteger, false, "return the average of groups", 
args(1,4, arg("",lng),arg("b",lng),arg("s",lng),arg("e",lng))),
+ pattern("batsql", "avg", SQLavginteger, false, "return the average of 
groups", args(1,4, 
batarg("",lng),batarg("b",lng),batarg("s",lng),batarg("e",lng))),
  pattern("sql", "avg", SQLavg, false, "return the average of groups", 
args(1,4, arg("",dbl),arg("b",lng),arg("s",lng),arg("e",lng))),
  pattern("batsql", "avg", SQLavg, false, "return the average of groups", 
args(1,4, batarg("",dbl),batarg("b",lng),batarg("s",lng),batarg("e",lng))),
  pattern("sql", "stdev", SQLstddev_samp, false, "return the standard deviation 
sample of groups", args(1,4, 
arg("",dbl),arg("b",lng),arg("s",lng),arg("e",lng))),
@@ -6688,6 +6696,8 @@ static mel_func sql_init_funcs[] = {
  pattern("batsql", "sum", SQLsum, false, "return the sum of groups", args(1,4, 
batarg("",hge),batarg("b",hge),batarg("s",lng),batarg("e",lng))),
  pattern("sql", "prod", SQLprod, false, "return the product of groups", 
args(1,4, arg("",hge),arg("b",hge),arg("s",lng),arg("e",lng))),
  pattern("batsql", "prod", SQLprod, false, "return the product of groups", 
args(1,4, batarg("",hge),batarg("b",hge),batarg("s",lng),batarg("e",lng))),
+ pattern("sql", "avg", SQLavginteger, false, "return the average of groups", 
args(1,4, arg("",hge),arg("b",hge),arg("s",lng),arg("e",lng))),
+ pattern("batsql", "avg", SQLavginteger, false, "return the average of 
groups", args(1,4, 
batarg("",hge),batarg("b",hge),batarg("s",lng),batarg("e",lng))),
  pattern("sql", "avg", SQLavg, false, "return the average of groups", 
args(1,4, arg("",dbl),arg("b",hge),arg("s",lng),arg("e",lng))),
  pattern("batsql", "avg", SQLavg, false, "return the average of groups", 
args(1,4, batarg("",dbl),batarg("b",hge),batarg("s",lng),batarg("e",lng))),
  pattern("sql", "stdev", SQLstddev_samp, false, "return the standard deviation 
of groups", args(1,4, arg("",dbl),arg("b",hge),arg("s",lng),arg("e",lng))),
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
@@ -1587,7 +1587,52 @@ SQLavg(Client cntxt, MalBlkPtr mb, MalSt
                                *res = *in;
                                break;
                        default:
-                               throw(SQL, "sql.avg", SQLSTATE(42000) "sql.avg 
not available for %s", ATOMname(tpe));
+                               throw(SQL, "sql.avg", SQLSTATE(42000) "sql.avg 
not available for %s to dbl", ATOMname(tpe));
+               }
+       }
+       return msg;
+}
+
+str
+SQLavginteger(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+       BAT *r, *b, *s, *e;
+       str msg = SQLanalytics_args(&r, &b, &s, &e, cntxt, mb, stk, pci, 0, 
"sql.avg", SQLSTATE(42000) "avg(:any_1,:lng,:lng)");
+       int tpe = getArgType(mb, pci, 1);
+       gdk_return gdk_res;
+
+       if (msg)
+               return msg;
+       if (isaBatType(tpe))
+               tpe = getBatType(tpe);
+
+       if (b) {
+               bat *res = getArgReference_bat(stk, pci, 0);
+
+               gdk_res = GDKanalyticalavginteger(r, b, s, e, tpe);
+               BBPunfix(b->batCacheid);
+               if (s) BBPunfix(s->batCacheid);
+               if (e) BBPunfix(e->batCacheid);
+               if (gdk_res == GDK_SUCCEED)
+                       BBPkeepref(*res = r->batCacheid);
+               else
+                       throw(SQL, "sql.avg", GDK_EXCEPTION);
+       } else {
+               ptr *res = getArgReference(stk, pci, 0);
+               ptr *in = getArgReference(stk, pci, 1);
+
+               switch (tpe) {
+                       case TYPE_bte:
+                       case TYPE_sht:
+                       case TYPE_int:
+                       case TYPE_lng:
+#ifdef HAVE_HGE
+                       case TYPE_hge:
+#endif
+                               *res = *in;
+                               break;
+                       default:
+                               throw(SQL, "sql.avg", SQLSTATE(42000) "sql.avg 
not available for %s to %s", ATOMname(tpe), ATOMname(tpe));
                }
        }
        return msg;
diff --git a/sql/backends/monet5/sql_rank.h b/sql/backends/monet5/sql_rank.h
--- a/sql/backends/monet5/sql_rank.h
+++ b/sql/backends/monet5/sql_rank.h
@@ -34,6 +34,7 @@ sql5_export str SQLcount(Client cntxt, M
 sql5_export str SQLsum(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 sql5_export str SQLprod(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 sql5_export str SQLavg(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
+sql5_export str SQLavginteger(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 
 /* statistical functions */
 sql5_export str SQLstddev_samp(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -1570,24 +1570,24 @@ sqltypeinit( sql_allocator *sa)
        sql_create_analytic(sa, "avg", "sql", "avg", SCALE_NONE, DBL, 1, HGE);
 #endif
 
+       sql_create_analytic(sa, "avg", "sql", "avg", SCALE_NONE, DBL, 1, FLT);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to