Changeset: e65fe1d2628a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e65fe1d2628a
Modified Files:
sql/server/rel_psm.c
sql/server/rel_rel.h
sql/server/rel_select.c
sql/server/rel_select.h
sql/server/rel_xml.c
sql/server/sql_parser.y
Branch: timetrails
Log Message:
Changes to the SQL layer to handle better continuous procedures
diffs (truncated from 804 to 300 lines):
diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c
--- a/sql/server/rel_psm.c
+++ b/sql/server/rel_psm.c
@@ -149,14 +149,31 @@ psm_set_exp(mvc *sql, dnode *n)
}
static sql_exp*
-rel_psm_call(mvc * sql, symbol *se)
+rel_psm_call(mvc * sql, int token, symbol *se)
{
sql_subtype *t;
sql_exp *res = NULL;
exp_kind ek = {type_value, card_none, FALSE};
sql_rel *rel = NULL;
+ int which_sql;
- res = rel_value_exp(sql, &rel, se, sql_sel, ek);
+ switch (token) {
+ case SQL_CALL:
+ which_sql = sql_sel;
+ break;
+ case SQL_START_CONTINUOUS_PROCEDURE:
+ ek.card = card_continuous_procedure;
+ which_sql = sql_start_continuous_procedure;
+ break;
+ case SQL_RESTART_CONTINUOUS_PROCEDURE:
+ ek.card = card_continuous_procedure;
+ which_sql = sql_restart_continuous_procedure;
+ break;
+ default:
+ assert(0);
+ }
+
+ res = rel_value_exp(sql, &rel, se, which_sql, ek);
if (!res || rel || ((t=exp_subtype(res)) && t->type)) /* only
procedures */
return sql_error(sql, 01, "function calls are ignored");
return res;
@@ -373,7 +390,7 @@ rel_psm_case( mvc *sql, sql_subtype *res
sql_exp *case_stmt = NULL;
if (!when_value || rel ||
- (cond = rel_binop_(sql, v, when_value, NULL, "=",
card_value)) == NULL ||
+ (cond = rel_binop_(sql, v, when_value, NULL, "=", 0,
card_value)) == NULL ||
(if_stmts = sequential_block( sql, res, restypelist,
m->next->data.lval, NULL, is_func)) == NULL ) {
if (rel)
return sql_error(sql, 02, "CASE: No
SELECT statements allowed within the CASE condition");
@@ -578,7 +595,7 @@ has_return( list *l )
}
static sql_rel *
-rel_change_continuous_procedure(mvc *sql, int token, dlist *qname, symbol* sym)
+rel_change_continuous_procedure(mvc *sql, int token, dlist *qname)
{
sql_schema *s = NULL;
const char *sname = qname_schema(qname);
@@ -589,10 +606,8 @@ rel_change_continuous_procedure(mvc *sql
char *F = NULL, *f = NULL;
int action;
- (void) sym; //TODO with te sym, retrieve the cq from the catalog (next
Monday)
-
switch (token) {
- case SQL_START_CONTINUOUS_PROCEDURE:
+ /*case SQL_START_CONTINUOUS_PROCEDURE:
F = "START CONTINUOUS PROCEDURE";
f = "START";
action = START_CONTINUOUS_PROCEDURE;
@@ -601,7 +616,7 @@ rel_change_continuous_procedure(mvc *sql
F = "RESTART CONTINUOUS PROCEDURE";
f = "RESTART";
action = RESTART_CONTINUOUS_PROCEDURE;
- break;
+ break;*/
case SQL_INTERRUPT_CONTINUOUS_PROCEDURE:
F = "INTERRUPT CONTINUOUS PROCEDURE";
f = "INTERRUPT";
@@ -659,7 +674,6 @@ sequential_block (mvc *sql, sql_subtype
dlist *dl;
dlist *qname;
sql_rel *r;
- symbol *sym;
assert(!restype || !restypelist);
@@ -694,22 +708,18 @@ sequential_block (mvc *sql, sql_subtype
reslist = rel_psm_case(sql, restype, restypelist,
s->data.lval->h, is_func);
break;
case SQL_CALL:
- res = rel_psm_call(sql, s->data.sym);
+ res = rel_psm_call(sql, s->token, s->data.sym);
break;
case SQL_START_CONTINUOUS_PROCEDURE:
case SQL_RESTART_CONTINUOUS_PROCEDURE:
- dl = s->data.lval;
- sym = dl->h->data.sym;
- qname = sym->data.lval;
- r = rel_change_continuous_procedure(sql, s->token,
qname, sym);
- res = exp_rel(sql, r);
+ res = rel_psm_call(sql, s->token, s->data.sym);
break;
case SQL_INTERRUPT_CONTINUOUS_PROCEDURE:
case SQL_CONTINUE_CONTINUOUS_PROCEDURE:
case SQL_HALT_CONTINUOUS_PROCEDURE:
dl = s->data.lval;
qname = dl->h->data.lval;
- r = rel_change_continuous_procedure(sql, s->token,
qname, NULL);
+ r = rel_change_continuous_procedure(sql, s->token,
qname);
res = exp_rel(sql, r);
break;
case SQL_RETURN:
@@ -1580,9 +1590,14 @@ rel_psm(mvc *sql, symbol *s)
sql->type = Q_SCHEMA;
break;
case SQL_CALL:
- ret = rel_psm_stmt(sql->sa, rel_psm_call(sql, s->data.sym));
+ ret = rel_psm_stmt(sql->sa, rel_psm_call(sql, s->token,
s->data.sym));
sql->type = Q_UPDATE;
break;
+ case SQL_START_CONTINUOUS_PROCEDURE:
+ case SQL_RESTART_CONTINUOUS_PROCEDURE:
+ ret = rel_psm_stmt(sql->sa, rel_psm_call(sql, s->token,
s->data.sym));
+ sql->type = Q_SCHEMA;
+ break;
case SQL_CREATE_TABLE_LOADER:
{
dlist *l = s->data.lval;
@@ -1617,21 +1632,12 @@ rel_psm(mvc *sql, symbol *s)
ret = psm_analyze(sql, "analyze", l->h->data.lval /* qualified
table name */, l->h->next->data.lval /* opt list of column */,
l->h->next->next->data.sym /* opt_sample_size */,
l->h->next->next->next->data.i_val);
sql->type = Q_UPDATE;
} break;
-
- case SQL_START_CONTINUOUS_PROCEDURE:
- case SQL_RESTART_CONTINUOUS_PROCEDURE: {
- dlist *l = s->data.lval;
- symbol *sym = l->h->data.sym;
- dlist *qname = sym->data.lval;
- ret = rel_change_continuous_procedure(sql, s->token, qname,
sym);
- sql->type = Q_SCHEMA;
- } break;
case SQL_INTERRUPT_CONTINUOUS_PROCEDURE:
case SQL_CONTINUE_CONTINUOUS_PROCEDURE:
case SQL_HALT_CONTINUOUS_PROCEDURE: {
dlist *l = s->data.lval;
dlist *qname = l->h->data.lval;
- ret = rel_change_continuous_procedure(sql, s->token, qname,
NULL);
+ ret = rel_change_continuous_procedure(sql, s->token, qname);
sql->type = Q_SCHEMA;
} break;
default:
diff --git a/sql/server/rel_rel.h b/sql/server/rel_rel.h
--- a/sql/server/rel_rel.h
+++ b/sql/server/rel_rel.h
@@ -12,11 +12,13 @@
#include "sql_relation.h"
#include "sql_mvc.h"
-#define sql_from 0
-#define sql_where 1
-#define sql_sel 2
-#define sql_having 3
-#define sql_orderby 4
+#define sql_from 0
+#define sql_where 1
+#define sql_sel 2
+#define sql_having 3
+#define sql_orderby 4
+#define sql_start_continuous_procedure 5
+#define sql_restart_continuous_procedure 6
#define ERR_AMBIGUOUS 050000
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -690,10 +690,11 @@ rel_named_table_function(mvc *sql, sql_r
}
static sql_exp *
-rel_op_(mvc *sql, sql_schema *s, char *fname, exp_kind ek)
+rel_op_(mvc *sql, sql_schema *s, char *fname, int fs, exp_kind ek)
{
sql_subfunc *f = NULL;
int type;
+ sql_exp * res;
switch (ek.card) {
case card_loader:
@@ -714,7 +715,9 @@ rel_op_(mvc *sql, sql_schema *s, char *f
f = sql_bind_func(sql->sa, s, fname, NULL, NULL, type);
if (f && check_card(ek.card, f)) {
- return exp_op(sql->sa, NULL, f);
+ res = exp_op(sql->sa, NULL, f);
+ res->flag = fs;
+ return res;
} else {
return sql_error(sql, 02,
"SELECT: no such operator '%s'", fname);
@@ -1678,7 +1681,7 @@ rel_compare_exp(mvc *sql, sql_rel *rel,
if (rel_convert_types(sql, &ls, &rs, 1, type_equal) < 0)
return NULL;
- e = rel_binop_(sql, ls, rs, NULL, compare_op, card_value);
+ e = rel_binop_(sql, ls, rs, NULL, compare_op, 0, card_value);
if (!e)
return NULL;
@@ -1925,9 +1928,9 @@ rel_logical_value_exp(mvc *sql, sql_rel
if (!ls || !rs)
return NULL;
if (sc->token == SQL_OR)
- return rel_binop_(sql, ls, rs, NULL, "or", card_value);
+ return rel_binop_(sql, ls, rs, NULL, "or", 0,
card_value);
else
- return rel_binop_(sql, ls, rs, NULL, "and", card_value);
+ return rel_binop_(sql, ls, rs, NULL, "and", 0,
card_value);
}
case SQL_FILTER:
/* [ x,..] filter [ y,..] */
@@ -1991,7 +1994,7 @@ rel_logical_value_exp(mvc *sql, sql_rel
return NULL;
if (rel_convert_types(sql, &ls, &rs, 1, type_equal) < 0)
return NULL;
- return rel_binop_(sql, ls, rs, NULL, compare_op,
card_value);
+ return rel_binop_(sql, ls, rs, NULL, compare_op, 0,
card_value);
} else {
/* first try without current relation, too see if there
are correlations with the outer relation */
@@ -2019,9 +2022,9 @@ rel_logical_value_exp(mvc *sql, sql_rel
return e;
/* For selection we need to convert
back into Boolean */
- ls = rel_unop_(sql, ls, NULL, "isnull",
card_value);
+ ls = rel_unop_(sql, ls, NULL, "isnull",
0, card_value);
rs = exp_atom_bool(sql->sa, 0);
- return rel_binop_(sql, ls, rs, NULL,
"=", card_value);
+ return rel_binop_(sql, ls, rs, NULL,
"=", 0, card_value);
}
} else if (r) {
sql_rel *l = *rel;
@@ -2051,7 +2054,7 @@ rel_logical_value_exp(mvc *sql, sql_rel
return NULL;
if (rel_convert_types(sql, &ls, &rs, 1, type_equal) <
0)
return NULL;
- return rel_binop_(sql, ls, rs, NULL, compare_op,
card_value);
+ return rel_binop_(sql, ls, rs, NULL, compare_op, 0,
card_value);
}
}
/* Set Member ship */
@@ -2137,15 +2140,15 @@ rel_logical_value_exp(mvc *sql, sql_rel
sql_exp *r = n->data, *ne;
if (sc->token == SQL_NOT_IN)
- ne = rel_binop_(sql, l, r,
NULL, "<>", card_value);
+ ne = rel_binop_(sql, l, r,
NULL, "<>", 0, card_value);
else
- ne = rel_binop_(sql, l, r,
NULL, "=", card_value);
+ ne = rel_binop_(sql, l, r,
NULL, "=", 0, card_value);
if (!e) {
e = ne;
} else if (sc->token == SQL_NOT_IN) {
- e = rel_binop_(sql, e, ne,
NULL, "and", card_value);
+ e = rel_binop_(sql, e, ne,
NULL, "and", 0, card_value);
} else {
- e = rel_binop_(sql, e, ne,
NULL, "or", card_value);
+ e = rel_binop_(sql, e, ne,
NULL, "or", 0, card_value);
}
}
*rel = outer;
@@ -2164,9 +2167,9 @@ rel_logical_value_exp(mvc *sql, sql_rel
else
*rel = left;
if (sc->token == SQL_NOT_IN)
- e = rel_binop_(sql, l, r, NULL, "<>",
card_value);
+ e = rel_binop_(sql, l, r, NULL, "<>", 0,
card_value);
else
- e = rel_binop_(sql, l, r, NULL, "=",
card_value);
+ e = rel_binop_(sql, l, r, NULL, "=", 0,
card_value);
return e;
}
return NULL;
@@ -2228,8 +2231,8 @@ rel_logical_value_exp(mvc *sql, sql_rel
ee = exp_atom(sql->sa, atom_string(sql->sa, st,
sa_strdup(sql->sa, escape)));
}
if (ee)
- return rel_nop_(sql, le, re, ee, NULL, sys, like,
card_value);
- return rel_binop_(sql, le, re, sys, like, card_value);
+ return rel_nop_(sql, le, re, ee, NULL, sys, like, 0,
card_value);
+ return rel_binop_(sql, le, re, sys, like, 0, card_value);
}
case SQL_BETWEEN:
case SQL_NOT_BETWEEN:
@@ -2268,18 +2271,18 @@ rel_logical_value_exp(mvc *sql, sql_rel
}
if (sc->token == SQL_NOT_BETWEEN) {
- e1 = rel_binop_(sql, le, re1, NULL, "<", card_value);
- e2 = rel_binop_(sql, le, re2, NULL, ">", card_value);
+ e1 = rel_binop_(sql, le, re1, NULL, "<", 0, card_value);
+ e2 = rel_binop_(sql, le, re2, NULL, ">", 0, card_value);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list