Changeset: 7403f802c1d2 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7403f802c1d2
Modified Files:
sql/server/rel_optimizer.c
Branch: default
Log Message:
Merged from Aug2011
diffs (212 lines):
diff --git a/sql/backends/monet5/UDF/udf.c b/sql/backends/monet5/UDF/udf.c
--- a/sql/backends/monet5/UDF/udf.c
+++ b/sql/backends/monet5/UDF/udf.c
@@ -29,71 +29,74 @@ reverse(str src)
/* The scalar function returns the new space */
len = (int) strlen(src);
- ret = new = GDKzalloc( len + 1);
- for(len--; len >= 0; len--)
+ ret = new = GDKzalloc(len + 1);
+ for (len--; len >= 0; len--)
*new++ = src[len];
return ret;
}
-str
+str
UDFreverse(str *ret, str *src)
{
- if( *src == 0 || strcmp(*src, str_nil) == 0 )
- *ret = GDKstrdup(str_nil);
- else *ret = reverse(*src);
+ if (*src == 0 || strcmp(*src, str_nil) == 0)
+ *ret = GDKstrdup(str_nil);
+ else
+ *ret = reverse(*src);
return MAL_SUCCEED;
}
-/*
+/*
* The BAT version is much more complicated, because we need to
* ensure that properties are maintained.
-*/
+ */
str UDFBATreverse(int *ret, int *bid)
{
- BATiter li;
- BAT *bn, *left;
- BUN p,q;
- str v;
+ BATiter li;
+ BAT *bn, *left;
+ BUN p, q;
+ str v;
/* locate the BAT in the buffer pool */
- if( (left= BATdescriptor(*bid)) == NULL )
- throw(MAL, "mal.reverse" , RUNTIME_OBJECT_MISSING);
+ if ((left = BATdescriptor(*bid)) == NULL)
+ throw(MAL, "mal.reverse", RUNTIME_OBJECT_MISSING);
/* create the result container */
- bn= BATnew(left->htype,TYPE_str,BATcount(left));
- if (left->htype== TYPE_void)
- BATseqbase(bn, left->hseqbase);
- if (bn == NULL){
- BBPreleaseref(left->batCacheid);
- throw(MAL, "mal.reverse", MAL_MALLOC_FAIL);
- }
+ bn = BATnew(left->htype, TYPE_str, BATcount(left));
+ if (left->htype == TYPE_void)
+ BATseqbase(bn, left->hseqbase);
+ if (bn == NULL) {
+ BBPreleaseref(left->batCacheid);
+ throw(MAL, "mal.reverse", MAL_MALLOC_FAIL);
+ }
/* manage the properties of the result */
- bn->hsorted= left->hsorted;
- bn->tsorted=0; /* assume not sorted afterwards */
+ bn->hsorted = left->hsorted;
+ bn->tsorted = 0; /* assume not sorted afterwards */
- li = bat_iterator(left);
+ li = bat_iterator(left);
/* advice on sequential scan */
- BATaccessBegin(left, USE_HEAD|USE_TAIL, MMAP_SEQUENTIAL);
+ BATaccessBegin(left, USE_HEAD | USE_TAIL, MMAP_SEQUENTIAL);
/* the core of the algorithm, expensive due to malloc/frees */
- BATloop(left, p, q) {
- ptr h = BUNhead(li,p);
- str tl = (str) BUNtail(li,p);
- v= reverse(tl);
- bunfastins(bn, h, v);
- GDKfree(v);
- }
- BATaccessEnd(left, USE_HEAD|USE_TAIL, MMAP_SEQUENTIAL);
- if (!(bn->batDirty & 2)) (bn) = BATsetaccess(bn, BAT_READ);
- *ret = (bn)->batCacheid;
- BBPkeepref(*ret);
- BBPreleaseref(left->batCacheid);
- return MAL_SUCCEED;
+ BATloop(left, p, q)
+ {
+ ptr h = BUNhead(li, p);
+ str tl = (str) BUNtail(li, p);
+ v = reverse(tl);
+ bunfastins(bn, h, v);
+ GDKfree(v);
+ }
+ BATaccessEnd(left, USE_HEAD | USE_TAIL, MMAP_SEQUENTIAL);
+ if (!(bn->batDirty & 2))
+ (bn) = BATsetaccess(bn, BAT_READ);
+ *ret = (bn)->batCacheid;
+ BBPkeepref(*ret);
+ BBPreleaseref(left->batCacheid);
+ return MAL_SUCCEED;
bunins_failed:
- BATaccessEnd(left, USE_HEAD|USE_TAIL, MMAP_SEQUENTIAL);
- BBPreleaseref(left->batCacheid);
- BBPreleaseref(*ret);
- throw(MAL, "mal.reverse", OPERATION_FAILED " During bulk operation");
+ BATaccessEnd(left, USE_HEAD | USE_TAIL, MMAP_SEQUENTIAL);
+ BBPreleaseref(left->batCacheid);
+ BBPreleaseref(*ret);
+ throw(MAL, "mal.reverse", OPERATION_FAILED " During bulk operation");
}
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -1823,11 +1823,14 @@ exps_case_fixup( mvc *sql, list *exps, s
if (e->type == e_func && e->l && !is_rank_op(e) ) {
sql_subfunc *f = e->f;
- if (!f->func->s && !strcmp(f->func->base.name,
"sql_div"))
+ if (!f->func->s && !strcmp(f->func->base.name,
"sql_div")) {
e = sql_div_fixup(sql, e, cond, lr);
- else
- e->l = exps_case_fixup(sql, e->l, cond,
lr);
-
+ } else {
+ list *l = exps_case_fixup(sql, e->l,
cond, lr);
+ sql_exp *ne = exp_op(sql->sa, l, f);
+ exp_setname(sql->sa, ne, e->rname,
e->name );
+ e = ne;
+ }
}
append(nexps, e);
}
@@ -5230,7 +5233,8 @@ _rel_optimizer(mvc *sql, sql_rel *rel, i
/* simple merging of projects */
if (gp.cnt[op_project]) {
rel = rewrite(sql, rel, &rel_merge_projects, &changes);
- rel = rewrite(sql, rel, &rel_case_fixup, &changes);
+ if (level <= 0)
+ rel = rewrite(sql, rel, &rel_case_fixup, &changes);
}
if (gp.cnt[op_join] ||
diff --git
a/sql/test/BugTracker-2009/Tests/segfault_when_quitting_debugger.SF-2538837.stable.out
b/sql/test/BugTracker-2009/Tests/segfault_when_quitting_debugger.SF-2538837.stable.out
---
a/sql/test/BugTracker-2009/Tests/segfault_when_quitting_debugger.SF-2538837.stable.out
+++
b/sql/test/BugTracker-2009/Tests/segfault_when_quitting_debugger.SF-2538837.stable.out
@@ -26,7 +26,7 @@ Over..
# 12:13:20 >
mdb># mdb.start();
-mdb># user.s1_1();
+mdb># user.s0_1();
# 12:13:21 >
# 12:13:21 > Done.
diff --git a/sql/test/leaks/Tests/check0.stable.out
b/sql/test/leaks/Tests/check0.stable.out
--- a/sql/test/leaks/Tests/check0.stable.out
+++ b/sql/test/leaks/Tests/check0.stable.out
@@ -35,28 +35,28 @@ Over..
[ "int", "int", 16 ]
[ "int", "lng", 2 ]
[ "int", "str", 142 ]
-[ "oid", "bit", 1148 ]
-[ "oid", "bit", 1148 ]
-[ "oid", "bit", 1148 ]
+[ "oid", "bit", 1149 ]
+[ "oid", "bit", 1149 ]
+[ "oid", "bit", 1149 ]
[ "oid", "int", 19 ]
[ "oid", "int", 19 ]
-[ "oid", "int", 1148 ]
-[ "oid", "int", 1148 ]
-[ "oid", "int", 3155 ]
-[ "oid", "int", 3155 ]
-[ "oid", "int", 3155 ]
-[ "oid", "int", 3155 ]
-[ "oid", "int", 3155 ]
-[ "oid", "lng", 0 ]
+[ "oid", "int", 1149 ]
+[ "oid", "int", 1149 ]
+[ "oid", "int", 1149 ]
+[ "oid", "int", 3157 ]
+[ "oid", "int", 3157 ]
+[ "oid", "int", 3157 ]
+[ "oid", "int", 3157 ]
+[ "oid", "int", 3157 ]
[ "oid", "lng", 19 ]
[ "oid", "str", 1 ]
[ "oid", "str", 1 ]
[ "oid", "str", 19 ]
-[ "oid", "str", 1148 ]
-[ "oid", "str", 1148 ]
-[ "oid", "str", 1148 ]
-[ "oid", "str", 3155 ]
-[ "oid", "str", 3155 ]
+[ "oid", "str", 1149 ]
+[ "oid", "str", 1149 ]
+[ "oid", "str", 1149 ]
+[ "oid", "str", 3157 ]
+[ "oid", "str", 3157 ]
#select 'transient', count(*) from bbp() as bbp where kind like 'tran%';
% .L1, .bbp # table_name
% L1, L2 # name
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list