Changeset: b54e36d811a7 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b54e36d811a7
Modified Files:
        sql/backends/monet5/sql_gencode.c
        sql/backends/monet5/sql_scenario.c
        sql/rel.txt
        sql/scripts/09_like.sql
        sql/scripts/Makefile.ag
        sql/server/bin_optimizer.c
        sql/server/rel_bin.c
        sql/server/rel_dump.c
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_optimizer.c
        sql/server/rel_select.c
        sql/server/sql_parser.y
        sql/server/sql_rel2bin.c
        sql/server/sql_statement.c
        sql/server/sql_statement.h
Branch: default
Log Message:

cleanup functions for restarting clients

implemented (i)like now using the filter function sql extension,
this also functions as an example how to use filter functions.


diffs (truncated from 832 to 300 lines):

diff --git a/sql/backends/monet5/sql_gencode.c 
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -900,24 +900,6 @@ _dumpstmt(backend *sql, MalBlkPtr mb, st
                                case cmp_gte:
                                        op = ">=";
                                        break;
-                               case cmp_like:
-                                       op = "like";
-                                       mod = strRef;
-                                       break;
-                               case cmp_ilike:
-                                       op = "ilike";
-                                       mod = strRef;
-                                       break;
-                               case cmp_notlike:
-                                       need_not = TRUE;
-                                       op = "like";
-                                       mod = strRef;
-                                       break;
-                               case cmp_notilike:
-                                       need_not = TRUE;
-                                       op = "ilike";
-                                       mod = strRef;
-                                       break;
                                default:
                                        showException(SQL,"sql","Unknown 
operator");
                                }
@@ -1000,7 +982,10 @@ _dumpstmt(backend *sql, MalBlkPtr mb, st
 
                                if (s->flag == cmp_filter) {
                                        char *mod, *fimp;
+                                       int r2 = -1;
 
+                                       if (s->op3)
+                                               r2 = _dumpstmt(sql, mb, s->op3);
                                        backend_create_func(sql, 
s->op4.funcval->func);
                                        mod  = 
sql_func_mod(s->op4.funcval->func);
                                        fimp = 
sql_func_imp(s->op4.funcval->func);
@@ -1008,44 +993,13 @@ _dumpstmt(backend *sql, MalBlkPtr mb, st
                                        q = newStmt(mb, mod, 
convertOperator(fimp));
                                        q = pushArgument(mb, q, l);
                                        q = pushArgument(mb, q, r);
+                                       if (s->op3)
+                                               q = pushArgument(mb, q, r2);
                                        s->nr = getDestVar(q);
                                        break;
                                }
                                        
                                switch (s->flag) {
-                               case cmp_like:
-                               case cmp_ilike:
-                               {
-                                       int e = _dumpstmt(sql, mb, s->op3);
-                                       q = newStmt1(mb, pcreRef,
-                                                       (s->flag == cmp_like ? 
"like_uselect" : "ilike_uselect"));
-                                       q = pushArgument(mb, q, l);
-                                       q = pushArgument(mb, q, r);
-                                       q = pushArgument(mb, q, e);
-                                       break;
-                               }
-                               case cmp_notlike:
-                               case cmp_notilike:
-                               {
-                                       int e = _dumpstmt(sql, mb, s->op3);
-                                       int k;
-
-                                       q = newStmt1(mb, pcreRef,
-                                                       (s->flag == cmp_notlike 
? "like_uselect" : "ilike_uselect"));
-                                       q = pushArgument(mb, q, l);
-                                       q = pushArgument(mb, q, r);
-                                       q = pushArgument(mb, q, e);
-                                       k = getDestVar(q);
-
-                                       q = newStmt2(mb, algebraRef, 
projectRef);
-                                       q = pushArgument(mb, q, l);
-                                       q = pushNil(mb, q, TYPE_void);
-                                       l = getDestVar(q);
-                                       q = newStmt2(mb, algebraRef, 
kdifferenceRef);
-                                       q = pushArgument(mb, q, l);
-                                       q = pushArgument(mb, q, k);
-                                       break;
-                               }
                                case cmp_equal:{
                                        q = newStmt1(mb, algebraRef, cmd);
                                        q = pushArgument(mb, q, l);
diff --git a/sql/backends/monet5/sql_scenario.c 
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -410,6 +410,8 @@ SQLinitClient(Client c)
                mvc_reset(m, c->fdin, c->fdout, SQLdebug, NR_GLOBAL_VARS);
                backend_reset(be);
        }
+       if (m->session->tr)
+               reset_functions(m->session->tr);
        /* pass through credentials of the user if not console */
        schema = monet5_user_get_def_schema(m, c->user);
        if (!schema) {
@@ -500,10 +502,6 @@ SQLexitClient(Client c)
                res_tables_destroy(m->results);
                m->results= NULL;
 
-               /*
-               if (m->session->tr)
-                       reset_functions(m->session->tr);
-               */
                {
                        backend *be = c->state[MAL_SCENARIO_PARSER];
 
diff --git a/sql/rel.txt b/sql/rel.txt
--- a/sql/rel.txt
+++ b/sql/rel.txt
@@ -105,16 +105,17 @@ e_cmp
                        cmp_equal = 4,
                        cmp_notequal = 5,
 
-                       cmp_notlike = 6,
+                       cmp_notlike = 6,        /* tobe removed */
                        cmp_like = 7,
                        cmp_notilike = 8,
                        cmp_ilike = 9,
 
-                       cmp_filter = 10,        ->r is a list of values
-                       cmp_or = 11,            or handling     ->l/r are both 
lists
-                       cmp_in = 12,            in list handling 
-                       cmp_notin = 13          not in list handling
-                                               cmp_in/cmp_notin ->r is a list 
of values
+                       cmp_or = 10,            or handling             ->l/r 
are both lists
+
+                       cmp_filter = 11,        filters                 ->r is 
a list of values
+                       cmp_in = 12,            in list handling        ->r is 
a list of values
+                       cmp_notin = 13          not in list handling    ->r is 
a list of values
+
                        cmp_all = 14,           cross product
                )
 
diff --git a/sql/scripts/09_like.sql b/sql/scripts/09_like.sql
new file mode 100644
--- /dev/null
+++ b/sql/scripts/09_like.sql
@@ -0,0 +1,2 @@
+create filter function "like"(val string, pat string, esc string) external 
name pcre.like_uselect;
+create filter function "ilike"(val string, pat string, esc string) external 
name pcre.ilike_uselect;
diff --git a/sql/scripts/Makefile.ag b/sql/scripts/Makefile.ag
--- a/sql/scripts/Makefile.ag
+++ b/sql/scripts/Makefile.ag
@@ -20,7 +20,7 @@ MT_SAFE
 headers_sql = {
        HEADERS = sql
        DIR = libdir/monetdb5/createdb
-       SOURCES = 10_math.sql 11_times.sql 12_url.sql 13_date.sql 14_inet.sql 
15_history.sql 16_tracelog.sql 17_compress.sql 18_dictionary.sql 19_cluster.sql 
20_vacuum.sql 21_dependency_functions.sql 22_clients.sql 23_skyserver.sql 
24_zorder.sql 25_debug.sql 99_system.sql
+       SOURCES = 09_like.sql 10_math.sql 11_times.sql 12_url.sql 13_date.sql 
14_inet.sql 15_history.sql 16_tracelog.sql 17_compress.sql 18_dictionary.sql 
19_cluster.sql 20_vacuum.sql 21_dependency_functions.sql 22_clients.sql 
23_skyserver.sql 24_zorder.sql 25_debug.sql 99_system.sql
 }
 
 headers_moresql = {
diff --git a/sql/server/bin_optimizer.c b/sql/server/bin_optimizer.c
--- a/sql/server/bin_optimizer.c
+++ b/sql/server/bin_optimizer.c
@@ -68,26 +68,6 @@ eliminate_semijoin(sql_allocator *sa, st
                        } else if (PSEL(s1) && s1->flag == cmp_notequal) {
                                /* do notequal select last */
                                swap = 1;
-                       } else if (PSEL(s2) &&
-                                       (s2->flag == cmp_notlike || s2->flag == 
cmp_notilike))
-                       {
-                               /* do notequal select last */
-                               swap = 0;
-                       } else if (PSEL(s1) &&
-                                       (s1->flag == cmp_notlike || s1->flag == 
cmp_notilike))
-                       {
-                               /* do notequal select last */
-                               swap = 1;
-                       } else if (PSEL(s2) &&
-                                       (s2->flag == cmp_like || s2->flag == 
cmp_ilike))
-                       {
-                               /* do like select last */
-                               swap = 0;
-                       } else if (PSEL(s1) &&
-                                       (s1->flag == cmp_like || s1->flag == 
cmp_ilike))
-                       {
-                               /* do like select last */
-                               swap = 1;
                        } else if (PSEL(s1)) {
                                /* single-sided range before double-sided range 
*/
                                swap = 0;
@@ -174,14 +154,8 @@ push_select( sql_allocator *sa, stmt *se
        if (select->type == st_uselect2) 
                return stmt_uselect2(sa,  s, select->op2, select->op3, 
(comp_type)select->flag);
 
-       if (select->type == st_select) {
-               if (select->flag == cmp_like || select->flag == cmp_notlike ||
-                   select->flag == cmp_ilike || select->flag == cmp_notilike)
-                       return stmt_likeselect(sa, s, select->op2,
-                                       select->op3, (comp_type)select->flag);
-               else
-                       return stmt_select(sa, s, select->op2, 
(comp_type)select->flag);
-       }
+       if (select->type == st_select) 
+               return stmt_select(sa, s, select->op2, (comp_type)select->flag);
 
        if (select->type == st_uselect) 
                return stmt_uselect(sa,  s, select->op2, 
(comp_type)select->flag);
diff --git a/sql/server/rel_bin.c b/sql/server/rel_bin.c
--- a/sql/server/rel_bin.c
+++ b/sql/server/rel_bin.c
@@ -435,8 +435,14 @@ exp_bin(mvc *sql, sql_exp *e, stmt *left
                sql_exp *re = e->r, *re2 = e->f;
                prop *p;
 
-               if (e->flag == cmp_filter)
+               if (e->flag == cmp_filter) {
+                       list *r = e->r;
+
                        re2 = NULL;
+                       re = r->h->data;
+                       if (r->h->next)
+                               re2 = r->h->next->data;
+               }
                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);
                }
@@ -514,72 +520,47 @@ exp_bin(mvc *sql, sql_exp *e, stmt *left
                        swapped = 1;
                }
                if (swapped || !right)
-                       r = exp_bin(sql, e->r, left, NULL, grp, sel);
+                       r = exp_bin(sql, re, left, NULL, grp, sel);
                else
-                       r = exp_bin(sql, e->r, right, NULL, grp, sel);
+                       r = exp_bin(sql, re, right, NULL, grp, sel);
                if (!r && !swapped) {
-                       r = exp_bin(sql, e->r, left, NULL, grp, sel);
+                       r = exp_bin(sql, re, left, NULL, grp, sel);
                        is_select = 1;
                }
                if (!r && swapped) {
-                       r = exp_bin(sql, e->r, right, NULL, grp, sel);
+                       r = exp_bin(sql, re, right, NULL, grp, sel);
                        is_select = 1;
                }
                if (re2)
-                       r2 = exp_bin(sql, e->f, left, right, grp, sel);
+                       r2 = exp_bin(sql, re2, left, right, grp, sel);
                if (!l || !r || (re2 && !r2)) {
                        assert(0);
                        return NULL;
                }
 
-               /* the escape character of like is in the right expression */
-               if (e->flag == cmp_notlike || e->flag == cmp_like ||
-                   e->flag == cmp_notilike || e->flag == cmp_ilike)
-               {
-                       if (!e->f)
-                               r2 = stmt_atom_string(sql->sa, 
sa_strdup(sql->sa, ""));
-                       if (!l || !r || !r2) {
-                               assert(0);
-                               return NULL;
-                       }
-                       if (l->nrcols == 0) {
-                               stmt *lstmt;
-                               char *likef = (e->flag == cmp_notilike || 
e->flag == cmp_ilike ?
-                                       "ilike" : "like");
-                               sql_subtype *s = sql_bind_localtype("str");
-                               sql_subfunc *like = sql_bind_func3(sql->sa, 
sql->session->schema, likef, s, s, s, F_FUNC);
-                               list *ops = list_new(sql->sa);
-
-                               assert(s && like);
-                               
-                               list_append(ops, l);
-                               list_append(ops, r);
-                               list_append(ops, r2);
-                               lstmt = stmt_Nop(sql->sa, stmt_list(sql->sa, 
ops), like);
-                               if (e->flag == cmp_notlike || e->flag == 
cmp_notilike) {
-                                       sql_subtype *bt = 
sql_bind_localtype("bit");
-                                       sql_subfunc *not = 
sql_bind_func(sql->sa, sql->session->schema, "not", bt, NULL, F_FUNC);
-                                       lstmt = stmt_unop(sql->sa, lstmt, not);
-                               }
-                               return lstmt;
-                       }
+               /* general predicate, select and join */
+               if (e->flag == cmp_filter) {
+                       if (l->nrcols == 0)
+                               l = stmt_const(sql->sa, 
bin_first_column(sql->sa, swapped?right:left), l); 
+
                         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->sa, 
sql->session->schema, like, s, s, s, F_FUNC);
-
-                                stmt *j = stmt_joinN(sql->sa, 
stmt_list(sql->sa, append(list_new(sql->sa),l)), stmt_list(sql->sa, 
append(append(list_new(sql->sa),r),r2)), f);
-                                if (is_anti(e) || anti)
+                               /* find predicate function */
+                                sql_subfunc *f = e->f;
+                               stmt *j;
+
+                               if (r2)
+                                       f = sql_bind_func3(sql->sa, 
sql->session->schema, f->func->base.name, tail_type(l), tail_type(r), 
tail_type(r2), F_FUNC);
+                               else
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to