Changeset: 1eeaf1bb451d for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1eeaf1bb451d
Modified Files:
        monetdb5/modules/mal/pcre.mal
        sql/backends/monet5/LSST/Tests/lsst_htmxmatch.sql
        sql/backends/monet5/sql_gencode.c
        sql/backends/monet5/sql_user.c
        sql/common/sql_types.c
        sql/common/sql_types.h
        sql/include/sql_catalog.h
        sql/rel.txt
        sql/server/rel_bin.c
        sql/server/rel_dump.c
        sql/server/rel_optimizer.c
        sql/server/rel_select.c
        sql/server/rel_semantic.c
        sql/server/rel_subquery.c
        sql/server/rel_updates.c
        sql/server/sql_env.c
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
        sql/server/sql_parser.h
        sql/server/sql_parser.y
        sql/server/sql_psm.c
        sql/server/sql_rel2bin.c
        sql/server/sql_scan.c
        sql/server/sql_semantic.c
        sql/server/sql_statement.c
        sql/server/sql_statement.h
        sql/storage/bat/bat_logger.c
        sql/storage/sql_catalog.c
        sql/storage/sql_storage.h
        sql/storage/store.c
        
sql/test/BugDay_2005-10-06_2.9.3/Tests/CrashMe_SQL_server_crash-2.SF-921673.stable.out
        sql/test/Dependencies/Tests/Dependencies.stable.out
        sql/test/Tests/mclient-t-s.stable.err
        sql/test/Tests/timezone.stable.out
        sql/test/Tests/trace.stable.out
        sql/test/bugs/Tests/groupby_having-bug-sf-947600.stable.out
        sql/test/bugs/Tests/innerjoin_multiple-bug-sf-943661.stable.out
        sql/test/leaks/Tests/check0.stable.out
        sql/test/leaks/Tests/check1.stable.out
        sql/test/leaks/Tests/check2.stable.out
        sql/test/leaks/Tests/check3.stable.out
        sql/test/leaks/Tests/check4.stable.out
        sql/test/leaks/Tests/check5.stable.out
Branch: default
Log Message:

partial implementation of filter and union functions
THe filter functions need a special create filter function statement.
Union functions can be simple 'functions (for now)'

Filter functions can be used in predicate cases, such
default =, <, > and (i)like.
An example is the xmatch of the lsst test.

The union functions are basicaly table functions which
have table input. Currently they are supported by a
hack (will surely change), ie

select func(col1,.., coln).* from tab.


diffs (truncated from 2739 to 300 lines):

diff --git a/monetdb5/modules/mal/pcre.mal b/monetdb5/modules/mal/pcre.mal
--- a/monetdb5/modules/mal/pcre.mal
+++ b/monetdb5/modules/mal/pcre.mal
@@ -58,6 +58,10 @@ address PCRElike_select_pcre;
 command ilike_select(s:bat[:any_1,:str], pat:str, esc:str):bat[:any_1,:str]
 address PCREilike_select_pcre;
 
+function ilike_filter(s:bat[:any_1,:str], pat:str) :bat[:any_1,:str];
+       return ilike_select(s, pat, "");
+end ilike_filter;
+
 command match(s:str, pat:str):bit
 address PCREmatch
 comment "Perl Compatible Regular Expression pattern matching against a string";
diff --git a/sql/backends/monet5/LSST/Tests/lsst_htmxmatch.sql 
b/sql/backends/monet5/LSST/Tests/lsst_htmxmatch.sql
--- a/sql/backends/monet5/LSST/Tests/lsst_htmxmatch.sql
+++ b/sql/backends/monet5/LSST/Tests/lsst_htmxmatch.sql
@@ -1,4 +1,4 @@
-create table htm( id lng);
+create table htm( id BIGINT);
 insert into htm values (100), (101), (102), (103);
 insert into htm values (110), (111), (112), (113);
 insert into htm values (120), (121), (122), (123);
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
@@ -998,6 +998,20 @@ _dumpstmt(backend *sql, MalBlkPtr mb, st
                                        cmd = s->type == st_select ?
                                                "thetaselect" : "thetauselect";
 
+                               if (s->flag == cmp_filter) {
+                                       char *mod, *fimp;
+
+                                       backend_create_func(sql, 
s->op4.funcval->func);
+                                       mod  = 
sql_func_mod(s->op4.funcval->func);
+                                       fimp = 
sql_func_imp(s->op4.funcval->func);
+
+                                       q = newStmt(mb, mod, 
convertOperator(fimp));
+                                       q = pushArgument(mb, q, l);
+                                       q = pushArgument(mb, q, r);
+                                       s->nr = getDestVar(q);
+                                       break;
+                               }
+                                       
                                switch (s->flag) {
                                case cmp_like:
                                case cmp_ilike:
@@ -1569,12 +1583,12 @@ _dumpstmt(backend *sql, MalBlkPtr mb, st
                        } else {
                                fimp = convertOperator(fimp);
                                q = newStmt(mb, mod, fimp);
-                               /* first dynamic output of copy* functions */
-                               if (f->res.comp_type) 
-                                       q = table_func_create_result(mb, q, 
f->res.comp_type);
-                               else if (f->func->res.comp_type) 
-                                       q = table_func_create_result(mb, q, 
f->func->res.comp_type);
                        }
+                       /* first dynamic output of copy* functions */
+                       if (f->res.comp_type) 
+                               q = table_func_create_result(mb, q, 
f->res.comp_type);
+                       else if (f->func->res.comp_type) 
+                               q = table_func_create_result(mb, q, 
f->func->res.comp_type);
                        if (list_length(s->op1->op4.lval))
                                tpe = tail_type(s->op1->op4.lval->h->data);
                        if (strcmp(fimp, "round")==0 && tpe &&
@@ -2156,8 +2170,8 @@ backend_dumpproc(backend *be, Client c, 
 
        if (m->history == 1) {
                sql_schema *sys = mvc_bind_schema(m, "sys");
-               sql_subfunc *kq = sql_find_func(m->sa, sys, "keepquery", 
NR_KEEPQUERY_ARGS);
-               sql_subfunc *cq = sql_find_func(m->sa, sys, "keepcall", 
NR_KEEPCALL_ARGS);
+               sql_subfunc *kq = sql_find_func(m->sa, sys, "keepquery", 
NR_KEEPQUERY_ARGS, F_PROC);
+               sql_subfunc *cq = sql_find_func(m->sa, sys, "keepcall", 
NR_KEEPCALL_ARGS, F_PROC);
 
                assert(kq && cq);
                backend_create_func(be, kq->func);
diff --git a/sql/backends/monet5/sql_user.c b/sql/backends/monet5/sql_user.c
--- a/sql/backends/monet5/sql_user.c
+++ b/sql/backends/monet5/sql_user.c
@@ -212,7 +212,7 @@ monet5_create_privileges(ptr _mvc, sql_s
        l = list_create((fdestroy) &arg_destroy);
        /* following funcion returns a table (single column) of user names
           with the approriate scenario (sql) */
-       mvc_create_func(m, s, "db_users", l, &tpe, FALSE, "sql", "db_users", 
"CREATE FUNCTION db_users () RETURNS TABLE( name varchar(2048)) EXTERNAL NAME 
sql.db_users;", 1);
+       mvc_create_func(m, s, "db_users", l, &tpe, F_FUNC, "sql", "db_users", 
"CREATE FUNCTION db_users () RETURNS TABLE( name varchar(2048)) EXTERNAL NAME 
sql.db_users;");
        list_destroy(l);
 
        t = mvc_create_view(m, s, "users", SQL_PERSIST,
diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -469,7 +469,7 @@ sql_bind_aggr(sql_allocator *sa, sql_sch
                        sql_func *a = n->data;
                        sql_arg *arg = NULL;
 
-                       if ((a->is_func && !a->res.type) || !a->aggr)
+                       if ((!IS_AGGR(a) || !a->res.type))
                                continue;
 
                        if (a->ops->h)
@@ -530,7 +530,7 @@ sql_find_aggr(sql_allocator *sa, sql_sch
                if (s->funcs.set) for (n=s->funcs.set->h; n; n = n->next) {
                        sql_func *a = n->data;
 
-                       if ((a->is_func && !a->res.type) || !a->aggr)
+                       if ((!IS_AGGR(a) || !a->res.type))
                                continue;
 
                        if (strcmp(a->base.name, sqlaname) == 0) {
@@ -574,7 +574,7 @@ static sql_subfunc *
 func_cmp(sql_allocator *sa, sql_func *f, char *name, int nrargs) 
 {
        if (strcmp(f->base.name, name) == 0) {
-               if (list_length(f->ops) == nrargs) {
+               if (nrargs < 0 || list_length(f->ops) == nrargs) {
                        sql_subfunc *fres = SA_ZNEW(sa, sql_subfunc);
 
                        fres->func = f;
@@ -589,7 +589,7 @@ func_cmp(sql_allocator *sa, sql_func *f,
 }
 
 sql_subfunc *
-sql_find_func(sql_allocator *sa, sql_schema *s, char *sqlfname, int nrargs)
+sql_find_func(sql_allocator *sa, sql_schema *s, char *sqlfname, int nrargs, 
int type)
 {
        node *n = funcs->h;
        sql_subfunc *fres;
@@ -598,7 +598,7 @@ sql_find_func(sql_allocator *sa, sql_sch
        for (; n; n = n->next) {
                sql_func *f = n->data;
 
-               if (!f->res.type)
+               if (f->type != type) 
                        continue;
                if ((fres = func_cmp(sa, f, sqlfname, nrargs )) != NULL) {
                        return fres;
@@ -610,7 +610,7 @@ sql_find_func(sql_allocator *sa, sql_sch
                if (s->funcs.set) for (n=s->funcs.set->h; n; n = n->next) {
                        sql_func *f = n->data;
 
-                       if (f->aggr)
+                       if (f->type != type) 
                                continue;
                        if ((fres = func_cmp(sa, f, sqlfname, nrargs )) != 
NULL) {
                                return fres;
@@ -656,7 +656,7 @@ sql_bind_member(sql_allocator *sa, sql_s
 }
 
 sql_subfunc *
-sql_bind_func(sql_allocator *sa, sql_schema *s, char *sqlfname, sql_subtype 
*tp1, sql_subtype *tp2)
+sql_bind_func(sql_allocator *sa, sql_schema *s, char *sqlfname, sql_subtype 
*tp1, sql_subtype *tp2, int type)
 {
        list *l = list_create((fdestroy)NULL);
        sql_subfunc *fres;
@@ -666,13 +666,13 @@ sql_bind_func(sql_allocator *sa, sql_sch
        if (tp2)
                list_append(l, tp2);
 
-       fres = sql_bind_func_(sa, s, sqlfname, l);
+       fres = sql_bind_func_(sa, s, sqlfname, l, type);
        list_destroy(l);
        return fres;
 }
 
 sql_subfunc *
-sql_bind_func3(sql_allocator *sa, sql_schema *s, char *sqlfname, sql_subtype 
*tp1, sql_subtype *tp2, sql_subtype *tp3)
+sql_bind_func3(sql_allocator *sa, sql_schema *s, char *sqlfname, sql_subtype 
*tp1, sql_subtype *tp2, sql_subtype *tp3, int type)
 {
        list *l = list_create((fdestroy)NULL);
        sql_subfunc *fres;
@@ -684,7 +684,7 @@ sql_bind_func3(sql_allocator *sa, sql_sc
        if (tp3)
                list_append(l, tp3);
 
-       fres = sql_bind_func_(sa, s, sqlfname, l);
+       fres = sql_bind_func_(sa, s, sqlfname, l, type);
        list_destroy(l);
        return fres;
 }
@@ -698,15 +698,15 @@ arg_subtype_cmp(sql_arg *a, sql_subtype 
 }
 
 sql_subfunc *
-sql_bind_func_(sql_allocator *sa, sql_schema *s, char *sqlfname, list *ops)
+sql_bind_func_(sql_allocator *sa, sql_schema *s, char *sqlfname, list *ops, 
int type)
 {
        node *n = funcs->h;
 
        (void)s;
-       while (n) {
+       for (; n; n = n->next) {
                sql_func *f = n->data;
 
-               if (f->is_func && !f->res.type)
+               if (f->type != type) 
                        continue;
                if (strcmp(f->base.name, sqlfname) == 0) {
                        if (list_cmp(f->ops, ops, (fcmp) &arg_subtype_cmp) == 
0) {
@@ -714,38 +714,41 @@ sql_bind_func_(sql_allocator *sa, sql_sc
                                sql_subfunc *fres = SA_ZNEW(sa, sql_subfunc);
 
                                fres->func = f;
-                               /* fix the scale */
-                               digits = f->res.digits;
-                               if (f->fix_scale > SCALE_NONE) {
-                                       for (n = ops->h; n; n = n->next) {
-                                               sql_subtype *a = n->data;
+                               if (IS_FUNC(f)) { /* not needed for PROC/FILT */
+                                       /* fix the scale */
+                                       digits = f->res.digits;
+                                       if (f->fix_scale > SCALE_NONE) {
+                                               for (n = ops->h; n; n = 
n->next) {
+                                                       sql_subtype *a = 
n->data;
 
-                                               /* same scale as the input */
-                                               if (a && a->scale > scale)
-                                                       scale = a->scale;
-                                               if (a && f->fix_scale == INOUT)
-                                                       digits = a->digits;
+                                                       /* same scale as the 
input */
+                                                       if (a && a->scale > 
scale)
+                                                               scale = 
a->scale;
+                                                       if (a && f->fix_scale 
== INOUT)
+                                                               digits = 
a->digits;
+                                               }
+                                       } else if (f->res.scale) 
+                                               scale = f->res.scale;
+                                       /* same type as the first input */
+                                       if (f->res.type->eclass == EC_ANY) {
+                                               node *m;
+                                               sql_subtype *a = NULL;
+                                               for (n = ops->h, m = f->ops->h; 
n; n = n->next, m = m->next) {
+                                                       sql_arg *s = m->data;
+                                                       if 
(s->type.type->eclass == EC_ANY) {
+                                                               a = n->data;
+                                                       }
+                                               }
+                                               sql_init_subtype(&fres->res, 
a->type, digits, scale);
+                                       } else {
+                                               sql_init_subtype(&fres->res, 
f->res.type, digits, scale);
                                        }
-                               } else if (f->res.scale) 
-                                       scale = f->res.scale;
-                               /* same type as the first input */
-                               if (f->res.type->eclass == EC_ANY) {
-                                       node *m;
-                                       sql_subtype *a = NULL;
-                                       for (n = ops->h, m = f->ops->h; n; n = 
n->next, m = m->next) {
-                                               sql_arg *s = m->data;
-                                               if (s->type.type->eclass == 
EC_ANY) {
-                                                       a = n->data;
-                                               }
-                                       }
-                                       sql_init_subtype(&fres->res, a->type, 
digits, scale);
                                } else {
-                                       sql_init_subtype(&fres->res, 
f->res.type, digits, scale);
+                                       fres->res.type = NULL;
                                }
                                return fres;
                        }
                }
-               n = n->next;
        }
        if (s) {
                node *n;
@@ -753,7 +756,7 @@ sql_bind_func_(sql_allocator *sa, sql_sc
                if (s->funcs.set) for (n=s->funcs.set->h; n; n = n->next) {
                        sql_func *f = n->data;
 
-                       if (f->is_func && !f->res.type)
+                       if (f->type != type) 
                                continue;
                        if (strcmp(f->base.name, sqlfname) == 0) {
                                if (list_cmp(f->ops, ops, (fcmp) 
&arg_subtype_cmp) == 0) {
@@ -768,7 +771,7 @@ sql_bind_func_(sql_allocator *sa, sql_sc
                                                if (a && a->scale > scale)
                                                        scale = a->scale;
                                        }
-                                       if (f->is_func) {
+                                       if (IS_FUNC(f)) {
                                                sql_init_subtype(&fres->res, 
f->res.type, f->res.digits, scale);
                                                if (f->res.comp_type) 
                                                        fres->res.comp_type = 
f->res.comp_type;
@@ -822,10 +825,10 @@ sql_bind_func_result_(sql_allocator *sa,
        node *n = funcs->h;
 
        (void)s;
-       while (n) {
+       for (; n; n = n->next) {
                sql_func *f = n->data;
 
-               if (!f->res.type)
+               if (!f->res.type) 
                        continue;
                if (strcmp(f->base.name, sqlfname) == 0 && (is_subtype(&f->res, 
res) || f->res.type->eclass == EC_ANY) && list_cmp(f->ops, ops, (fcmp) 
&arg_subtype_cmp) == 0) {
                        unsigned int scale = 0;
@@ -857,30 +860,6 @@ sql_bind_func_result_(sql_allocator *sa,
                        }
                        return fres;
                }
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to