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