Changeset: dc800e803010 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=dc800e803010
Modified Files:
        sql/common/sql_list.c
        sql/include/sql_list.h
        sql/include/sql_relation.h
        sql/server/rel_dump.c
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_rel.c
        sql/server/rel_rel.h
        sql/server/rel_select.c
        sql/server/rel_unnest.c
Branch: sq2
Log Message:

more cleaning


diffs (truncated from 930 to 300 lines):

diff --git a/sql/common/sql_list.c b/sql/common/sql_list.c
--- a/sql/common/sql_list.c
+++ b/sql/common/sql_list.c
@@ -740,6 +740,15 @@ list_hash_add(list *l, void *data, fcmp 
        return data;
 }
 
+void
+list_hash_clear(list *l)
+{
+       MT_lock_set(&l->ht_lock);
+        l->ht = NULL;
+        MT_lock_unset(&l->ht_lock);
+
+}
+
 #ifdef TEST
 #include <string.h>
 
diff --git a/sql/include/sql_list.h b/sql/include/sql_list.h
--- a/sql/include/sql_list.h
+++ b/sql/include/sql_list.h
@@ -95,5 +95,6 @@ extern list *list_merge_destroy(list *l,
 
 extern void list_hash_delete(list *l, void *data, fcmp cmp);
 extern void* list_hash_add(list *l, void *data, fcmp cmp);
+extern void list_hash_clear(list *l);
 
 #endif /* LIST_H */
diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h
--- a/sql/include/sql_relation.h
+++ b/sql/include/sql_relation.h
@@ -165,6 +165,8 @@ typedef enum operator_type {
        (et == e_func)
 #define is_aggr(et) \
        (et == e_aggr)
+#define is_convert(et) \
+       (et == e_convert)
 #define is_map_op(et) \
        (et == e_func || et == e_convert)
 #define is_column(et) \
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -85,7 +85,7 @@ exp_print(mvc *sql, stream *fout, sql_ex
        (void)sql;
        if (!e)
                return;
-       //mnstr_printf(fout, "%p ", e);
+       /*mnstr_printf(fout, "%p ", e);*/
        switch(e->type) {
        case e_psm: {
                if (e->flag & PSM_SET) {
@@ -106,7 +106,7 @@ exp_print(mvc *sql, stream *fout, sql_ex
                        if (e->f)
                                exps_print(sql, fout, e->f, depth, refs, alias, 
0);
                } else if (e->flag & PSM_REL) {
-                       rel_print_(sql, fout, e->l, depth+1, refs, 1);
+                       rel_print_(sql, fout, e->l, depth+10, refs, 1);
                } else if (e->flag & PSM_EXCEPTION) {
                        mnstr_printf(fout, "except ");
                        exp_print(sql, fout, e->l, depth, refs, 0, 0);
@@ -164,8 +164,11 @@ exp_print(mvc *sql, stream *fout, sql_ex
                                f->func->s?f->func->s->base.name:"sys",
                                f->func->base.name);
                exps_print(sql, fout, e->l, depth, refs, alias, 1);
-               if (e->r)
-                       exps_print(sql, fout, e->r, depth, refs, alias, 1);
+               if (e->r) { /* list of optional lists */
+                       list *l = e->r;
+                       for(node *n = l->h; n; n = n->next) 
+                               exps_print(sql, fout, n->data, depth, refs, 
alias, 1);
+               }
        }       break;
        case e_aggr: {
                sql_subaggr *a = e->f;
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -540,17 +540,11 @@ exp_alias_or_copy( mvc *sql, const char 
        if (!tname)
                tname = old->alias.rname;
 
-       if (!tname && old->type == e_column)
-               tname = old->l;
-
        if (!cname && exp_name(old) && exp_name(old)[0] == 'L') {
                ne = exp_column(sql->sa, exp_relname(old), exp_name(old), 
exp_subtype(old), orel?orel->card:CARD_ATOM, has_nil(old), is_intern(old));
                return exp_propagate(sql->sa, ne, old);
        } else if (!cname) {
-               char name[16], *nme;
-               nme = number2name(name, 16, ++sql->label);
-
-               exp_setname(sql->sa, old, nme, nme);
+               exp_label(sql->sa, old, ++sql->label);
                ne = exp_column(sql->sa, exp_relname(old), exp_name(old), 
exp_subtype(old), orel?orel->card:CARD_ATOM, has_nil(old), is_intern(old));
                return exp_propagate(sql->sa, ne, old);
        } else if (cname && !old->alias.name) {
@@ -652,6 +646,11 @@ exp_rel(mvc *sql, sql_rel *rel)
        */
        e->l = rel;
        e->flag = PSM_REL;
+       assert(rel);
+       if (is_project(rel->op)) {
+               sql_exp *last = rel->exps->t->data;
+               e->tpe = *exp_subtype(last);
+       }
        return e;
 }
 
@@ -804,6 +803,10 @@ exp_subtype( sql_exp *e )
        }
        case e_cmp:
                /* return bit */
+       case e_psm:
+               if (e->tpe.type)
+                       return &e->tpe;
+               /* fall through */
        default:
                return NULL;
        }
@@ -825,8 +828,6 @@ exp_relname( sql_exp *e )
 {
        if (e->alias.rname)
                return e->alias.rname;
-       if (e->type == e_column && e->l)
-               return e->l;
        return NULL;
 }
 
@@ -837,8 +838,6 @@ exp_find_rel_name(sql_exp *e)
                return e->alias.rname;
        switch(e->type) {
        case e_column:
-               if (e->l)
-                       return e->l;
                break;
        case e_convert:
                return exp_find_rel_name(e->l);
@@ -881,6 +880,8 @@ exp_equal( sql_exp *e1, sql_exp *e2)
                return 0;
        if (e1->alias.rname && e2->alias.rname && strcmp(e1->alias.rname, 
e2->alias.rname) == 0)
                return strcmp(e1->alias.name, e2->alias.name);
+       if (!e1->alias.rname && !e2->alias.rname && e1->alias.label == 
e2->alias.label && e1->alias.name && e2->alias.name)
+               return strcmp(e1->alias.name, e2->alias.name);
        return -1;
 }
 
@@ -1542,6 +1543,12 @@ exp_is_atom( sql_exp *e )
 }
 
 int
+exp_is_rel( sql_exp *e )
+{
+       return (e->type == e_psm && e->flag == PSM_REL && e->l);
+}
+
+int
 exps_are_atoms( list *exps)
 {
        node *n;
@@ -2024,7 +2031,6 @@ exp_copy( sql_allocator *sa, sql_exp * e
        if (!ne)
                return ne;
        if (e->alias.name)
-               //exp_setname(sa, ne, exp_find_rel_name(e), exp_name(e));
                exp_prop_alias(ne, e);
        ne = exp_propagate(sa, ne, e);
        if (is_freevar(e))
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -130,6 +130,7 @@ extern int exp_is_true(mvc *sql, sql_exp
 extern int exp_is_zero(mvc *sql, sql_exp *e);
 extern int exp_is_not_null(mvc *sql, sql_exp *e);
 extern int exp_is_null(mvc *sql, sql_exp *e);
+extern int exp_is_rel(sql_exp *e);
 extern int exps_are_atoms(list *exps);
 extern int exp_has_func(sql_exp *e);
 extern int exp_unsafe(sql_exp *e, int allow_identity);
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -694,6 +694,9 @@ rel_groupby_add_aggr(mvc *sql, sql_rel *
        sql_exp *m = NULL, *ne;
        char name[16], *nme = NULL;
 
+       if (list_empty(rel->r))
+               rel->card = e->card = CARD_ATOM;
+
        if ((m=exps_find_match_exp(rel->exps, e)) == NULL) {
                if (!exp_name(e)) {
                        nme = number2name(name, 16, ++sql->label);
@@ -1774,3 +1777,157 @@ rel_dependencies(mvc *sql, sql_rel *r)
                return NULL;
        return l;
 }
+
+
+static list *exps_exp_visitor(mvc *sql, sql_rel *rel, list *exps, 
exp_rewrite_fptr exp_rewriter);
+
+static sql_exp *
+exp_visitor(mvc *sql, sql_rel *rel, sql_exp *e, exp_rewrite_fptr exp_rewriter) 
+{
+       assert(e);
+       switch(e->type) {
+       case e_column:
+               break;
+       case e_convert:
+               e->l = exp_visitor(sql, rel, e->l, exp_rewriter);
+               break;
+       case e_aggr:
+       case e_func: 
+               if (e->r) /* rewrite rank */
+                       e->r = exps_exp_visitor(sql, rel, e->r, exp_rewriter);
+               if (e->l)
+                       e->l = exps_exp_visitor(sql, rel, e->l, exp_rewriter);
+               break;
+       case e_cmp:     
+               if (get_cmp(e) == cmp_or || get_cmp(e) == cmp_filter) {
+                       e->l = exps_exp_visitor(sql, rel, e->l, exp_rewriter);
+                       e->r = exps_exp_visitor(sql, rel, e->r, exp_rewriter);
+               } else if (e->flag == cmp_in || e->flag == cmp_notin) {
+                       e->l = exp_visitor(sql, rel, e->l, exp_rewriter);
+                       e->r = exps_exp_visitor(sql, rel, e->r, exp_rewriter);
+               } else {
+                       e->l = exp_visitor(sql, rel, e->l, exp_rewriter);
+                       e->r = exp_visitor(sql, rel, e->r, exp_rewriter);
+                       if (e->f)
+                               e->f = exp_visitor(sql, rel, e->f, 
exp_rewriter);
+               }
+               break;
+       case e_psm:
+               if (e->flag == PSM_REL) 
+                       e->l = rel_exp_visitor(sql, e->l, exp_rewriter);
+       case e_atom:
+               break;
+       }
+       e = exp_rewriter(sql, rel, e);
+       return e;
+}
+
+static list *
+exps_exp_visitor(mvc *sql, sql_rel *rel, list *exps, exp_rewrite_fptr 
exp_rewriter) 
+{
+       node *n;
+
+       if (list_empty(exps))
+               return exps;
+       for (n = exps->h; n; n = n->next) {
+               if (n->data)
+                       n->data = exp_visitor(sql, rel, n->data, exp_rewriter);
+       }
+       list_hash_clear(exps);
+       return exps;
+}
+
+sql_rel *
+rel_exp_visitor(mvc *sql, sql_rel *rel, exp_rewrite_fptr exp_rewriter) 
+{
+       if (!rel)
+               return rel;
+
+       rel->exps = exps_exp_visitor(sql, rel, rel->exps, exp_rewriter);
+       if (is_groupby(rel->op) && rel->r)
+               rel->r = exps_exp_visitor(sql, rel, rel->r, exp_rewriter);
+
+       switch(rel->op){
+       case op_basetable:
+       case op_table:
+               return rel;
+       case op_ddl:
+               return rel;
+
+       case op_insert:
+       case op_update:
+       case op_delete:
+       case op_truncate:
+
+       case op_join:
+       case op_left:
+       case op_right:
+       case op_full:
+       case op_semi:
+       case op_anti:
+
+       case op_union:
+       case op_inter:
+       case op_except:
+               if (rel->l)
+                       rel->l = rel_exp_visitor(sql, rel->l, exp_rewriter);
+               if (rel->r)
+                       rel->r = rel_exp_visitor(sql, rel->r, exp_rewriter);
+               break;
+       case op_select:
+       case op_topn:
+       case op_sample:
+       case op_project:
+       case op_groupby:
+               if (rel->l)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to