Changeset: 330787e5b698 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=330787e5b698
Modified Files:
        buildtools/autogen/scripts/mal2h.py
        buildtools/autogen/scripts/sql2h.py
        monetdb5/mal/mal_import.c
        monetdb5/modules/atoms/batxml.mal.h
        monetdb5/modules/atoms/blob.mal.h
        monetdb5/modules/atoms/color.mal.h
        monetdb5/modules/atoms/identifier.mal.h
        monetdb5/modules/atoms/inet.mal.h
        monetdb5/modules/atoms/json.mal.h
        monetdb5/modules/atoms/mtime.mal.h
        monetdb5/modules/atoms/str.mal.h
        monetdb5/modules/atoms/streams.mal.h
        monetdb5/modules/atoms/url.mal.h
        monetdb5/modules/atoms/uuid.mal.h
        monetdb5/modules/atoms/xml.mal.h
        monetdb5/modules/kernel/00_aggr_hge.mal.h
        monetdb5/modules/kernel/aggr.mal.h
        monetdb5/modules/kernel/alarm.mal.h
        monetdb5/modules/kernel/algebra.mal.h
        monetdb5/modules/kernel/bat5.mal.h
        monetdb5/modules/kernel/batcolor.mal.h
        monetdb5/modules/kernel/batstr.mal.h
        monetdb5/modules/kernel/logger.mal.h
        monetdb5/modules/kernel/microbenchmark.mal.h
        monetdb5/modules/kernel/mmath.mal.h
        monetdb5/modules/kernel/status.mal.h
        monetdb5/modules/mal/00_batcalc_hge.mal.h
        monetdb5/modules/mal/00_calc_hge.mal.h
        monetdb5/modules/mal/00_mal_mapi_hge.mal.h
        monetdb5/modules/mal/00_mkey_hge.mal.h
        monetdb5/modules/mal/01_batcalc.mal.h
        monetdb5/modules/mal/01_calc.mal.h
        monetdb5/modules/mal/batExtensions.mal.h
        monetdb5/modules/mal/batmtime.mal.h
        monetdb5/modules/mal/bbp.mal.h
        monetdb5/modules/mal/clients.mal.h
        monetdb5/modules/mal/factories.mal.h
        monetdb5/modules/mal/groupby.mal.h
        monetdb5/modules/mal/inspect.mal.h
        monetdb5/modules/mal/iterator.mal.h
        monetdb5/modules/mal/json_util.mal.h
        monetdb5/modules/mal/language.mal.h
        monetdb5/modules/mal/mal_io.mal.h
        monetdb5/modules/mal/mal_mapi.mal.h
        monetdb5/modules/mal/manual.mal.h
        monetdb5/modules/mal/mat.mal.h
        monetdb5/modules/mal/mdb.mal.h
        monetdb5/modules/mal/mkey.mal.h
        monetdb5/modules/mal/oltp.mal.h
        monetdb5/modules/mal/orderidx.mal.h
        monetdb5/modules/mal/pcre.mal.h
        monetdb5/modules/mal/profiler.mal.h
        monetdb5/modules/mal/querylog.mal.h
        monetdb5/modules/mal/remote.mal.h
        monetdb5/modules/mal/sabaoth.mal.h
        monetdb5/modules/mal/sample.mal.h
        monetdb5/modules/mal/sysmon.mal.h
        monetdb5/modules/mal/tokenizer.mal.h
        monetdb5/modules/mal/transaction.mal.h
        monetdb5/modules/mal/txtsim.mal.h
        monetdb5/modules/mal/wlc.mal.h
        monetdb5/optimizer/optimizer.mal.h
        monetdb5/scheduler/run_adder.mal.h
        monetdb5/scheduler/run_isolate.mal.h
        monetdb5/scheduler/run_memo.mal.h
        sql/backends/monet5/generator/generator.mal.h
        sql/backends/monet5/generator/generator_hge.mal.h
        sql/backends/monet5/sql.mal.h
        sql/backends/monet5/sql_decimal.mal.h
        sql/backends/monet5/sql_decimal_hge.mal.h
        sql/backends/monet5/sql_hge.mal.h
        sql/backends/monet5/sql_rank.mal.h
        sql/backends/monet5/sql_rank_hge.mal.h
        sql/backends/monet5/sql_transaction.mal.h
        sql/backends/monet5/sqlcatalog.mal.h
        sql/backends/monet5/wlr.mal.h
Branch: translate-scripts
Log Message:

Add option to keep MAL command's comment when translating to C header files. 
The comments are used by some modules, so we will keep them.


diffs (truncated from 894 to 300 lines):

diff --git a/buildtools/autogen/scripts/mal2h.py 
b/buildtools/autogen/scripts/mal2h.py
--- a/buildtools/autogen/scripts/mal2h.py
+++ b/buildtools/autogen/scripts/mal2h.py
@@ -13,6 +13,7 @@ import argparse
 parser = argparse.ArgumentParser(description='Convert MonetDB MAL scripts to C 
header files to be inlined')
 parser.add_argument('file', metavar='F', type=str, help='The MAL file to 
convert')
 parser.add_argument('-t', '--trim', dest='trim', action='store_true', 
help='trim whitespaces')
+parser.add_argument('-r', '--rcomments', dest='rcom', action='store_true', 
help='remove comments')
 
 # check arguments and veracity of the input file first
 args = parser.parse_args()
@@ -56,8 +57,10 @@ insert1 = (
 mal_h_output_file.write(insert1)
 
 # Let's remove comments from the mal script with a Markov chain :) Bugs might 
still be there
-# STATES 0 - OK, 1 in # comment, 2 between comment keyword and comment block, 
3 inside address comment block,
-# 4 inside ' string, 5 inside " string, 6 inside whitespaces
+# STATES 0 - OK, 1 in # comment, 2 between comment keyword and comment block 
(removing comments),
+# 3 inside address comment block (removing comments),
+# 4 between comment keyword and comment block (not removing comments),
+# 5 inside address comment block (not removing comments), 6 inside " string, 7 
inside whitespaces
 CACHE_SIZE = file_stat.st_blksize  # we will set the cache size to the 
filesystem blocksize
 
 buffer = ['\0'] * CACHE_SIZE
@@ -79,17 +82,17 @@ def write_to_buffer(input_c):
 while i < endloop:
     c = mal_content[i]
 
-    if cur_state == 1:
+    if cur_state == 1:  # inside an hashtag comment
         if c == '\n':
             cur_state = 0
         i += 1
         continue
-    elif cur_state == 2:
+    elif cur_state == 2:  # before entering a MAL comment, and removing it
         if c == '"':
             cur_state = 3
         i += 1
         continue
-    elif cur_state == 3:
+    elif cur_state == 3:  # inside a MAL comment, and removing it
         if c == '\\':
             i += 2
         elif c == '"':
@@ -98,7 +101,40 @@ while i < endloop:
         else:
             i += 1
         continue
-    elif cur_state == 4:
+    elif cur_state == 4:  # before entering a MAL comment, but not removing it
+        if c == '"':
+            write_to_buffer('\\')
+            write_to_buffer('"')
+            cur_state = 5
+        i += 1
+        continue
+    elif cur_state == 5:  # inside a MAL comment, but not removing it
+        if c == '\\' and i + 1 < endloop:
+            write_to_buffer('\\')
+            write_to_buffer('\\')
+            write_to_buffer('\\')
+            write_to_buffer('\\')
+            write_to_buffer('\\')
+            write_to_buffer(mal_content[i + 1])
+            i += 2
+        elif c == '\n':
+            write_to_buffer('\\')
+            write_to_buffer('n')
+            i += 1
+        elif c == '\t':
+            write_to_buffer('\\')
+            write_to_buffer('t')
+            i += 1
+        else:
+            if c == '"':
+                write_to_buffer('\\')
+                write_to_buffer('\"')
+                cur_state = 0
+            else:
+                write_to_buffer(c)
+            i += 1
+        continue
+    elif cur_state == 6:  # inside a string
         if c == '\\' and i + 1 < endloop:
             write_to_buffer('\\')
             write_to_buffer('\\')
@@ -109,22 +145,9 @@ while i < endloop:
             write_to_buffer('\\')
             write_to_buffer('n')
             i += 1
-        else:
-            if c == '\'':
-                cur_state = 0
-            write_to_buffer(c)
-            i += 1
-        continue
-    elif cur_state == 5:
-        if c == '\\' and i + 1 < endloop:
+        elif c == '\t':
             write_to_buffer('\\')
-            write_to_buffer('\\')
-            write_to_buffer('\\')
-            write_to_buffer(mal_content[i + 1])
-            i += 2
-        elif c == '\n':
-            write_to_buffer('\\')
-            write_to_buffer('n')
+            write_to_buffer('t')
             i += 1
         else:
             if c == '"':
@@ -133,7 +156,7 @@ while i < endloop:
             write_to_buffer(c)
             i += 1
         continue
-    elif cur_state == 6:
+    elif cur_state == 7:  # inside whitespaces
         if c not in (' ', '\t', '\n'):
             cur_state = 0
             continue
@@ -144,14 +167,14 @@ while i < endloop:
         cur_state = 1
         i += 1
         continue
-    elif c == '\'':
-        write_to_buffer(c)
-        cur_state = 4
-        i += 1
-        continue
     elif c == 'c':
-        if i + 7 < endloop and mal_content[i:i+8] == 'comment ':
-            cur_state = 2
+        if i + 8 < endloop and mal_content[i:i+8] == 'comment ':
+            if args.rcom:
+                cur_state = 2
+            else:
+                for mchar in 'comment ':
+                    write_to_buffer(mchar)
+                cur_state = 4
             i += 7
         else:
             write_to_buffer('c')
@@ -160,7 +183,7 @@ while i < endloop:
     elif c == '"':
         write_to_buffer('\\')
         write_to_buffer(c)
-        cur_state = 5
+        cur_state = 6
         i += 1
         continue
     elif c in (' ', '\t', '\n'):
@@ -173,7 +196,7 @@ while i < endloop:
         else:
             write_to_buffer(c)
         if args.trim:
-            cur_state = 6
+            cur_state = 7
         i += 1
         continue
 
diff --git a/buildtools/autogen/scripts/sql2h.py 
b/buildtools/autogen/scripts/sql2h.py
--- a/buildtools/autogen/scripts/sql2h.py
+++ b/buildtools/autogen/scripts/sql2h.py
@@ -106,6 +106,10 @@ while i < endloop:
             write_to_buffer('\\')
             write_to_buffer('n')
             i += 1
+        elif c == '\t':
+            write_to_buffer('\\')
+            write_to_buffer('t')
+            i += 1
         else:
             if c == '\'':
                 cur_state = 0
@@ -123,6 +127,10 @@ while i < endloop:
             write_to_buffer('\\')
             write_to_buffer('n')
             i += 1
+        elif c == '\t':
+            write_to_buffer('\\')
+            write_to_buffer('t')
+            i += 1
         else:
             if c == '"':
                 cur_state = 0
diff --git a/monetdb5/mal/mal_import.c b/monetdb5/mal/mal_import.c
--- a/monetdb5/mal/mal_import.c
+++ b/monetdb5/mal/mal_import.c
@@ -172,38 +172,6 @@ malInclude(Client c, str name, int listi
        c->listing = listing;
        c->fdin = NULL;
 
-#ifdef HAVE_EMBEDDED
-       (void) filename;
-       (void) p;
-       {
-               size_t mal_init_len = strlen(mal_init_inline);
-               buffer* mal_init_buf;
-               stream* mal_init_stream;
-
-               if ((mal_init_buf = GDKmalloc(sizeof(buffer))) == NULL)
-                       throw(MAL, "malInclude", MAL_MALLOC_FAIL);
-               if ((mal_init_stream = buffer_rastream(mal_init_buf, name)) == 
NULL) {
-                       GDKfree(mal_init_buf);
-                       throw(MAL, "malInclude", MAL_MALLOC_FAIL);
-               }
-               buffer_init(mal_init_buf, mal_init_inline, mal_init_len);
-               c->srcFile = name;
-               c->yycur = 0;
-               c->bak = NULL;
-               if ((c->fdin = bstream_create(mal_init_stream, mal_init_len)) 
== NULL) {
-                       mnstr_destroy(mal_init_stream);
-                       GDKfree(mal_init_buf);
-                       throw(MAL, "malInclude", MAL_MALLOC_FAIL);
-               }
-               bstream_next(c->fdin);
-               parseMAL(c, c->curprg, 1, INT_MAX);
-               free(mal_init_buf);
-               free(mal_init_stream);
-               free(c->fdin);
-               c->fdin = NULL;
-               GDKfree(mal_init_buf);
-       }
-#else
        if ((filename = malResolveFile(name)) != NULL) {
                name = filename;
                do {
@@ -227,7 +195,7 @@ malInclude(Client c, str name, int listi
                GDKfree(name);
                c->fdin = NULL;
        }
-#endif
+
        restoreClient;
        return msg;
 }
diff --git a/monetdb5/modules/atoms/batxml.mal.h 
b/monetdb5/modules/atoms/batxml.mal.h
--- a/monetdb5/modules/atoms/batxml.mal.h
+++ b/monetdb5/modules/atoms/batxml.mal.h
@@ -7,4 +7,4 @@
 */
 
 // This file was generated automatically with mal2h.py. Do not edit this file 
directly.
-{ "batxml", "\nmodule batxml;\n\ncommand 
batxml.xml(src:bat[:str]):bat[:xml]\naddress BATXMLstr2xml\n;\n\ncommand 
batxml.str(src:bat[:xml]):bat[:str]\naddress BATXMLxml2str\n;\n\ncommand 
batxml.document(src:bat[:str]):bat[:xml]\naddress BATXMLdocument\n;\n\ncommand 
batxml.content(src:bat[:str]):bat[:xml]\naddress BATXMLcontent\n;\n\ncommand 
batxml.comment(val:bat[:str]):bat[:xml]\naddress BATXMLcomment\n;\n\ncommand 
batxml.parse(doccont:str,val:bat[:str],option:str):bat[:xml]\naddress 
BATXMLparse\n;\n\ncommand batxml.serialize(val:bat[:xml]):bat[:str]\naddress 
BATXMLxml2str\n;\n\ncommand batxml.text(val:bat[:xml]):bat[:str]\naddress 
BATXMLxmltext\n;\n\ncommand 
batxml.xquery(val:bat[:str],expr:str):bat[:xml]\naddress 
BATXMLxquery\n;\n\n\ncommand batxml.pi(target:str, 
val:bat[:xml]):bat[:xml]\naddress BATXMLpi\n;\n\ncommand 
batxml.attribute(name:str, val:bat[:str]):bat[:xml]\naddress 
BATXMLattribute\n;\n\ncommand batxml.element(name:str, s:bat[:xml]) 
:bat[:xml]\naddress BATXMLelementS
 mall\n; \n\ncommand batxml.options(tag:str, 
option:str,left:bat[:xml]):bat[:xml]\naddress BATXMLoptions\n;\n\ncommand 
batxml.element(name:str, ns:xml, attr:xml, s:bat[:xml]):bat[:xml]\naddress 
BATXMLelement\n;\n\ncommand batxml.concat(left:bat[:xml],right:bat[:xml] 
):bat[:xml]\naddress BATXMLconcat\n;\n\npattern 
batxml.forest(val:bat[:xml]...):bat[:xml]\naddress BATXMLforest\n;\n\ncommand 
batxml.root(val:bat[:xml], version:str, standalone:str):bat[:xml]\naddress 
BATXMLroot\n;\n\ncommand batxml.isdocument(val:bat[:str]):bat[:bit]\naddress 
BATXMLisdocument\n;\n\ncommand xml.aggr(val:bat[:xml]):xml\naddress 
BATXMLgroup\n;\n\ncommand xml.subaggr(val:bat[:xml],g:bat[:oid],e:bat[:any_1], 
skip_nils:bit) :bat[:xml]\naddress AGGRsubxml\n;\n\ncommand 
xml.subaggr(val:bat[:xml],g:bat[:oid],e:bat[:any_1],s:bat[:oid], skip_nils:bit) 
:bat[:xml]\naddress AGGRsubxmlcand\n;\n\nmodule batcalc;\ncommand 
xml(src:bat[:str]):bat[:xml] address BATXMLstr2xml;" }, 
+{ "batxml", "\nmodule batxml;\n\ncommand 
batxml.xml(src:bat[:str]):bat[:xml]\naddress BATXMLstr2xml\ncomment \"Cast the 
string to an xml compliant string.\";\n\ncommand 
batxml.str(src:bat[:xml]):bat[:str]\naddress BATXMLxml2str\ncomment \"Cast the 
xml to a string.\";\n\ncommand 
batxml.document(src:bat[:str]):bat[:xml]\naddress BATXMLdocument\ncomment 
\"Parse the string as an XML document.\";\n\ncommand 
batxml.content(src:bat[:str]):bat[:xml]\naddress BATXMLcontent\ncomment \"Parse 
the string as XML element content.\";\n\ncommand 
batxml.comment(val:bat[:str]):bat[:xml]\naddress BATXMLcomment\ncomment 
\"Create an XML comment element.\";\n\ncommand 
batxml.parse(doccont:str,val:bat[:str],option:str):bat[:xml]\naddress 
BATXMLparse\ncomment \"Parse the XML document or element string 
values.\";\n\ncommand batxml.serialize(val:bat[:xml]):bat[:str]\naddress 
BATXMLxml2str\ncomment \"Serialize the XML object to a string.\";\n\ncommand 
batxml.text(val:bat[:xml]):bat[:str]\naddress BATXMLxmltext
 \ncomment \"Serialize the XML object to a string.\";\n\ncommand 
batxml.xquery(val:bat[:str],expr:str):bat[:xml]\naddress BATXMLxquery\ncomment 
\"Execute the XQuery against the elements.\";\n\n\ncommand 
batxml.pi(target:str, val:bat[:xml]):bat[:xml]\naddress BATXMLpi\ncomment 
\"Construct a processing instruction.\";\n\ncommand batxml.attribute(name:str, 
val:bat[:str]):bat[:xml]\naddress BATXMLattribute\ncomment \"Construct an 
attribute value pair.\";\n\ncommand batxml.element(name:str, s:bat[:xml]) 
:bat[:xml]\naddress BATXMLelementSmall\ncomment \"The basic building block for 
XML elements are namespaces, attributes and a sequence of XML elements. The 
name space and the attributes may be left unspecified.\"; \n\ncommand 
batxml.options(tag:str, option:str,left:bat[:xml]):bat[:xml]\naddress 
BATXMLoptions\ncomment \"Create the components including NULL 
conversions.\";\n\ncommand batxml.element(name:str, ns:xml, attr:xml, 
s:bat[:xml]):bat[:xml]\naddress BATXMLelement\ncomment \"The basic 
 building block for XML elements are namespaces, attributes and a sequence of 
XML elements. The name space and the attributes may be left 
unspecified(=nil).\";\n\ncommand batxml.concat(left:bat[:xml],right:bat[:xml] 
):bat[:xml]\naddress BATXMLconcat\ncomment \"Concatenate the XML 
values.\";\n\npattern batxml.forest(val:bat[:xml]...):bat[:xml]\naddress 
BATXMLforest\ncomment \"Construct an element list.\";\n\ncommand 
batxml.root(val:bat[:xml], version:str, standalone:str):bat[:xml]\naddress 
BATXMLroot\ncomment \"Contruct the root nodes.\";\n\ncommand 
batxml.isdocument(val:bat[:str]):bat[:bit]\naddress BATXMLisdocument\ncomment 
\"Validate the string as a XML document.\";\n\ncommand 
xml.aggr(val:bat[:xml]):xml\naddress BATXMLgroup\ncomment \"Aggregate the XML 
values.\";\n\ncommand xml.subaggr(val:bat[:xml],g:bat[:oid],e:bat[:any_1], 
skip_nils:bit) :bat[:xml]\naddress AGGRsubxml\ncomment \"Grouped aggregation of 
XML values.\";\n\ncommand xml.subaggr(val:bat[:xml],g:bat[:oid],e:bat[:any_1]
 ,s:bat[:oid], skip_nils:bit) :bat[:xml]\naddress AGGRsubxmlcand\ncomment 
\"Grouped aggregation of XML values with candidates list.\";\n\nmodule 
batcalc;\ncommand xml(src:bat[:str]):bat[:xml] address BATXMLstr2xml;" }, 
diff --git a/monetdb5/modules/atoms/blob.mal.h 
b/monetdb5/modules/atoms/blob.mal.h
--- a/monetdb5/modules/atoms/blob.mal.h
+++ b/monetdb5/modules/atoms/blob.mal.h
@@ -7,4 +7,4 @@
 */
 
 // This file was generated automatically with mal2h.py. Do not edit this file 
directly.
-{ "blob", "\nmodule blob;\n\natom blob;\n\ncommand tostr()   address 
BLOBtostr;\ncommand fromstr() address BLOBfromstr;\ncommand cmp()     address 
BLOBcmp;\ncommand hash()    address BLOBhash;\ncommand null()    address 
BLOBnull;\ncommand read()    address BLOBread;\ncommand write()   address 
BLOBwrite;\ncommand put()     address BLOBput;\ncommand del()     address 
BLOBdel;\ncommand length()  address BLOBlength;\ncommand heap()    address 
BLOBheap;\n\ncommand blob(s:blob):blob\naddress BLOBblob_blob\n;\n\ncommand 
blob(s:str):blob\naddress BLOBblob_fromstr;\n\ncommand toblob(v:str) 
:blob\naddress BLOBtoblob\n;\ncommand nitems(b:blob):int\naddress 
BLOBnitems\n;\n\ncommand prelude() :void\naddress 
BLOBprelude;\n\nblob.prelude();\n\nmodule calc;\n\ncommand blob(b:blob):blob 
address BLOBblob_blob;\ncommand blob(s:str):blob address BLOBblob_fromstr;" }, 
+{ "blob", "\nmodule blob;\n\natom blob;\n\ncommand tostr()   address 
BLOBtostr;\ncommand fromstr() address BLOBfromstr;\ncommand cmp()     address 
BLOBcmp;\ncommand hash()    address BLOBhash;\ncommand null()    address 
BLOBnull;\ncommand read()    address BLOBread;\ncommand write()   address 
BLOBwrite;\ncommand put()     address BLOBput;\ncommand del()     address 
BLOBdel;\ncommand length()  address BLOBlength;\ncommand heap()    address 
BLOBheap;\n\ncommand blob(s:blob):blob\naddress BLOBblob_blob\ncomment \"Noop 
routine.\";\n\ncommand blob(s:str):blob\naddress BLOBblob_fromstr;\n\ncommand 
toblob(v:str) :blob\naddress BLOBtoblob\ncomment \"store a string as a 
blob.\";\ncommand nitems(b:blob):int\naddress BLOBnitems\ncomment \"get the 
number of bytes in this blob.\";\n\ncommand prelude() :void\naddress 
BLOBprelude;\n\nblob.prelude();\n\nmodule calc;\n\ncommand blob(b:blob):blob 
address BLOBblob_blob;\ncommand blob(s:str):blob address BLOBblob_fromstr;" }, 
diff --git a/monetdb5/modules/atoms/color.mal.h 
b/monetdb5/modules/atoms/color.mal.h
--- a/monetdb5/modules/atoms/color.mal.h
+++ b/monetdb5/modules/atoms/color.mal.h
@@ -7,4 +7,4 @@
 */
 
 // This file was generated automatically with mal2h.py. Do not edit this file 
directly.
-{ "color", "\nmodule color;\n\natom color:int;\n\ncommand tostr() address 
color_tostr;\ncommand fromstr() address color_fromstr;\n\ncommand 
str(s:color):str\naddress CLRstr\n;\n\ncommand color(s:str):color\naddress 
CLRcolor\n;\n\ncommand rgb(r:int, g:int, b:int):color\naddress 
CLRrgb\ncomment\t\"Converts an RGB triplets to a color atom\";\n\ncommand red  
(c:color) :int\naddress CLRred\ncomment\t\"Extracts red component from a color 
atom\";\n\ncommand green(c:color) :int\naddress CLRgreen\ncomment\t\"Extracts 
green component from a color atom\";\n\ncommand blue (c:color) :int\naddress 
CLRblue\ncomment\t\"Extracts blue component from a color atom\";\n\ncommand 
hue(c:color) :int\naddress CLRhueInt\ncomment\t\"Extracts hue component from a 
color atom\";\n\ncommand saturation(c:color) :int\naddress 
CLRsaturationInt\ncomment\t\"Extracts saturation component from a color 
atom\";\n\ncommand value(c:color) :int\naddress 
CLRvalueInt\ncomment\t\"Extracts value component from a color atom\";\n\
 ncommand hsv(h:flt,s:flt, v:flt) :color\naddress CLRhsv\ncomment\t\"Converts 
an HSV triplets to a color atom\";\n\ncommand hue(c:color) :flt\naddress 
CLRhue\ncomment\t\"Extracts hue component from a color atom\";\n\ncommand 
saturation(c:color) :flt\naddress CLRsaturation\ncomment\t\"Extracts saturation 
component from a color atom\";\n\ncommand value(c:color) :flt\naddress 
CLRvalue\ncomment\t\"Extracts value component from a color atom\";\n\ncommand 
ycc(y:int,cr:int,cb:int) :color\naddress CLRycc\ncomment\t\"Converts an YCC 
triplets to a color atom\";\n\ncommand luminance (c:color) :int\naddress 
CLRluminance\ncomment\t\"Extracts Y(luminance) component from a color 
atom\";\n\ncommand cr(c:color) :int\naddress CLRcr\ncomment\t\"Extracts Cr(red 
color) component from a color atom\";\n\ncommand cb(c:color) :int\naddress 
CLRcb\ncomment\t\"Extracts Cb(blue color) component from a color atom\";\n" }, 
+{ "color", "\nmodule color;\n\natom color:int;\n\ncommand tostr() address 
color_tostr;\ncommand fromstr() address color_fromstr;\n\ncommand 
str(s:color):str\naddress CLRstr\ncomment \"Converts color to string 
\";\n\ncommand color(s:str):color\naddress CLRcolor\ncomment \"Converts string 
to color\";\n\ncommand rgb(r:int, g:int, b:int):color\naddress 
CLRrgb\ncomment\t\"Converts an RGB triplets to a color atom\";\n\ncommand red  
(c:color) :int\naddress CLRred\ncomment\t\"Extracts red component from a color 
atom\";\n\ncommand green(c:color) :int\naddress CLRgreen\ncomment\t\"Extracts 
green component from a color atom\";\n\ncommand blue (c:color) :int\naddress 
CLRblue\ncomment\t\"Extracts blue component from a color atom\";\n\ncommand 
hue(c:color) :int\naddress CLRhueInt\ncomment\t\"Extracts hue component from a 
color atom\";\n\ncommand saturation(c:color) :int\naddress 
CLRsaturationInt\ncomment\t\"Extracts saturation component from a color 
atom\";\n\ncommand value(c:color) :int\naddress
  CLRvalueInt\ncomment\t\"Extracts value component from a color 
atom\";\n\ncommand hsv(h:flt,s:flt, v:flt) :color\naddress 
CLRhsv\ncomment\t\"Converts an HSV triplets to a color atom\";\n\ncommand 
hue(c:color) :flt\naddress CLRhue\ncomment\t\"Extracts hue component from a 
color atom\";\n\ncommand saturation(c:color) :flt\naddress 
CLRsaturation\ncomment\t\"Extracts saturation component from a color 
atom\";\n\ncommand value(c:color) :flt\naddress CLRvalue\ncomment\t\"Extracts 
value component from a color atom\";\n\ncommand ycc(y:int,cr:int,cb:int) 
:color\naddress CLRycc\ncomment\t\"Converts an YCC triplets to a color 
atom\";\n\ncommand luminance (c:color) :int\naddress 
CLRluminance\ncomment\t\"Extracts Y(luminance) component from a color 
atom\";\n\ncommand cr(c:color) :int\naddress CLRcr\ncomment\t\"Extracts Cr(red 
color) component from a color atom\";\n\ncommand cb(c:color) :int\naddress 
CLRcb\ncomment\t\"Extracts Cb(blue color) component from a color atom\";\n" }, 
diff --git a/monetdb5/modules/atoms/identifier.mal.h 
b/monetdb5/modules/atoms/identifier.mal.h
--- a/monetdb5/modules/atoms/identifier.mal.h
+++ b/monetdb5/modules/atoms/identifier.mal.h
@@ -7,4 +7,4 @@
 */
 
 // This file was generated automatically with mal2h.py. Do not edit this file 
directly.
-{ "identifier", "\natom identifier:str;\n\ncommand fromstr()\naddress 
IDfromString\n;\n\ncommand tostr()\naddress IDtoString\n;\n\ncommand 
identifier(s:str):identifier\naddress IDentifier\n;\n\ncommand 
prelude():void\naddress IDprelude\n;\n\nidentifier.prelude();\n" }, 
+{ "identifier", "\natom identifier:str;\n\ncommand fromstr()\naddress 
IDfromString\ncomment \"Convert a string to an identifier without any 
check\";\n\ncommand tostr()\naddress IDtoString\ncomment \"Convert identifier 
to string equivalent\";\n\ncommand identifier(s:str):identifier\naddress 
IDentifier\ncomment \"Cast a string to an identifer \";\n\ncommand 
prelude():void\naddress IDprelude\ncomment \"Initialize the 
module\";\n\nidentifier.prelude();\n" }, 
diff --git a/monetdb5/modules/atoms/inet.mal.h 
b/monetdb5/modules/atoms/inet.mal.h
--- a/monetdb5/modules/atoms/inet.mal.h
+++ b/monetdb5/modules/atoms/inet.mal.h
@@ -7,4 +7,4 @@
 */
 
 // This file was generated automatically with mal2h.py. Do not edit this file 
directly.
-{ "inet", "\natom inet:lng;\n\ncommand null()\naddress INETnull;\ncommand 
cmp()\naddress INETcompare;\ncommand fromstr()\naddress 
INETfromString\n;\ncommand tostr()\naddress INETtoString\n;\ncommand 
new(s:str):inet\naddress INETnew\n;\ncommand isnil(v:inet):bit\naddress 
INET_isnil\n;\ncommand =(v:inet,w:inet):bit\naddress INET_comp_EQ\n;\ncommand 
!=(v:inet,w:inet):bit\naddress INET_comp_NEQ\n;\ncommand 
<(v:inet,w:inet):bit\naddress INET_comp_LT\n;\ncommand 
>(v:inet,w:inet):bit\naddress INET_comp_GT\n;\ncommand 
<=(v:inet,w:inet):bit\naddress INET_comp_LE\n;\ncommand 
>=(v:inet,w:inet):bit\naddress INET_comp_GE\n;\ncommand 
<<(v:inet,w:inet):bit\naddress INET_comp_CW\n;\ncommand 
<<=(v:inet,w:inet):bit\naddress INET_comp_CWE\n;\ncommand 
>>(v:inet,w:inet):bit\naddress INET_comp_CS\n;\ncommand 
>>=(v:inet,w:inet):bit\naddress INET_comp_CSE\n;\ncommand 
broadcast(:inet):inet\naddress INETbroadcast\n;\ncommand 
host(:inet):str\naddress INEThost\n;\ncommand masklen(:inet):int\naddress 
INETmaskle
 n\n;\ncommand setmasklen(:inet,:int):inet\naddress INETsetmasklen\n;\ncommand 
netmask(:inet):inet\naddress INETnetmask\n;\ncommand 
hostmask(:inet):inet\naddress INEThostmask\n;\ncommand 
network(:inet):inet\naddress INETnetwork\n;\ncommand text(:inet):str\naddress 
INETtext\n;\ncommand abbrev(:inet):str\naddress INETabbrev\n;\n\nmodule 
calc;\n\ncommand inet(s:inet):inet\naddress INET_inet\n;\n\ncommand 
inet(s:str):inet\naddress INET_fromstr\n;\n\ncommand 
==(v:inet,w:inet):bit\naddress INET_comp_EQ\n;\n\ncommand 
!=(v:inet,w:inet):bit\naddress INET_comp_NEQ\n;\n\ncommand 
<(v:inet,w:inet):bit\naddress INET_comp_LT\n;\n\ncommand 
>(v:inet,w:inet):bit\naddress INET_comp_GT\n;\n\ncommand 
<=(v:inet,w:inet):bit\naddress INET_comp_LE\n;\n\ncommand 
>=(v:inet,w:inet):bit\naddress INET_comp_GE\n;" }, 
+{ "inet", "\natom inet:lng;\n\ncommand null()\naddress INETnull;\ncommand 
cmp()\naddress INETcompare;\ncommand fromstr()\naddress INETfromString\ncomment 
\"Convert a string to an inet\";\ncommand tostr()\naddress 
INETtoString\ncomment \"Convert inet to string equivalent\";\ncommand 
new(s:str):inet\naddress INETnew\ncomment \"Create an inet from a string 
literal\";\ncommand isnil(v:inet):bit\naddress INET_isnil\ncomment \"Nil test 
for inet value\";\ncommand =(v:inet,w:inet):bit\naddress INET_comp_EQ\ncomment 
\"Equality of two inets\";\ncommand !=(v:inet,w:inet):bit\naddress 
INET_comp_NEQ\ncomment \"Inequality of two inets\";\ncommand 
<(v:inet,w:inet):bit\naddress INET_comp_LT\ncomment \"Whether v is less than 
w\";\ncommand >(v:inet,w:inet):bit\naddress INET_comp_GT\ncomment \"Whether v 
is greater than w\";\ncommand <=(v:inet,w:inet):bit\naddress 
INET_comp_LE\ncomment \"Whether v is less than or equal to w\";\ncommand 
>=(v:inet,w:inet):bit\naddress INET_comp_GE\ncomment \"Whether v is
  equal to or greater than w\";\ncommand <<(v:inet,w:inet):bit\naddress 
INET_comp_CW\ncomment \"Whether v is contained within w\";\ncommand 
<<=(v:inet,w:inet):bit\naddress INET_comp_CWE\ncomment \"Whether v is contained 
within or is equal to w\";\ncommand >>(v:inet,w:inet):bit\naddress 
INET_comp_CS\ncomment \"Whether v contains w\";\ncommand 
>>=(v:inet,w:inet):bit\naddress INET_comp_CSE\ncomment \"Whether v contains or 
is equal to w\";\ncommand broadcast(:inet):inet\naddress INETbroadcast\ncomment 
\"Returns the broadcast address for network\";\ncommand 
host(:inet):str\naddress INEThost\ncomment \"Extract IP address as 
text\";\ncommand masklen(:inet):int\naddress INETmasklen\ncomment \"Extract 
netmask length\";\ncommand setmasklen(:inet,:int):inet\naddress 
INETsetmasklen\ncomment \"Set netmask length for inet value\";\ncommand 
netmask(:inet):inet\naddress INETnetmask\ncomment \"Construct netmask for 
network\";\ncommand hostmask(:inet):inet\naddress INEThostmask\ncomment 
\"Construct ho
 st mask for network\";\ncommand network(:inet):inet\naddress 
INETnetwork\ncomment \"Extract network part of address\";\ncommand 
text(:inet):str\naddress INETtext\ncomment \"Extract IP address and netmask 
length as text\";\ncommand abbrev(:inet):str\naddress INETabbrev\ncomment 
\"Abbreviated display format as text\";\n\nmodule calc;\n\ncommand 
inet(s:inet):inet\naddress INET_inet\ncomment \"Convert a inet to an 
inet\";\n\ncommand inet(s:str):inet\naddress INET_fromstr\ncomment \"Convert a 
string to an inet\";\n\ncommand ==(v:inet,w:inet):bit\naddress 
INET_comp_EQ\ncomment \"Equality of two inets\";\n\ncommand 
!=(v:inet,w:inet):bit\naddress INET_comp_NEQ\ncomment \"Inequality of two 
inets\";\n\ncommand <(v:inet,w:inet):bit\naddress INET_comp_LT\ncomment 
\"Whether v is less than w\";\n\ncommand >(v:inet,w:inet):bit\naddress 
INET_comp_GT\ncomment \"Whether v is greater than w\";\n\ncommand 
<=(v:inet,w:inet):bit\naddress INET_comp_LE\ncomment \"Whether v is less than 
or equal to w\";\n\n
 command >=(v:inet,w:inet):bit\naddress INET_comp_GE\ncomment \"Whether v is 
equal to or greater than w\";" }, 
diff --git a/monetdb5/modules/atoms/json.mal.h 
b/monetdb5/modules/atoms/json.mal.h
--- a/monetdb5/modules/atoms/json.mal.h
+++ b/monetdb5/modules/atoms/json.mal.h
@@ -7,4 +7,4 @@
 */
 
 // This file was generated automatically with mal2h.py. Do not edit this file 
directly.
-{ "json", "\natom json:str;\n\ncommand fromstr()\naddress 
JSONfromString\n;\n\ncommand tostr()\naddress JSONtoString\n;\n\ncommand 
new(j:str):json\naddress JSONstr2json\n;\n\ncommand 
calc.json(j:str):json\naddress JSONstr2json\n;\n\ncommand 
calc.json(j:json):json\naddress JSONstr2json\n;\n\ncommand 
str(j:json):str\naddress JSONjson2str\n;\n\ncommand text(j:json):str\naddress 
JSONjson2text\n;\n\ncommand text(j:json,s:str):str\naddress 
JSONjson2textSeparator\n;\n\ncommand number(j:json):dbl\naddress 
JSONjson2number\n;\n\ncommand integer(j:json):lng\naddress 
JSONjson2integer\n;\n\ncommand dump(j:json):void\naddress JSONdump;\n\ncommand 
filter(name:json, pathexpr:str) :json\naddress JSONfilter\n;\n\ncommand 
filter(name:json, idx:bte) :json\naddress JSONfilterArray_bte;\ncommand 
filter(name:json, idx:bte,other:str) :json\naddress 
JSONfilterArrayDefault_bte;\ncommand filter(name:json, idx:sht) :json\naddress 
JSONfilterArray_sht;\ncommand filter(name:json, idx:sht,other:str) 
:json\naddress
  JSONfilterArrayDefault_sht;\ncommand filter(name:json, idx:int) 
:json\naddress JSONfilterArray_int;\ncommand filter(name:json, idx:int, 
other:str) :json\naddress JSONfilterArrayDefault_int;\ncommand 
filter(name:json, idx:lng) :json\naddress JSONfilterArray_lng;\ncommand 
filter(name:json, idx:lng, other:str) :json\naddress 
JSONfilterArrayDefault_lng\n;\n\ncommand isvalid(val:json):bit\naddress 
JSONisvalid\n;\n\ncommand isobject(val:json):bit\naddress 
JSONisobject\n;\n\ncommand isarray(val:json):bit\naddress 
JSONisarray\n;\n\ncommand isvalid(val:str):bit\naddress 
JSONisvalid\n;\n\ncommand isobject(val:str):bit\naddress 
JSONisobject\n;\n\ncommand isarray(val:str):bit\naddress 
JSONisarray\n;\n\ncommand length(val:json):int\naddress 
JSONlength\n;\n\npattern unfold(val:json)(k:bat[:str],v:bat[:json])\naddress 
JSONunfold\n;\n\npattern 
unfold(val:json)(o:bat[:oid],k:bat[:str],v:bat[:json])\naddress 
JSONunfold\n;\n\npattern 
fold(o:bat[:oid],k:bat[:str],v:bat[:any]):json\naddress JSONfold\n;
 \n\npattern fold(k:bat[:str],v:bat[:any]):json\naddress JSONfold\n;\n\npattern 
fold(v:bat[:any]):json\naddress JSONfold\n;\n\ncommand 
keyarray(val:json):json\naddress JSONkeyArray\n;\n\ncommand 
valuearray(val:json):json\naddress JSONvalueArray\n;\n\ncommand 
keys(val:json):bat[:str]\naddress JSONkeyTable\n;\n\ncommand 
values(val:json):bat[:json]\naddress JSONvalueTable\n;\n\ncommand 
output(b:bat[:any_1]):str\naddress JSONtextString\n;\n\ncommand 
suboutput(b:bat[:any_1], gid:bat[:oid], ext:bat[:lng], 
flg:bit):bat[:str]\naddress JSONtextGrouped\n;\n\ncommand prelude()\naddress 
JSONprelude;\n\npattern renderobject(val:any...):json\naddress 
JSONrenderobject;\n\npattern renderarray(val:any...):json\naddress 
JSONrenderarray;\n\ncommand aggr.jsonaggr(val:bat[:str]):str\naddress 
JSONgroupStr\n;\n\ncommand aggr.jsonaggr(val:bat[:dbl]):str\naddress 
JSONgroupStr\n;\n\ncommand 
aggr.subjsonaggr(val:bat[:str],g:bat[:oid],e:bat[:any_1], skip_nils:bit) 
:bat[:str]\naddress JSONsubjson\n;\n\ncommand a
 ggr.subjsonaggr(val:bat[:dbl],g:bat[:oid],e:bat[:any_1], skip_nils:bit) 
:bat[:str]\naddress JSONsubjson\n;\n\ncommand 
aggr.subjsonaggr(val:bat[:str],g:bat[:oid],e:bat[:any_1],s:bat[:oid], 
skip_nils:bit) :bat[:str]\naddress JSONsubjsoncand\n;\n\ncommand 
aggr.subjsonaggr(val:bat[:dbl],g:bat[:oid],e:bat[:any_1],s:bat[:oid], 
skip_nils:bit) :bat[:str]\naddress JSONsubjsoncand\n;\n\nmodule 
calc;\n\npattern ==(l:json,r:json):bit\naddress CMDvarEQ\n;\n\npattern 
==(l:json,r:json,nil_matches:bit):bit\naddress CMDvarEQ\n;\n\npattern 
!=(l:json,r:json):bit\naddress CMDvarNE\n;\n\npattern 
!=(l:json,r:json,nil_matches:bit):bit\naddress CMDvarNE\n;\n\npattern 
<(l:json,r:json):bit\naddress CMDvarLT\n;\n\npattern 
<=(l:json,r:json):bit\naddress CMDvarLE\n;\n\npattern 
>(l:json,r:json):bit\naddress CMDvarGT\n;\n\npattern 
>=(l:json,r:json):bit\naddress CMDvarGE\n;\n\nmodule batcalc;\n\npattern 
==(b1:bat[:json],b2:bat[:json]) :bat[:bit]\naddress CMDbatEQ\n;\n\npattern 
==(b1:bat[:json],b2:bat[:json],nil_ma
 tches:bit) :bat[:bit]\naddress CMDbatEQ\n;\n\npattern 
!=(b1:bat[:json],b2:bat[:json]) :bat[:bit]\naddress CMDbatNE\n;\n\npattern 
!=(b1:bat[:json],b2:bat[:json],nil_matches:bit) :bat[:bit]\naddress 
CMDbatNE\n;\n\npattern <(b1:bat[:json],b2:bat[:json]) :bat[:bit]\naddress 
CMDbatLT\n;\n\npattern <=(b1:bat[:json],b2:bat[:json]) :bat[:bit]\naddress 
CMDbatLE\n;\n\npattern >(b1:bat[:json],b2:bat[:json]) :bat[:bit]\naddress 
CMDbatGT\n;\n\npattern >=(b1:bat[:json],b2:bat[:json]) :bat[:bit]\naddress 
CMDbatGE\n;\n\njson.prelude();" }, 
+{ "json", "\natom json:str;\n\ncommand fromstr()\naddress 
JSONfromString\ncomment \"Validate a string to be JSON compliant. A NOOP if 
valid json, NULL otherwise.\";\n\ncommand tostr()\naddress 
JSONtoString\ncomment \"Convert JSON to its string equivalent. Dealing with 
escape characters\";\n\ncommand new(j:str):json\naddress JSONstr2json\ncomment 
\"Convert string to its JSON. Dealing with escape characters\";\n\ncommand 
calc.json(j:str):json\naddress JSONstr2json\ncomment \"Convert string to its 
JSON. Dealing with escape characters\";\n\ncommand 
calc.json(j:json):json\naddress JSONstr2json\ncomment \"Convert JSON to JSON. 
Dealing with escape characters\";\n\ncommand str(j:json):str\naddress 
JSONjson2str\ncomment \"Convert JSON to its string equivalent. Dealing with 
escape characters\";\n\ncommand text(j:json):str\naddress 
JSONjson2text\ncomment \"Convert JSON values to their plain string 
equivalent.\";\n\ncommand text(j:json,s:str):str\naddress 
JSONjson2textSeparator\ncomment \"Conve
 rt JSON values to their plain string equivalent, injecting a 
separator.\";\n\ncommand number(j:json):dbl\naddress JSONjson2number\ncomment 
\"Convert simple JSON values to a double, return nil upon error.\";\n\ncommand 
integer(j:json):lng\naddress JSONjson2integer\ncomment \"Convert simple JSON 
values to an integer, return nil upon error.\";\n\ncommand 
dump(j:json):void\naddress JSONdump;\n\ncommand filter(name:json, pathexpr:str) 
:json\naddress JSONfilter\ncomment \"Filter all members of an object by a path 
expression, returning an array.\nNon-matching elements are 
skipped.\";\n\ncommand filter(name:json, idx:bte) :json\naddress 
JSONfilterArray_bte;\ncommand filter(name:json, idx:bte,other:str) 
:json\naddress JSONfilterArrayDefault_bte;\ncommand filter(name:json, idx:sht) 
:json\naddress JSONfilterArray_sht;\ncommand filter(name:json, 
idx:sht,other:str) :json\naddress JSONfilterArrayDefault_sht;\ncommand 
filter(name:json, idx:int) :json\naddress JSONfilterArray_int;\ncommand filter(n
 ame:json, idx:int, other:str) :json\naddress 
JSONfilterArrayDefault_int;\ncommand filter(name:json, idx:lng) :json\naddress 
JSONfilterArray_lng;\ncommand filter(name:json, idx:lng, other:str) 
:json\naddress JSONfilterArrayDefault_lng\ncomment \"Extract a single array 
element\";\n\ncommand isvalid(val:json):bit\naddress JSONisvalid\ncomment 
\"Validate the string as a valid JSON document\";\n\ncommand 
isobject(val:json):bit\naddress JSONisobject\ncomment \"Validate the string as 
a valid JSON object\";\n\ncommand isarray(val:json):bit\naddress 
JSONisarray\ncomment \"Validate the string as a valid JSON array\";\n\ncommand 
isvalid(val:str):bit\naddress JSONisvalid\ncomment \"Validate the string as a 
valid JSON document\";\n\ncommand isobject(val:str):bit\naddress 
JSONisobject\ncomment \"Validate the string as a valid JSON 
object\";\n\ncommand isarray(val:str):bit\naddress JSONisarray\ncomment 
\"Validate the string as a valid JSON array\";\n\ncommand 
length(val:json):int\naddress JSONleng
 th\ncomment \"Returns the number of elements in the outermost JSON 
object.\";\n\npattern unfold(val:json)(k:bat[:str],v:bat[:json])\naddress 
JSONunfold\ncomment \"Expands the outermost JSON object into key-value 
pairs.\";\n\npattern 
unfold(val:json)(o:bat[:oid],k:bat[:str],v:bat[:json])\naddress 
JSONunfold\ncomment \"Expands the outermost JSON object into key-value 
pairs.\";\n\npattern fold(o:bat[:oid],k:bat[:str],v:bat[:any]):json\naddress 
JSONfold\ncomment \"Combine the key-value pairs into a single json object 
list.\";\n\npattern fold(k:bat[:str],v:bat[:any]):json\naddress 
JSONfold\ncomment \"Combine the key-value pairs into a single json object 
list.\";\n\npattern fold(v:bat[:any]):json\naddress JSONfold\ncomment \"Combine 
the value list into a single json array object.\";\n\ncommand 
keyarray(val:json):json\naddress JSONkeyArray\ncomment \"Expands the outermost 
JSON object keys into a JSON value array.\";\n\ncommand 
valuearray(val:json):json\naddress JSONvalueArray\ncomment \"Ex
 pands the outermost JSON object values into a JSON value array.\";\n\ncommand 
keys(val:json):bat[:str]\naddress JSONkeyTable\ncomment \"Expands the outermost 
JSON object names.\";\n\ncommand values(val:json):bat[:json]\naddress 
JSONvalueTable\ncomment \"Expands the outermost JSON values.\";\n\ncommand 
output(b:bat[:any_1]):str\naddress JSONtextString\ncomment \"Pack the values 
into a single json structure\";\n\ncommand suboutput(b:bat[:any_1], 
gid:bat[:oid], ext:bat[:lng], flg:bit):bat[:str]\naddress 
JSONtextGrouped\ncomment \"Pack the values into a json structure\";\n\ncommand 
prelude()\naddress JSONprelude;\n\npattern 
renderobject(val:any...):json\naddress JSONrenderobject;\n\npattern 
renderarray(val:any...):json\naddress JSONrenderarray;\n\ncommand 
aggr.jsonaggr(val:bat[:str]):str\naddress JSONgroupStr\ncomment \"Aggregate the 
string values to array.\";\n\ncommand aggr.jsonaggr(val:bat[:dbl]):str\naddress 
JSONgroupStr\ncomment \"Aggregate the double values to array.\";\n\ncommand
  aggr.subjsonaggr(val:bat[:str],g:bat[:oid],e:bat[:any_1], skip_nils:bit) 
:bat[:str]\naddress JSONsubjson\ncomment \"Grouped aggregation of 
values.\";\n\ncommand aggr.subjsonaggr(val:bat[:dbl],g:bat[:oid],e:bat[:any_1], 
skip_nils:bit) :bat[:str]\naddress JSONsubjson\ncomment \"Grouped aggregation 
of values.\";\n\ncommand 
aggr.subjsonaggr(val:bat[:str],g:bat[:oid],e:bat[:any_1],s:bat[:oid], 
skip_nils:bit) :bat[:str]\naddress JSONsubjsoncand\ncomment \"Grouped 
aggregation of values with candidates list.\";\n\ncommand 
aggr.subjsonaggr(val:bat[:dbl],g:bat[:oid],e:bat[:any_1],s:bat[:oid], 
skip_nils:bit) :bat[:str]\naddress JSONsubjsoncand\ncomment \"Grouped 
aggregation of values with candidates list.\";\n\nmodule calc;\n\npattern 
==(l:json,r:json):bit\naddress CMDvarEQ\ncomment \"Return V1 == 
V2\";\n\npattern ==(l:json,r:json,nil_matches:bit):bit\naddress 
CMDvarEQ\ncomment \"Return V1 == V2\";\n\npattern 
!=(l:json,r:json):bit\naddress CMDvarNE\ncomment \"Return V1 != 
V2\";\n\npattern !=(
 l:json,r:json,nil_matches:bit):bit\naddress CMDvarNE\ncomment \"Return V1 != 
V2\";\n\npattern <(l:json,r:json):bit\naddress CMDvarLT\ncomment \"Return V1 < 
V2\";\n\npattern <=(l:json,r:json):bit\naddress CMDvarLE\ncomment \"Return V1 
<= V2\";\n\npattern >(l:json,r:json):bit\naddress CMDvarGT\ncomment \"Return V1 
> V2\";\n\npattern >=(l:json,r:json):bit\naddress CMDvarGE\ncomment \"Return V1 
>= V2\";\n\nmodule batcalc;\n\npattern ==(b1:bat[:json],b2:bat[:json]) 
:bat[:bit]\naddress CMDbatEQ\ncomment \"Return B1 == B2\";\n\npattern 
==(b1:bat[:json],b2:bat[:json],nil_matches:bit) :bat[:bit]\naddress 
CMDbatEQ\ncomment \"Return B1 == B2\";\n\npattern 
!=(b1:bat[:json],b2:bat[:json]) :bat[:bit]\naddress CMDbatNE\ncomment \"Return 
B1 != B2\";\n\npattern !=(b1:bat[:json],b2:bat[:json],nil_matches:bit) 
:bat[:bit]\naddress CMDbatNE\ncomment \"Return B1 != B2\";\n\npattern 
<(b1:bat[:json],b2:bat[:json]) :bat[:bit]\naddress CMDbatLT\ncomment \"Return 
B1 < B2\";\n\npattern <=(b1:bat[:json],b2:bat[
 :json]) :bat[:bit]\naddress CMDbatLE\ncomment \"Return B1 <= B2\";\n\npattern 
>(b1:bat[:json],b2:bat[:json]) :bat[:bit]\naddress CMDbatGT\ncomment \"Return 
B1 > B2\";\n\npattern >=(b1:bat[:json],b2:bat[:json]) :bat[:bit]\naddress 
CMDbatGE\ncomment \"Return B1 >= B2\";\n\njson.prelude();" }, 
diff --git a/monetdb5/modules/atoms/mtime.mal.h 
b/monetdb5/modules/atoms/mtime.mal.h
--- a/monetdb5/modules/atoms/mtime.mal.h
+++ b/monetdb5/modules/atoms/mtime.mal.h
@@ -7,4 +7,4 @@
 */
 
 // This file was generated automatically with mal2h.py. Do not edit this file 
directly.
-{ "mtime", "\natom date :int;\ncommand date(s:date):date\naddress 
MTIMEdate_date\n;\n\ncommand fromstr()\naddress date_fromstr;\ncommand 
tostr()\naddress date_tostr;\n\n\npattern ==(v:date,w:date):bit\naddress 
CMDvarEQ\n;\npattern ==(v:date,w:date,nil_matches:bit):bit\naddress 
CMDvarEQ\n;\npattern !=(v:date,w:date):bit\naddress CMDvarNE\n;\npattern 
!=(v:date,w:date,nil_matches:bit):bit\naddress CMDvarNE\n;\npattern 
<(v:date,w:date):bit\naddress CMDvarLT\n;\npattern 
<=(v:date,w:date):bit\naddress CMDvarLE\n;\npattern 
>(v:date,w:date):bit\naddress CMDvarGT\n;\npattern 
>=(v:date,w:date):bit\naddress CMDvarGE\n;\npattern isnil(v:date):bit\naddress 
CMDvarISNIL\n;\n\nmodule mtime;\npattern calc.==(v:date,w:date):bit\naddress 
CMDvarEQ\n;\npattern calc.==(v:date,w:date,nil_matches:bit):bit\naddress 
CMDvarEQ\n;\npattern calc.!=(v:date,w:date):bit\naddress CMDvarNE\n;\npattern 
calc.!=(v:date,w:date,nil_matches:bit):bit\naddress CMDvarNE\n;\npattern 
calc.<(v:date,w:date):bit\naddress CMDvarLT\
 n;\npattern calc.<=(v:date,w:date):bit\naddress CMDvarLE\n;\npattern 
calc.>(v:date,w:date):bit\naddress CMDvarGT\n;\npattern 
calc.>=(v:date,w:date):bit\naddress CMDvarGE\n;\n\n\n\natom daytime 
:int;\ncommand fromstr()\naddress daytime_tz_fromstr;\ncommand tostr()\naddress 
daytime_tostr;\n\n\npattern ==(v:daytime,w:daytime):bit\naddress 
CMDvarEQ\n;\npattern ==(v:daytime,w:daytime,nil_matches:bit):bit\naddress 
CMDvarEQ\n;\npattern !=(v:daytime,w:daytime):bit\naddress CMDvarNE\n;\npattern 
!=(v:daytime,w:daytime,nil_matches:bit):bit\naddress CMDvarNE\n;\npattern 
<(v:daytime,w:daytime):bit\naddress CMDvarLT\n;\npattern 
<=(v:daytime,w:daytime):bit\naddress CMDvarLE\n;\npattern 
>(v:daytime,w:daytime):bit\naddress CMDvarGT\n;\npattern 
>=(v:daytime,w:daytime):bit\naddress CMDvarGE\n;\npattern 
isnil(v:daytime):bit\naddress CMDvarISNIL\n;\n\nmodule mtime;\npattern 
calc.==(v:daytime,w:daytime):bit\naddress CMDvarEQ\n;\npattern 
calc.==(v:daytime,w:daytime,nil_matches:bit):bit\naddress CMDvarEQ\n
 ;\npattern calc.!=(v:daytime,w:daytime):bit\naddress CMDvarNE\n;\npattern 
calc.!=(v:daytime,w:daytime,nil_matches:bit):bit\naddress CMDvarNE\n;\npattern 
calc.<(v:daytime,w:daytime):bit\naddress CMDvarLT\n;\npattern 
calc.<=(v:daytime,w:daytime):bit\naddress CMDvarLE\n;\npattern 
calc.>(v:daytime,w:daytime):bit\naddress CMDvarGT\n;\npattern 
calc.>=(v:daytime,w:daytime):bit\naddress CMDvarGE\n;\n\n\n\n\natom timestamp 
:lng;\ncommand fromstr()\naddress timestamp_fromstr;\n\ncommand 
tostr()\naddress timestamp_tostr;\n\nunsafe command 
unix_epoch():timestamp\naddress MTIMEunix_epoch\n;\nunsafe command 
epoch():timestamp\naddress MTIMEcurrent_timestamp\n;\n\ncommand 
epoch(t:timestamp):int\naddress MTIMEepoch2int\n;\n\ncommand 
epoch(t:int):timestamp\naddress MTIMEtimestamp\n;\ncommand 
epoch(t:lng):timestamp\naddress MTIMEtimestamplng\n;\n\n\npattern 
==(v:timestamp,w:timestamp):bit\naddress CMDvarEQ\n;\npattern 
==(v:timestamp,w:timestamp,nil_matches:bit):bit\naddress CMDvarEQ\n;\npattern 
!=(v:t
 imestamp,w:timestamp):bit\naddress CMDvarNE\n;\npattern 
!=(v:timestamp,w:timestamp,nil_matches:bit):bit\naddress CMDvarNE\n;\npattern 
<(v:timestamp,w:timestamp):bit\naddress CMDvarLT\n;\npattern 
<=(v:timestamp,w:timestamp):bit\naddress CMDvarLE\n;\npattern 
>(v:timestamp,w:timestamp):bit\naddress CMDvarGT\n;\npattern 
>=(v:timestamp,w:timestamp):bit\naddress CMDvarGE\n;\npattern 
isnil(v:timestamp):bit\naddress CMDvarISNIL\n;\n\nmodule mtime;\npattern 
calc.==(v:timestamp,w:timestamp):bit\naddress CMDvarEQ\n;\npattern 
calc.==(v:timestamp,w:timestamp,nil_matches:bit):bit\naddress 
CMDvarEQ\n;\npattern calc.!=(v:timestamp,w:timestamp):bit\naddress 
CMDvarNE\n;\npattern 
calc.!=(v:timestamp,w:timestamp,nil_matches:bit):bit\naddress 
CMDvarNE\n;\npattern calc.<(v:timestamp,w:timestamp):bit\naddress 
CMDvarLT\n;\npattern calc.<=(v:timestamp,w:timestamp):bit\naddress 
CMDvarLE\n;\npattern calc.>(v:timestamp,w:timestamp):bit\naddress 
CMDvarGT\n;\npattern calc.>=(v:timestamp,w:timestamp):bit\naddress
  CMDvarGE\n;\n\n\n\n\natom timezone :lng;\ncommand fromstr()\naddress 
tzone_fromstr;\ncommand tostr()\naddress tzone_tostr;\ncommand 
str(z:timezone):str\naddress MTIMEtzone_tostr;\ncommand 
timestamp(s:str):timestamp\naddress MTIMEtimestamp_fromstr;\ncommand 
timestamp(secs:int):timestamp\naddress MTIMEtimestamp\n;\n\natom zrule 
:int;\ncommand fromstr()\naddress rule_fromstr;\ncommand tostr()\naddress 
rule_tostr;\ncommand define(m:int,d:int,w:int,h:int,min:int):zrule\naddress 
MTIMEruleDef0\n;\ncommand 
define(m:int,d:str,w:int,h:int,min:int):zrule\naddress 
MTIMEruleDef1\n;\ncommand define(m:int,d:str,w:int,min:int):zrule\naddress 
MTIMEruleDef2\n;\n\n\nmodule batmtime;\nmodule mtime;\ncommand 
date_sub_sec_interval(t:date,s:int):date\naddress 
MTIMEdate_sub_sec_interval_wrap\n;\ncommand 
date_sub_msec_interval(t:date,ms:lng):date\naddress 
MTIMEdate_sub_msec_interval_lng_wrap;\n\ncommand 
date_add_sec_interval(t:date,s:int):date\naddress 
MTIMEdate_add_sec_interval_wrap\n;\ncommand date_add_m
 sec_interval(t:date,ms:lng):date\naddress 
MTIMEdate_add_msec_interval_lng_wrap;\n\ncommand 
timestamp_sub_msec_interval(t:timestamp,ms:lng):timestamp\naddress 
MTIMEtimestamp_sub_msec_interval_lng_wrap;\ncommand 
timestamp_add_msec_interval(t:timestamp,ms:lng):timestamp\naddress 
MTIMEtimestamp_add;\n\ncommand 
timestamp_sub_month_interval(t:timestamp,s:int):timestamp\naddress 
MTIMEtimestamp_sub_month_interval_wrap\n;\n\ncommand 
timestamp_sub_month_interval(t:timestamp,s:lng):timestamp\naddress 
MTIMEtimestamp_sub_month_interval_lng_wrap\n;\n\ncommand 
timestamp_add_month_interval(t:timestamp,s:int):timestamp\naddress 
MTIMEtimestamp_add_month_interval_wrap\n;\n\ncommand 
timestamp_add_month_interval(t:timestamp,s:lng):timestamp\naddress 
MTIMEtimestamp_add_month_interval_lng_wrap\n;\n\ncommand 
timestamp(t:timestamp):timestamp\naddress MTIMEtimestamp2timestamp;\n\ncommand 
time_sub_msec_interval(t:daytime,ms:lng):daytime\naddress 
MTIMEtime_sub_msec_interval_wrap\n;\ncommand time_add_msec_inter
 val(t:daytime,ms:lng):daytime\naddress 
MTIMEtime_add_msec_interval_wrap\n;\n\ncommand diff(val1:daytime, val2:daytime) 
:lng\naddress MTIMEdaytime_diff\n;\n\ncommand 
date_add_month_interval(t:date,s:int):date\naddress 
MTIMEdate_addmonths\n;\n\ncommand 
date_sub_month_interval(t:date,s:int):date\naddress 
MTIMEdate_submonths\n;\n\ncommand date(:date):date\naddress 
MTIMEdate2date\n;\ncommand date(:void):date\naddress 
MTIMEnil2date\n;\n\ncommand local_timezone():lng\naddress 
MTIMElocal_timezone\n;\n\ncommand timezone_local(t:timezone):void\naddress 
MTIMEtzone_set_local\n;\ncommand timezone_local() :timezone\naddress 
MTIMEtzone_get_local\n;\n\ncommand date(s:str):date\naddress 
MTIMEdate_fromstr\n;\n\ncommand date(yr:int, mo:int, day:int):date\naddress 
MTIMEdate_create\n;\n\ncommand daytime(s:str):daytime\naddress 
MTIMEdaytime_fromstr\n;\ncommand daytime(:daytime):daytime\naddress 
MTIMEdaytime2daytime;\ncommand daytime(:lng):daytime\naddress 
MTIMEsecs2daytime;\n\ncommand daytime(h:int,m:int
 ,s:int,mi:int)\n\t\t:daytime\naddress MTIMEdaytime_create\n;\ncommand 
timestamp(d:date,dt:daytime,t:timezone) :timestamp\naddress 
MTIMEtimestamp_create\n;\ncommand timestamp(d:date,dt:daytime) 
:timestamp\naddress MTIMEtimestamp_create_default\n;\ncommand timestamp(d:date) 
:timestamp\naddress MTIMEtimestamp_create_from_date\n;\n\ncommand 
rule(s:str):zrule\naddress MTIMErule_fromstr\n;\ncommand rule 
(mo:int,d:int,wkday:int,mi:int) :zrule\naddress MTIMErule_create\n;\n\ncommand 
timezone(s:str):timezone\naddress MTIMEtzone_fromstr\n;\ncommand 
timezone(s:int):timezone\naddress MTIMEtzone_create\n;\ncommand 
timezone(s:lng):timezone\naddress MTIMEtzone_create_lng\n;\ncommand 
timezone(mi:int,s:zrule,erule:zrule):timezone\naddress 
MTIMEtzone_create_dst\n;\n\ncommand year(d:date) :int\naddress 
MTIMEdate_extract_year\n;\ncommand 
batmtime.year(d:bat[:date]):bat[:int]\naddress 
MTIMEdate_extract_year_bulk;\n\ncommand quarter(d:date) :int\naddress 
MTIMEdate_extract_quarter\n;\ncommand batmtime.qua
 rter(d:bat[:date]):bat[:int]\naddress 
MTIMEdate_extract_quarter_bulk;\n\ncommand month(d:date) :int\naddress 
MTIMEdate_extract_month\n;\ncommand 
batmtime.month(d:bat[:date]):bat[:int]\naddress 
MTIMEdate_extract_month_bulk;\n\ncommand day(d:date) :int\naddress 
MTIMEdate_extract_day\n;\ncommand batmtime.day(d:bat[:date]):bat[:int]\naddress 
MTIMEdate_extract_day_bulk;\n\ncommand hours(h:daytime) :int\naddress 
MTIMEdaytime_extract_hours\n;\ncommand 
batmtime.hours(d:bat[:daytime]):bat[:int]\naddress 
MTIMEdaytime_extract_hours_bulk;\n\ncommand minutes(d:daytime) :int\naddress 
MTIMEdaytime_extract_minutes\n;\ncommand 
batmtime.minutes(d:bat[:daytime]):bat[:int]\naddress 
MTIMEdaytime_extract_minutes_bulk;\n\ncommand seconds(d:daytime) :int\naddress 
MTIMEdaytime_extract_seconds\n;\ncommand 
batmtime.seconds(d:bat[:daytime]):bat[:int]\naddress 
MTIMEdaytime_extract_seconds_bulk;\n\ncommand sql_seconds(d:daytime) 
:int\naddress MTIMEdaytime_extract_sql_seconds\n;\ncommand 
batmtime.sql_seconds(d:ba
 t[:daytime]):bat[:int]\naddress 
MTIMEdaytime_extract_sql_seconds_bulk;\n\ncommand milliseconds(d:daytime) 
:int\naddress MTIMEdaytime_extract_milliseconds\n;\ncommand 
batmtime.milliseconds(d:bat[:daytime]):bat[:int]\naddress 
MTIMEdaytime_extract_milliseconds_bulk;\n\ncommand daytime(t:timestamp) 
:daytime\naddress MTIMEtimestamp_extract_daytime_default\n;\ncommand 
daytime(t:timestamp, v:timezone) :daytime\naddress 
MTIMEtimestamp_extract_daytime\n;\n\ncommand date(t:timestamp) :date\naddress 
MTIMEtimestamp_extract_date_default\n;\ncommand date(t:timestamp,v:timezone) 
:date\naddress MTIMEtimestamp_extract_date\n;\n\ncommand 
setTimezone(name:str):timezone\naddress MTIMEtimezone\n;\n\ncommand 
start_dst(t:timezone) :zrule\naddress MTIMEtzone_extract_start\n;\ncommand 
end_dst(t:timezone) :zrule\naddress MTIMEtzone_extract_end\n;\ncommand 
minutes(t:timezone) :int\naddress MTIMEtzone_extract_minutes\n;\n\ncommand 
month(t:zrule) :int\naddress MTIMErule_extract_month\n;\ncommand day(t:zrule) :i
 nt\naddress MTIMErule_extract_day\n;\ncommand weekday(t:zrule) :int\naddress 
MTIMErule_extract_weekday\n;\ncommand minutes(t:zrule) :int\naddress 
MTIMErule_extract_minutes\n;\n\ncommand addyears(value:date, years:int) 
:date\naddress MTIMEdate_addyears\n;\ncommand addmonths(value:date, months:int) 
:date\naddress MTIMEdate_addmonths\n;\ncommand adddays(value:date, days:int) 
:date\naddress MTIMEdate_adddays\n;\ncommand diff(val1:date, val2:date) 
:int\naddress MTIMEdate_diff\n;\n\ncommand dayofyear(d:date) :int\naddress 
MTIMEdate_extract_dayofyear\n;\ncommand weekofyear(d:date) :int\naddress 
MTIMEdate_extract_weekofyear\n;\ncommand week(d:date) :int\naddress 
MTIMEdate_extract_weekofyear\n;\ncommand dayofweek(d:date) :int\naddress 
MTIMEdate_extract_dayofweek\n;\n\ncommand add(v:timestamp, msecs:lng) 
:timestamp\naddress MTIMEtimestamp_add\n;\ncommand diff(val1:timestamp, 
val2:timestamp) :lng\naddress MTIMEtimestamp_diff\n;\n\ncommand 
dst(t:timestamp,v:timezone) :bit\naddress MTIMEtimestam
 p_inside_dst\n;\n\ncommand compute(r:zrule, year:int) :date\naddress 
MTIMEcompute_rule_foryear\n;\n\ncommand monthnum(month:str) :int\naddress 
MTIMEmonth_from_str\n;\ncommand monthname(month:int) :str\naddress 
MTIMEmonth_to_str\n;\ncommand daynum(day:str) :int\naddress 
MTIMEday_from_str\n;\ncommand dayname(day:int) :str\naddress 
MTIMEday_to_str\n;\n\ncommand time_synonyms(allow:bit)\naddress 
MTIMEsynonyms\n;\n\ncommand str_to_date(s:str, format:str) :date\naddress 
MTIMEstr_to_date\n;\n\ncommand date_to_str(d:date, format:str) :str\naddress 
MTIMEdate_to_str\n;\n\ncommand str_to_time(s:str, format:str) :daytime\naddress 
MTIMEstr_to_time\n;\n\ncommand time_to_str(d:daytime, format:str) :str\naddress 
MTIMEtime_to_str\n;\n\ncommand str_to_timestamp(s:str, format:str) 
:timestamp\naddress MTIMEstr_to_timestamp\n;\n\ncommand 
timestamp_to_str(d:timestamp, format:str) :str\naddress 
MTIMEtimestamp_to_str\n;\n\n\ncommand 
msecs(d:int,h:int,m:int,s:int,ms:int):lng\naddress MTIMEmsecs\n;\n\ncomman
 d daytime(h:int):daytime\naddress MTIMEdaytime1\n;\ncommand 
daytime(h:int,m:int):daytime\naddress MTIMEdaytime2\n;\ncommand 
daytime(h:int,m:int,s:int):daytime\naddress MTIMEdaytime3\n;\n\ncommand 
current_timestamp():timestamp\naddress MTIMEcurrent_timestamp;\ncommand 
current_date():date\naddress MTIMEcurrent_date;\ncommand 
current_time():daytime\naddress MTIMEcurrent_time;\n\ncommand 
year(t:timestamp):int\naddress MTIMEtimestamp_year;\ncommand 
quarter(t:timestamp):int\naddress MTIMEtimestamp_quarter;\ncommand 
month(t:timestamp):int\naddress MTIMEtimestamp_month;\ncommand 
day(t:timestamp):int\naddress MTIMEtimestamp_day;\ncommand 
hours(t:timestamp):int\naddress MTIMEtimestamp_hours;\ncommand 
minutes(t:timestamp):int\naddress MTIMEtimestamp_minutes;\ncommand 
seconds(t:timestamp):int\naddress MTIMEtimestamp_seconds;\ncommand 
sql_seconds(t:timestamp):int\naddress MTIMEtimestamp_sql_seconds;\ncommand 
milliseconds(t:timestamp):int\naddress MTIMEtimestamp_milliseconds;\n\ncommand 
year(mont
 hs:int):int\naddress MTIMEsql_year;\ncommand month(months:int):int\naddress 
MTIMEsql_month;\ncommand day(msecs:lng):lng\naddress MTIMEsql_day;\ncommand 
hours(msecs:lng):int\naddress MTIMEsql_hours;\ncommand 
minutes(msecs:lng):int\naddress MTIMEsql_minutes;\ncommand 
seconds(msecs:lng):int\naddress MTIMEsql_seconds;\n\nunsafe command 
msec():lng\naddress MTIMEmsec\n;\n\ncommand prelude() :void\naddress 
MTIMEprelude;\n\ncommand epilogue() :void\naddress 
MTIMEepilogue;\n\nmtime.prelude();\n\nmodule calc;\n\ncommand date(s:str):date 
address MTIMEdate_fromstr;\ncommand date(d:date):date address 
MTIMEdate_date;\ncommand date(t:timestamp) :date address 
MTIMEtimestamp_extract_date_default;\n\ncommand timestamp(s:str):timestamp 
address MTIMEtimestamp_fromstr;\ncommand timestamp(t:timestamp):timestamp 
address MTIMEtimestamp2timestamp;\ncommand timestamp(d:date) :timestamp address 
MTIMEtimestamp_create_from_date;\ncommand timestamp(secs:int):timestamp address 
MTIMEtimestamp;\ncommand timestamp(m
 secs:lng):timestamp address MTIMEtimestamp_lng;\n\ncommand 
daytime(s:str):daytime address MTIMEdaytime_fromstr;\ncommand 
daytime(d:daytime):daytime address MTIMEdaytime2daytime;\ncommand 
daytime(s:lng):daytime address MTIMEsecs2daytime;\ncommand daytime(t:timestamp) 
:daytime address MTIMEtimestamp_extract_daytime_default;\n\nmodule 
batcalc;\n\ncommand date(t:bat[:timestamp]) :bat[:date]\naddress 
MTIMEtimestamp_extract_date_default_bulk;\n\ncommand timestamp(d:bat[:date]) 
:bat[:timestamp]\naddress MTIMEtimestamp_create_from_date_bulk;\ncommand 
timestamp(secs:bat[:int]) :bat[:timestamp]\naddress 
MTIMEtimestamp_bulk;\ncommand timestamp(msecs:bat[:lng]) 
:bat[:timestamp]\naddress MTIMEtimestamp_lng_bulk;\n\ncommand 
daytime(s:bat[:lng]) :bat[:daytime]\naddress MTIMEsecs2daytime_bulk;\ncommand 
daytime(t:bat[:timestamp]) :bat[:daytime]\naddress 
MTIMEtimestamp_extract_daytime_default_bulk;" }, 
+{ "mtime", "\natom date :int;\ncommand date(s:date):date\naddress 
MTIMEdate_date\ncomment \"Noop routine.\";\n\ncommand fromstr()\naddress 
date_fromstr;\ncommand tostr()\naddress date_tostr;\n\n\npattern 
==(v:date,w:date):bit\naddress CMDvarEQ\ncomment \"Equality of two 
dates\";\npattern ==(v:date,w:date,nil_matches:bit):bit\naddress 
CMDvarEQ\ncomment \"Equality of two dates\";\npattern 
!=(v:date,w:date):bit\naddress CMDvarNE\ncomment \"Equality of two 
dates\";\npattern !=(v:date,w:date,nil_matches:bit):bit\naddress 
CMDvarNE\ncomment \"Equality of two dates\";\npattern 
<(v:date,w:date):bit\naddress CMDvarLT\ncomment \"Equality of two 
dates\";\npattern <=(v:date,w:date):bit\naddress CMDvarLE\ncomment \"Equality 
of two dates\";\npattern >(v:date,w:date):bit\naddress CMDvarGT\ncomment 
\"Equality of two dates\";\npattern >=(v:date,w:date):bit\naddress 
CMDvarGE\ncomment \"Equality of two dates\";\npattern 
isnil(v:date):bit\naddress CMDvarISNIL\ncomment \"Nil test for date 
value\";\n\nmod
 ule mtime;\npattern calc.==(v:date,w:date):bit\naddress CMDvarEQ\ncomment 
\"Equality of two dates\";\npattern 
calc.==(v:date,w:date,nil_matches:bit):bit\naddress CMDvarEQ\ncomment 
\"Equality of two dates\";\npattern calc.!=(v:date,w:date):bit\naddress 
CMDvarNE\ncomment \"Equality of two dates\";\npattern 
calc.!=(v:date,w:date,nil_matches:bit):bit\naddress CMDvarNE\ncomment 
\"Equality of two dates\";\npattern calc.<(v:date,w:date):bit\naddress 
CMDvarLT\ncomment \"Equality of two dates\";\npattern 
calc.<=(v:date,w:date):bit\naddress CMDvarLE\ncomment \"Equality of two 
dates\";\npattern calc.>(v:date,w:date):bit\naddress CMDvarGT\ncomment 
\"Equality of two dates\";\npattern calc.>=(v:date,w:date):bit\naddress 
CMDvarGE\ncomment \"Equality of two dates\";\n\n\n\natom daytime :int;\ncommand 
fromstr()\naddress daytime_tz_fromstr;\ncommand tostr()\naddress 
daytime_tostr;\n\n\npattern ==(v:daytime,w:daytime):bit\naddress 
CMDvarEQ\ncomment \"Equality of two daytimes\";\npattern ==(v:daytime,w
 :daytime,nil_matches:bit):bit\naddress CMDvarEQ\ncomment \"Equality of two 
daytimes\";\npattern !=(v:daytime,w:daytime):bit\naddress CMDvarNE\ncomment 
\"Equality of two daytimes\";\npattern 
!=(v:daytime,w:daytime,nil_matches:bit):bit\naddress CMDvarNE\ncomment 
\"Equality of two daytimes\";\npattern <(v:daytime,w:daytime):bit\naddress 
CMDvarLT\ncomment \"Equality of two daytimes\";\npattern 
<=(v:daytime,w:daytime):bit\naddress CMDvarLE\ncomment \"Equality of two 
daytimes\";\npattern >(v:daytime,w:daytime):bit\naddress CMDvarGT\ncomment 
\"Equality of two daytimes\";\npattern >=(v:daytime,w:daytime):bit\naddress 
CMDvarGE\ncomment \"Equality of two daytimes\";\npattern 
isnil(v:daytime):bit\naddress CMDvarISNIL\ncomment \"Nil test for daytime 
value\";\n\nmodule mtime;\npattern calc.==(v:daytime,w:daytime):bit\naddress 
CMDvarEQ\ncomment \"Equality of two daytimes\";\npattern 
calc.==(v:daytime,w:daytime,nil_matches:bit):bit\naddress CMDvarEQ\ncomment 
\"Equality of two daytimes\";\npattern 
 calc.!=(v:daytime,w:daytime):bit\naddress CMDvarNE\ncomment \"Equality of two 
daytimes\";\npattern calc.!=(v:daytime,w:daytime,nil_matches:bit):bit\naddress 
CMDvarNE\ncomment \"Equality of two daytimes\";\npattern 
calc.<(v:daytime,w:daytime):bit\naddress CMDvarLT\ncomment \"Equality of two 
daytimes\";\npattern calc.<=(v:daytime,w:daytime):bit\naddress 
CMDvarLE\ncomment \"Equality of two daytimes\";\npattern 
calc.>(v:daytime,w:daytime):bit\naddress CMDvarGT\ncomment \"Equality of two 
daytimes\";\npattern calc.>=(v:daytime,w:daytime):bit\naddress 
CMDvarGE\ncomment \"Equality of two daytimes\";\n\n\n\n\natom timestamp 
:lng;\ncommand fromstr()\naddress timestamp_fromstr;\n\ncommand 
tostr()\naddress timestamp_tostr;\n\nunsafe command 
unix_epoch():timestamp\naddress MTIMEunix_epoch\ncomment \"The Unix epoch time 
(00:00:00 UTC on January 1, 1970)\";\nunsafe command epoch():timestamp\naddress 
MTIMEcurrent_timestamp\ncomment \"unix-time (epoch) support: seconds since the 
Unix epoch\";\n\ncom
 mand epoch(t:timestamp):int\naddress MTIMEepoch2int\ncomment \"unix-time 
(epoch) support: seconds since epoch\";\n\ncommand 
epoch(t:int):timestamp\naddress MTIMEtimestamp\ncomment \"convert seconds since 
epoch into a timestamp\";\ncommand epoch(t:lng):timestamp\naddress 
MTIMEtimestamplng\ncomment \"convert milli seconds since epoch into a 
timestamp\";\n\n\npattern ==(v:timestamp,w:timestamp):bit\naddress 
CMDvarEQ\ncomment \"Equality of two timestamps\";\npattern 
==(v:timestamp,w:timestamp,nil_matches:bit):bit\naddress CMDvarEQ\ncomment 
\"Equality of two timestamps\";\npattern 
!=(v:timestamp,w:timestamp):bit\naddress CMDvarNE\ncomment \"Equality of two 
timestamps\";\npattern !=(v:timestamp,w:timestamp,nil_matches:bit):bit\naddress 
CMDvarNE\ncomment \"Equality of two timestamps\";\npattern 
<(v:timestamp,w:timestamp):bit\naddress CMDvarLT\ncomment \"Equality of two 
timestamps\";\npattern <=(v:timestamp,w:timestamp):bit\naddress 
CMDvarLE\ncomment \"Equality of two timestamps\";\npattern
  >(v:timestamp,w:timestamp):bit\naddress CMDvarGT\ncomment \"Equality of two 
timestamps\";\npattern >=(v:timestamp,w:timestamp):bit\naddress 
CMDvarGE\ncomment \"Equality of two timestamps\";\npattern 
isnil(v:timestamp):bit\naddress CMDvarISNIL\ncomment \"Nil test for timestamp 
value\";\n\nmodule mtime;\npattern 
calc.==(v:timestamp,w:timestamp):bit\naddress CMDvarEQ\ncomment \"Equality of 
two timestamps\";\npattern 
calc.==(v:timestamp,w:timestamp,nil_matches:bit):bit\naddress CMDvarEQ\ncomment 
\"Equality of two timestamps\";\npattern 
calc.!=(v:timestamp,w:timestamp):bit\naddress CMDvarNE\ncomment \"Equality of 
two timestamps\";\npattern 
calc.!=(v:timestamp,w:timestamp,nil_matches:bit):bit\naddress CMDvarNE\ncomment 
\"Equality of two timestamps\";\npattern 
calc.<(v:timestamp,w:timestamp):bit\naddress CMDvarLT\ncomment \"Equality of 
two timestamps\";\npattern calc.<=(v:timestamp,w:timestamp):bit\naddress 
CMDvarLE\ncomment \"Equality of two timestamps\";\npattern 
calc.>(v:timestamp,w:ti
 mestamp):bit\naddress CMDvarGT\ncomment \"Equality of two 
timestamps\";\npattern calc.>=(v:timestamp,w:timestamp):bit\naddress 
CMDvarGE\ncomment \"Equality of two timestamps\";\n\n\n\n\natom timezone 
:lng;\ncommand fromstr()\naddress tzone_fromstr;\ncommand tostr()\naddress 
tzone_tostr;\ncommand str(z:timezone):str\naddress MTIMEtzone_tostr;\ncommand 
timestamp(s:str):timestamp\naddress MTIMEtimestamp_fromstr;\ncommand 
timestamp(secs:int):timestamp\naddress MTIMEtimestamp\ncomment \"Utility 
function to create a timestamp from a number of seconds since the Unix 
epoch\";\n\natom zrule :int;\ncommand fromstr()\naddress rule_fromstr;\ncommand 
tostr()\naddress rule_tostr;\ncommand 
define(m:int,d:int,w:int,h:int,min:int):zrule\naddress MTIMEruleDef0\ncomment 
\"Introduce a synomym timezone rule.\";\ncommand 
define(m:int,d:str,w:int,h:int,min:int):zrule\naddress MTIMEruleDef1\ncomment 
\"Introduce a synomym timezone rule.\";\ncommand 
define(m:int,d:str,w:int,min:int):zrule\naddress MTIMEruleD
 ef2\ncomment \"Introduce a synomym timezone rule.\";\n\n\nmodule 
batmtime;\nmodule mtime;\ncommand 
date_sub_sec_interval(t:date,s:int):date\naddress 
MTIMEdate_sub_sec_interval_wrap\ncomment \"Subtract seconds from a 
date\";\ncommand date_sub_msec_interval(t:date,ms:lng):date\naddress 
MTIMEdate_sub_msec_interval_lng_wrap;\n\ncommand 
date_add_sec_interval(t:date,s:int):date\naddress 
MTIMEdate_add_sec_interval_wrap\ncomment \"Add seconds to a date\";\ncommand 
date_add_msec_interval(t:date,ms:lng):date\naddress 
MTIMEdate_add_msec_interval_lng_wrap;\n\ncommand 
timestamp_sub_msec_interval(t:timestamp,ms:lng):timestamp\naddress 
MTIMEtimestamp_sub_msec_interval_lng_wrap;\ncommand 
timestamp_add_msec_interval(t:timestamp,ms:lng):timestamp\naddress 
MTIMEtimestamp_add;\n\ncommand 
timestamp_sub_month_interval(t:timestamp,s:int):timestamp\naddress 
MTIMEtimestamp_sub_month_interval_wrap\ncomment \"Subtract months from a 
timestamp\";\n\ncommand timestamp_sub_month_interval(t:timestamp,s:lng):timest
 amp\naddress MTIMEtimestamp_sub_month_interval_lng_wrap\ncomment \"Subtract 
months from a timestamp\";\n\ncommand 
timestamp_add_month_interval(t:timestamp,s:int):timestamp\naddress 
MTIMEtimestamp_add_month_interval_wrap\ncomment \"Add months to a 
timestamp\";\n\ncommand 
timestamp_add_month_interval(t:timestamp,s:lng):timestamp\naddress 
MTIMEtimestamp_add_month_interval_lng_wrap\ncomment \"Add months to a 
timestamp\";\n\ncommand timestamp(t:timestamp):timestamp\naddress 
MTIMEtimestamp2timestamp;\n\ncommand 
time_sub_msec_interval(t:daytime,ms:lng):daytime\naddress 
MTIMEtime_sub_msec_interval_wrap\ncomment \"Subtract seconds from a 
time\";\ncommand time_add_msec_interval(t:daytime,ms:lng):daytime\naddress 
MTIMEtime_add_msec_interval_wrap\ncomment \"Add seconds to a time\";\n\ncommand 
diff(val1:daytime, val2:daytime) :lng\naddress MTIMEdaytime_diff\ncomment 
\"returns the number of msec between 'val1' and 'val2'.\";\n\ncommand 
date_add_month_interval(t:date,s:int):date\naddress MTIMEdate
 _addmonths\ncomment \"Add months to a date\";\n\ncommand 
date_sub_month_interval(t:date,s:int):date\naddress 
MTIMEdate_submonths\ncomment \"Subtract months from a date\";\n\ncommand 
date(:date):date\naddress MTIMEdate2date\ncomment \"generate the nil 
date\";\ncommand date(:void):date\naddress MTIMEnil2date\ncomment \"generate 
the nil date\";\n\ncommand local_timezone():lng\naddress 
MTIMElocal_timezone\ncomment \"get the local timezone in seconds\";\n\ncommand 
timezone_local(t:timezone):void\naddress MTIMEtzone_set_local\ncomment \"set 
the local timezone; which is used for printing timestamps\";\ncommand 
timezone_local() :timezone\naddress MTIMEtzone_get_local\ncomment \"get the 
local timezone; which is used for printing timestamps\";\n\ncommand 
date(s:str):date\naddress MTIMEdate_fromstr\ncomment \"convert the string to a 
type date value\";\n\ncommand date(yr:int, mo:int, day:int):date\naddress 
MTIMEdate_create\ncomment \"creates a date from (year,month,day).\";\n\ncommand 
daytime(s
 :str):daytime\naddress MTIMEdaytime_fromstr\ncomment \"convert the string to a 
daytime value.\";\ncommand daytime(:daytime):daytime\naddress 
MTIMEdaytime2daytime;\ncommand daytime(:lng):daytime\naddress 
MTIMEsecs2daytime;\n\ncommand 
daytime(h:int,m:int,s:int,mi:int)\n\t\t:daytime\naddress 
MTIMEdaytime_create\ncomment \"creates a time from 
(hours,minutes,\n\tseconds,milliseconds) parameters.\";\ncommand 
timestamp(d:date,dt:daytime,t:timezone) :timestamp\naddress 
MTIMEtimestamp_create\ncomment \"creates a timestamp from (date, 
daytime,timezone) parameters.\";\ncommand timestamp(d:date,dt:daytime) 
:timestamp\naddress MTIMEtimestamp_create_default\ncomment \"creates a 
timestamp from (d,dt) parameters (in the local timezone).\";\ncommand 
timestamp(d:date) :timestamp\naddress MTIMEtimestamp_create_from_date\ncomment 
\"creates a timestamp from (d,00:00:00) parameters (in the local 
timezone).\";\n\ncommand rule(s:str):zrule\naddress MTIMErule_fromstr\ncomment 
\"create a rule from a  string.
 \";\ncommand rule (mo:int,d:int,wkday:int,mi:int) :zrule\naddress 
MTIMErule_create\ncomment \"create a DST start/end date rule.\";\n\ncommand 
timezone(s:str):timezone\naddress MTIMEtzone_fromstr\ncomment \"Convert the 
string to a timezone.\";\ncommand timezone(s:int):timezone\naddress 
MTIMEtzone_create\ncomment \"Convert the int to a timezone.\";\ncommand 
timezone(s:lng):timezone\naddress MTIMEtzone_create_lng\ncomment \"Convert the 
int to a timezone.\";\ncommand 
timezone(mi:int,s:zrule,erule:zrule):timezone\naddress 
MTIMEtzone_create_dst\ncomment \"create a timezone as an hour 
difference\n\tfrom GMT and a DST.\";\n\ncommand year(d:date) :int\naddress 
MTIMEdate_extract_year\ncomment \"extracts year from date (nonzero\n\tvalue 
between -5867411 and +5867411).\";\ncommand 
batmtime.year(d:bat[:date]):bat[:int]\naddress 
MTIMEdate_extract_year_bulk;\n\ncommand quarter(d:date) :int\naddress 
MTIMEdate_extract_quarter\ncomment \"extracts quarter from date\";\ncommand 
batmtime.quarter(d:bat[:
 date]):bat[:int]\naddress MTIMEdate_extract_quarter_bulk;\n\ncommand 
month(d:date) :int\naddress MTIMEdate_extract_month\ncomment \"extracts month 
from date\";\ncommand batmtime.month(d:bat[:date]):bat[:int]\naddress 
MTIMEdate_extract_month_bulk;\n\ncommand day(d:date) :int\naddress 
MTIMEdate_extract_day\ncomment \"extracts day from date \";\ncommand 
batmtime.day(d:bat[:date]):bat[:int]\naddress 
MTIMEdate_extract_day_bulk;\n\ncommand hours(h:daytime) :int\naddress 
MTIMEdaytime_extract_hours\ncomment \"extracts hour from daytime\";\ncommand 
batmtime.hours(d:bat[:daytime]):bat[:int]\naddress 
MTIMEdaytime_extract_hours_bulk;\n\ncommand minutes(d:daytime) :int\naddress 
MTIMEdaytime_extract_minutes\ncomment \"extracts minutes from 
daytime\";\ncommand batmtime.minutes(d:bat[:daytime]):bat[:int]\naddress 
MTIMEdaytime_extract_minutes_bulk;\n\ncommand seconds(d:daytime) :int\naddress 
MTIMEdaytime_extract_seconds\ncomment \"extracts seconds from 
daytime\";\ncommand batmtime.seconds(d:bat[:day
 time]):bat[:int]\naddress MTIMEdaytime_extract_seconds_bulk;\n\ncommand 
sql_seconds(d:daytime) :int\naddress MTIMEdaytime_extract_sql_seconds\ncomment 
\"extracts seconds (with fractional milliseconds) from daytime\";\ncommand 
batmtime.sql_seconds(d:bat[:daytime]):bat[:int]\naddress 
MTIMEdaytime_extract_sql_seconds_bulk;\n\ncommand milliseconds(d:daytime) 
:int\naddress MTIMEdaytime_extract_milliseconds\ncomment \"extracts 
milliseconds from daytime\";\ncommand 
batmtime.milliseconds(d:bat[:daytime]):bat[:int]\naddress 
MTIMEdaytime_extract_milliseconds_bulk;\n\ncommand daytime(t:timestamp) 
:daytime\naddress MTIMEtimestamp_extract_daytime_default\ncomment \"extracts 
daytime from timestamp\n\tin the local timezone.\";\ncommand 
daytime(t:timestamp, v:timezone) :daytime\naddress 
MTIMEtimestamp_extract_daytime\ncomment \"extracts daytime from timestamp\n\tin 
a specific timezone.\";\n\ncommand date(t:timestamp) :date\naddress 
MTIMEtimestamp_extract_date_default\ncomment \"extracts date from t
 imestamp\n\tin the local timezone.\";\ncommand date(t:timestamp,v:timezone) 
:date\naddress MTIMEtimestamp_extract_date\ncomment \"extracts date from 
timestamp in a\n\tspecific timezone.\";\n\ncommand 
setTimezone(name:str):timezone\naddress MTIMEtimezone\ncomment \"Test and set 
the timezone.\";\n\ncommand start_dst(t:timezone) :zrule\naddress 
MTIMEtzone_extract_start\ncomment \"extract rule that determines\n\tstart of 
DST from timezone.\";\ncommand end_dst(t:timezone) :zrule\naddress 
MTIMEtzone_extract_end\ncomment \"extract rule that determines\n\tend of DST 
from timezone.\";\ncommand minutes(t:timezone) :int\naddress 
MTIMEtzone_extract_minutes\ncomment \"extract number of minutes that\n\ttime 
zone is offset wrt GMT.\";\n\ncommand month(t:zrule) :int\naddress 
MTIMErule_extract_month\ncomment \"extract month from rule.\";\ncommand 
day(t:zrule) :int\naddress MTIMErule_extract_day\ncomment \"extract day from 
rule.\";\ncommand weekday(t:zrule) :int\naddress MTIMErule_extract_weekday\nco
 mment \"extract weekday from rule.\";\ncommand minutes(t:zrule) :int\naddress 
MTIMErule_extract_minutes\ncomment \"extract minutes from rule.\";\n\ncommand 
addyears(value:date, years:int) :date\naddress MTIMEdate_addyears\ncomment 
\"returns the date after a number\n\tof years (possibly negative).\";\ncommand 
addmonths(value:date, months:int) :date\naddress MTIMEdate_addmonths\ncomment 
\"returns the date after a number of\n\tmonths (possibly negative).\";\ncommand 
adddays(value:date, days:int) :date\naddress MTIMEdate_adddays\ncomment 
\"returns the date after a number\n\tof days (possibly negative).\";\ncommand 
diff(val1:date, val2:date) :int\naddress MTIMEdate_diff\ncomment \"returns the 
number of days\n\tbetween 'val1' and 'val2'.\";\n\ncommand dayofyear(d:date) 
:int\naddress MTIMEdate_extract_dayofyear\ncomment \"Returns N where d is the 
Nth day\n\tof the year (january 1 returns 1)\";\ncommand weekofyear(d:date) 
:int\naddress MTIMEdate_extract_weekofyear\ncomment \"Returns the wee
 k number in the year.\";\ncommand week(d:date) :int\naddress 
MTIMEdate_extract_weekofyear\ncomment \"Returns the week number in the 
year.\";\ncommand dayofweek(d:date) :int\naddress 
MTIMEdate_extract_dayofweek\ncomment \"Returns the current day of the 
week\n\twhere 1=monday, .., 7=sunday\";\n\ncommand add(v:timestamp, msecs:lng) 
:timestamp\naddress MTIMEtimestamp_add\ncomment \"returns the timestamp that 
comes 'msecs'\n\t(possibly negative) after 'value'.\";\ncommand 
diff(val1:timestamp, val2:timestamp) :lng\naddress MTIMEtimestamp_diff\ncomment 
\"returns the number of milliseconds\n\tbetween 'val1' and 
'val2'.\";\n\ncommand dst(t:timestamp,v:timezone) :bit\naddress 
MTIMEtimestamp_inside_dst\ncomment \"return whether DST holds in 
the\n\ttimezone at a certain point of time.\";\n\ncommand compute(r:zrule, 
year:int) :date\naddress MTIMEcompute_rule_foryear\ncomment \"compute the date 
from a rule in a given year\";\n\ncommand monthnum(month:str) :int\naddress 
MTIMEmonth_from_str\ncommen
 t \"Returns month number [1-12] from a string\n\t or nil if does not match 
any.\";\ncommand monthname(month:int) :str\naddress MTIMEmonth_to_str\ncomment 
\"Returns month name from a number\n\tbetween [1-12], str(nil) 
otherwise.\";\ncommand daynum(day:str) :int\naddress MTIMEday_from_str\ncomment 
\"Returns number of day [1-7] from a\n\tstring or nil if does not match 
any.\";\ncommand dayname(day:int) :str\naddress MTIMEday_to_str\ncomment 
\"Returns day name from a number\n\tbetween [1-7], str(nil) 
otherwise.\";\n\ncommand time_synonyms(allow:bit)\naddress 
MTIMEsynonyms\ncomment \"Allow synonyms for the parse format 
of\n\tdate/timestamp.\";\n\ncommand str_to_date(s:str, format:str) 
:date\naddress MTIMEstr_to_date\ncomment \"create a date from the string, using 
the specified format (see man strptime)\";\n\ncommand date_to_str(d:date, 
format:str) :str\naddress MTIMEdate_to_str\ncomment \"create a string from the 
date, using the specified format (see man strftime)\";\n\ncommand str_to_ti
 me(s:str, format:str) :daytime\naddress MTIMEstr_to_time\ncomment \"create a 
time from the string, using the specified format (see man 
strptime)\";\n\ncommand time_to_str(d:daytime, format:str) :str\naddress 
MTIMEtime_to_str\ncomment \"create a string from the time, using the specified 
format (see man strftime)\";\n\ncommand str_to_timestamp(s:str, format:str) 
:timestamp\naddress MTIMEstr_to_timestamp\ncomment \"create a timestamp from 
the string, using the specified format (see man strptime)\";\n\ncommand 
timestamp_to_str(d:timestamp, format:str) :str\naddress 
MTIMEtimestamp_to_str\ncomment \"create a string from the time, using the 
specified format (see man strftime)\";\n\n\ncommand 
msecs(d:int,h:int,m:int,s:int,ms:int):lng\naddress MTIMEmsecs\ncomment 
\"convert date components to milliseconds\";\n\ncommand 
daytime(h:int):daytime\naddress MTIMEdaytime1\ncomment \"default time with 
zeroed components\";\ncommand daytime(h:int,m:int):daytime\naddress 
MTIMEdaytime2\ncomment \"default 
 time with zeroed components\";\ncommand 
daytime(h:int,m:int,s:int):daytime\naddress MTIMEdaytime3\ncomment \"default 
time with zeroed components\";\n\ncommand 
current_timestamp():timestamp\naddress MTIMEcurrent_timestamp;\ncommand 
current_date():date\naddress MTIMEcurrent_date;\ncommand 
current_time():daytime\naddress MTIMEcurrent_time;\n\ncommand 
year(t:timestamp):int\naddress MTIMEtimestamp_year;\ncommand 
quarter(t:timestamp):int\naddress MTIMEtimestamp_quarter;\ncommand 
month(t:timestamp):int\naddress MTIMEtimestamp_month;\ncommand 
day(t:timestamp):int\naddress MTIMEtimestamp_day;\ncommand 
hours(t:timestamp):int\naddress MTIMEtimestamp_hours;\ncommand 
minutes(t:timestamp):int\naddress MTIMEtimestamp_minutes;\ncommand 
seconds(t:timestamp):int\naddress MTIMEtimestamp_seconds;\ncommand 
sql_seconds(t:timestamp):int\naddress MTIMEtimestamp_sql_seconds;\ncommand 
milliseconds(t:timestamp):int\naddress MTIMEtimestamp_milliseconds;\n\ncommand 
year(months:int):int\naddress MTIMEsql_year;\n
 command month(months:int):int\naddress MTIMEsql_month;\ncommand 
day(msecs:lng):lng\naddress MTIMEsql_day;\ncommand 
hours(msecs:lng):int\naddress MTIMEsql_hours;\ncommand 
minutes(msecs:lng):int\naddress MTIMEsql_minutes;\ncommand 
seconds(msecs:lng):int\naddress MTIMEsql_seconds;\n\nunsafe command 
msec():lng\naddress MTIMEmsec\ncomment \"get time of day in msec since 
1-1-1970.\";\n\ncommand prelude() :void\naddress MTIMEprelude;\n\ncommand 
epilogue() :void\naddress MTIMEepilogue;\n\nmtime.prelude();\n\nmodule 
calc;\n\ncommand date(s:str):date address MTIMEdate_fromstr;\ncommand 
date(d:date):date address MTIMEdate_date;\ncommand date(t:timestamp) :date 
address MTIMEtimestamp_extract_date_default;\n\ncommand 
timestamp(s:str):timestamp address MTIMEtimestamp_fromstr;\ncommand 
timestamp(t:timestamp):timestamp address MTIMEtimestamp2timestamp;\ncommand 
timestamp(d:date) :timestamp address MTIMEtimestamp_create_from_date;\ncommand 
timestamp(secs:int):timestamp address MTIMEtimestamp;\ncomma
 nd timestamp(msecs:lng):timestamp address MTIMEtimestamp_lng;\n\ncommand 
daytime(s:str):daytime address MTIMEdaytime_fromstr;\ncommand 
daytime(d:daytime):daytime address MTIMEdaytime2daytime;\ncommand 
daytime(s:lng):daytime address MTIMEsecs2daytime;\ncommand daytime(t:timestamp) 
:daytime address MTIMEtimestamp_extract_daytime_default;\n\nmodule 
batcalc;\n\ncommand date(t:bat[:timestamp]) :bat[:date]\naddress 
MTIMEtimestamp_extract_date_default_bulk;\n\ncommand timestamp(d:bat[:date]) 
:bat[:timestamp]\naddress MTIMEtimestamp_create_from_date_bulk;\ncommand 
timestamp(secs:bat[:int]) :bat[:timestamp]\naddress 
MTIMEtimestamp_bulk;\ncommand timestamp(msecs:bat[:lng]) 
:bat[:timestamp]\naddress MTIMEtimestamp_lng_bulk;\n\ncommand 
daytime(s:bat[:lng]) :bat[:daytime]\naddress MTIMEsecs2daytime_bulk;\ncommand 
daytime(t:bat[:timestamp]) :bat[:daytime]\naddress 
MTIMEtimestamp_extract_daytime_default_bulk;" }, 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to