Changeset: 347f36a06f36 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=347f36a06f36
Modified Files:
        monetdb5/modules/mal/wlc.mal
        sql/backends/monet5/basket.mal
        sql/backends/monet5/sql_basket.c
        sql/backends/monet5/sql_basket.h
        sql/backends/monet5/sql_cat.c
        sql/backends/monet5/sql_cquery.c
        sql/backends/monet5/sql_cquery.h
        sql/backends/monet5/sql_execute.c
        sql/backends/monet5/sqlcatalog.mal
        sql/backends/monet5/wlr.mal
        sql/include/sql_catalog.h
        sql/server/rel_psm.c
        sql/server/sql_mvc.h
        sql/server/sql_parser.y
        sql/server/sql_qc.c
        sql/server/sql_qc.h
        sql/storage/store.c
Branch: trails
Log Message:

Fixed some backend validations for continuous procedures


diffs (truncated from 781 to 300 lines):

diff --git a/monetdb5/modules/mal/wlc.mal b/monetdb5/modules/mal/wlc.mal
--- a/monetdb5/modules/mal/wlc.mal
+++ b/monetdb5/modules/mal/wlc.mal
@@ -210,7 +210,7 @@ pattern drop_function( sname:str, fname:
 address WLCgeneric
 comment "Catalog operation drop_function";
 
-pattern create_function( sname:str, fname:str)
+pattern create_function( sname:str, fname:str, replace:int)
 address WLCgeneric
 comment "Catalog operation create_function";
 
diff --git a/sql/backends/monet5/basket.mal b/sql/backends/monet5/basket.mal
--- a/sql/backends/monet5/basket.mal
+++ b/sql/backends/monet5/basket.mal
@@ -45,13 +45,13 @@ comment "Remove tuples from a basket";
 pattern clear_table(sname:str,tname:str):lng
 address mvc_clear_table_wrap;
 
-# pattern window(sch:str, tbl:str, elm:int):int
-# address BSKTwindow
-# comment "Set window size";
+pattern window(sch:str, tbl:str, elm:int):int
+address BSKTwindow
+comment "Set window size";
 
-# pattern window(sch:str, tbl:str, elm:int, stride:int):int
-# address BSKTwindow
-# comment "Set window size and stride";
+pattern window(sch:str, tbl:str, elm:int, stride:int):int
+address BSKTwindow
+comment "Set window size and stride";
 
 unsafe pattern tumble(mvc:any, sch:str, tbl:str):int
 address BSKTtumble
@@ -89,6 +89,3 @@ comment "Show the baskets table";
 command prelude() :void
 address BSKTprelude;
 basket.prelude();
-
-command epilogue() :void
-address BSKTepilogue;
diff --git a/sql/backends/monet5/sql_basket.c b/sql/backends/monet5/sql_basket.c
--- a/sql/backends/monet5/sql_basket.c
+++ b/sql/backends/monet5/sql_basket.c
@@ -66,7 +66,6 @@ static int BSKTnewEntry(void)
                bsktLimit += MAXBSKT;
                baskets = bnew;
        }
-       
        for (i = 1; i < bsktLimit; i++) { /* find an available slot */
                if (baskets[i].table == NULL)
                        break;
@@ -74,12 +73,12 @@ static int BSKTnewEntry(void)
        if(i >= bsktTop) { /* if it's the last one we need to increment bsktTop 
*/
                bsktTop++;
        }
-       MT_lock_init(&baskets[i].lock,"bsktlock");      
+       MT_lock_init(&baskets[i].lock,"bsktlock");
        return i;
 }
 
 // free a basket structure
-void
+static void
 BSKTclean(int idx)
 {      int i;
 
@@ -88,6 +87,8 @@ BSKTclean(int idx)
                        GDKfree(baskets[idx].error);
                baskets[idx].table = NULL;
                baskets[idx].error = NULL;
+               baskets[idx].window = 0;
+               baskets[idx].stride = 0;
                baskets[idx].count = 0;
                baskets[idx].events = 0;
                baskets[idx].seen =  *timestamp_nil;
@@ -97,6 +98,7 @@ BSKTclean(int idx)
                }
                GDKfree(baskets[idx].bats);
                GDKfree(baskets[idx].cols);
+               MT_lock_destroy(&baskets[idx].lock);
        }
 }
 
@@ -138,6 +140,8 @@ BSKTregisterInternal(Client cntxt, MalBl
                throw(MAL,"basket.register",MAL_MALLOC_FAIL);
 
        baskets[idx].table = t;
+       baskets[idx].window = t->stream->window;
+       baskets[idx].stride = t->stream->stride;
        (void) MTIMEcurrent_timestamp(&baskets[idx].seen);
 
        // Check the column types first
@@ -185,7 +189,6 @@ BSKTregister(Client cntxt, MalBlkPtr mb,
        return msg;
 }
 
-/* Not being used, so comment for now
 str
 BSKTwindow(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
@@ -207,11 +210,11 @@ BSKTwindow(Client cntxt, MalBlkPtr mb, M
                if( idx ==0)
                        throw(SQL,"basket.window","Stream table %s.%s not 
accessible\n",sch,tbl);
        }
-       if( pci->argc == 5)
+       baskets[idx].window = window;
+       if( pci->argc == 5) {
                stride = *getArgReference_int(stk,pci,4);
-       else stride = window;
-       baskets[idx].window = window;
-       baskets[idx].stride = stride;
+               baskets[idx].stride = stride;
+       }
        return MAL_SUCCEED;
 }
 
@@ -261,7 +264,7 @@ BSKTrelease(Client cntxt, MalBlkPtr mb, 
        if( baskets[idx].window < 0)
                baskets[idx].window = - baskets[idx].window -1;
        return MAL_SUCCEED;
-}*/
+}
 
 static BAT *
 BSKTbindColumn(str sch, str tbl, str col)
@@ -298,11 +301,11 @@ BSKTtid(Client cntxt, MalBlkPtr mb, MalS
        if( b == 0)
                throw(SQL,"basket.bind","Stream table reference column '%s.%s' 
not accessible\n",sch,tbl);
 
-    tids = COLnew(0, TYPE_void, 0, TRANSIENT);
-    if (tids == NULL)
-        throw(SQL, "basket.tid", MAL_MALLOC_FAIL);
+       tids = COLnew(0, TYPE_void, 0, TRANSIENT);
+       if (tids == NULL)
+               throw(SQL, "basket.tid", MAL_MALLOC_FAIL);
        tids->tseqbase = 0;
-    BATsetcount(tids, BATcount(b));
+       BATsetcount(tids, BATcount(b));
        BATsettrivprop(tids);
 
        BBPkeepref( *ret = tids->batCacheid);
@@ -324,19 +327,18 @@ BSKTbind(Client cntxt, MalBlkPtr mb, Mal
        msg = BSKTregisterInternal(cntxt,mb,sch,tbl);
        if( msg)
                return msg;
-       
        bskt = BSKTlocate(sch,tbl);
        b = BSKTbindColumn(sch,tbl,col);
        *ret = 0;
        if( b){
                if( bskt > 0){
-                       if( baskets[bskt].table->stream->window >0){
+                       if( baskets[bskt].window >0){
                                bn = VIEWcreate(0,b);
                                if( bn){
-                                       VIEWbounds(b,bn, 0, 
baskets[bskt].table->stream->window);
+                                       VIEWbounds(b,bn, 0, 
baskets[bskt].window);
                                        BBPkeepref(*ret =  bn->batCacheid);
                                } else
-                                       throw(SQL,"basket.bind","Can not create 
view %s.%s.%s[%d]\n",sch,tbl,col,baskets[bskt].table->stream->window );
+                                       throw(SQL,"basket.bind","Can not create 
view %s.%s.%s[%d]\n",sch,tbl,col,baskets[bskt].window );
                        } else{
                                BBPkeepref( *ret = b->batCacheid);
                                BBPfix(b->batCacheid); // don't loose it
@@ -459,10 +461,10 @@ BSKTtumble(Client cntxt, MalBlkPtr mb, M
                        throw(SQL,"basket.tumble","Stream table %s.%s not 
accessible \n",sch,tbl);
        }
        // don't tumble when the window constraint has not been set to at least 0
-       if( baskets[idx].table->stream->window < 0)
+       if( baskets[idx].window < 0)
                return MAL_SUCCEED;
        /* also take care of time-based tumbling */
-       elm =(int) baskets[idx].table->stream->stride;
+       elm =(int) baskets[idx].stride;
        return BSKTtumbleInternal(cntxt, sch, tbl, idx, elm);
 }
 
@@ -546,8 +548,8 @@ BSKTdump(void *ret)
                                        baskets[bskt].table->s->base.name,
                                        baskets[bskt].table->base.name,
                                        baskets[bskt].count,
-                                       baskets[bskt].table->stream->window,
-                                       baskets[bskt].table->stream->stride,
+                                       baskets[bskt].window,
+                                       baskets[bskt].stride,
                                        baskets[bskt].error,
                                        cnt);
                }
@@ -757,8 +759,8 @@ BSKTstatus (Client cntxt, MalBlkPtr mb, 
                        if( BUNappend(seen, &baskets[i].seen, FALSE) != 
GDK_SUCCEED ||
                                BUNappend(schema, 
baskets[i].table->s->base.name, FALSE) != GDK_SUCCEED ||
                                BUNappend(table, baskets[i].table->base.name, 
FALSE) != GDK_SUCCEED ||
-                               BUNappend(window, 
&baskets[i].table->stream->window, FALSE) != GDK_SUCCEED ||
-                               BUNappend(stride, 
&baskets[i].table->stream->stride, FALSE) != GDK_SUCCEED ||
+                               BUNappend(window, &baskets[i].window, FALSE) != 
GDK_SUCCEED ||
+                               BUNappend(stride, &baskets[i].stride, FALSE) != 
GDK_SUCCEED ||
                                BUNappend(events, &baskets[i].events, FALSE) != 
GDK_SUCCEED ||
                                BUNappend(errors, (baskets[i].error? 
baskets[i].error:""), FALSE) != GDK_SUCCEED )
                                goto wrapup;
@@ -803,9 +805,8 @@ BSKTprelude(void *ret)
 }
 
 str
-BSKTepilogue(void *ret)
+BSKTshutdown(void)
 {
-       (void) ret;
        if(baskets)
                GDKfree(baskets);
        baskets = NULL;
diff --git a/sql/backends/monet5/sql_basket.h b/sql/backends/monet5/sql_basket.h
--- a/sql/backends/monet5/sql_basket.h
+++ b/sql/backends/monet5/sql_basket.h
@@ -33,8 +33,8 @@ typedef struct{
        BAT **bats;                     /* the bats comprising the basket */
        int ncols;                      /* number of columns of the table */
        BUN count;                      /* number of events available in basket 
*/
-       //int window;           /* consumption size (now in the table's stream) 
*/
-       //int stride;           /* stride forward after consumption (now in the 
table's stream) */
+       int window;                     /* consumption size */
+       int stride;                     /* stride forward after consumption  */
 
        /* statistics */
        timestamp seen;
@@ -54,9 +54,9 @@ sql5_export str BSKTregister(Client cntx
 sql5_export str BSKTtid(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 sql5_export str BSKTbind(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 
-/*sql5_export str BSKTkeep(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
+sql5_export str BSKTkeep(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 sql5_export str BSKTrelease(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
-sql5_export str BSKTwindow(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);*/
+sql5_export str BSKTwindow(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 sql5_export str BSKTtumble(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 sql5_export str BSKTreset(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 sql5_export str BSKTcommit(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
@@ -73,8 +73,7 @@ sql5_export str BSKTdelete(Client cntxt,
 sql5_export str BSKTlock(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 sql5_export str BSKTunlock(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 
-sql5_export void BSKTclean(int idx);
 sql5_export str BSKTdump(void *ret);
 sql5_export str BSKTprelude(void *ret);
-sql5_export str BSKTepilogue(void *ret);
+sql5_export str BSKTshutdown(void);
 #endif
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
@@ -538,6 +538,10 @@ drop_func(mvc *sql, char *sname, char *n
                                list_destroy(list_func);
                                return sql_message("DROP %s%s: there are 
database objects dependent on %s%s %s;", KF, F, kf, f, func->base.name);
                        }
+                       if(IS_PROC(func) && CQlocateExternal(sname, name)) {
+                               list_destroy(list_func);
+                               return sql_message("DROP %s%s: there are 
continuous queries dependent on %s%s %s;", KF, F, kf, f, func->base.name);
+                       }
                }
                mvc_drop_all_func(sql, s, list_func, action);
                list_destroy(list_func);
@@ -546,20 +550,34 @@ drop_func(mvc *sql, char *sname, char *n
 }
 
 static char *
-create_func(mvc *sql, char *sname, char *fname, sql_func *f)
+create_func(mvc *sql, char *sname, char *fname, sql_func *f, sql_func *fo, int 
replace)
 {
        sql_func *nf;
        sql_schema *s = NULL;
+       node *n;
        char is_aggr = (f->type == F_AGGR);
        char is_func = (f->type != F_PROC);
+       char is_loader = (f->type == F_LOADER);
        char *F = is_aggr ? "AGGREGATE" : (is_func ? "FUNCTION" : "PROCEDURE");
+       char *fn = is_loader?"loader":(is_aggr ? "aggregate" : (is_func ? 
"function" : "procedure"));
        char *KF = f->type == F_FILT ? "FILTER " : f->type == F_UNION ? "UNION 
" : "";
+       char *kf = f->type == F_FILT ? "filter " : f->type == F_UNION ? "union 
" : "";
 
        (void)fname;
        if (sname && !(s = mvc_bind_schema(sql, sname)))
                return sql_message("3F000!CREATE %s%s: no such schema '%s'", 
KF, F, sname);
        if (!s)
                s = cur_schema(sql);
+       if (replace && fo && (n = find_sql_func_node(s, fo->base.id))) {
+               if (!mvc_schema_privs(sql, s))
+                       return sql_message("3F000!CREATE OR REPLACE %s%s: 
access denied for %s to schema ;'%s'", KF, F, stack_get_string(sql, 
"current_user"), s->base.name);
+               if (mvc_check_dependency(sql, fo->base.id, !IS_PROC(fo) ? 
FUNC_DEPENDENCY : PROC_DEPENDENCY, NULL))
+                       return sql_message("3F000!CREATE OR REPLACE %s%s: there 
are database objects dependent on %s%s %s;", KF, F, kf, fn, fo->base.name);
+               if(IS_PROC(fo) && CQlocateExternal(sname, fo->base.name))
+                       return sql_message("3F000!CREATE OR REPLACE %s%s: there 
are continuous queries dependent on %s%s %s;", KF, F, kf, fn, fo->base.name);
+
+               mvc_drop_func(sql, s, n->data, 0);
+       }
        nf = mvc_create_func(sql, NULL, s, f->base.name, f->ops, f->res, 
f->type, f->lang, f->mod, f->imp, f->query, f->varres, f->vararg);
        if (nf && nf->query && nf->lang <= FUNC_LANG_SQL) {
                char *buf;
@@ -773,7 +791,7 @@ UPGcreate_func(Client cntxt, MalBlkPtr m
                char *schema = 
((stmt*)s->op1->op4.lval->h->data)->op4.aval->data.val.sval;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to