Changeset: 22ec25e68cfb for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=22ec25e68cfb
Modified Files:
Branch: default
Log Message:
merge
diffs (truncated from 1189 to 300 lines):
diff -r 0b0fe4f918d3 -r 22ec25e68cfb sql/rel.txt
--- a/sql/rel.txt Fri Dec 03 22:00:42 2010 +0100
+++ b/sql/rel.txt Fri Dec 03 22:01:22 2010 +0100
@@ -69,6 +69,8 @@
or
-> r parameter ( ->r = varname, ->type = subtype, ->flag = level)
or
+ -> f list of atom expressions
+ or
-> numbered variable ( ->flag = nr, ->type = subtype)
e_convert
@@ -88,7 +90,12 @@
cmp_notlike = 6,
cmp_like = 7,
cmp_all = 8, cross product
- cmp_or = 9 or handling
+ cmp_or = 9, or handling
+ cmp_in = 10, in list handling
+ cmp_notin = 11 not in list handling
+
+ cmp_in/cmp_notin
+ ->r is a list of values
)
e_func
diff -r 0b0fe4f918d3 -r 22ec25e68cfb sql/src/backends/monet5/sql_gencode.mx
--- a/sql/src/backends/monet5/sql_gencode.mx Fri Dec 03 22:00:42 2010 +0100
+++ b/sql/src/backends/monet5/sql_gencode.mx Fri Dec 03 22:01:22 2010 +0100
@@ -1352,7 +1352,8 @@
f->type->eclass &&
f->type->eclass != EC_INTERVAL &&
f->type->eclass != EC_DEC &&
- t->digits == 0
+ (t->digits == 0 ||
+ f->digits == t->digits)
) {
s->nr = l;
break;
diff -r 0b0fe4f918d3 -r 22ec25e68cfb sql/src/backends/monet5/vaults/Tests/All
--- a/sql/src/backends/monet5/vaults/Tests/All Fri Dec 03 22:00:42 2010 +0100
+++ b/sql/src/backends/monet5/vaults/Tests/All Fri Dec 03 22:01:22 2010 +0100
@@ -1,1 +1,1 @@
-vault00
+#vault00
diff -r 0b0fe4f918d3 -r 22ec25e68cfb sql/src/server/rel_bin.c
--- a/sql/src/server/rel_bin.c Fri Dec 03 22:00:42 2010 +0100
+++ b/sql/src/server/rel_bin.c Fri Dec 03 22:01:22 2010 +0100
@@ -175,6 +175,32 @@
}
}
+static stmt *
+handle_in_exps( mvc *sql, sql_exp *ce, list *nl, stmt *left, stmt *right,
group *grp, int in, int use_r)
+{
+ node *n;
+ stmt *s, *c;
+
+ /* create bat append values */
+ s = stmt_temp(sql->sa, exp_subtype(ce));
+ for( n = nl->h; n; n = n->next) {
+ sql_exp *e = n->data;
+ stmt *i = exp_bin(sql, use_r?e->r:e, left, right, grp, NULL);
+
+ s = stmt_append(sql->sa, s, i);
+ }
+ c = exp_bin(sql, ce, left, right, grp, NULL);
+ /*s = stmt_mark_tail(sql->sa, stmt_reverse(sql->sa,
stmt_semijoin(sql->sa, stmt_reverse(sql->sa, c), stmt_reverse(sql->sa, s))),
0);*/
+ /* not really a projection join, therefore make sure left values are
unique !! */
+ c = column(sql->sa, c);
+ if (in)
+ s = stmt_project(sql->sa, c, stmt_reverse(sql->sa,
stmt_unique(sql->sa, s, NULL)));
+ else
+ s = stmt_reverse(sql->sa, stmt_diff(sql->sa,
stmt_reverse(sql->sa, c), stmt_reverse(sql->sa, stmt_unique(sql->sa, s,
NULL))));
+ s = stmt_const(sql->sa, s, NULL);
+ return s;
+}
+
/* For now this only works if all or's are part of the 'IN' */
static stmt *
handle_equality_exps( mvc *sql, list *l, list *r, stmt *left, stmt *right,
group *grp )
@@ -182,7 +208,6 @@
node *n;
sql_exp *ce = NULL;
list *nl = new_exp_list(sql->sa);
- stmt *s = NULL, *c;
get_exps(nl, l);
get_exps(nl, r);
@@ -197,20 +222,23 @@
if (!exp_match(ce, e->l))
return NULL;
}
+ return handle_in_exps( sql, ce, nl, left, right, grp, 1, 1);
+}
+
+static stmt *
+value_list( mvc *sql, list *vals)
+{
+ node *n;
+ stmt *s;
/* create bat append values */
- s = stmt_temp(sql->sa, exp_subtype(ce));
- for( n = nl->h; n; n = n->next) {
+ s = stmt_temp(sql->sa, exp_subtype(vals->h->data));
+ for( n = vals->h; n; n = n->next) {
sql_exp *e = n->data;
- stmt *i = exp_bin(sql, e->r, left, right, grp, NULL);
+ stmt *i = exp_bin(sql, e, NULL, NULL, NULL, NULL);
s = stmt_append(sql->sa, s, i);
}
- c = exp_bin(sql, ce, left, right, grp, NULL);
- /*s = stmt_mark_tail(sql->sa, stmt_reverse(sql->sa,
stmt_semijoin(sql->sa, stmt_reverse(sql->sa, c), stmt_reverse(sql->sa, s))),
0);*/
- /* not really a projection join, therefore make sure left values are
unique !! */
- s = stmt_project(sql->sa, c, stmt_reverse(sql->sa, stmt_unique(sql->sa,
s, NULL)));
- s = stmt_const(sql->sa, s, NULL);
return s;
}
@@ -231,6 +259,8 @@
s = stmt_atom(sql->sa, atom_dup(sql->sa, a));
} else if (e->r) { /* parameters */
s = stmt_var(sql->sa, sa_strdup(sql->sa, e->r),
e->tpe.type?&e->tpe:NULL, 0, e->flag);
+ } else if (e->f) { /* values */
+ s = value_list(sql, e->f);
} else { /* arguments */
s = stmt_varnr(sql->sa, e->flag,
e->tpe.type?&e->tpe:NULL);
}
@@ -394,6 +424,9 @@
sql_exp *re = e->r, *re2 = e->f;
prop *p;
+ if (e->flag == cmp_in || e->flag == cmp_notin) {
+ return handle_in_exps(sql, e->l, e->r, left, right,
grp, (e->flag == cmp_in), 0);
+ }
if (e->flag == cmp_or) {
list *l = e->l;
node *n;
@@ -1615,6 +1648,9 @@
sel = NULL;
} else {
sel = stmt_join(sql->sa, sel, predicate, cmp_all);
+ predicate = NULL;
+ if (!sub)
+ predicate = sel;
}
}
/* construct relation */
diff -r 0b0fe4f918d3 -r 22ec25e68cfb sql/src/server/rel_dump.c
--- a/sql/src/server/rel_dump.c Fri Dec 03 22:00:42 2010 +0100
+++ b/sql/src/server/rel_dump.c Fri Dec 03 22:01:22 2010 +0100
@@ -62,6 +62,8 @@
case cmp_ilike: r = "ilike"; break;
case cmp_all: r = "all"; break;
case cmp_or: r = "or"; break;
+ case cmp_in: r = "in"; break;
+ case cmp_notin: r = "notin"; break;
default:
r = "";
}
@@ -108,6 +110,9 @@
if (e->r) { /* named parameters */
char *name = e->r;
mnstr_printf(fout, "%s", name);
+ } else if (e->f) { /* values list */
+ list *l = e->f;
+ exp_print(sql, fout, l->h->data, depth, 0, 0);
} else { /* numbered arguments */
mnstr_printf(fout, "A%d", e->flag);
}
@@ -141,7 +146,11 @@
alias = 0;
break;
case e_cmp:
- if (e->flag == cmp_or) {
+ if (e->flag == cmp_in || e->flag == cmp_notin) {
+ exp_print(sql, fout, e->l, depth, alias, 1);
+ cmp_print(sql, fout, e->flag );
+ exps_print(sql, fout, e->r, depth, alias, 1);
+ } else if (e->flag == cmp_or) {
exps_print(sql, fout, e->l, depth, alias, 1);
cmp_print(sql, fout, e->flag );
exps_print(sql, fout, e->r, depth, alias, 1);
diff -r 0b0fe4f918d3 -r 22ec25e68cfb sql/src/server/rel_exp.c
--- a/sql/src/server/rel_exp.c Fri Dec 03 22:00:42 2010 +0100
+++ b/sql/src/server/rel_exp.c Fri Dec 03 22:01:22 2010 +0100
@@ -82,6 +82,20 @@
return e;
}
+sql_exp *
+exp_in(sql_allocator *sa, sql_exp *l, list *r, int cmptype)
+{
+ sql_exp *e = exp_create(sa, e_cmp);
+
+ e->card = l->card;
+ e->l = l;
+ e->r = r;
+ assert( cmptype == cmp_in || cmptype == cmp_notin);
+ e->flag = cmptype;
+ return e;
+}
+
+
static sql_subtype*
dup_subtype(sql_allocator *sa, sql_subtype *st)
{
@@ -225,6 +239,15 @@
}
sql_exp *
+exp_values(sql_allocator *sa, list *exps)
+{
+ sql_exp *e = exp_create(sa, e_atom);
+ e->card = CARD_MULTI;
+ e->f = exps;
+ return e;
+}
+
+sql_exp *
exp_alias(sql_allocator *sa, char *arname, char *acname, char *org_rname, char
*org_cname, sql_subtype *t, int card, int has_nils, int intern)
{
sql_exp *e = exp_create(sa, e_column);
@@ -431,17 +454,17 @@
if (e1->type != e_cmp || e2->type != e_cmp)
return 0;
- if (e1->flag != cmp_or && e1_r && e1_r->card == 1 &&
- e2->flag != cmp_or && e2_r && e2_r->card == 1)
+ if (!is_complex_exp(e1->flag) && e1_r && e1_r->card == 1 &&
+ !is_complex_exp(e2->flag) && e2_r && e2_r->card == 1)
return exp_match_exp(e1->l, e2->l);
- if (e1->flag != cmp_or && e1_r && e1_r->card == 1 &&
+ if (!is_complex_exp(e1->flag) && e1_r && e1_r->card == 1 &&
e2->flag == cmp_or)
return exp_match_col_exps(e1->l, e2->l) &&
exp_match_col_exps(e1->l, e2->r);
if (e1->flag == cmp_or &&
- e2->flag != cmp_or && e2_r && e2_r->card == 1)
+ !is_complex_exp(e2->flag) && e2_r && e2_r->card == 1)
return exp_match_col_exps(e2->l, e1->l) &&
exp_match_col_exps(e2->l, e1->r);
@@ -502,7 +525,7 @@
if (e1->type == e2->type) {
switch(e1->type) {
case e_cmp:
- if (e1->flag == e2->flag && e1->flag != cmp_or &&
+ if (e1->flag == e2->flag && !is_complex_exp(e1->flag) &&
exp_match_exp(e1->l, e2->l) &&
exp_match_exp(e1->r, e2->r) &&
((!e1->f && !e2->f) || exp_match_exp(e1->f, e2->f)))
@@ -558,7 +581,7 @@
{
sql_exp *l = e->l;
sql_exp *r = e->r;
- if (e->type == e_cmp && e->flag != cmp_or && l && r && r->card >=
CARD_AGGR)
+ if (e->type == e_cmp && !is_complex_exp(e->flag) && l && r && r->card
>= CARD_AGGR)
return 0;
if (e->type == e_cmp && e->flag == cmp_or && e->card >= CARD_AGGR)
if (exps_are_joins(e->l) == 0 && exps_are_joins(e->r) == 0)
@@ -611,7 +634,7 @@
/* only simple compare expressions, ie not or lists
or range expressions (e->f)
*/
- if (e->type == e_cmp && e->flag != cmp_or && e->l && e->r && !e->f &&
e->card >= CARD_AGGR && !complex_select(e))
+ if (e->type == e_cmp && !is_complex_exp(e->flag) && e->l && e->r &&
!e->f && e->card >= CARD_AGGR && !complex_select(e))
return 0;
return -1;
}
@@ -704,7 +727,7 @@
int
exp_is_correlation(sql_exp *e, sql_rel *r )
{
- if (e->type == e_cmp && e->flag != cmp_or) {
+ if (e->type == e_cmp && !is_complex_exp(e->flag)) {
sql_exp *le = rel_find_exp(r->l, e->l);
sql_exp *re = rel_find_exp(r->r, e->r);
diff -r 0b0fe4f918d3 -r 22ec25e68cfb sql/src/server/rel_exp.h
--- a/sql/src/server/rel_exp.h Fri Dec 03 22:00:42 2010 +0100
+++ b/sql/src/server/rel_exp.h Fri Dec 03 22:01:22 2010 +0100
@@ -25,6 +25,7 @@
extern sql_exp *exp_compare(sql_allocator *sa, sql_exp *l, sql_exp *r, int
cmptype);
extern sql_exp *exp_compare2(sql_allocator *sa, sql_exp *l, sql_exp *r,
sql_exp *h, int cmptype);
extern sql_exp *exp_or(sql_allocator *sa, list *l, list *r);
+extern sql_exp *exp_in(sql_allocator *sa, sql_exp *l, list *r, int cmptype);
#define exp_fromtype(e) ((list*)e->r)->h->data
#define exp_totype(e) ((list*)e->r)->h->next->data
@@ -54,6 +55,8 @@
extern sql_exp * exp_atom_ptr(sql_allocator *sa, void *s);
extern sql_exp * exp_atom_ref(sql_allocator *sa, int i, sql_subtype *tpe);
extern sql_exp * exp_param(sql_allocator *sa, char *name, sql_subtype *tpe,
int frame);
+extern sql_exp * exp_values(sql_allocator *sa, list *exps);
+
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list