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