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