Changeset: 9b3cc21644b4 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9b3cc21644b4
Added Files:
        
sql/test/BugTracker-2012/Tests/aggregate_incorrect_precision_scale.Bug-3182.sql
        
sql/test/BugTracker-2012/Tests/aggregate_incorrect_precision_scale.Bug-3182.stable.err
        
sql/test/BugTracker-2012/Tests/aggregate_incorrect_precision_scale.Bug-3182.stable.out
Modified Files:
        gdk/gdk_align.c
        monetdb5/extras/jaql/Tests/plan00.stable.out
        monetdb5/extras/jaql/jaql.c
        monetdb5/extras/jaql/jaqlgencode.c
        monetdb5/extras/jaql/jaqltests/Tests/All
        monetdb5/extras/jaql/jaqltests/Tests/calculations.stable.out
        monetdb5/mal/Tests/tst601.mal
        monetdb5/mal/Tests/tst601.stable.out
        monetdb5/mal/mal_box.c
        sql/backends/monet5/sql_scenario.c
        sql/scripts/39_analytics.sql
        sql/server/rel_select.c
        sql/test/BugTracker-2012/Tests/All
        sql/test/BugTracker-2012/Tests/predicate_select.Bug-3090.stable.err
        sql/test/BugTracker-2012/Tests/predicate_select.Bug-3090.stable.out
        sql/test/Tests/systemfunctions.stable.out
        sql/test/leaks/Tests/check0.stable.out
        sql/test/leaks/Tests/check1.stable.out
        sql/test/leaks/Tests/check2.stable.out
        sql/test/leaks/Tests/check3.stable.out
        sql/test/leaks/Tests/check4.stable.out
        sql/test/leaks/Tests/check5.stable.out
        sql/test/mapi/Tests/php_monetdb.stable.out
Branch: default
Log Message:

Merge with Oct2012 branch.


diffs (truncated from 885 to 300 lines):

diff --git a/gdk/gdk_align.c b/gdk/gdk_align.c
--- a/gdk/gdk_align.c
+++ b/gdk/gdk_align.c
@@ -721,8 +721,16 @@ VIEWreset(BAT *b)
                /* reset capacity */
                n->U->capacity = cnt;
 
+               /* swap n and v in case the original input was reversed, because
+                * BATins demands (v)oid-headed input */
+               if (b->batCacheid < 0) {
+                       n = m;
+                       m = BATmirror(v);
+               } else {
+                       m = v;
+               }
                /* insert all of v in n, and quit */
-               BATins(n, v, FALSE);
+               BATins(n, m, FALSE);
                BBPreclaim(v);
                BBPunfix(n->batCacheid);
        }
diff --git a/monetdb5/extras/jaql/Tests/plan00.stable.out 
b/monetdb5/extras/jaql/Tests/plan00.stable.out
--- a/monetdb5/extras/jaql/Tests/plan00.stable.out
+++ b/monetdb5/extras/jaql/Tests/plan00.stable.out
@@ -58,10 +58,10 @@ A as $ -> expand: $.ids => <result>
 [1,2,3] as $ -> transform: { "value": $ } 
 [1,2,3] => <result> 
 [1,2,3] as $ -> transform: ( $ * 2 ) 
-[1,2,3] as $ -> transform: ( $ * 2 ) 
+[1,2,3] as $ -> transform: ( 2 * $ ) 
 [1,2,3] as $ -> transform: 4 
-[1,2,3] as $ -> transform: ( ( $ * 2 ) * 2 ) 
-[1,2,3] as $ -> transform: ( ( $ * 2.000000 ) * 2 ) 
+[1,2,3] as $ -> transform: ( 2 * ( $ * 2 ) ) 
+[1,2,3] as $ -> transform: ( 2 * ( 2.000000 * $ ) ) 
 [1,2,3] as $ -> transform: ( ( $ * 2.000000 ) / 4 ) 
 as users in users , pages in pages -> join: where ( ( users.id == pages.userid 
) ) into { "name": users.name , "url": pages.url } 
 as u in users , p in pages -> join: where ( ( u.id == p.userid ) ) into { 
"name": u.name , "url": p.url } 
diff --git a/monetdb5/extras/jaql/jaql.c b/monetdb5/extras/jaql/jaql.c
--- a/monetdb5/extras/jaql/jaql.c
+++ b/monetdb5/extras/jaql/jaql.c
@@ -1186,66 +1186,59 @@ make_operation(tree *var1, tree *op, tre
                return res;
        }
 
-       if (var1->type != j_var && var1->type != j_operation) {
-               /* left is value (literal) */
-               if (var2->type == j_var || var2->type == j_operation) {
-                       /* right is var, or another operation, swap (want the 
var
-                        * left eventually (if any)) */
-                       tree *t = var1;
-                       var1 = var2;
-                       var2 = t;
-               } else {
-                       /* right is literal, pre-compute the value
-                        * only cases left are number/double combinations */
-                       if (var1->type == j_num)
-                               var1->dval = (double)var1->nval;
-                       if (var2->type == j_num)
-                               var2->dval = (double)var2->nval;
-                       switch (op->cval) {
-                               case j_plus:
-                                       if (var1->type == j_dbl || var2->type 
== j_dbl) {
-                                               res->type = j_dbl;
-                                               res->dval = var1->dval + 
var2->dval;
-                                       } else {
-                                               res->type = j_num;
-                                               res->nval = var1->nval + 
var2->nval;
-                                       }
-                                       break;
-                               case j_min:
-                                       if (var1->type == j_dbl || var2->type 
== j_dbl) {
-                                               res->type = j_dbl;
-                                               res->dval = var1->dval - 
var2->dval;
-                                       } else {
-                                               res->type = j_num;
-                                               res->nval = var1->nval - 
var2->nval;
-                                       }
-                                       break;
-                               case j_multiply:
-                                       if (var1->type == j_dbl || var2->type 
== j_dbl) {
-                                               res->type = j_dbl;
-                                               res->dval = var1->dval * 
var2->dval;
-                                       } else {
-                                               res->type = j_num;
-                                               res->nval = var1->nval * 
var2->nval;
-                                       }
-                                       break;
-                               case j_divide:
-                                       if (var1->type == j_dbl || var2->type 
== j_dbl) {
-                                               res->type = j_dbl;
-                                               res->dval = var1->dval / 
var2->dval;
-                                       } else {
-                                               res->type = j_num;
-                                               res->nval = var1->nval / 
var2->nval;
-                                       }
-                                       break;
-                               default:
-                                       assert(0);
-                       }
-                       freetree(var1);
-                       freetree(op);
-                       freetree(var2);
-                       return res;
+       if (var1->type != j_var && var1->type != j_operation &&
+                       var2->type != j_var && var2->type != j_operation)
+       {
+               /* both are constants, pre-compute the value
+                * only cases left are number/double combinations */
+               if (var1->type == j_num)
+                       var1->dval = (double)var1->nval;
+               if (var2->type == j_num)
+                       var2->dval = (double)var2->nval;
+               switch (op->cval) {
+                       case j_plus:
+                               if (var1->type == j_dbl || var2->type == j_dbl) 
{
+                                       res->type = j_dbl;
+                                       res->dval = var1->dval + var2->dval;
+                               } else {
+                                       res->type = j_num;
+                                       res->nval = var1->nval + var2->nval;
+                               }
+                               break;
+                       case j_min:
+                               if (var1->type == j_dbl || var2->type == j_dbl) 
{
+                                       res->type = j_dbl;
+                                       res->dval = var1->dval - var2->dval;
+                               } else {
+                                       res->type = j_num;
+                                       res->nval = var1->nval - var2->nval;
+                               }
+                               break;
+                       case j_multiply:
+                               if (var1->type == j_dbl || var2->type == j_dbl) 
{
+                                       res->type = j_dbl;
+                                       res->dval = var1->dval * var2->dval;
+                               } else {
+                                       res->type = j_num;
+                                       res->nval = var1->nval * var2->nval;
+                               }
+                               break;
+                       case j_divide:
+                               if (var1->type == j_dbl || var2->type == j_dbl) 
{
+                                       res->type = j_dbl;
+                                       res->dval = var1->dval / var2->dval;
+                               } else {
+                                       res->type = j_num;
+                                       res->nval = var1->nval / var2->nval;
+                               }
+                               break;
+                       default:
+                               assert(0);
                }
+               freetree(var1);
+               freetree(op);
+               freetree(var2);
+               return res;
        }
 
        res->type = j_operation;
diff --git a/monetdb5/extras/jaql/jaqlgencode.c 
b/monetdb5/extras/jaql/jaqlgencode.c
--- a/monetdb5/extras/jaql/jaqlgencode.c
+++ b/monetdb5/extras/jaql/jaqlgencode.c
@@ -2879,10 +2879,12 @@ dumpvariabletransformation(jc *j, Client
                        int u = -1, v;
                        int h, i, k = -1, l = -1, m;
                        InstrPtr p;
-                       b = -1;
+                       b = c = -1;
                        switch (t->tval1->type) {
                                case j_var:
                                case j_operation:
+                               case j_num:
+                               case j_dbl:
                                        b = dumpvariabletransformation(j, 
cntxt, mb, t->tval1, elems);
 
                                        q = newInstruction(mb, ASSIGNsymbol);
diff --git a/monetdb5/extras/jaql/jaqltests/Tests/All 
b/monetdb5/extras/jaql/jaqltests/Tests/All
--- a/monetdb5/extras/jaql/jaqltests/Tests/All
+++ b/monetdb5/extras/jaql/jaqltests/Tests/All
@@ -10,3 +10,4 @@ HAVE_JAQL?shred
 HAVE_JAQL?in
 HAVE_JAQL?documents
 HAVE_JAQL?multiline
+HAVE_JAQL?calculations
diff --git a/monetdb5/extras/jaql/jaqltests/Tests/calculations.stable.out 
b/monetdb5/extras/jaql/jaqltests/Tests/calculations.stable.out
--- a/monetdb5/extras/jaql/jaqltests/Tests/calculations.stable.out
+++ b/monetdb5/extras/jaql/jaqltests/Tests/calculations.stable.out
@@ -77,8 +77,8 @@ Ready.
 % .json # table_name
 % json # name
 % clob # type
-% 31 # length
-[ 10, 2, 5, 2.439024, 2 ]
+% 32 # length
+[ 10, 5, 1, 4.761905, 4.761905 ]
 #AB -> transform $.A / $.B;
 % .json # table_name
 % json # name
diff --git a/monetdb5/mal/Tests/tst601.mal b/monetdb5/mal/Tests/tst601.mal
--- a/monetdb5/mal/Tests/tst601.mal
+++ b/monetdb5/mal/Tests/tst601.mal
@@ -10,3 +10,6 @@ p2:flt := const.take("pi");
 io.print(p2);
 const.close(); # save the content on persistent store
 io.print(p2);
+
+# don't leave any residues
+const.destroy();
diff --git a/monetdb5/mal/Tests/tst601.stable.out 
b/monetdb5/mal/Tests/tst601.stable.out
--- a/monetdb5/mal/Tests/tst601.stable.out
+++ b/monetdb5/mal/Tests/tst601.stable.out
@@ -38,6 +38,8 @@ function user.main():void;
     const.close();
 # save the content on persistent store 
     io.print(p2);
+# don't leave any residues 
+    const.destroy();
 end main;
 [ 3.14700007 ]
 [ 3.14700007 ]
diff --git a/monetdb5/mal/mal_box.c b/monetdb5/mal/mal_box.c
--- a/monetdb5/mal/mal_box.c
+++ b/monetdb5/mal/mal_box.c
@@ -356,18 +356,22 @@ destroyBox(str name)
 
        MT_lock_set(&mal_contextLock, "destroyBox");
        for (i = j = 0; i < topbox; i++) {
-               if (idcmp(malbox[j]->name, name) == 0) {
-                       free(malbox[i]->name);
+               if (idcmp(malbox[i]->name, name) == 0) {
                        freeMalBlk(malbox[i]->sym);
                        if ( malbox[i]->val)
                                freeStack(malbox[i]->val);
                        boxfile = boxFileName(malbox[i], 0);
                        unlink(boxfile);
                        GDKfree(boxfile);
+                       GDKfree(malbox[i]->name);
                        MT_lock_destroy(&malbox[i]->lock);
-               } else
-                       malbox[i] = malbox[j++];
+               } else {
+                       if (j < i)
+                               malbox[j] = malbox[i];
+                       j++;
+               }
        }
+       topbox = j;
        MT_lock_unset(&mal_contextLock, "destroyBox");
 }
 
diff --git a/sql/backends/monet5/sql_scenario.c 
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -492,6 +492,34 @@ sql_update_oct2012(Client c)
        return err;             /* usually MAL_SUCCEED */
 }
 
+static str
+sql_update_oct2012_sp1(Client c)
+{
+       char *buf = GDKmalloc(2048), *err = NULL;
+       size_t bufsize = 2048, pos = 0;
+
+       /* sys.stddev functions */
+       pos += snprintf(buf+pos, bufsize-pos, "create aggregate sys.stddev(val 
TINYINT) returns TINYINT external name \"aggr\".\"stddev\";\n");
+       pos += snprintf(buf+pos, bufsize-pos, "create aggregate sys.stddev(val 
SMALLINT) returns SMALLINT external name \"aggr\".\"stddev\";\n");
+       pos += snprintf(buf+pos, bufsize-pos, "create aggregate sys.stddev(val 
INTEGER) returns INTEGER external name \"aggr\".\"stddev\";\n");
+       pos += snprintf(buf+pos, bufsize-pos, "create aggregate sys.stddev(val 
BIGINT) returns BIGINT external name \"aggr\".\"stddev\";\n");
+       pos += snprintf(buf+pos, bufsize-pos, "create aggregate sys.stddev(val 
REAL) returns REAL external name \"aggr\".\"stddev\";\n");
+       pos += snprintf(buf+pos, bufsize-pos, "create aggregate sys.stddev(val 
DOUBLE) returns DOUBLE external name \"aggr\".\"stddev\";\n");
+
+       pos += snprintf(buf+pos, bufsize-pos, "create aggregate sys.stddev(val 
DATE) returns DATE external name \"aggr\".\"stddev\";\n");
+       pos += snprintf(buf+pos, bufsize-pos, "create aggregate sys.stddev(val 
TIME) returns TIME external name \"aggr\".\"stddev\";\n");
+       pos += snprintf(buf+pos, bufsize-pos, "create aggregate sys.stddev(val 
TIMESTAMP) returns TIMESTAMP external name \"aggr\".\"stddev\";\n");
+
+       pos += snprintf(buf + pos, bufsize-pos, "insert into 
sys.systemfunctions (select f.id from sys.functions f, sys.schemas s where 
f.name = 'stddev' and f.type = %d and f.schema_id = s.id and s.name = 
'sys');\n", F_AGGR);
+
+       assert(pos < 2048);
+
+       printf("Running database upgrade commands:\n%s\n", buf);
+       err = SQLstatementIntern(c, &buf, "update", 1, 0);
+       GDKfree(buf);
+       return err;             /* usually MAL_SUCCEED */
+}
+
 str
 SQLinitClient(Client c)
 {
@@ -630,7 +658,7 @@ SQLinitClient(Client c)
                        if ((err = sql_update_apr2012_sp1(c)) != NULL)
                                fprintf(stderr, "!%s\n", err);
                }
-               /* if aggregate function sys.median(int) does not
+               /* if function sys.alpa(double) does not
                 * exist, we need to update */
                sql_find_subtype(&tp, "double", 0, 0);
                if (!sql_bind_func(m->sa, mvc_bind_schema(m,"sys"), "alpha", 
&tp, &tp, F_FUNC )) {
@@ -652,6 +680,13 @@ SQLinitClient(Client c)
                                        fprintf(stderr, "!%s\n", err);
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to