Update of /cvsroot/monetdb/sql/src/server
In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv1066/src/server

Modified Files:
        rel_bin.mx rel_dump.mx rel_exp.mx rel_optimizer.mx 
        rel_semantic.mx sql_parser.mx sql_rel2bin.mx sql_scan.mx 
Log Message:
the optimizer now recognizes range joins and selects


U sql_rel2bin.mx
Index: sql_rel2bin.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_rel2bin.mx,v
retrieving revision 1.132
retrieving revision 1.133
diff -u -d -r1.132 -r1.133
--- sql_rel2bin.mx      13 Mar 2009 10:24:55 -0000      1.132
+++ sql_rel2bin.mx      8 Jun 2009 04:43:11 -0000       1.133
@@ -552,8 +552,8 @@
                        /* pairwise (re-)combine single-sided range selects to 
double-sided range selects */
                        /*
                         *      0) a> x && a< y  =>  x< a< y
-                        *      1) a> x && a<=y  =>  x< a<=y
-                        *      2) a>=x && a< y  =>  x<=a< y
+                        *      1) a>=x && a< y  =>  x<=a< y
+                        *      2) a> x && a<=y  =>  x< a<=y
                         *      3) a>=x && a<=y  =>  x<=a<=y
                         */
                        for (flg = 0; flg <= 3; flg++) {
@@ -565,13 +565,13 @@
                                        cr = cmp_lt;
                                        break;
                                case 1:
-                                       cl = cmp_gt;
-                                       cr = cmp_lte;
-                                       break;
-                               case 2:
                                        cl = cmp_gte;
                                        cr = cmp_lt;
                                        break;
+                               case 2:
+                                       cl = cmp_gt;
+                                       cr = cmp_lte;
+                                       break;
                                case 3:
                                        cl = cmp_gte;
                                        cr = cmp_lte;

U rel_bin.mx
Index: rel_bin.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_bin.mx,v
retrieving revision 1.78
retrieving revision 1.79
diff -u -d -r1.78 -r1.79
--- rel_bin.mx  18 May 2009 07:18:14 -0000      1.78
+++ rel_bin.mx  8 Jun 2009 04:43:10 -0000       1.79
@@ -555,10 +555,12 @@
                                l = 
stmt_const(bin_first_column(swapped?right:left), l); 
                        if (r->nrcols == 0)
                                r = 
stmt_const(bin_first_column(swapped?left:right), r); 
-                       if (swapped) {
-                               s = stmt_join(r, stmt_reverse(l), 
swap_compare((comp_type)e->flag));
-                       } else if (r2) {
+                       if (r2) {
                                s = stmt_join2(l, r, r2, (comp_type)e->flag);
+                               if (swapped) 
+                                       s = stmt_reverse(s);
+                       } else if (swapped) {
+                               s = stmt_join(r, stmt_reverse(l), 
swap_compare((comp_type)e->flag));
                        } else {
                                s = stmt_join(l, stmt_reverse(r), 
(comp_type)e->flag);
                        }
@@ -566,14 +568,22 @@
                        if (r2) {
                                if (l->nrcols == 0 && r->nrcols == 0 && 
r2->nrcols == 0) {
                                        sql_subtype *bt = 
sql_bind_localtype("bit");
-                                       sql_subfunc *f = 
sql_bind_func(sql->session->schema, compare_func(range2compare(e->flag&3)), 
tail_type(l), tail_type(r));
+                                       sql_subfunc *lf = 
sql_bind_func(sql->session->schema, compare_func(range2lcompare(e->flag)), 
tail_type(l), tail_type(r));
+                                       sql_subfunc *rf = 
sql_bind_func(sql->session->schema, compare_func(range2rcompare(e->flag)), 
tail_type(l), tail_type(r));
                                        sql_subfunc *a = 
sql_bind_func(sql->session->schema, "and", bt, bt);
-                                       assert(f && a);
+                                       assert(lf && rf && a);
+                                       l = stmt_dup(l);
                                        s = stmt_binop(
-                                               stmt_binop(r, stmt_dup(l), f), 
-                                               stmt_binop(l, r2, 
sql_dup_func(f)), a);
-                               } else
+                                               stmt_binop(l, r, lf), 
+                                               stmt_binop(l, r2, rf), a);
+                               } else if (l->nrcols > 0 && r->nrcols > 0 && 
r2->nrcols > 0) {
+                                       l = stmt_dup(l);
+                                       s = stmt_semijoin(
+                                               stmt_uselect(l, r, 
range2lcompare(e->flag)),
+                                               stmt_uselect(l, r2, 
range2rcompare(e->flag)));
+                               } else {
                                        s = stmt_uselect2(l, r, r2, 
(comp_type)e->flag);
+                               }
                        } else {
                                /* value compare or select */
                                if (l->nrcols == 0 && r->nrcols == 0) {

U rel_optimizer.mx
Index: rel_optimizer.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_optimizer.mx,v
retrieving revision 1.61
retrieving revision 1.62
diff -u -d -r1.61 -r1.62
--- rel_optimizer.mx    4 Jun 2009 20:27:54 -0000       1.61
+++ rel_optimizer.mx    8 Jun 2009 04:43:11 -0000       1.62
@@ -2196,8 +2196,11 @@
                break;
 
        case op_topn: 
-               if (proj)
+               if (proj) {
                        rel = rel ->l;
+                       rel_mark_used(sql, rel, proj);
+                       break;
+               }
        case op_project:
        case op_groupby: 
                if (proj && rel->l) {
@@ -2596,9 +2599,8 @@
                                /*sql_exp *lf = f->l;*/
                                sql_exp *rf = f->r;
 
-                               assert(f->type == e_cmp && e->flag != cmp_or);
-                               if (rf->card == CARD_ATOM && e->flag < 
cmp_equal) {
-                                       /*printf("possible candidate\n");*/
+                               if (rf->card == CARD_ATOM && f->flag < 
cmp_equal) {
+                                       printf("possible candidate\n");
                                }
                        }
                }
@@ -2621,6 +2623,119 @@
        return rel;
 }
 
+static list *
+exp_merge_range(list *exps)
+{
+       node *n, *m;
+       for (n=exps->h; n && n->next; n = n->next) {
+               sql_exp *e = n->data;
+               sql_exp *le = e->l;
+               sql_exp *re = e->r;
+
+               /* only look for gt, gte, lte, lt */
+               if (e->type == e_cmp && e->flag < cmp_equal && 
+                   re->card == CARD_ATOM) {
+                       for (m=n->next; m; m = m->next) {
+                               sql_exp *f = m->data;
+                               sql_exp *lf = f->l;
+                               sql_exp *rf = f->r;
+
+                               if (f->type == e_cmp && f->flag < cmp_equal && 
+                                   rf->card == CARD_ATOM && 
+                                   exp_match_exp(le, lf)) {
+                                       sql_exp *ne;
+                                       int swap = 0, lt = 0, gt = 0;
+                                       /* for now only   c1 <[=] x <[=] c2 */ 
+
+                                       swap = lt = (e->flag == cmp_lt || 
e->flag == cmp_lte);
+                                       gt = !lt;
+
+                                       if (gt && 
+                                          (f->flag == cmp_gt ||
+                                           f->flag == cmp_gte)) 
+                                               continue;
+                                       if (lt && 
+                                          (f->flag == cmp_lt ||
+                                           f->flag == cmp_lte)) 
+                                               continue;
+                                       if (!swap) 
+                                               ne = exp_compare2(exp_dup(le), 
exp_dup(re), exp_dup(rf), compare2range(e->flag, f->flag));
+                                       else
+                                               ne = exp_compare2(exp_dup(le), 
exp_dup(rf), exp_dup(re), compare2range(f->flag, e->flag));
+
+                                       list_remove_data(exps, e);
+                                       list_remove_data(exps, f);
+                                       list_append(exps, ne);
+                                       return exp_merge_range(exps);
+                               }
+                       }
+               } else if (e->type == e_cmp && e->flag < cmp_equal && 
+                          re->card > CARD_ATOM) {
+                       for (m=n->next; m; m = m->next) {
+                               sql_exp *f = m->data;
+                               sql_exp *lf = f->l;
+                               sql_exp *rf = f->r;
+
+                               if (f->type == e_cmp && f->flag < cmp_equal && 
+                                   rf->card > CARD_ATOM) {
+                                       sql_exp *ne;
+                                       int swap = 0, lt = 0, gt = 0;
+                                       int ef = e->flag, ff = f->flag;
+                               
+                                       /* is left swapped ? */
+                                       if (exp_match_exp(re, lf)) {
+                                               sql_exp *t = re; 
+
+                                               re = le;
+                                               le = t;
+                                               ef = swap_compare(ef);
+                                       }
+                                       /* is right swapped ? */
+                                       if (exp_match_exp(le, rf)) {
+                                               sql_exp *t = rf; 
+
+                                               rf = lf;
+                                               lf = t;
+                                               ff = swap_compare(ff);
+                                       }
+
+                                       if (!exp_match_exp(le, lf))
+                                               continue;
+
+                                       /* for now only   c1 <[=] x <[=] c2 */ 
+                                       swap = lt = (ef == cmp_lt || ef == 
cmp_lte);
+                                       gt = !lt;
+
+                                       if (gt && (ff == cmp_gt || ff == 
cmp_gte)) 
+                                               continue;
+                                       if (lt && (ff == cmp_lt || ff == 
cmp_lte)) 
+                                               continue;
+                                       if (!swap) 
+                                               ne = exp_compare2(exp_dup(le), 
exp_dup(re), exp_dup(rf), compare2range(ef, ff));
+                                       else
+                                               ne = exp_compare2(exp_dup(le), 
exp_dup(rf), exp_dup(re), compare2range(ff, ef));
+
+                                       list_remove_data(exps, e);
+                                       list_remove_data(exps, f);
+                                       list_append(exps, ne);
+                                       return exp_merge_range(exps);
+                               }
+                       }
+               }
+       }
+       return exps;
+}
+
+static sql_rel *
+rel_find_range(int *changes, mvc *sql, sql_rel *rel) 
+{
+       (void)sql;
+       *changes = 0; 
+       if ((is_join(rel->op) || rel->op == op_select) && rel->exps && 
list_length(rel->exps)>1) 
+               rel->exps = exp_merge_range(rel->exps);
+       return rel;
+}
+
 static int
 is_identity( sql_exp *e, sql_rel *r)
 {
@@ -2814,11 +2929,14 @@
        if (gp.cnt[op_join] || gp.cnt[op_left])
                rel = rewrite(sql, rel, &rel_join_order); 
 
-       /* Todo rel_find_range_exps (and then remove from later code) */
-
-       if (gp.cnt[op_select])
+       if (gp.cnt[op_select]) 
                rel = rewrite(sql, rel, &rel_select_order); 
 
+       if (gp.cnt[op_join] || 
+           gp.cnt[op_left] || gp.cnt[op_right] || gp.cnt[op_full] || 
+           gp.cnt[op_select]) 
+               rel = rewrite(sql, rel, &rel_find_range);
+
        if (gp.cnt[op_select])
                rel = rewrite(sql, rel, &rel_select_use_index); 
 

U rel_dump.mx
Index: rel_dump.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_dump.mx,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -d -r1.37 -r1.38
--- rel_dump.mx 13 Mar 2009 21:17:15 -0000      1.37
+++ rel_dump.mx 8 Jun 2009 04:43:10 -0000       1.38
@@ -145,16 +145,23 @@
                        exps_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->f) {
+                       exp_print(sql, fout, e->r, depth+1, 0, 0);
+                       if (is_anti(e))
+                               stream_printf(fout, " ! ");
+                       cmp_print(sql, fout, 
swap_compare(range2lcompare(e->flag)) );
+                       exp_print(sql, fout, e->l, depth+1, 0, 0);
+                       if (is_anti(e))
+                               stream_printf(fout, " ! ");
+                       cmp_print(sql, fout, range2rcompare(e->flag) );
+                       exp_print(sql, fout, e->f, depth+1, 0, 0);
                } else {
                        exp_print(sql, fout, e->l, depth+1, 0, 0);
                        if (is_anti(e))
                                stream_printf(fout, " ! ");
                        cmp_print(sql, fout, e->flag );
+
                        exp_print(sql, fout, e->r, depth+1, 0, 0);
-                       if (e->f) {
-                               stream_printf(fout, ", ");
-                               exp_print(sql, fout, e->f, depth+1, 0, 0);
-                       }
                }
                break;
        default:

U rel_semantic.mx
Index: rel_semantic.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_semantic.mx,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -d -r1.36 -r1.37
--- rel_semantic.mx     22 Jan 2009 21:58:06 -0000      1.36
+++ rel_semantic.mx     8 Jun 2009 04:43:11 -0000       1.37
@@ -33,7 +33,9 @@
 extern sql_rel *rel_parse(mvc *m, char *query, char emode);
 
 extern comp_type swap_compare( comp_type t );
-extern comp_type range2compare( int r );
+extern comp_type range2lcompare( int r );
+extern comp_type range2rcompare( int r );
+extern int compare2range( comp_type l, comp_type r );
 
 #endif /*_REL_SEMANTIC_H_*/
 
@@ -74,22 +76,43 @@
 }
 
 comp_type 
-range2compare( int r )
+range2lcompare( int r )
 {
-       switch(r) {
-       case 0:
-               return cmp_gt;
-       case 1:
+       if (r&1) {
                return cmp_gte;
-       case 2:
+       } else {
+               return cmp_gt;
+       }
+}
+
+comp_type 
+range2rcompare( int r )
+{
+       if (r&2) {
                return cmp_lte;
-       case 3:
+       } else {
                return cmp_lt;
-       default:
-               return cmp_gte;
        }
 }
 
+int 
+compare2range( comp_type l, comp_type r )
+{
+       if (l == cmp_gt) {
+               if (r == cmp_lt)
+                       return 0;
+               else if (r == cmp_lte)
+                       return 2;
+       } else if (l == cmp_gte) {
+               if (r == cmp_lt)
+                       return 1;
+               else if (r == cmp_lte)
+                       return 3;
+       } 
+       return -1;
+}
+
+
 sql_rel *
 rel_parse(mvc *m, char *query, char emode)
 {

U rel_exp.mx
Index: rel_exp.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_exp.mx,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -d -r1.31 -r1.32
--- rel_exp.mx  9 Apr 2009 14:34:14 -0000       1.31
+++ rel_exp.mx  8 Jun 2009 04:43:10 -0000       1.32
@@ -262,7 +262,8 @@
        return e;
 }
 
-sql_exp * exp_atom( atom *a) 
+sql_exp * 
+exp_atom( atom *a) 
 {
        sql_exp *e = exp_create(e_atom);
        e->card = CARD_ATOM;

U sql_scan.mx
Index: sql_scan.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_scan.mx,v
retrieving revision 1.148
retrieving revision 1.149
diff -u -d -r1.148 -r1.149
--- sql_scan.mx 5 Jun 2009 08:48:27 -0000       1.148
+++ sql_scan.mx 8 Jun 2009 04:43:11 -0000       1.149
@@ -316,7 +316,6 @@
 
        keywords_insert("EXPLAIN", SQL_EXPLAIN);
        keywords_insert("PLAN", SQL_PLAN);
-       keywords_insert("RECORD", SQL_RECORD);
        keywords_insert("DEBUG", SQL_DEBUG);
        keywords_insert("TRACE", SQL_TRACE);
        keywords_insert("PREPARE", PREPARE);

U sql_parser.mx
Index: sql_parser.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_parser.mx,v
retrieving revision 1.309
retrieving revision 1.310
diff -u -d -r1.309 -r1.310
--- sql_parser.mx       5 Jun 2009 08:48:23 -0000       1.309
+++ sql_parser.mx       8 Jun 2009 04:43:11 -0000       1.310
@@ -691,7 +691,7 @@
 %token CHECK CONSTRAINT CREATE
 %token TYPE PROCEDURE FUNCTION AGGREGATE RETURNS EXTERNAL sqlNAME DECLARE
 %token CALL LANGUAGE 
-%token SQL_EXPLAIN SQL_PLAN SQL_RECORD SQL_DEBUG SQL_TRACE PREPARE EXECUTE
+%token SQL_EXPLAIN SQL_PLAN SQL_DEBUG SQL_TRACE PREPARE EXECUTE
 %token DEFAULT DISTINCT DROP
 %token FOREIGN
 %token ENCRYPTED UNENCRYPTED PASSWORD GRANT REVOKE ROLE ADMIN INTO
@@ -4420,7 +4420,6 @@
 |  PREPARE     { $$ = sa_strdup(SA, "prepare"); }
 |  EXECUTE     { $$ = sa_strdup(SA, "execute"); }
 |  SQL_EXPLAIN { $$ = sa_strdup(SA, "explain"); }
-|  SQL_RECORD  { $$ = sa_strdup(SA, "record"); }
 |  SQL_DEBUG   { $$ = sa_strdup(SA, "debug"); }
 |  SQL_TRACE   { $$ = sa_strdup(SA, "trace"); }
 |  AUTO_COMMIT { $$ = sa_strdup(SA, "auto_commit"); }


------------------------------------------------------------------------------
OpenSolaris 2009.06 is a cutting edge operating system for enterprises 
looking to deploy the next generation of Solaris that includes the latest 
innovations from Sun and the OpenSource community. Download a copy and 
enjoy capabilities such as Networking, Storage and Virtualization. 
Go to: http://p.sf.net/sfu/opensolaris-get
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins

Reply via email to