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

Reply via email to