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