Changeset: fc72232f2991 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/fc72232f2991 Modified Files: sql/include/sql_catalog.h sql/server/rel_dump.c sql/server/rel_exp.c sql/server/rel_exp.h sql/server/rel_optimizer.c sql/server/rel_rel.c sql/server/rel_select.c sql/server/sql_mvc.h sql/storage/sql_catalog.c sql/storage/sql_storage.h sql/test/BugTracker-2015/Tests/quantile_function_resolution.Bug-3773.test sql/test/analytics/Tests/analytics00.test sql/test/miscellaneous/Tests/simple_plans.test sql/test/miscellaneous/Tests/simple_selects.test Branch: antipush Log Message:
Merged with default diffs (truncated from 4734 to 300 lines): diff --git a/clients/Tests/MAL-signatures.stable.out b/clients/Tests/MAL-signatures.stable.out --- a/clients/Tests/MAL-signatures.stable.out +++ b/clients/Tests/MAL-signatures.stable.out @@ -637,6 +637,7 @@ [ "bat", "getRole", "command bat.getRole(X_0:bat[:any_1]):str ", "BKCgetRole;", "Returns the rolename of the head column of a BAT." ] [ "bat", "getSequenceBase", "command bat.getSequenceBase(X_0:bat[:any_1]):oid ", "BKCgetSequenceBase;", "Get the sequence base for the void column of a BAT." ] [ "bat", "getSize", "command bat.getSize(X_0:bat[:any_1]):lng ", "BKCgetSize;", "Calculate the actual size of the BAT descriptor, heaps, hashes and imprint indices in bytes\nrounded to the memory page size (see bbp.getPageSize())." ] +[ "bat", "getVHeapSize", "command bat.getVHeapSize(X_0:bat[:any_1]):lng ", "BKCgetVHeapSize;", "Calculate the vheap size for string bats" ] [ "bat", "getorderidx", "pattern bat.getorderidx(X_0:bat[:any_1]):bat[:oid] ", "OIDXgetorderidx;", "Return the order index if it exists" ] [ "bat", "hasorderidx", "pattern bat.hasorderidx(X_0:bat[:any_1]):bit ", "OIDXhasorderidx;", "Return true if order index exists" ] [ "bat", "imprints", "command bat.imprints(X_0:bat[:bte]):void ", "CMDBATimprints;", "" ] @@ -689,6 +690,7 @@ [ "bat", "setPersistent", "command bat.setPersistent(X_0:bat[:any_1]):void ", "BKCsetPersistent;", "Make the BAT persistent." ] [ "bat", "setTransient", "command bat.setTransient(X_0:bat[:any_1]):void ", "BKCsetTransient;", "Make the BAT transient. Returns \nboolean which indicates if the\nBAT administration has indeed changed." ] [ "bat", "single", "pattern bat.single(X_0:any_1):bat[:any_1] ", "CMDBATsingle;", "Create a BAT with a single elemenet" ] +[ "bat", "vacuum", "command bat.vacuum(X_0:bat[:str]):bat[:str] ", "CMDBATvacuum;", "" ] [ "bataggr", "allnotequal", "pattern bataggr.allnotequal(X_0:bat[:any_1], X_1:bat[:any_1]):bit ", "SQLallnotequal;", "" ] [ "bataggr", "anyequal", "pattern bataggr.anyequal(X_0:bat[:any_1], X_1:bat[:any_1]):bat[:bit] ", "SQLanyequal;", "" ] [ "bataggr", "exist", "pattern bataggr.exist(X_0:any_1):bat[:bit] ", "SQLexist;", "" ] @@ -9427,6 +9429,7 @@ [ "sql", "stdevp", "pattern sql.stdevp(X_0:int, X_1:bit, X_2:bit, X_3:int, X_4:oid, X_5:oid):dbl ", "SQLstddev_pop;", "return the standard deviation population of groups" ] [ "sql", "stdevp", "pattern sql.stdevp(X_0:lng, X_1:bit, X_2:bit, X_3:int, X_4:oid, X_5:oid):dbl ", "SQLstddev_pop;", "return the standard deviation population of groups" ] [ "sql", "stdevp", "pattern sql.stdevp(X_0:sht, X_1:bit, X_2:bit, X_3:int, X_4:oid, X_5:oid):dbl ", "SQLstddev_pop;", "return the standard deviation population of groups" ] +[ "sql", "stop_vacuum", "pattern sql.stop_vacuum(X_0:str, X_1:str, X_2:str):void ", "SQLstr_column_stop_vacuum;", "stop auto vacuum" ] [ "sql", "storage", "pattern sql.storage() (X_0:bat[:str], X_1:bat[:str], X_2:bat[:str], X_3:bat[:str], X_4:bat[:str], X_5:bat[:str], X_6:bat[:lng], X_7:bat[:int], X_8:bat[:lng], X_9:bat[:lng], X_10:bat[:lng], X_11:bat[:bit], X_12:bat[:lng], X_13:bat[:bit], X_14:bat[:bit], X_15:bat[:bit], X_16:bat[:lng]) ", "sql_storage;", "return a table with storage information " ] [ "sql", "storage", "pattern sql.storage(X_0:str) (X_1:bat[:str], X_2:bat[:str], X_3:bat[:str], X_4:bat[:str], X_5:bat[:str], X_6:bat[:str], X_7:bat[:lng], X_8:bat[:int], X_9:bat[:lng], X_10:bat[:lng], X_11:bat[:lng], X_12:bat[:bit], X_13:bat[:lng], X_14:bat[:bit], X_15:bat[:bit], X_16:bat[:bit], X_17:bat[:lng]) ", "sql_storage;", "return a table with storage information for a particular schema " ] [ "sql", "storage", "pattern sql.storage(X_0:str, X_1:str) (X_2:bat[:str], X_3:bat[:str], X_4:bat[:str], X_5:bat[:str], X_6:bat[:str], X_7:bat[:str], X_8:bat[:lng], X_9:bat[:int], X_10:bat[:lng], X_11:bat[:lng], X_12:bat[:lng], X_13:bat[:bit], X_14:bat[:lng], X_15:bat[:bit], X_16:bat[:bit], X_17:bat[:bit], X_18:bat[:lng]) ", "sql_storage;", "return a table with storage information for a particular table" ] @@ -9455,6 +9458,8 @@ [ "sql", "update", "pattern sql.update(X_0:int, X_1:str, X_2:str, X_3:str, X_4:any, X_5:any):int ", "mvc_update_wrap;", "Update the values of the column tname.cname. Returns sequence number for order dependence)" ] [ "sql", "update_schemas", "unsafe pattern sql.update_schemas():void ", "SYSupdate_schemas;", "Procedure triggered on update of the sys.schemas table" ] [ "sql", "update_tables", "unsafe pattern sql.update_tables():void ", "SYSupdate_tables;", "Procedure triggered on update of the sys._tables table" ] +[ "sql", "vacuum", "pattern sql.vacuum(X_0:str, X_1:str, X_2:str, X_3:int):void ", "SQLstr_column_auto_vacuum;", "auto vacuum string column with interval(sec)" ] +[ "sql", "vacuum", "pattern sql.vacuum(X_0:str, X_1:str, X_2:str):void ", "SQLstr_column_vacuum;", "vacuum a string column" ] [ "sql", "variance", "pattern sql.variance(X_0:bte, X_1:bit, X_2:bit, X_3:int, X_4:oid, X_5:oid):dbl ", "SQLvar_samp;", "return the variance sample of groups" ] [ "sql", "variance", "pattern sql.variance(X_0:dbl, X_1:bit, X_2:bit, X_3:int, X_4:oid, X_5:oid):dbl ", "SQLvar_samp;", "return the variance sample of groups" ] [ "sql", "variance", "pattern sql.variance(X_0:flt, X_1:bit, X_2:bit, X_3:int, X_4:oid, X_5:oid):dbl ", "SQLvar_samp;", "return the variance sample of groups" ] diff --git a/clients/Tests/MAL-signatures.stable.out.int128 b/clients/Tests/MAL-signatures.stable.out.int128 --- a/clients/Tests/MAL-signatures.stable.out.int128 +++ b/clients/Tests/MAL-signatures.stable.out.int128 @@ -750,6 +750,7 @@ [ "bat", "getRole", "command bat.getRole(X_0:bat[:any_1]):str ", "BKCgetRole;", "Returns the rolename of the head column of a BAT." ] [ "bat", "getSequenceBase", "command bat.getSequenceBase(X_0:bat[:any_1]):oid ", "BKCgetSequenceBase;", "Get the sequence base for the void column of a BAT." ] [ "bat", "getSize", "command bat.getSize(X_0:bat[:any_1]):lng ", "BKCgetSize;", "Calculate the actual size of the BAT descriptor, heaps, hashes and imprint indices in bytes\nrounded to the memory page size (see bbp.getPageSize())." ] +[ "bat", "getVHeapSize", "command bat.getVHeapSize(X_0:bat[:any_1]):lng ", "BKCgetVHeapSize;", "Calculate the vheap size for string bats" ] [ "bat", "getorderidx", "pattern bat.getorderidx(X_0:bat[:any_1]):bat[:oid] ", "OIDXgetorderidx;", "Return the order index if it exists" ] [ "bat", "hasorderidx", "pattern bat.hasorderidx(X_0:bat[:any_1]):bit ", "OIDXhasorderidx;", "Return true if order index exists" ] [ "bat", "imprints", "command bat.imprints(X_0:bat[:bte]):void ", "CMDBATimprints;", "" ] @@ -804,6 +805,7 @@ [ "bat", "setPersistent", "command bat.setPersistent(X_0:bat[:any_1]):void ", "BKCsetPersistent;", "Make the BAT persistent." ] [ "bat", "setTransient", "command bat.setTransient(X_0:bat[:any_1]):void ", "BKCsetTransient;", "Make the BAT transient. Returns \nboolean which indicates if the\nBAT administration has indeed changed." ] [ "bat", "single", "pattern bat.single(X_0:any_1):bat[:any_1] ", "CMDBATsingle;", "Create a BAT with a single elemenet" ] +[ "bat", "vacuum", "command bat.vacuum(X_0:bat[:str]):bat[:str] ", "CMDBATvacuum;", "" ] [ "bataggr", "allnotequal", "pattern bataggr.allnotequal(X_0:bat[:any_1], X_1:bat[:any_1]):bit ", "SQLallnotequal;", "" ] [ "bataggr", "anyequal", "pattern bataggr.anyequal(X_0:bat[:any_1], X_1:bat[:any_1]):bat[:bit] ", "SQLanyequal;", "" ] [ "bataggr", "exist", "pattern bataggr.exist(X_0:any_1):bat[:bit] ", "SQLexist;", "" ] @@ -12739,6 +12741,7 @@ [ "sql", "stdevp", "pattern sql.stdevp(X_0:int, X_1:bit, X_2:bit, X_3:int, X_4:oid, X_5:oid):dbl ", "SQLstddev_pop;", "return the standard deviation population of groups" ] [ "sql", "stdevp", "pattern sql.stdevp(X_0:lng, X_1:bit, X_2:bit, X_3:int, X_4:oid, X_5:oid):dbl ", "SQLstddev_pop;", "return the standard deviation population of groups" ] [ "sql", "stdevp", "pattern sql.stdevp(X_0:sht, X_1:bit, X_2:bit, X_3:int, X_4:oid, X_5:oid):dbl ", "SQLstddev_pop;", "return the standard deviation population of groups" ] +[ "sql", "stop_vacuum", "pattern sql.stop_vacuum(X_0:str, X_1:str, X_2:str):void ", "SQLstr_column_stop_vacuum;", "stop auto vacuum" ] [ "sql", "storage", "pattern sql.storage() (X_0:bat[:str], X_1:bat[:str], X_2:bat[:str], X_3:bat[:str], X_4:bat[:str], X_5:bat[:str], X_6:bat[:lng], X_7:bat[:int], X_8:bat[:lng], X_9:bat[:lng], X_10:bat[:lng], X_11:bat[:bit], X_12:bat[:lng], X_13:bat[:bit], X_14:bat[:bit], X_15:bat[:bit], X_16:bat[:lng]) ", "sql_storage;", "return a table with storage information " ] [ "sql", "storage", "pattern sql.storage(X_0:str) (X_1:bat[:str], X_2:bat[:str], X_3:bat[:str], X_4:bat[:str], X_5:bat[:str], X_6:bat[:str], X_7:bat[:lng], X_8:bat[:int], X_9:bat[:lng], X_10:bat[:lng], X_11:bat[:lng], X_12:bat[:bit], X_13:bat[:lng], X_14:bat[:bit], X_15:bat[:bit], X_16:bat[:bit], X_17:bat[:lng]) ", "sql_storage;", "return a table with storage information for a particular schema " ] [ "sql", "storage", "pattern sql.storage(X_0:str, X_1:str) (X_2:bat[:str], X_3:bat[:str], X_4:bat[:str], X_5:bat[:str], X_6:bat[:str], X_7:bat[:str], X_8:bat[:lng], X_9:bat[:int], X_10:bat[:lng], X_11:bat[:lng], X_12:bat[:lng], X_13:bat[:bit], X_14:bat[:lng], X_15:bat[:bit], X_16:bat[:bit], X_17:bat[:bit], X_18:bat[:lng]) ", "sql_storage;", "return a table with storage information for a particular table" ] @@ -12772,6 +12775,8 @@ [ "sql", "update", "pattern sql.update(X_0:int, X_1:str, X_2:str, X_3:str, X_4:any, X_5:any):int ", "mvc_update_wrap;", "Update the values of the column tname.cname. Returns sequence number for order dependence)" ] [ "sql", "update_schemas", "unsafe pattern sql.update_schemas():void ", "SYSupdate_schemas;", "Procedure triggered on update of the sys.schemas table" ] [ "sql", "update_tables", "unsafe pattern sql.update_tables():void ", "SYSupdate_tables;", "Procedure triggered on update of the sys._tables table" ] +[ "sql", "vacuum", "pattern sql.vacuum(X_0:str, X_1:str, X_2:str, X_3:int):void ", "SQLstr_column_auto_vacuum;", "auto vacuum string column with interval(sec)" ] +[ "sql", "vacuum", "pattern sql.vacuum(X_0:str, X_1:str, X_2:str):void ", "SQLstr_column_vacuum;", "vacuum a string column" ] [ "sql", "variance", "pattern sql.variance(X_0:bte, X_1:bit, X_2:bit, X_3:int, X_4:oid, X_5:oid):dbl ", "SQLvar_samp;", "return the variance sample of groups" ] [ "sql", "variance", "pattern sql.variance(X_0:dbl, X_1:bit, X_2:bit, X_3:int, X_4:oid, X_5:oid):dbl ", "SQLvar_samp;", "return the variance sample of groups" ] [ "sql", "variance", "pattern sql.variance(X_0:flt, X_1:bit, X_2:bit, X_3:int, X_4:oid, X_5:oid):dbl ", "SQLvar_samp;", "return the variance sample of groups" ] diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out --- a/clients/Tests/exports.stable.out +++ b/clients/Tests/exports.stable.out @@ -514,6 +514,8 @@ size_t escapedStrlen(const char *restric ssize_t fltFromStr(const char *src, size_t *len, flt **dst, bool external); ssize_t fltToStr(str *dst, size_t *len, const flt *src, bool external); const flt flt_nil; +gdk_return gdk_add_callback(char *name, gdk_callback_func *f, int argc, void *argv[], int interval); +gdk_return gdk_remove_callback(char *, gdk_callback_func *f); geomcatalogfix_fptr geomcatalogfix_get(void); void geomcatalogfix_set(geomcatalogfix_fptr); geomsqlfix_fptr geomsqlfix_get(void); diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -1252,7 +1252,6 @@ gdk_export BAT *COLcopy(BAT *b, int tt, gdk_export gdk_return BATgroup(BAT **groups, BAT **extents, BAT **histo, BAT *b, BAT *s, BAT *g, BAT *e, BAT *h) __attribute__((__warn_unused_result__)); - /* * @- BAT Input/Output * @multitable @columnfractions 0.08 0.7 @@ -2381,4 +2380,20 @@ gdk_export BAT *BATsample_with_seed(BAT CALLBACK; \ } while (0) +typedef struct gdk_callback { + char *name; + int argc; + int interval; // units sec + lng last_called; // timestamp GDKusec + gdk_return (*func)(int argc, void *argv[]); + struct gdk_callback *next; + void *argv[FLEXIBLE_ARRAY_MEMBER]; +} gdk_callback; + +typedef gdk_return gdk_callback_func(int argc, void *argv[]); + +gdk_export gdk_return gdk_add_callback(char *name, gdk_callback_func *f, int argc, void + *argv[], int interval); +gdk_export gdk_return gdk_remove_callback(char *, gdk_callback_func *f); + #endif /* _GDK_H_ */ diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c --- a/gdk/gdk_bat.c +++ b/gdk/gdk_bat.c @@ -2787,3 +2787,4 @@ BATassertProps(BAT *b) } MT_lock_unset(&b->theaplock); } + diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c --- a/gdk/gdk_bbp.c +++ b/gdk/gdk_bbp.c @@ -130,6 +130,7 @@ static gdk_return BBPprepare(bool subcom static BAT *getBBPdescriptor(bat i, bool lock); static gdk_return BBPbackup(BAT *b, bool subcommit); static gdk_return BBPdir_init(void); +static void BBPcallbacks(void); static lng BBPlogno; /* two lngs of extra info in BBP.dir */ static lng BBPtransid; @@ -1404,6 +1405,7 @@ BBPmanager(void *dummy) return; } BBPtrim(false); + BBPcallbacks(); if (GDKexiting()) return; } @@ -4306,3 +4308,129 @@ gdk_bbp_reset(void) backup_dir = 0; backup_subdir = 0; } + +static MT_Lock GDKCallbackListLock = MT_LOCK_INITIALIZER(GDKCallbackListLock); + +static struct { + int cnt; + gdk_callback *head; +} callback_list = { + .cnt = 0, + .head = NULL, +}; + +/* + * @- Add a callback + * Adds new callback to the callback list. + */ +gdk_return +gdk_add_callback(char *name, gdk_callback_func *f, int argc, void *argv[], int + interval) +{ + + gdk_callback *callback = NULL; + gdk_callback *p = callback_list.head; + + if (!(callback = GDKmalloc(sizeof(gdk_callback) + sizeof(void *) * argc))) { + TRC_CRITICAL(GDK, "Failed to allocate memory!"); + return GDK_FAIL; + } + + *callback = (gdk_callback) { + .name = name, + .argc = argc, + .interval = interval, + .func = f, + }; + + for (int i=0; i < argc; i++) { + callback->argv[i] = argv[i]; + } + + MT_lock_set(&GDKCallbackListLock); + if (p) { + int cnt = 1; + do { + // check if already added + if (strcmp(callback->name, p->name) == 0) + return GDK_FAIL; + if (p->next == NULL) { + p->next = callback; + p = callback->next; + } else { + p = p->next; + } + cnt += 1; + } while(p); + callback_list.cnt = cnt; + } else { + callback_list.cnt = 1; + callback_list.head = callback; + } + MT_lock_unset(&GDKCallbackListLock); + return GDK_SUCCEED; +} + +/* + * @- Remove a callback + * Removes a callback from the callback list with a given name as an argument. + */ +gdk_return +gdk_remove_callback(char *cb_name, gdk_callback_func *argsfree) +{ + gdk_callback *curr = callback_list.head; + gdk_callback *prev = NULL; + gdk_return res = GDK_FAIL; + while(curr) { + if (strcmp(cb_name, curr->name) == 0) { + MT_lock_set(&GDKCallbackListLock); + if (curr == callback_list.head && prev == NULL) { + callback_list.head = curr->next; + } else { + prev->next = curr->next; + } + if (argsfree) + argsfree(curr->argc, curr->argv); + GDKfree(curr); + curr = NULL; + callback_list.cnt -=1; + res = GDK_SUCCEED; + MT_lock_unset(&GDKCallbackListLock); + } else { + prev = curr; + curr = curr->next; + } + } + return res; +} + +static gdk_return +do_callback(gdk_callback *cb) +{ + cb->last_called = GDKusec(); + return cb->func(cb->argc, cb->argv); +} + +static bool +should_call(gdk_callback *cb) +{ + if (cb->last_called && cb->interval) { + return (cb->last_called + cb->interval * 1000 * 1000) < + GDKusec(); + } + return true; +} + +static void +BBPcallbacks(void) +{ + gdk_callback *next = callback_list.head; + + MT_lock_set(&GDKCallbackListLock); + while (next) { + if(should_call(next)) + do_callback(next); + next = next->next; + } + MT_lock_unset(&GDKCallbackListLock); +} diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c --- a/gdk/gdk_calc.c +++ b/gdk/gdk_calc.c @@ -16929,12 +16929,14 @@ VARconvert(ValPtr ret, const ValRecord * 0, abort_on_error, &reduce, scale1, scale2, precision); } - if (nils == BUN_NONE + 1) { - GDKerror("conversion from type %s to type %s " - "unsupported.\n", - ATOMname(v->vtype), ATOMname(ret->vtype)); + if (nils >= BUN_NONE) { + if (nils == BUN_NONE + 1) { + GDKerror("conversion from type %s to type %s " + "unsupported.\n", + ATOMname(v->vtype), ATOMname(ret->vtype)); + } return GDK_FAIL; } ret->len = ATOMlen(ret->vtype, VALptr(ret)); - return nils == BUN_NONE ? GDK_FAIL : GDK_SUCCEED; -} + return GDK_SUCCEED; +} diff --git a/monetdb5/mal/mal_instruction.c b/monetdb5/mal/mal_instruction.c --- a/monetdb5/mal/mal_instruction.c +++ b/monetdb5/mal/mal_instruction.c _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list