Update of /cvsroot/monetdb/sql/src/server
In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv6054/src/server
Modified Files:
Tag: Nov2009
rel_bin.mx sql_statement.mx
Log Message:
implemented 2 new stmts (joinN and selectN)
needed for the bugs related to like-joins.
Index: rel_bin.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_bin.mx,v
retrieving revision 1.93.2.1
retrieving revision 1.93.2.2
diff -u -d -r1.93.2.1 -r1.93.2.2
--- rel_bin.mx 6 Oct 2009 13:32:27 -0000 1.93.2.1
+++ rel_bin.mx 22 Nov 2009 20:29:14 -0000 1.93.2.2
@@ -562,6 +562,18 @@
}
return lstmt;
}
+ if (left && right && re->card > CARD_ATOM &&
!is_select) {
+ /* create l and r, gen operator func */
+ char *like = (e->flag == cmp_like || e->flag
== cmp_notlike)?"like":"ilike";
+ int anti = (e->flag == cmp_notlike || e->flag
== cmp_notilike);
+ sql_subtype *s = sql_bind_localtype("str");
+ sql_subfunc *f =
sql_bind_func3(sql->session->schema, like, s, s, s);
+
+ stmt *j =
stmt_joinN(stmt_list(append(create_stmt_list(),l)),
stmt_list(append(append(create_stmt_list(),r),r2)), f);
+ if (is_anti(e) || anti)
+ j->flag |= ANTI;
+ return j;
+ }
return stmt_likeselect(l, r, r2, (comp_type)e->flag);
}
if (left && right && re->card > CARD_ATOM && !is_select) {
Index: sql_statement.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_statement.mx,v
retrieving revision 1.190
retrieving revision 1.190.2.1
diff -u -d -r1.190 -r1.190.2.1
--- sql_statement.mx 4 Aug 2009 07:24:43 -0000 1.190
+++ sql_statement.mx 22 Nov 2009 20:29:14 -0000 1.190.2.1
@@ -77,14 +77,17 @@
st_atom,
st_select,
st_select2,
+ st_selectN,
st_uselect,
st_uselect2,
+ st_uselectN,
st_semijoin,
st_relselect,
st_releqjoin,
st_join,
st_join2,
+ st_joinN,
st_outerjoin,
st_diff,
st_union,
@@ -221,9 +224,7 @@
extern stmt *stmt_atom_lng(lng l);
extern stmt *stmt_bool(int b);
extern stmt *stmt_select(stmt *op1, stmt *op2, comp_type cmptype);
-extern stmt *stmt_likeselect(stmt *op1, stmt *op2, stmt *op3, comp_type
cmptype);
extern stmt *stmt_uselect(stmt *op1, stmt *op2, comp_type cmptype);
-
/* cmp
0 == l < x < h
1 == l < x <= h
@@ -232,6 +233,10 @@
*/
extern stmt *stmt_select2(stmt *op1, stmt *op2, stmt *op3, int cmp);
extern stmt *stmt_uselect2(stmt *op1, stmt *op2, stmt *op3, int cmp);
+extern stmt *stmt_selectN(stmt *l, stmt *r, sql_subfunc *op);
+extern stmt *stmt_uselectN(stmt *l, stmt *r, sql_subfunc *op);
+extern stmt *stmt_likeselect(stmt *op1, stmt *op2, stmt *op3, comp_type
cmptype);
+
extern stmt *stmt_semijoin(stmt *op1, stmt *op2);
extern stmt *stmt_relselect_init(void);
@@ -242,6 +247,10 @@
extern stmt *stmt_releqjoin1(list *joins);
extern stmt *stmt_releqjoin2(list *l1, list *l2);
extern stmt *stmt_join(stmt *op1, stmt *op2, comp_type cmptype);
+
+/* generic join operator, with a left and right statement list */
+extern stmt *stmt_joinN(stmt *l, stmt *r, sql_subfunc *op);
+
extern stmt *stmt_join2(stmt *l, stmt *ra, stmt *rb, int cmp);
extern stmt *stmt_project(stmt *op1, stmt *op2);
extern stmt *stmt_outerjoin(stmt *op1, stmt *op2, comp_type cmptype);
@@ -359,13 +368,16 @@
ST(select);
ST(select2);
ST(uselect);
+ ST(selectN);
ST(uselect2);
+ ST(uselectN);
ST(semijoin);
ST(relselect);
ST(releqjoin);
ST(join);
ST(join2);
+ ST(joinN);
ST(outerjoin);
ST(diff);
ST(union);
@@ -620,6 +632,7 @@
case st_union:
case st_join:
case st_join2:
+ case st_joinN:
case st_outerjoin:
case st_derive:
case st_unique:
@@ -746,8 +759,10 @@
case st_select:
case st_select2:
+ case st_selectN:
case st_uselect:
case st_uselect2:
+ case st_uselectN:
case st_semijoin:
if (s->op1.stval)
stmt_destroy(s->op1.stval);
@@ -755,7 +770,7 @@
stmt_destroy(s->op2.stval);
if (s->op3.stval)
stmt_destroy(s->op3.stval);
- if (s->op4.stval)
+ if (s->type != st_selectN && s->type != st_uselectN &&
s->op4.stval)
stmt_destroy(s->op4.stval);
break;
default:
@@ -860,6 +875,7 @@
case st_union:
case st_join:
case st_join2:
+ case st_joinN:
case st_outerjoin:
case st_derive:
case st_unique:
@@ -974,8 +990,10 @@
case st_select:
case st_select2:
+ case st_selectN:
case st_uselect:
case st_uselect2:
+ case st_uselectN:
case st_semijoin:
case st_connection:
if (s->op1.stval)
@@ -984,7 +1002,7 @@
push(s->op2.stval);
if (s->op3.stval)
push(s->op3.stval);
- if (s->op4.stval)
+ if (s->type != st_selectN && s->type != st_uselectN &&
s->op4.stval)
push(s->op4.stval);
break;
}
@@ -1546,6 +1564,20 @@
}
stmt *
+stmt_selectN(stmt *op1, stmt *op2, sql_subfunc *op)
+{
+ stmt *s = stmt_create(st_selectN);
+
+ s->op1.stval = op1;
+ s->op2.stval = op2;
+ s->op4.funcval = op;
+ s->nrcols = (op1->nrcols==2)?2:1;
+ s->h = stmt_dup(s->op1.stval->h);
+ s->t = stmt_dup(s->op1.stval->t);
+ return s;
+}
+
+stmt *
stmt_uselect(stmt *op1, stmt *op2, comp_type cmptype)
{
stmt *s = stmt_create(st_uselect);
@@ -1575,6 +1607,19 @@
}
stmt *
+stmt_uselectN(stmt *op1, stmt *op2, sql_subfunc *op)
+{
+ stmt *s = stmt_create(st_uselectN);
+
+ s->op1.stval = op1;
+ s->op2.stval = op2;
+ s->op4.funcval = op;
+ s->nrcols = (op1->nrcols==2)?2:1;
+ s->h = stmt_dup(s->op1.stval->h);
+ return s;
+}
+
+stmt *
stmt_semijoin(stmt *op1, stmt *op2)
{
stmt *s = stmt_create(st_semijoin);
@@ -1719,6 +1764,19 @@
return s;
}
+stmt *
+stmt_joinN(stmt *l, stmt *r, sql_subfunc *op)
+{
+ stmt *s = stmt_create(st_joinN);
+
+ s->op1.stval = l;
+ s->op2.stval = r;
+ s->op4.funcval = op;
+ s->nrcols = 2;
+ s->h = stmt_dup(l->h);
+ s->t = stmt_dup(r->h);
+ return s;
+}
stmt *
stmt_outerjoin(stmt *op1, stmt *op2, comp_type cmptype)
@@ -2072,7 +2130,6 @@
return s;
}
-
sql_subtype *
tail_type(stmt *st)
{
@@ -2082,6 +2139,7 @@
case st_outerjoin:
return tail_type(st->op2.stval);
case st_join2:
+ case st_joinN:
/* The tail type of a join2 is the head of the second operant!,
ie should be 'oid' */
return head_type(st->op2.stval);
@@ -2098,8 +2156,10 @@
case st_diff:
case st_select:
case st_select2:
+ case st_selectN:
case st_uselect:
case st_uselect2:
+ case st_uselectN:
case st_limit:
case st_semijoin:
case st_unique:
@@ -2177,13 +2237,16 @@
case st_diff:
case st_join:
case st_join2:
+ case st_joinN:
case st_outerjoin:
case st_semijoin:
case st_mirror:
case st_select:
case st_select2:
+ case st_selectN:
case st_uselect:
case st_uselect2:
+ case st_uselectN:
case st_column:
case st_append:
case st_gen_group:
@@ -2234,8 +2297,10 @@
case st_Nop:
case st_select:
case st_select2:
+ case st_selectN:
case st_uselect:
case st_uselect2:
+ case st_uselectN:
case st_atom:
return 0;
case st_unop:
@@ -2293,6 +2358,7 @@
case st_const:
case st_join:
case st_join2:
+ case st_joinN:
case st_outerjoin:
case st_derive:
case st_rs_column:
@@ -2308,8 +2374,10 @@
case st_gen_group:
case st_select:
case st_select2:
+ case st_selectN:
case st_uselect:
case st_uselect2:
+ case st_uselectN:
case st_limit:
case st_semijoin:
case st_diff:
@@ -2368,6 +2436,7 @@
case st_const:
case st_join:
case st_join2:
+ case st_joinN:
case st_outerjoin:
case st_derive:
return table_name(st->op2.stval);
@@ -2381,8 +2450,10 @@
case st_gen_group:
case st_select:
case st_select2:
+ case st_selectN:
case st_uselect:
case st_uselect2:
+ case st_uselectN:
case st_limit:
case st_semijoin:
case st_diff:
@@ -2426,6 +2497,7 @@
case st_const:
case st_join:
case st_join2:
+ case st_joinN:
case st_outerjoin:
case st_derive:
return schema_name(st->op2.stval);
@@ -2438,8 +2510,10 @@
case st_gen_group:
case st_select:
case st_select2:
+ case st_selectN:
case st_uselect:
case st_uselect2:
+ case st_uselectN:
case st_limit:
case st_semijoin:
case st_diff:
@@ -2636,7 +2710,7 @@
case st_aggr:
case st_unop: case st_binop: case st_Nop:
case st_diff: case st_union:
- case st_join: case st_join2: case st_outerjoin:
+ case st_join: case st_join2: case st_joinN: case st_outerjoin:
case st_derive:
case st_unique:
case st_alias:
@@ -2651,8 +2725,8 @@
case st_group: case st_group_ext:
- case st_select: case st_select2:
- case st_uselect: case st_uselect2:
+ case st_select: case st_select2: case st_selectN:
+ case st_uselect: case st_uselect2: case st_uselectN:
case st_semijoin:
case st_export:
@@ -2800,6 +2874,9 @@
case st_select2:
case st_uselect2:
dump3(s, "select", nr); break;
+ case st_selectN:
+ case st_uselectN:
+ dump2(s, "selectN", nr); break;
case st_semijoin: dump2(s, "semijoin", nr); break;
case st_diff: dump2(s, "diff", nr); break;
case st_union: dump2(s, "union", nr); break;
@@ -2812,6 +2889,8 @@
break;
case st_join2:
dump3(s, "join", nr); break;
+ case st_joinN:
+ dump2(s, "joinN", nr); break;
case st_group: dump1(s, "group", nr); break;
case st_group_ext: dump1(s, "extent", nr); break;
case st_derive: dump2(s, "derive", nr); break;
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus on
what you do best, core application coding. Discover what's new with
Crystal Reports now. http://p.sf.net/sfu/bobj-july
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins