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

Reply via email to