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

Reply via email to