Changeset: f37e6abcd44c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f37e6abcd44c
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_cat.c
        sql/backends/monet5/sql_cquery.c
        sql/include/sql_catalog.h
        sql/server/rel_psm.c
        sql/server/rel_select.c
        sql/server/rel_semantic.c
        sql/server/sql_mvc.h
        sql/server/sql_parser.h
        sql/server/sql_parser.y
        sql/server/sql_scan.c
Branch: timetrails
Log Message:

Trying to add add START CONTINUE PROCEDURE name (args) statements but with no 
luck :(


diffs (truncated from 514 to 300 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -17,6 +17,7 @@
 #include "rel_updates.h"
 #include "rel_optimizer.h"
 #include "sql_env.h"
+#include "sql_cquery.h"
 
 #define OUTER_ZERO 64
 
@@ -168,7 +169,7 @@ static stmt *column(backend *be, stmt *v
        return val;
 }
 
-static stmt *Column(backend *be, stmt *val )
+static stmt *RelColumn(backend *be, stmt *val )
 {
        if (val->nrcols == 0)
                val = const_column(be, val);
@@ -453,7 +454,22 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                if (f->func->rel) 
                        s = stmt_func(be, stmt_list(be, l), sa_strdup(sql->sa, 
f->func->base.name), f->func->rel, (f->func->type == F_UNION));
                else
-                       s = stmt_Nop(be, stmt_list(be, l), e->f); 
+                       s = stmt_Nop(be, stmt_list(be, l), e->f);
+
+               if (f->func->type == F_CONTINUOUS_PROCEDURE) {
+                       char *petrinetResponse;
+                       char *sname = f->func->s->base.name;
+                       char *fname = f->func->base.name;
+                       if (!CQlocate(sname, fname)) { //if the continuous 
procedure is not registered in the catalog then we register it
+                               petrinetResponse = 
CQregisterInternal(MCgetClient(sql->clientid), sname, fname);
+                       }
+                       if (!petrinetResponse) {
+                               petrinetResponse = CQresumeInternal(sname, 
fname);
+                       }
+                       if (petrinetResponse) {
+                               return sql_error(sql, 02, "M0M27!START 
CONTINUOUS PROCEDURE internal error: %s", petrinetResponse);
+                       }
+               }
        }       break;
        case e_aggr: {
                list *attr = e->l; 
@@ -1851,7 +1867,7 @@ rel2bin_join(backend *be, sql_rel *rel, 
 
                /* as append isn't save, we append to a new copy */
                if (rel->op == op_left || rel->op == op_full || rel->op == 
op_right)
-                       s = Column(be, s);
+                       s = RelColumn(be, s);
                if (rel->op == op_left || rel->op == op_full)
                        s = stmt_append(be, s, stmt_project(be, ld, c));
                if (rel->op == op_right || rel->op == op_full) 
@@ -1868,7 +1884,7 @@ rel2bin_join(backend *be, sql_rel *rel, 
 
                /* as append isn't save, we append to a new copy */
                if (rel->op == op_left || rel->op == op_full || rel->op == 
op_right)
-                       s = Column(be, s);
+                       s = RelColumn(be, s);
                if (rel->op == op_left || rel->op == op_full) 
                        s = stmt_append(be, s, stmt_const(be, ld, 
(c->flag&OUTER_ZERO)?stmt_atom_lng(be, 0):stmt_atom(be, atom_general(sql->sa, 
tail_type(c), NULL))));
                if (rel->op == op_right || rel->op == op_full) 
@@ -2119,7 +2135,7 @@ rel2bin_union(backend *be, sql_rel *rel,
                const char *nme = column_name(sql->sa, c1);
                stmt *s;
 
-               s = stmt_append(be, Column(be, c1), c2);
+               s = stmt_append(be, RelColumn(be, c1), c2);
                s = stmt_alias(be, s, rnme, nme);
                list_append(l, s);
        }
diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c
--- a/sql/backends/monet5/sql_cat.c
+++ b/sql/backends/monet5/sql_cat.c
@@ -726,17 +726,16 @@ static str
 continuous_procedure(mvc *sql, char *sname, char *cpname, int fid, int action)
 {
        sql_schema *s = NULL;
-       char *F;
-       Client cntxt;
+       char *F = NULL;
        str petrinetResponse = MAL_SUCCEED;
 
        switch (action) {
-               case START_CONTINUOUS_PROCEDURE:
-                       F = "START CONTINUOUS PROCEDURE";
-                       break;
                case INTERRUPT_CONTINUOUS_PROCEDURE:
                        F = "INTERRUPT CONTINUOUS PROCEDURE";
                        break;
+               case CONTINUE_CONTINUOUS_PROCEDURE:
+                       F = "CONTINUE CONTINUOUS PROCEDURE";
+                       break;
                case HALT_CONTINUOUS_PROCEDURE:
                        F = "HALT CONTINUOUS PROCEDURE";
                        break;
@@ -754,19 +753,12 @@ continuous_procedure(mvc *sql, char *sna
                                return sql_message("3F000!%s: access denied for 
%s to schema ;'%s'", F, stack_get_string(sql, "current_user"), s->base.name);
                        }
                        switch (action) {
-                               case START_CONTINUOUS_PROCEDURE: {
-                                               if(!CQlocate(sname, cpname)) { 
//if the continuous procedure is not registered in the catalog then we register 
it
-                                                       cntxt = 
MCgetClient(sql->clientid);
-                                                       petrinetResponse = 
CQregisterInternal(cntxt, sname, cpname);
-                                               }
-                                               if(!petrinetResponse) {
-                                                       petrinetResponse = 
CQresumeInternal(sname, cpname);
-                                               }
-                                       }
-                                       break;
                                case INTERRUPT_CONTINUOUS_PROCEDURE:
                                        petrinetResponse = 
CQpauseInternal(sname, cpname);
                                        break;
+                               case CONTINUE_CONTINUOUS_PROCEDURE:
+                                       petrinetResponse = 
CQresumeInternal(sname, cpname);
+                                       break;
                                case HALT_CONTINUOUS_PROCEDURE:
                                        petrinetResponse = 
CQderegisterInternal(sname, cpname);
                                        break;
diff --git a/sql/backends/monet5/sql_cquery.c b/sql/backends/monet5/sql_cquery.c
--- a/sql/backends/monet5/sql_cquery.c
+++ b/sql/backends/monet5/sql_cquery.c
@@ -441,7 +441,7 @@ CQregisterInternal(Client cntxt, str mod
        sig = getInstrPtr(mb,0);
        i = CQlocate(getModuleId(sig), getFunctionId(sig));
        if (i != pnettop)
-               throw(MAL,"cquery.register","Duplicate registration of 
continuous procedure");
+               throw(MAL,"cquery.register","Duplicate registration of 
continuous procedure %s.%s", modnme, fcnnme);
 
 #ifdef DEBUG_CQUERY
        fprintf(stderr, "#cquery register %s.%s\n", 
getModuleId(sig),getFunctionId(sig));
@@ -466,7 +466,7 @@ CQregisterInternal(Client cntxt, str mod
        MT_lock_set(&ttrLock);
        if( CQlocate(getModuleId(sig), getFunctionId(sig)) != pnettop){
                freeSymbol(s);
-               throw(MAL,"cquery.register","Duplicate registration of 
continuous procedure");
+               throw(MAL,"cquery.register","Duplicate registration of 
continuous procedure %s.%s", modnme, fcnnme);
        }
        pnet[pnettop].mod = GDKstrdup(modnme);
        pnet[pnettop].fcn = GDKstrdup(fcnnme);
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -310,8 +310,10 @@ typedef struct sql_arg {
 #define LANG_EXT(l)  (l>FUNC_LANG_SQL)
 
 #define START_CONTINUOUS_PROCEDURE 1 /* this might stay here I think... */
-#define INTERRUPT_CONTINUOUS_PROCEDURE 2
-#define HALT_CONTINUOUS_PROCEDURE 3
+#define RESTART_CONTINUOUS_PROCEDURE 2 /* currently not using it */
+#define INTERRUPT_CONTINUOUS_PROCEDURE 3
+#define CONTINUE_CONTINUOUS_PROCEDURE 4
+#define HALT_CONTINUOUS_PROCEDURE 5
 
 typedef struct sql_func {
        sql_base base;
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,11 +149,12 @@ 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};
+       int card = (token == SQL_START_CONTINUOUS_PROCEDURE) ? 
card_continuous_procedure : card_none;
+       exp_kind ek = {type_value, card, FALSE};
        sql_rel *rel = NULL;
 
        res = rel_value_exp(sql, &rel, se, sql_sel, ek);
@@ -616,7 +617,7 @@ 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_RETURN:
                        /*If it is not a function it cannot have a return 
statement*/
@@ -1455,14 +1456,14 @@ rel_change_continuous_procedure(mvc *sql
        int action;
 
        switch (token) {
-               case SQL_START_CONTINUOUS_PROCEDURE:
-                       F = "START CONTINUOUS PROCEDURE";
-                       action = START_CONTINUOUS_PROCEDURE;
-                       break;
                case SQL_INTERRUPT_CONTINUOUS_PROCEDURE:
                        F = "INTERRUPT CONTINUOUS PROCEDURE";
                        action = INTERRUPT_CONTINUOUS_PROCEDURE;
                        break;
+               case SQL_CONTINUE_CONTINUOUS_PROCEDURE:
+                       F = "CONTINUE CONTINUOUS PROCEDURE";
+                       action = CONTINUE_CONTINUOUS_PROCEDURE;
+                       break;
                case SQL_HALT_CONTINUOUS_PROCEDURE:
                        F = "HALT CONTINUOUS PROCEDURE";
                        action = HALT_CONTINUOUS_PROCEDURE;
@@ -1545,7 +1546,8 @@ 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));
+       case SQL_START_CONTINUOUS_PROCEDURE:
+               ret = rel_psm_stmt(sql->sa, rel_psm_call(sql, s->token, 
s->data.sym));
                sql->type = Q_UPDATE;
                break;
        case SQL_CREATE_TABLE_LOADER:
@@ -1582,8 +1584,9 @@ 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_INTERRUPT_CONTINUOUS_PROCEDURE:
+       case SQL_CONTINUE_CONTINUOUS_PROCEDURE:
        case SQL_HALT_CONTINUOUS_PROCEDURE: {
                dlist *l = s->data.lval;
                dlist *qname = l->h->data.lval;
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
@@ -26,7 +26,7 @@
 #endif
 
 #define VALUE_FUNC(f) (f->func->type == F_FUNC || f->func->type == F_FILT)
-#define check_card(card,f) ((card == card_none && !f->res) || 
(CARD_VALUE(card) && f->res && VALUE_FUNC(f)) || card == card_loader || (card 
== card_relation && f->func->type == F_UNION))
+#define check_card(card,f) ((card == card_none && !f->res) || 
(CARD_VALUE(card) && f->res && VALUE_FUNC(f)) || card == card_loader || card == 
card_continuous_procedure || (card == card_relation && f->func->type == 
F_UNION))
 
 static void
 rel_setsubquery(sql_rel*r)
@@ -693,8 +693,24 @@ static sql_exp *
 rel_op_(mvc *sql, sql_schema *s, char *fname, exp_kind ek)
 {
        sql_subfunc *f = NULL;
-       int type = (ek.card == card_loader)?F_LOADER:((ek.card == 
card_none)?F_PROC:
-                  ((ek.card == card_relation)?F_UNION:F_FUNC));
+       int type;
+
+       switch (ek.card) {
+               case card_loader:
+                       type = F_LOADER;
+                       break;
+               case card_none:
+                       type = F_PROC;
+                       break;
+               case card_relation:
+                       type = F_UNION;
+                       break;
+               case card_continuous_procedure:
+                       type = F_CONTINUOUS_PROCEDURE;
+                       break;
+               default:
+                       type = F_FUNC;
+       }
 
        f = sql_bind_func(sql->sa, s, fname, NULL, NULL, type);
        if (f && check_card(ek.card, f)) {
@@ -1786,10 +1802,25 @@ static sql_exp*
 _rel_nop( mvc *sql, sql_schema *s, char *fname, list *tl, list *exps, 
sql_subtype *obj_type, int nr_args, exp_kind ek)
 {
        sql_subfunc *f = NULL;
-       int table_func = (ek.card == card_relation);
-       int type = (ek.card == card_loader)?F_LOADER:((ek.card == 
card_none)?F_PROC:
-                  ((ek.card == card_relation)?F_UNION:F_FUNC));
-       int filt = (type == F_FUNC)?F_FILT:type;
+       int table_func = (ek.card == card_relation), type, filt;
+
+       switch (ek.card) {
+               case card_loader:
+                       type = F_LOADER;
+                       break;
+               case card_none:
+                       type = F_PROC;
+                       break;
+               case card_relation:
+                       type = F_UNION;
+                       break;
+               case card_continuous_procedure:
+                       type = F_CONTINUOUS_PROCEDURE;
+                       break;
+               default:
+                       type = F_FUNC;
+       }
+       filt = (type == F_FUNC)?F_FILT:type;
 
        f = bind_func_(sql, s, fname, tl, type);
        if (f) {
@@ -2855,8 +2886,24 @@ rel_unop_(mvc *sql, sql_exp *e, sql_sche
 {
        sql_subfunc *f = NULL;
        sql_subtype *t = NULL;
-       int type = (card == card_loader)?F_LOADER:((card == card_none)?F_PROC:
-                  ((card == card_relation)?F_UNION:F_FUNC));
+       int type;
+
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to