Changeset: 5340e5fbc2ac for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5340e5fbc2ac
Modified Files:
sql/server/rel_exp.c
sql/server/rel_exp.h
sql/server/rel_optimizer.c
Branch: default
Log Message:
moved exp_copy and exps_copy from rel_optimizer to rel_exp, which seems a more
logical place
diffs (229 lines):
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
@@ -21,6 +21,7 @@
#include "sql_semantic.h"
#include "rel_semantic.h"
#include "rel_exp.h"
+#include "rel_prop.h" /* for prop_copy() */
static sql_exp *
exp_create(sql_allocator *sa, int type )
@@ -1078,3 +1079,97 @@ is_identity( sql_exp *e, sql_rel *r)
}
}
+list *
+exps_copy( sql_allocator *sa, list *exps)
+{
+ node *n;
+ list *nl = new_exp_list(sa);
+
+ for(n = exps->h; n; n = n->next) {
+ sql_exp *arg = n->data;
+
+ arg = exp_copy(sa, arg);
+ if (!arg)
+ return NULL;
+ append(nl, arg);
+ }
+ return nl;
+}
+
+sql_exp *
+exp_copy( sql_allocator *sa, sql_exp * e)
+{
+ sql_exp *l, *r, *r2, *ne = NULL;
+
+ switch(e->type){
+ case e_column:
+ ne = exp_column(sa, e->l, e->r, exp_subtype(e), e->card,
has_nil(e), is_intern(e));
+ ne->flag = e->flag;
+ break;
+ case e_cmp:
+ if (e->flag == cmp_or) {
+ list *l = exps_copy(sa, e->l);
+ list *r = exps_copy(sa, e->r);
+ if (l && r)
+ ne = exp_or(sa, l,r);
+ } else if (e->flag == cmp_in || e->flag == cmp_notin || e->flag
== cmp_filter) {
+ sql_exp *l = exp_copy(sa, e->l);
+ list *r = exps_copy(sa, e->r);
+
+ if (l && r) {
+ if (e->flag == cmp_filter)
+ ne = exp_filter(sa, l, r, e->f);
+ else
+ ne = exp_in(sa, l, r, e->flag);
+ }
+ } else {
+ l = exp_copy(sa, e->l);
+ r = exp_copy(sa, e->r);
+
+ if (e->f) {
+ r2 = exp_copy(sa, e->f);
+ if (l && r && r2)
+ ne = exp_compare2(sa, l, r, r2,
e->flag);
+ } else if (l && r) {
+ ne = exp_compare(sa, l, r, e->flag);
+ }
+ }
+ break;
+ case e_convert:
+ l = exp_copy(sa, e->l);
+ if (l)
+ ne = exp_convert(sa, l, exp_fromtype(e), exp_totype(e));
+ break;
+ case e_aggr:
+ case e_func: {
+ list *l = e->l, *nl = NULL;
+
+ if (!l) {
+ return e;
+ } else {
+ nl = exps_copy(sa, l);
+ if (!nl)
+ return NULL;
+ }
+ if (e->type == e_func)
+ ne = exp_op(sa, nl, e->f);
+ else
+ ne = exp_aggr(sa, nl, e->f, need_distinct(e),
need_no_nil(e), e->card, has_nil(e));
+ break;
+ }
+ case e_atom:
+ if (e->l)
+ ne = exp_atom(sa, e->l);
+ else if (!e->r)
+ ne = exp_atom_ref(sa, e->flag, &e->tpe);
+ else
+ ne = exp_param(sa, e->r, &e->tpe, e->flag);
+ break;
+ }
+ if (ne && e->p)
+ ne->p = prop_copy(sa, e->p);
+ if (e->name)
+ exp_setname(sa, ne, exp_find_rel_name(e), exp_name(e));
+ return ne;
+}
+
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
@@ -69,6 +69,10 @@ extern void exp_setname(sql_allocator *s
extern void noninternexp_setname(sql_allocator *sa, sql_exp *e, char *rname,
char *name );
extern sql_exp* exp_label(sql_allocator *sa, sql_exp *e, int nr);
+extern sql_exp * exp_copy( sql_allocator *sa, sql_exp *e);
+extern list * exps_copy( sql_allocator *sa, list *exps);
+
+
extern void exp_swap( sql_exp *e );
extern sql_subtype * exp_subtype( sql_exp *e );
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
@@ -317,102 +317,6 @@ rel_properties(mvc *sql, global_props *g
}
}
-static sql_exp * exp_copy( sql_allocator *sa, sql_exp *e);
-
-static list *
-exps_copy( sql_allocator *sa, list *exps)
-{
- node *n;
- list *nl = new_exp_list(sa);
-
- for(n = exps->h; n; n = n->next) {
- sql_exp *arg = n->data;
-
- arg = exp_copy(sa, arg);
- if (!arg)
- return NULL;
- append(nl, arg);
- }
- return nl;
-}
-
-static sql_exp *
-exp_copy( sql_allocator *sa, sql_exp * e)
-{
- sql_exp *l, *r, *r2, *ne = NULL;
-
- switch(e->type){
- case e_column:
- ne = exp_column(sa, e->l, e->r, exp_subtype(e), e->card,
has_nil(e), is_intern(e));
- ne->flag = e->flag;
- break;
- case e_cmp:
- if (e->flag == cmp_or) {
- list *l = exps_copy(sa, e->l);
- list *r = exps_copy(sa, e->r);
- if (l && r)
- ne = exp_or(sa, l,r);
- } else if (e->flag == cmp_in || e->flag == cmp_notin || e->flag
== cmp_filter) {
- sql_exp *l = exp_copy(sa, e->l);
- list *r = exps_copy(sa, e->r);
-
- if (l && r) {
- if (e->flag == cmp_filter)
- ne = exp_filter(sa, l, r, e->f);
- else
- ne = exp_in(sa, l, r, e->flag);
- }
- } else {
- l = exp_copy(sa, e->l);
- r = exp_copy(sa, e->r);
-
- if (e->f) {
- r2 = exp_copy(sa, e->f);
- if (l && r && r2)
- ne = exp_compare2(sa, l, r, r2,
e->flag);
- } else if (l && r) {
- ne = exp_compare(sa, l, r, e->flag);
- }
- }
- break;
- case e_convert:
- l = exp_copy(sa, e->l);
- if (l)
- ne = exp_convert(sa, l, exp_fromtype(e), exp_totype(e));
- break;
- case e_aggr:
- case e_func: {
- list *l = e->l, *nl = NULL;
-
- if (!l) {
- return e;
- } else {
- nl = exps_copy(sa, l);
- if (!nl)
- return NULL;
- }
- if (e->type == e_func)
- ne = exp_op(sa, nl, e->f);
- else
- ne = exp_aggr(sa, nl, e->f, need_distinct(e),
need_no_nil(e), e->card, has_nil(e));
- break;
- }
- case e_atom:
- if (e->l)
- ne = exp_atom(sa, e->l);
- else if (!e->r)
- ne = exp_atom_ref(sa, e->flag, &e->tpe);
- else
- ne = exp_param(sa, e->r, &e->tpe, e->flag);
- break;
- }
- if (ne && e->p)
- ne->p = prop_copy(sa, e->p);
- if (e->name)
- exp_setname(sa, ne, exp_find_rel_name(e), exp_name(e));
- return ne;
-}
-
static void
get_relations(sql_rel *rel, list *rels)
{
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list