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