Changeset: 461f5af94689 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=461f5af94689
Added Files:
        tools/sql/Makefile.ag
Modified Files:
        monetdb5/mal/mal_linker.c
        sql/backends/monet5/Makefile.ag
        sql/backends/monet5/sql_embedded.c
        sql/backends/monet5/sql_rank.mal
        sql/backends/monet5/sql_rank.mal.h
        sql/backends/monet5/sql_rank_hge.mal
        sql/backends/monet5/sql_rank_hge.mal.h
        tools/Makefile.ag
        tools/mserver/Makefile.ag
        vertoo.config
Branch: translate-scripts
Log Message:

Create new library "libsql", to be used by mserver executable to start the SQL 
environment.


diffs (195 lines):

diff --git a/monetdb5/mal/mal_linker.c b/monetdb5/mal/mal_linker.c
--- a/monetdb5/mal/mal_linker.c
+++ b/monetdb5/mal/mal_linker.c
@@ -103,17 +103,17 @@ getAddress(str fcnname)
         *
         * the first argument must be the same as the base name of the
         * library that is created in src/tools */
-       dl = mdlopen("libmonetdb5", RTLD_NOW | RTLD_GLOBAL);
+       dl = mdlopen("libsql", RTLD_NOW | RTLD_GLOBAL);
        if (dl == NULL) 
                return NULL;
 
        adr = (MALfcn) dlsym(dl, fcnname);
-       filesLoaded[lastfile].modname = GDKstrdup("libmonetdb5");
+       filesLoaded[lastfile].modname = GDKstrdup("libsql");
        if(filesLoaded[lastfile].modname == NULL) {
                dlclose(dl);
                return NULL;
        }
-       filesLoaded[lastfile].fullname = GDKstrdup("libmonetdb5");
+       filesLoaded[lastfile].fullname = GDKstrdup("libsql");
        if(filesLoaded[lastfile].fullname == NULL) {
                dlclose(dl);
                GDKfree(filesLoaded[lastfile].modname);
diff --git a/sql/backends/monet5/Makefile.ag b/sql/backends/monet5/Makefile.ag
--- a/sql/backends/monet5/Makefile.ag
+++ b/sql/backends/monet5/Makefile.ag
@@ -19,15 +19,9 @@ INCLUDES = ../../include ../../common ..
                   ../../../common/utils \
                   ../../../gdk
 
-lib_sqlstart = {
+lib_sqlcatalog = {
        NOINST
        DIR = libdir/monetdb5
-       SOURCES = sql_embedded.c sql_embedded.h
-}
-
-lib__sql = {
-       MODULE
-       DIR = libdir/monetdb5
        SOURCES = \
                sql.c sql.h \
                mal_backend.c mal_backend.h \
@@ -52,19 +46,8 @@ lib__sql = {
                sql_fround.c sql_fround_impl.h \
                sql_orderidx.c sql_orderidx.h \
                wlr.c wlr.h \
-               sql_rank.c sql_rank.h
-
-       # libmapi on Windows for mcrypt_*
-       LIBS = ../../server/libsqlserver \
-               ../../scripts/libsqlscripts \
-               ../../storage/libstore \
-               ../../storage/bat/libbatstore \
-               ../../common/libsqlcommon \
-               WIN32?../../../clients/mapilib/libmapi \
-               WIN32?../../../monetdb5/tools/libmonetdb5 \
-               WIN32?../../../gdk/libbat \
-               WIN32?../../../common/stream/libstream \
-               WIN32?$(openssl_LIBS)
+               sql_rank.c sql_rank.h \
+               sql_embedded.c sql_embedded.h
 }
 
 EXTRA_DIST_DIR = Tests
diff --git a/sql/backends/monet5/sql_embedded.c 
b/sql/backends/monet5/sql_embedded.c
--- a/sql/backends/monet5/sql_embedded.c
+++ b/sql/backends/monet5/sql_embedded.c
@@ -27,11 +27,11 @@ static struct mal_sql_scripts {
 #include "sql_aggr_flt.mal.h"
 #include "sql_aggr_dbl.mal.h"
 #include "sql_inspect.mal.h"
+#include "sql.mal.h"
 #include "sqlcatalog.mal.h"
 #include "sql_transaction.mal.h"
 #include "wlr.mal.h"
 #include "40_sql.mal.h"
-#include "sql.mal.h"
 
 #ifdef HAVE_HGE
 #include "sql_decimal_hge.mal.h"
diff --git a/sql/backends/monet5/sql_rank.mal b/sql/backends/monet5/sql_rank.mal
--- a/sql/backends/monet5/sql_rank.mal
+++ b/sql/backends/monet5/sql_rank.mal
@@ -6,6 +6,8 @@
 
 # This file was generated by using the script sql_rank.mal.sh.
 
+module aggr;
+module batsql;
 module sql;
 
 pattern sql.diff(b:any_1) :bit
diff --git a/sql/backends/monet5/sql_rank.mal.h 
b/sql/backends/monet5/sql_rank.mal.h
--- a/sql/backends/monet5/sql_rank.mal.h
+++ b/sql/backends/monet5/sql_rank.mal.h
@@ -7,4 +7,4 @@
 */
 
 // This file was generated automatically with mal2h.py. Do not edit this file 
directly.
-{ "sql_rank", "\n\nmodule sql;\n\npattern sql.diff(b:any_1) :bit\naddress 
SQLdiff\ncomment \"return true if cur != prev row\";\n\npattern 
batsql.diff(b:bat[:any_1]) :bat[:bit]\naddress SQLdiff\ncomment \"return true 
if cur != prev row\";\n\npattern sql.diff(p:bit, b:any_1) :bit\naddress 
SQLdiff\ncomment \"return true if cur != prev row\";\n\npattern 
batsql.diff(p:bat[:bit], b:bat[:any_1]) :bat[:bit]\naddress SQLdiff\ncomment 
\"return true if cur != prev row\";\n\npattern sql.window_bound(b:any_1, 
unit:int, bound:int, excl:int, limit:bte) :lng\naddress 
SQLwindow_bound\ncomment \"computes window ranges for each row\";\n\npattern 
batsql.window_bound(b:bat[:any_1], unit:int, bound:int, excl:int, limit:bte) 
:bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window ranges for each 
row\";\n\npattern sql.window_bound(p:bit, b:any_1, unit:int, bound:int, 
excl:int, limit:bte) :lng\naddress SQLwindow_bound\ncomment \"computes window 
ranges for each row\";\n\npattern batsql.window_bound(p:
 bat[:bit], b:bat[:any_1], unit:int, bound:int, excl:int, limit:bte) 
:bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window ranges for each 
row\";\n\npattern batsql.window_bound(b:bat[:any_1], unit:int, bound:int, 
excl:int, limit:bat[:bte]) :bat[:lng]\naddress SQLwindow_bound\ncomment 
\"computes window ranges for each row\";\n\npattern 
batsql.window_bound(p:bat[:bit], b:bat[:any_1], unit:int, bound:int, excl:int, 
limit:bat[:bte]) :bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window 
ranges for each row\";\n\n\npattern sql.window_bound(b:any_1, unit:int, 
bound:int, excl:int, limit:sht) :lng\naddress SQLwindow_bound\ncomment 
\"computes window ranges for each row\";\n\npattern 
batsql.window_bound(b:bat[:any_1], unit:int, bound:int, excl:int, limit:sht) 
:bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window ranges for each 
row\";\n\npattern sql.window_bound(p:bit, b:any_1, unit:int, bound:int, 
excl:int, limit:sht) :lng\naddress SQLwindow_bound\ncomment \"computes
  window ranges for each row\";\n\npattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, limit:sht) :bat[:lng]\naddress 
SQLwindow_bound\ncomment \"computes window ranges for each row\";\n\npattern 
batsql.window_bound(b:bat[:any_1], unit:int, bound:int, excl:int, 
limit:bat[:sht]) :bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window 
ranges for each row\";\n\npattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, limit:bat[:sht]) 
:bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window ranges for each 
row\";\n\n\npattern sql.window_bound(b:any_1, unit:int, bound:int, excl:int, 
limit:int) :lng\naddress SQLwindow_bound\ncomment \"computes window ranges for 
each row\";\n\npattern batsql.window_bound(b:bat[:any_1], unit:int, bound:int, 
excl:int, limit:int) :bat[:lng]\naddress SQLwindow_bound\ncomment \"computes 
window ranges for each row\";\n\npattern sql.window_bound(p:bit, b:any_1, 
unit:int, bound:int, excl:i
 nt, limit:int) :lng\naddress SQLwindow_bound\ncomment \"computes window ranges 
for each row\";\n\npattern batsql.window_bound(p:bat[:bit], b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:int) :bat[:lng]\naddress 
SQLwindow_bound\ncomment \"computes window ranges for each row\";\n\npattern 
batsql.window_bound(b:bat[:any_1], unit:int, bound:int, excl:int, 
limit:bat[:int]) :bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window 
ranges for each row\";\n\npattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, limit:bat[:int]) 
:bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window ranges for each 
row\";\n\n\npattern sql.window_bound(b:any_1, unit:int, bound:int, excl:int, 
limit:lng) :lng\naddress SQLwindow_bound\ncomment \"computes window ranges for 
each row\";\n\npattern batsql.window_bound(b:bat[:any_1], unit:int, bound:int, 
excl:int, limit:lng) :bat[:lng]\naddress SQLwindow_bound\ncomment \"computes 
window ranges for each row\";\n\npatt
 ern sql.window_bound(p:bit, b:any_1, unit:int, bound:int, excl:int, limit:lng) 
:lng\naddress SQLwindow_bound\ncomment \"computes window ranges for each 
row\";\n\npattern batsql.window_bound(p:bat[:bit], b:bat[:any_1], unit:int, 
bound:int, excl:int, limit:lng) :bat[:lng]\naddress SQLwindow_bound\ncomment 
\"computes window ranges for each row\";\n\npattern 
batsql.window_bound(b:bat[:any_1], unit:int, bound:int, excl:int, 
limit:bat[:lng]) :bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window 
ranges for each row\";\n\npattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, limit:bat[:lng]) 
:bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window ranges for each 
row\";\n\n\npattern sql.window_bound(b:any_1, unit:int, bound:int, excl:int, 
limit:flt) :lng\naddress SQLwindow_bound\ncomment \"computes window ranges for 
each row\";\n\npattern batsql.window_bound(b:bat[:any_1], unit:int, bound:int, 
excl:int, limit:flt) :bat[:lng]\naddress SQLwindow
 _bound\ncomment \"computes window ranges for each row\";\n\npattern 
sql.window_bound(p:bit, b:any_1, unit:int, bound:int, excl:int, limit:flt) 
:lng\naddress SQLwindow_bound\ncomment \"computes window ranges for each 
row\";\n\npattern batsql.window_bound(p:bat[:bit], b:bat[:any_1], unit:int, 
bound:int, excl:int, limit:flt) :bat[:lng]\naddress SQLwindow_bound\ncomment 
\"computes window ranges for each row\";\n\npattern 
batsql.window_bound(b:bat[:any_1], unit:int, bound:int, excl:int, 
limit:bat[:flt]) :bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window 
ranges for each row\";\n\npattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, limit:bat[:flt]) 
:bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window ranges for each 
row\";\n\n\npattern sql.window_bound(b:any_1, unit:int, bound:int, excl:int, 
limit:dbl) :lng\naddress SQLwindow_bound\ncomment \"computes window ranges for 
each row\";\n\npattern batsql.window_bound(b:bat[:any_1], unit:in
 t, bound:int, excl:int, limit:dbl) :bat[:lng]\naddress 
SQLwindow_bound\ncomment \"computes window ranges for each row\";\n\npattern 
sql.window_bound(p:bit, b:any_1, unit:int, bound:int, excl:int, limit:dbl) 
:lng\naddress SQLwindow_bound\ncomment \"computes window ranges for each 
row\";\n\npattern batsql.window_bound(p:bat[:bit], b:bat[:any_1], unit:int, 
bound:int, excl:int, limit:dbl) :bat[:lng]\naddress SQLwindow_bound\ncomment 
\"computes window ranges for each row\";\n\npattern 
batsql.window_bound(b:bat[:any_1], unit:int, bound:int, excl:int, 
limit:bat[:dbl]) :bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window 
ranges for each row\";\n\npattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, limit:bat[:dbl]) 
:bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window ranges for each 
row\";\n\n\npattern sql.row_number(b:any_1, p:bit, o:bit) :int\naddress 
SQLrow_number\ncomment \"return the row_numer-ed groups\";\n\npattern 
batsql.row_numb
 er(b:bat[:any_1], p:any_2, o:any_3) :bat[:int]\naddress SQLrow_number\ncomment 
\"return the row_numer-ed groups\";\n\n\npattern sql.rank(b:any_1, p:bit, 
o:bit) :int\naddress SQLrank\ncomment \"return the ranked groups\";\n\npattern 
batsql.rank(b:bat[:any_1], p:any_2, o:any_3) :bat[:int]\naddress 
SQLrank\ncomment \"return the ranked groups\";\n\n\npattern 
sql.dense_rank(b:any_1, p:bit, o:bit) :int\naddress SQLdense_rank\ncomment 
\"return the densely ranked groups\";\n\npattern 
batsql.dense_rank(b:bat[:any_1], p:any_2, o:any_3) :bat[:int]\naddress 
SQLdense_rank\ncomment \"return the densely ranked groups\";\n\n\npattern 
sql.percent_rank(b:any_1, p:bit, o:bit) :dbl\naddress SQLpercent_rank\ncomment 
\"return the percentage into the total number of groups for each 
row\";\n\npattern batsql.percent_rank(b:bat[:any_1], p:any_2, o:any_3) 
:bat[:dbl]\naddress SQLpercent_rank\ncomment \"return the percentage into the 
total number of groups for each row\";\n\n\npattern sql.cume_dist(b:any_1, p:b
 it, o:bit) :dbl\naddress SQLcume_dist\ncomment \"return the accumulated 
distribution of the number of rows per group to the total number of partition 
rows\";\n\npattern batsql.cume_dist(b:bat[:any_1], p:any_2, o:any_3) 
:bat[:dbl]\naddress SQLcume_dist\ncomment \"return the accumulated distribution 
of the number of rows per group to the total number of partition 
rows\";\n\n\npattern sql.lag(b:any_1, p:any_3, o:any_4) :any_1\naddress 
SQLlag\ncomment \"return the value in the previous row in the partition or NULL 
if non existent\";\n\npattern batsql.lag(b:bat[:any_1], p:any_3, o:any_4) 
:bat[:any_1]\naddress SQLlag\ncomment \"return the value in the previous row in 
the partition or NULL if non existent\";\n\n\npattern sql.lag(b:any_1, l:any_2, 
p:any_3, o:any_4) :any_1\naddress SQLlag\ncomment \"return the value in the 
previous 'l' row in the partition or NULL if non existent\";\n\npattern 
batsql.lag(b:bat[:any_1], l:any_2, p:any_3, o:any_4) :bat[:any_1]\naddress 
SQLlag\ncomment \"return
  the value in the previous 'l' row in the partition or NULL if non 
existent\";\n\npattern sql.lag(b:any_1, l:bat[:any_2], p:any_3, o:any_4) 
:any_1\naddress SQLlag\ncomment \"return the value in the previous 'l' row in 
the partition or NULL if non existent\";\n\npattern batsql.lag(b:bat[:any_1], 
l:bat[:any_2], p:any_3, o:any_4) :bat[:any_1]\naddress SQLlag\ncomment \"return 
the value in the previous 'l' row in the partition or NULL if non 
existent\";\n\n\npattern sql.lag(b:any_1, l:any_2, d:any_1, p:any_3, o:any_4) 
:any_1\naddress SQLlag\ncomment \"return the value in the previous 'l' row in 
the partition or 'd' if non existent\";\n\npattern batsql.lag(b:bat[:any_1], 
l:any_2, d:any_1, p:any_3, o:any_4) :bat[:any_1]\naddress SQLlag\ncomment 
\"return the value in the previous 'l' row in the partition or 'd' if non 
existent\";\n\npattern sql.lag(b:any_1, l:bat[:any_2], d:any_1, p:any_3, 
o:any_4) :any_1\naddress SQLlag\ncomment \"return the value in the previous 'l' 
row in the partition 
 or 'd' if non existent\";\n\npattern batsql.lag(b:bat[:any_1], l:bat[:any_2], 
d:any_1, p:any_3, o:any_4) :bat[:any_1]\naddress SQLlag\ncomment \"return the 
value in the previous 'l' row in the partition or 'd' if non 
existent\";\n\npattern sql.lag(b:any_1, l:any_2, d:bat[:any_1], p:any_3, 
o:any_4) :any_1\naddress SQLlag\ncomment \"return the value in the previous 'l' 
row in the partition or 'd' if non existent\";\n\npattern 
batsql.lag(b:bat[:any_1], l:any_2, d:bat[:any_1], p:any_3, o:any_4) 
:bat[:any_1]\naddress SQLlag\ncomment \"return the value in the previous 'l' 
row in the partition or 'd' if non existent\";\n\npattern sql.lag(b:any_1, 
l:bat[:any_2], d:bat[:any_1], p:any_3, o:any_4) :any_1\naddress SQLlag\ncomment 
\"return the value in the previous 'l' row in the partition or 'd' if non 
existent\";\n\npattern batsql.lag(b:bat[:any_1], l:bat[:any_2], d:bat[:any_1], 
p:any_3, o:any_4) :bat[:any_1]\naddress SQLlag\ncomment \"return the value in 
the previous 'l' row in the partition 
 or 'd' if non existent\";\n\n\npattern sql.lead(b:any_1, p:any_3, o:any_4) 
:any_1\naddress SQLlead\ncomment \"return the value in the next row in the 
partition or NULL if non existent\";\n\npattern batsql.lead(b:bat[:any_1], 
p:any_3, o:any_4) :bat[:any_1]\naddress SQLlead\ncomment \"return the value in 
the next row in the partition or NULL if non existent\";\n\n\npattern 
sql.lead(b:any_1, l:any_2, p:any_3, o:any_4) :any_1\naddress SQLlead\ncomment 
\"return the value in the next 'l' row in the partition or NULL if non 
existent\";\n\npattern batsql.lead(b:bat[:any_1], l:any_2, p:any_3, o:any_4) 
:bat[:any_1]\naddress SQLlead\ncomment \"return the value in the next 'l' row 
in the partition or NULL if non existent\";\n\npattern sql.lead(b:any_1, 
l:bat[:any_2], p:any_3, o:any_4) :any_1\naddress SQLlead\ncomment \"return the 
value in the next 'l' row in the partition or NULL if non 
existent\";\n\npattern batsql.lead(b:bat[:any_1], l:bat[:any_2], p:any_3, 
o:any_4) :bat[:any_1]\naddress SQLl
 ead\ncomment \"return the value in the next 'l' row in the partition or NULL 
if non existent\";\n\n\npattern sql.lead(b:any_1, l:any_2, d:any_1, p:any_3, 
o:any_4) :any_1\naddress SQLlead\ncomment \"return the value in the next 'l' 
row in the partition or 'd' if non existent\";\n\npattern 
batsql.lead(b:bat[:any_1], l:any_2, d:any_1, p:any_3, o:any_4) 
:bat[:any_1]\naddress SQLlead\ncomment \"return the value in the next 'l' row 
in the partition or 'd' if non existent\";\n\npattern sql.lead(b:any_1, 
l:bat[:any_2], d:any_1, p:any_3, o:any_4) :any_1\naddress SQLlead\ncomment 
\"return the value in the next 'l' row in the partition or 'd' if non 
existent\";\n\npattern batsql.lead(b:bat[:any_1], l:bat[:any_2], d:any_1, 
p:any_3, o:any_4) :bat[:any_1]\naddress SQLlead\ncomment \"return the value in 
the next 'l' row in the partition or 'd' if non existent\";\n\npattern 
sql.lead(b:any_1, l:any_2, d:bat[:any_1], p:any_3, o:any_4) :any_1\naddress 
SQLlead\ncomment \"return the value in the next 'l
 ' row in the partition or 'd' if non existent\";\n\npattern 
batsql.lead(b:bat[:any_1], l:any_2, d:bat[:any_1], p:any_3, o:any_4) 
:bat[:any_1]\naddress SQLlead\ncomment \"return the value in the next 'l' row 
in the partition or 'd' if non existent\";\n\npattern sql.lead(b:any_1, 
l:bat[:any_2], d:bat[:any_1], p:any_3, o:any_4) :any_1\naddress 
SQLlead\ncomment \"return the value in the next 'l' row in the partition or 'd' 
if non existent\";\n\npattern batsql.lead(b:bat[:any_1], l:bat[:any_2], 
d:bat[:any_1], p:any_3, o:any_4) :bat[:any_1]\naddress SQLlead\ncomment 
\"return the value in the next 'l' row in the partition or 'd' if non 
existent\";\n\n\npattern sql.ntile(b:any_1, n:any_2, p:any_3, o:any_4) 
:any_2\naddress SQLntile\ncomment \"return the groups divided as equally as 
possible\";\n\npattern batsql.ntile(b:bat[:any_1], n:any_2, p:any_3, o:any_4) 
:bat[:any_2]\naddress SQLntile\ncomment \"return the groups divided as equally 
as possible\";\n\npattern sql.ntile(b:any_1, n:bat[:any_
 2], p:any_3, o:any_4) :any_2\naddress SQLntile\ncomment \"return the groups 
divided as equally as possible\";\n\npattern batsql.ntile(b:bat[:any_1], 
n:bat[:any_2], p:any_3, o:any_4) :bat[:any_2]\naddress SQLntile\ncomment 
\"return the groups divided as equally as possible\";\n\n\npattern 
sql.first_value(b:any_1, s:lng, e:lng) :any_1\naddress SQLfirst_value\ncomment 
\"return the first value of groups\";\n\npattern 
batsql.first_value(b:bat[:any_1], s:bat[:lng], e:bat[:lng]) 
:bat[:any_1]\naddress SQLfirst_value\ncomment \"return the first value of 
groups\";\n\n\npattern sql.last_value(b:any_1, s:lng, e:lng) :any_1\naddress 
SQLlast_value\ncomment \"return the last value of groups\";\n\npattern 
batsql.last_value(b:bat[:any_1], s:bat[:lng], e:bat[:lng]) 
:bat[:any_1]\naddress SQLlast_value\ncomment \"return the last value of 
groups\";\n\n\npattern sql.nth_value(b:any_1, n:any_2, s:lng, e:lng) 
:any_1\naddress SQLnth_value\ncomment \"return the nth value of each 
group\";\n\npattern batsql.nt
 h_value(b:bat[:any_1], n:any_2, s:bat[:lng], e:bat[:lng]) 
:bat[:any_1]\naddress SQLnth_value\ncomment \"return the nth value of each 
group\";\n\npattern sql.nth_value(b:any_1, n:bat[:any_2], s:lng, e:lng) 
:any_1\naddress SQLnth_value\ncomment \"return the nth value of each 
group\";\n\npattern batsql.nth_value(b:bat[:any_1], n:bat[:any_2], s:bat[:lng], 
e:bat[:lng]) :bat[:any_1]\naddress SQLnth_value\ncomment \"return the nth value 
of each group\";\n\n\npattern sql.min(b:any_1, s:lng, e:lng) :any_1\naddress 
SQLmin\ncomment \"return the minimum of groups\";\n\npattern 
batsql.min(b:bat[:any_1], s:bat[:lng], e:bat[:lng]) :bat[:any_1]\naddress 
SQLmin\ncomment \"return the minimum of groups\";\n\npattern sql.max(b:any_1, 
s:lng, e:lng) :any_1\naddress SQLmax\ncomment \"return the maximum of 
groups\";\n\npattern batsql.max(b:bat[:any_1], s:bat[:lng], e:bat[:lng]) 
:bat[:any_1]\naddress SQLmax\ncomment \"return the maximum of 
groups\";\n\npattern sql.count(b:any_1, ignils:bit, s:lng, e:lng) :l
 ng\naddress SQLcount\ncomment \"return count of groups\";\n\npattern 
batsql.count(b:bat[:any_1], ignils:bit, s:bat[:lng], e:bat[:lng]) 
:bat[:lng]\naddress SQLcount\ncomment \"return count of groups\";\n\npattern 
sql.sum(b:bte, s:lng, e:lng) :lng\naddress SQLsum\ncomment \"return the sum of 
groups\";\n\npattern batsql.sum(b:bat[:bte], s:bat[:lng], e:bat[:lng]) 
:bat[:lng]\naddress SQLsum\ncomment \"return the sum of groups\";\n\npattern 
sql.prod(b:bte, s:lng, e:lng) :lng\naddress SQLprod\ncomment \"return the 
product of groups\";\n\npattern batsql.prod(b:bat[:bte], s:bat[:lng], 
e:bat[:lng]) :bat[:lng]\naddress SQLprod\ncomment \"return the product of 
groups\";\n\npattern sql.sum(b:sht, s:lng, e:lng) :lng\naddress SQLsum\ncomment 
\"return the sum of groups\";\n\npattern batsql.sum(b:bat[:sht], s:bat[:lng], 
e:bat[:lng]) :bat[:lng]\naddress SQLsum\ncomment \"return the sum of 
groups\";\n\npattern sql.prod(b:sht, s:lng, e:lng) :lng\naddress 
SQLprod\ncomment \"return the product of groups\
 ";\n\npattern batsql.prod(b:bat[:sht], s:bat[:lng], e:bat[:lng]) 
:bat[:lng]\naddress SQLprod\ncomment \"return the product of 
groups\";\n\npattern sql.sum(b:int, s:lng, e:lng) :lng\naddress SQLsum\ncomment 
\"return the sum of groups\";\n\npattern batsql.sum(b:bat[:int], s:bat[:lng], 
e:bat[:lng]) :bat[:lng]\naddress SQLsum\ncomment \"return the sum of 
groups\";\n\npattern sql.prod(b:int, s:lng, e:lng) :lng\naddress 
SQLprod\ncomment \"return the product of groups\";\n\npattern 
batsql.prod(b:bat[:int], s:bat[:lng], e:bat[:lng]) :bat[:lng]\naddress 
SQLprod\ncomment \"return the product of groups\";\n\npattern sql.sum(b:lng, 
s:lng, e:lng) :lng\naddress SQLsum\ncomment \"return the sum of 
groups\";\n\npattern batsql.sum(b:bat[:lng], s:bat[:lng], e:bat[:lng]) 
:bat[:lng]\naddress SQLsum\ncomment \"return the sum of groups\";\n\npattern 
sql.prod(b:lng, s:lng, e:lng) :lng\naddress SQLprod\ncomment \"return the 
product of groups\";\n\npattern batsql.prod(b:bat[:lng], s:bat[:lng], 
e:bat[:lng]) 
 :bat[:lng]\naddress SQLprod\ncomment \"return the product of 
groups\";\n\npattern sql.sum(b:flt, s:lng, e:lng) :flt\naddress SQLsum\ncomment 
\"return the sum of groups\";\n\npattern batsql.sum(b:bat[:flt], s:bat[:lng], 
e:bat[:lng]) :bat[:flt]\naddress SQLsum\ncomment \"return the sum of 
groups\";\n\npattern sql.prod(b:flt, s:lng, e:lng) :flt\naddress 
SQLprod\ncomment \"return the product of groups\";\n\npattern 
batsql.prod(b:bat[:flt], s:bat[:lng], e:bat[:lng]) :bat[:flt]\naddress 
SQLprod\ncomment \"return the product of groups\";\n\npattern sql.sum(b:flt, 
s:lng, e:lng) :dbl\naddress SQLsum\ncomment \"return the sum of 
groups\";\n\npattern batsql.sum(b:bat[:flt], s:bat[:lng], e:bat[:lng]) 
:bat[:dbl]\naddress SQLsum\ncomment \"return the sum of groups\";\n\npattern 
sql.prod(b:flt, s:lng, e:lng) :dbl\naddress SQLprod\ncomment \"return the 
product of groups\";\n\npattern batsql.prod(b:bat[:flt], s:bat[:lng], 
e:bat[:lng]) :bat[:dbl]\naddress SQLprod\ncomment \"return the product of grou
 ps\";\n\npattern sql.sum(b:dbl, s:lng, e:lng) :dbl\naddress SQLsum\ncomment 
\"return the sum of groups\";\n\npattern batsql.sum(b:bat[:dbl], s:bat[:lng], 
e:bat[:lng]) :bat[:dbl]\naddress SQLsum\ncomment \"return the sum of 
groups\";\n\npattern sql.prod(b:dbl, s:lng, e:lng) :dbl\naddress 
SQLprod\ncomment \"return the product of groups\";\n\npattern 
batsql.prod(b:bat[:dbl], s:bat[:lng], e:bat[:lng]) :bat[:dbl]\naddress 
SQLprod\ncomment \"return the product of groups\";\n\npattern sql.avg(b:bte, 
s:lng, e:lng) :dbl\naddress SQLavg\ncomment \"return the average of 
groups\";\n\npattern batsql.avg(b:bat[:bte], s:bat[:lng], e:bat[:lng]) 
:bat[:dbl]\naddress SQLavg\ncomment \"return the average of 
groups\";\n\npattern sql.avg(b:sht, s:lng, e:lng) :dbl\naddress SQLavg\ncomment 
\"return the average of groups\";\n\npattern batsql.avg(b:bat[:sht], 
s:bat[:lng], e:bat[:lng]) :bat[:dbl]\naddress SQLavg\ncomment \"return the 
average of groups\";\n\npattern sql.avg(b:int, s:lng, e:lng) :dbl\naddress S
 QLavg\ncomment \"return the average of groups\";\n\npattern 
batsql.avg(b:bat[:int], s:bat[:lng], e:bat[:lng]) :bat[:dbl]\naddress 
SQLavg\ncomment \"return the average of groups\";\n\npattern sql.avg(b:lng, 
s:lng, e:lng) :dbl\naddress SQLavg\ncomment \"return the average of 
groups\";\n\npattern batsql.avg(b:bat[:lng], s:bat[:lng], e:bat[:lng]) 
:bat[:dbl]\naddress SQLavg\ncomment \"return the average of 
groups\";\n\npattern sql.avg(b:flt, s:lng, e:lng) :dbl\naddress SQLavg\ncomment 
\"return the average of groups\";\n\npattern batsql.avg(b:bat[:flt], 
s:bat[:lng], e:bat[:lng]) :bat[:dbl]\naddress SQLavg\ncomment \"return the 
average of groups\";\n\npattern sql.avg(b:dbl, s:lng, e:lng) :dbl\naddress 
SQLavg\ncomment \"return the average of groups\";\n\npattern 
batsql.avg(b:bat[:dbl], s:bat[:lng], e:bat[:lng]) :bat[:dbl]\naddress 
SQLavg\ncomment \"return the average of groups\";\n\ncommand 
aggr.exist(b:bat[:any_2], h:any_1):bit\naddress ALGexist;\n\ncommand 
aggr.exist(b:bat[:any_2]):bit\na
 ddress SQLexist;\n\npattern aggr.exist(v:any_2):bit\naddress SQLexist_val;\n" 
}, 
+{ "sql_rank", "\n\nmodule aggr;\nmodule batsql;\nmodule sql;\n\npattern 
sql.diff(b:any_1) :bit\naddress SQLdiff\ncomment \"return true if cur != prev 
row\";\n\npattern batsql.diff(b:bat[:any_1]) :bat[:bit]\naddress 
SQLdiff\ncomment \"return true if cur != prev row\";\n\npattern sql.diff(p:bit, 
b:any_1) :bit\naddress SQLdiff\ncomment \"return true if cur != prev 
row\";\n\npattern batsql.diff(p:bat[:bit], b:bat[:any_1]) :bat[:bit]\naddress 
SQLdiff\ncomment \"return true if cur != prev row\";\n\npattern 
sql.window_bound(b:any_1, unit:int, bound:int, excl:int, limit:bte) 
:lng\naddress SQLwindow_bound\ncomment \"computes window ranges for each 
row\";\n\npattern batsql.window_bound(b:bat[:any_1], unit:int, bound:int, 
excl:int, limit:bte) :bat[:lng]\naddress SQLwindow_bound\ncomment \"computes 
window ranges for each row\";\n\npattern sql.window_bound(p:bit, b:any_1, 
unit:int, bound:int, excl:int, limit:bte) :lng\naddress 
SQLwindow_bound\ncomment \"computes window ranges for each row\";\n\n
 pattern batsql.window_bound(p:bat[:bit], b:bat[:any_1], unit:int, bound:int, 
excl:int, limit:bte) :bat[:lng]\naddress SQLwindow_bound\ncomment \"computes 
window ranges for each row\";\n\npattern batsql.window_bound(b:bat[:any_1], 
unit:int, bound:int, excl:int, limit:bat[:bte]) :bat[:lng]\naddress 
SQLwindow_bound\ncomment \"computes window ranges for each row\";\n\npattern 
batsql.window_bound(p:bat[:bit], b:bat[:any_1], unit:int, bound:int, excl:int, 
limit:bat[:bte]) :bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window 
ranges for each row\";\n\n\npattern sql.window_bound(b:any_1, unit:int, 
bound:int, excl:int, limit:sht) :lng\naddress SQLwindow_bound\ncomment 
\"computes window ranges for each row\";\n\npattern 
batsql.window_bound(b:bat[:any_1], unit:int, bound:int, excl:int, limit:sht) 
:bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window ranges for each 
row\";\n\npattern sql.window_bound(p:bit, b:any_1, unit:int, bound:int, 
excl:int, limit:sht) :lng\naddress SQLwi
 ndow_bound\ncomment \"computes window ranges for each row\";\n\npattern 
batsql.window_bound(p:bat[:bit], b:bat[:any_1], unit:int, bound:int, excl:int, 
limit:sht) :bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window 
ranges for each row\";\n\npattern batsql.window_bound(b:bat[:any_1], unit:int, 
bound:int, excl:int, limit:bat[:sht]) :bat[:lng]\naddress 
SQLwindow_bound\ncomment \"computes window ranges for each row\";\n\npattern 
batsql.window_bound(p:bat[:bit], b:bat[:any_1], unit:int, bound:int, excl:int, 
limit:bat[:sht]) :bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window 
ranges for each row\";\n\n\npattern sql.window_bound(b:any_1, unit:int, 
bound:int, excl:int, limit:int) :lng\naddress SQLwindow_bound\ncomment 
\"computes window ranges for each row\";\n\npattern 
batsql.window_bound(b:bat[:any_1], unit:int, bound:int, excl:int, limit:int) 
:bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window ranges for each 
row\";\n\npattern sql.window_bound(p:bit, b:any_
 1, unit:int, bound:int, excl:int, limit:int) :lng\naddress 
SQLwindow_bound\ncomment \"computes window ranges for each row\";\n\npattern 
batsql.window_bound(p:bat[:bit], b:bat[:any_1], unit:int, bound:int, excl:int, 
limit:int) :bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window 
ranges for each row\";\n\npattern batsql.window_bound(b:bat[:any_1], unit:int, 
bound:int, excl:int, limit:bat[:int]) :bat[:lng]\naddress 
SQLwindow_bound\ncomment \"computes window ranges for each row\";\n\npattern 
batsql.window_bound(p:bat[:bit], b:bat[:any_1], unit:int, bound:int, excl:int, 
limit:bat[:int]) :bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window 
ranges for each row\";\n\n\npattern sql.window_bound(b:any_1, unit:int, 
bound:int, excl:int, limit:lng) :lng\naddress SQLwindow_bound\ncomment 
\"computes window ranges for each row\";\n\npattern 
batsql.window_bound(b:bat[:any_1], unit:int, bound:int, excl:int, limit:lng) 
:bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window 
 ranges for each row\";\n\npattern sql.window_bound(p:bit, b:any_1, unit:int, 
bound:int, excl:int, limit:lng) :lng\naddress SQLwindow_bound\ncomment 
\"computes window ranges for each row\";\n\npattern 
batsql.window_bound(p:bat[:bit], b:bat[:any_1], unit:int, bound:int, excl:int, 
limit:lng) :bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window 
ranges for each row\";\n\npattern batsql.window_bound(b:bat[:any_1], unit:int, 
bound:int, excl:int, limit:bat[:lng]) :bat[:lng]\naddress 
SQLwindow_bound\ncomment \"computes window ranges for each row\";\n\npattern 
batsql.window_bound(p:bat[:bit], b:bat[:any_1], unit:int, bound:int, excl:int, 
limit:bat[:lng]) :bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window 
ranges for each row\";\n\n\npattern sql.window_bound(b:any_1, unit:int, 
bound:int, excl:int, limit:flt) :lng\naddress SQLwindow_bound\ncomment 
\"computes window ranges for each row\";\n\npattern 
batsql.window_bound(b:bat[:any_1], unit:int, bound:int, excl:int, limit:flt)
  :bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window ranges for 
each row\";\n\npattern sql.window_bound(p:bit, b:any_1, unit:int, bound:int, 
excl:int, limit:flt) :lng\naddress SQLwindow_bound\ncomment \"computes window 
ranges for each row\";\n\npattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, limit:flt) :bat[:lng]\naddress 
SQLwindow_bound\ncomment \"computes window ranges for each row\";\n\npattern 
batsql.window_bound(b:bat[:any_1], unit:int, bound:int, excl:int, 
limit:bat[:flt]) :bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window 
ranges for each row\";\n\npattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, limit:bat[:flt]) 
:bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window ranges for each 
row\";\n\n\npattern sql.window_bound(b:any_1, unit:int, bound:int, excl:int, 
limit:dbl) :lng\naddress SQLwindow_bound\ncomment \"computes window ranges for 
each row\";\n\npattern batsql.windo
 w_bound(b:bat[:any_1], unit:int, bound:int, excl:int, limit:dbl) 
:bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window ranges for each 
row\";\n\npattern sql.window_bound(p:bit, b:any_1, unit:int, bound:int, 
excl:int, limit:dbl) :lng\naddress SQLwindow_bound\ncomment \"computes window 
ranges for each row\";\n\npattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, limit:dbl) :bat[:lng]\naddress 
SQLwindow_bound\ncomment \"computes window ranges for each row\";\n\npattern 
batsql.window_bound(b:bat[:any_1], unit:int, bound:int, excl:int, 
limit:bat[:dbl]) :bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window 
ranges for each row\";\n\npattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, limit:bat[:dbl]) 
:bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window ranges for each 
row\";\n\n\npattern sql.row_number(b:any_1, p:bit, o:bit) :int\naddress 
SQLrow_number\ncomment \"return the row_numer-ed groups
 \";\n\npattern batsql.row_number(b:bat[:any_1], p:any_2, o:any_3) 
:bat[:int]\naddress SQLrow_number\ncomment \"return the row_numer-ed 
groups\";\n\n\npattern sql.rank(b:any_1, p:bit, o:bit) :int\naddress 
SQLrank\ncomment \"return the ranked groups\";\n\npattern 
batsql.rank(b:bat[:any_1], p:any_2, o:any_3) :bat[:int]\naddress 
SQLrank\ncomment \"return the ranked groups\";\n\n\npattern 
sql.dense_rank(b:any_1, p:bit, o:bit) :int\naddress SQLdense_rank\ncomment 
\"return the densely ranked groups\";\n\npattern 
batsql.dense_rank(b:bat[:any_1], p:any_2, o:any_3) :bat[:int]\naddress 
SQLdense_rank\ncomment \"return the densely ranked groups\";\n\n\npattern 
sql.percent_rank(b:any_1, p:bit, o:bit) :dbl\naddress SQLpercent_rank\ncomment 
\"return the percentage into the total number of groups for each 
row\";\n\npattern batsql.percent_rank(b:bat[:any_1], p:any_2, o:any_3) 
:bat[:dbl]\naddress SQLpercent_rank\ncomment \"return the percentage into the 
total number of groups for each row\";\n\n\npatt
 ern sql.cume_dist(b:any_1, p:bit, o:bit) :dbl\naddress SQLcume_dist\ncomment 
\"return the accumulated distribution of the number of rows per group to the 
total number of partition rows\";\n\npattern batsql.cume_dist(b:bat[:any_1], 
p:any_2, o:any_3) :bat[:dbl]\naddress SQLcume_dist\ncomment \"return the 
accumulated distribution of the number of rows per group to the total number of 
partition rows\";\n\n\npattern sql.lag(b:any_1, p:any_3, o:any_4) 
:any_1\naddress SQLlag\ncomment \"return the value in the previous row in the 
partition or NULL if non existent\";\n\npattern batsql.lag(b:bat[:any_1], 
p:any_3, o:any_4) :bat[:any_1]\naddress SQLlag\ncomment \"return the value in 
the previous row in the partition or NULL if non existent\";\n\n\npattern 
sql.lag(b:any_1, l:any_2, p:any_3, o:any_4) :any_1\naddress SQLlag\ncomment 
\"return the value in the previous 'l' row in the partition or NULL if non 
existent\";\n\npattern batsql.lag(b:bat[:any_1], l:any_2, p:any_3, o:any_4) 
:bat[:any_1]\nad
 dress SQLlag\ncomment \"return the value in the previous 'l' row in the 
partition or NULL if non existent\";\n\npattern sql.lag(b:any_1, l:bat[:any_2], 
p:any_3, o:any_4) :any_1\naddress SQLlag\ncomment \"return the value in the 
previous 'l' row in the partition or NULL if non existent\";\n\npattern 
batsql.lag(b:bat[:any_1], l:bat[:any_2], p:any_3, o:any_4) 
:bat[:any_1]\naddress SQLlag\ncomment \"return the value in the previous 'l' 
row in the partition or NULL if non existent\";\n\n\npattern sql.lag(b:any_1, 
l:any_2, d:any_1, p:any_3, o:any_4) :any_1\naddress SQLlag\ncomment \"return 
the value in the previous 'l' row in the partition or 'd' if non 
existent\";\n\npattern batsql.lag(b:bat[:any_1], l:any_2, d:any_1, p:any_3, 
o:any_4) :bat[:any_1]\naddress SQLlag\ncomment \"return the value in the 
previous 'l' row in the partition or 'd' if non existent\";\n\npattern 
sql.lag(b:any_1, l:bat[:any_2], d:any_1, p:any_3, o:any_4) :any_1\naddress 
SQLlag\ncomment \"return the value in the prev
 ious 'l' row in the partition or 'd' if non existent\";\n\npattern 
batsql.lag(b:bat[:any_1], l:bat[:any_2], d:any_1, p:any_3, o:any_4) 
:bat[:any_1]\naddress SQLlag\ncomment \"return the value in the previous 'l' 
row in the partition or 'd' if non existent\";\n\npattern sql.lag(b:any_1, 
l:any_2, d:bat[:any_1], p:any_3, o:any_4) :any_1\naddress SQLlag\ncomment 
\"return the value in the previous 'l' row in the partition or 'd' if non 
existent\";\n\npattern batsql.lag(b:bat[:any_1], l:any_2, d:bat[:any_1], 
p:any_3, o:any_4) :bat[:any_1]\naddress SQLlag\ncomment \"return the value in 
the previous 'l' row in the partition or 'd' if non existent\";\n\npattern 
sql.lag(b:any_1, l:bat[:any_2], d:bat[:any_1], p:any_3, o:any_4) 
:any_1\naddress SQLlag\ncomment \"return the value in the previous 'l' row in 
the partition or 'd' if non existent\";\n\npattern batsql.lag(b:bat[:any_1], 
l:bat[:any_2], d:bat[:any_1], p:any_3, o:any_4) :bat[:any_1]\naddress 
SQLlag\ncomment \"return the value in the prev
 ious 'l' row in the partition or 'd' if non existent\";\n\n\npattern 
sql.lead(b:any_1, p:any_3, o:any_4) :any_1\naddress SQLlead\ncomment \"return 
the value in the next row in the partition or NULL if non 
existent\";\n\npattern batsql.lead(b:bat[:any_1], p:any_3, o:any_4) 
:bat[:any_1]\naddress SQLlead\ncomment \"return the value in the next row in 
the partition or NULL if non existent\";\n\n\npattern sql.lead(b:any_1, 
l:any_2, p:any_3, o:any_4) :any_1\naddress SQLlead\ncomment \"return the value 
in the next 'l' row in the partition or NULL if non existent\";\n\npattern 
batsql.lead(b:bat[:any_1], l:any_2, p:any_3, o:any_4) :bat[:any_1]\naddress 
SQLlead\ncomment \"return the value in the next 'l' row in the partition or 
NULL if non existent\";\n\npattern sql.lead(b:any_1, l:bat[:any_2], p:any_3, 
o:any_4) :any_1\naddress SQLlead\ncomment \"return the value in the next 'l' 
row in the partition or NULL if non existent\";\n\npattern 
batsql.lead(b:bat[:any_1], l:bat[:any_2], p:any_3, o:any
 _4) :bat[:any_1]\naddress SQLlead\ncomment \"return the value in the next 'l' 
row in the partition or NULL if non existent\";\n\n\npattern sql.lead(b:any_1, 
l:any_2, d:any_1, p:any_3, o:any_4) :any_1\naddress SQLlead\ncomment \"return 
the value in the next 'l' row in the partition or 'd' if non 
existent\";\n\npattern batsql.lead(b:bat[:any_1], l:any_2, d:any_1, p:any_3, 
o:any_4) :bat[:any_1]\naddress SQLlead\ncomment \"return the value in the next 
'l' row in the partition or 'd' if non existent\";\n\npattern sql.lead(b:any_1, 
l:bat[:any_2], d:any_1, p:any_3, o:any_4) :any_1\naddress SQLlead\ncomment 
\"return the value in the next 'l' row in the partition or 'd' if non 
existent\";\n\npattern batsql.lead(b:bat[:any_1], l:bat[:any_2], d:any_1, 
p:any_3, o:any_4) :bat[:any_1]\naddress SQLlead\ncomment \"return the value in 
the next 'l' row in the partition or 'd' if non existent\";\n\npattern 
sql.lead(b:any_1, l:any_2, d:bat[:any_1], p:any_3, o:any_4) :any_1\naddress 
SQLlead\ncomment \"r
 eturn the value in the next 'l' row in the partition or 'd' if non 
existent\";\n\npattern batsql.lead(b:bat[:any_1], l:any_2, d:bat[:any_1], 
p:any_3, o:any_4) :bat[:any_1]\naddress SQLlead\ncomment \"return the value in 
the next 'l' row in the partition or 'd' if non existent\";\n\npattern 
sql.lead(b:any_1, l:bat[:any_2], d:bat[:any_1], p:any_3, o:any_4) 
:any_1\naddress SQLlead\ncomment \"return the value in the next 'l' row in the 
partition or 'd' if non existent\";\n\npattern batsql.lead(b:bat[:any_1], 
l:bat[:any_2], d:bat[:any_1], p:any_3, o:any_4) :bat[:any_1]\naddress 
SQLlead\ncomment \"return the value in the next 'l' row in the partition or 'd' 
if non existent\";\n\n\npattern sql.ntile(b:any_1, n:any_2, p:any_3, o:any_4) 
:any_2\naddress SQLntile\ncomment \"return the groups divided as equally as 
possible\";\n\npattern batsql.ntile(b:bat[:any_1], n:any_2, p:any_3, o:any_4) 
:bat[:any_2]\naddress SQLntile\ncomment \"return the groups divided as equally 
as possible\";\n\npattern 
 sql.ntile(b:any_1, n:bat[:any_2], p:any_3, o:any_4) :any_2\naddress 
SQLntile\ncomment \"return the groups divided as equally as 
possible\";\n\npattern batsql.ntile(b:bat[:any_1], n:bat[:any_2], p:any_3, 
o:any_4) :bat[:any_2]\naddress SQLntile\ncomment \"return the groups divided as 
equally as possible\";\n\n\npattern sql.first_value(b:any_1, s:lng, e:lng) 
:any_1\naddress SQLfirst_value\ncomment \"return the first value of 
groups\";\n\npattern batsql.first_value(b:bat[:any_1], s:bat[:lng], 
e:bat[:lng]) :bat[:any_1]\naddress SQLfirst_value\ncomment \"return the first 
value of groups\";\n\n\npattern sql.last_value(b:any_1, s:lng, e:lng) 
:any_1\naddress SQLlast_value\ncomment \"return the last value of 
groups\";\n\npattern batsql.last_value(b:bat[:any_1], s:bat[:lng], e:bat[:lng]) 
:bat[:any_1]\naddress SQLlast_value\ncomment \"return the last value of 
groups\";\n\n\npattern sql.nth_value(b:any_1, n:any_2, s:lng, e:lng) 
:any_1\naddress SQLnth_value\ncomment \"return the nth value of each
  group\";\n\npattern batsql.nth_value(b:bat[:any_1], n:any_2, s:bat[:lng], 
e:bat[:lng]) :bat[:any_1]\naddress SQLnth_value\ncomment \"return the nth value 
of each group\";\n\npattern sql.nth_value(b:any_1, n:bat[:any_2], s:lng, e:lng) 
:any_1\naddress SQLnth_value\ncomment \"return the nth value of each 
group\";\n\npattern batsql.nth_value(b:bat[:any_1], n:bat[:any_2], s:bat[:lng], 
e:bat[:lng]) :bat[:any_1]\naddress SQLnth_value\ncomment \"return the nth value 
of each group\";\n\n\npattern sql.min(b:any_1, s:lng, e:lng) :any_1\naddress 
SQLmin\ncomment \"return the minimum of groups\";\n\npattern 
batsql.min(b:bat[:any_1], s:bat[:lng], e:bat[:lng]) :bat[:any_1]\naddress 
SQLmin\ncomment \"return the minimum of groups\";\n\npattern sql.max(b:any_1, 
s:lng, e:lng) :any_1\naddress SQLmax\ncomment \"return the maximum of 
groups\";\n\npattern batsql.max(b:bat[:any_1], s:bat[:lng], e:bat[:lng]) 
:bat[:any_1]\naddress SQLmax\ncomment \"return the maximum of 
groups\";\n\npattern sql.count(b:any_1
 , ignils:bit, s:lng, e:lng) :lng\naddress SQLcount\ncomment \"return count of 
groups\";\n\npattern batsql.count(b:bat[:any_1], ignils:bit, s:bat[:lng], 
e:bat[:lng]) :bat[:lng]\naddress SQLcount\ncomment \"return count of 
groups\";\n\npattern sql.sum(b:bte, s:lng, e:lng) :lng\naddress SQLsum\ncomment 
\"return the sum of groups\";\n\npattern batsql.sum(b:bat[:bte], s:bat[:lng], 
e:bat[:lng]) :bat[:lng]\naddress SQLsum\ncomment \"return the sum of 
groups\";\n\npattern sql.prod(b:bte, s:lng, e:lng) :lng\naddress 
SQLprod\ncomment \"return the product of groups\";\n\npattern 
batsql.prod(b:bat[:bte], s:bat[:lng], e:bat[:lng]) :bat[:lng]\naddress 
SQLprod\ncomment \"return the product of groups\";\n\npattern sql.sum(b:sht, 
s:lng, e:lng) :lng\naddress SQLsum\ncomment \"return the sum of 
groups\";\n\npattern batsql.sum(b:bat[:sht], s:bat[:lng], e:bat[:lng]) 
:bat[:lng]\naddress SQLsum\ncomment \"return the sum of groups\";\n\npattern 
sql.prod(b:sht, s:lng, e:lng) :lng\naddress SQLprod\ncomment \
 "return the product of groups\";\n\npattern batsql.prod(b:bat[:sht], 
s:bat[:lng], e:bat[:lng]) :bat[:lng]\naddress SQLprod\ncomment \"return the 
product of groups\";\n\npattern sql.sum(b:int, s:lng, e:lng) :lng\naddress 
SQLsum\ncomment \"return the sum of groups\";\n\npattern 
batsql.sum(b:bat[:int], s:bat[:lng], e:bat[:lng]) :bat[:lng]\naddress 
SQLsum\ncomment \"return the sum of groups\";\n\npattern sql.prod(b:int, s:lng, 
e:lng) :lng\naddress SQLprod\ncomment \"return the product of 
groups\";\n\npattern batsql.prod(b:bat[:int], s:bat[:lng], e:bat[:lng]) 
:bat[:lng]\naddress SQLprod\ncomment \"return the product of 
groups\";\n\npattern sql.sum(b:lng, s:lng, e:lng) :lng\naddress SQLsum\ncomment 
\"return the sum of groups\";\n\npattern batsql.sum(b:bat[:lng], s:bat[:lng], 
e:bat[:lng]) :bat[:lng]\naddress SQLsum\ncomment \"return the sum of 
groups\";\n\npattern sql.prod(b:lng, s:lng, e:lng) :lng\naddress 
SQLprod\ncomment \"return the product of groups\";\n\npattern 
batsql.prod(b:bat[:ln
 g], s:bat[:lng], e:bat[:lng]) :bat[:lng]\naddress SQLprod\ncomment \"return 
the product of groups\";\n\npattern sql.sum(b:flt, s:lng, e:lng) :flt\naddress 
SQLsum\ncomment \"return the sum of groups\";\n\npattern 
batsql.sum(b:bat[:flt], s:bat[:lng], e:bat[:lng]) :bat[:flt]\naddress 
SQLsum\ncomment \"return the sum of groups\";\n\npattern sql.prod(b:flt, s:lng, 
e:lng) :flt\naddress SQLprod\ncomment \"return the product of 
groups\";\n\npattern batsql.prod(b:bat[:flt], s:bat[:lng], e:bat[:lng]) 
:bat[:flt]\naddress SQLprod\ncomment \"return the product of 
groups\";\n\npattern sql.sum(b:flt, s:lng, e:lng) :dbl\naddress SQLsum\ncomment 
\"return the sum of groups\";\n\npattern batsql.sum(b:bat[:flt], s:bat[:lng], 
e:bat[:lng]) :bat[:dbl]\naddress SQLsum\ncomment \"return the sum of 
groups\";\n\npattern sql.prod(b:flt, s:lng, e:lng) :dbl\naddress 
SQLprod\ncomment \"return the product of groups\";\n\npattern 
batsql.prod(b:bat[:flt], s:bat[:lng], e:bat[:lng]) :bat[:dbl]\naddress 
SQLprod\ncommen
 t \"return the product of groups\";\n\npattern sql.sum(b:dbl, s:lng, e:lng) 
:dbl\naddress SQLsum\ncomment \"return the sum of groups\";\n\npattern 
batsql.sum(b:bat[:dbl], s:bat[:lng], e:bat[:lng]) :bat[:dbl]\naddress 
SQLsum\ncomment \"return the sum of groups\";\n\npattern sql.prod(b:dbl, s:lng, 
e:lng) :dbl\naddress SQLprod\ncomment \"return the product of 
groups\";\n\npattern batsql.prod(b:bat[:dbl], s:bat[:lng], e:bat[:lng]) 
:bat[:dbl]\naddress SQLprod\ncomment \"return the product of 
groups\";\n\npattern sql.avg(b:bte, s:lng, e:lng) :dbl\naddress SQLavg\ncomment 
\"return the average of groups\";\n\npattern batsql.avg(b:bat[:bte], 
s:bat[:lng], e:bat[:lng]) :bat[:dbl]\naddress SQLavg\ncomment \"return the 
average of groups\";\n\npattern sql.avg(b:sht, s:lng, e:lng) :dbl\naddress 
SQLavg\ncomment \"return the average of groups\";\n\npattern 
batsql.avg(b:bat[:sht], s:bat[:lng], e:bat[:lng]) :bat[:dbl]\naddress 
SQLavg\ncomment \"return the average of groups\";\n\npattern sql.avg(b:int,
  s:lng, e:lng) :dbl\naddress SQLavg\ncomment \"return the average of 
groups\";\n\npattern batsql.avg(b:bat[:int], s:bat[:lng], e:bat[:lng]) 
:bat[:dbl]\naddress SQLavg\ncomment \"return the average of 
groups\";\n\npattern sql.avg(b:lng, s:lng, e:lng) :dbl\naddress SQLavg\ncomment 
\"return the average of groups\";\n\npattern batsql.avg(b:bat[:lng], 
s:bat[:lng], e:bat[:lng]) :bat[:dbl]\naddress SQLavg\ncomment \"return the 
average of groups\";\n\npattern sql.avg(b:flt, s:lng, e:lng) :dbl\naddress 
SQLavg\ncomment \"return the average of groups\";\n\npattern 
batsql.avg(b:bat[:flt], s:bat[:lng], e:bat[:lng]) :bat[:dbl]\naddress 
SQLavg\ncomment \"return the average of groups\";\n\npattern sql.avg(b:dbl, 
s:lng, e:lng) :dbl\naddress SQLavg\ncomment \"return the average of 
groups\";\n\npattern batsql.avg(b:bat[:dbl], s:bat[:lng], e:bat[:lng]) 
:bat[:dbl]\naddress SQLavg\ncomment \"return the average of 
groups\";\n\ncommand aggr.exist(b:bat[:any_2], h:any_1):bit\naddress 
ALGexist;\n\ncommand ag
 gr.exist(b:bat[:any_2]):bit\naddress SQLexist;\n\npattern 
aggr.exist(v:any_2):bit\naddress SQLexist_val;\n" }, 
diff --git a/sql/backends/monet5/sql_rank_hge.mal 
b/sql/backends/monet5/sql_rank_hge.mal
--- a/sql/backends/monet5/sql_rank_hge.mal
+++ b/sql/backends/monet5/sql_rank_hge.mal
@@ -6,6 +6,7 @@
 
 # This file was generated by using the script sql_rank_hge.mal.sh.
 
+module batsql;
 module sql;
 
 pattern sql.window_bound(b:any_1, unit:int, bound:int, excl:int, start:hge) 
:lng
diff --git a/sql/backends/monet5/sql_rank_hge.mal.h 
b/sql/backends/monet5/sql_rank_hge.mal.h
--- a/sql/backends/monet5/sql_rank_hge.mal.h
+++ b/sql/backends/monet5/sql_rank_hge.mal.h
@@ -7,4 +7,4 @@
 */
 
 // This file was generated automatically with mal2h.py. Do not edit this file 
directly.
-{ "sql_rank_hge", "\n\nmodule sql;\n\npattern sql.window_bound(b:any_1, 
unit:int, bound:int, excl:int, start:hge) :lng\naddress 
SQLwindow_bound\ncomment \"computes window ranges for each row\";\n\npattern 
batsql.window_bound(b:bat[:any_1], unit:int, bound:int, excl:int, start:hge) 
:bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window ranges for each 
row\";\n\npattern sql.window_bound(p:bit, b:any_1, unit:int, bound:int, 
excl:int, start:hge) :lng\naddress SQLwindow_bound\ncomment \"computes window 
ranges for each row\";\n\npattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, start:hge) :bat[:lng]\naddress 
SQLwindow_bound\ncomment \"computes window ranges for each row\";\n\npattern 
batsql.window_bound(b:bat[:any_1], unit:int, bound:int, excl:int, 
start:bat[:hge]) :bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window 
ranges for each row\";\n\npattern batsql.window_bound(p:bat[:bit], 
b:bat[:any_1], unit:int, bound:int, excl:int, start:
 bat[:hge]) :bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window 
ranges for each row\";\n\n\npattern sql.sum(b:bte, s:lng, e:lng) :hge\naddress 
SQLsum\ncomment \"return the sum of groups\";\n\npattern 
batsql.sum(b:bat[:bte], s:bat[:lng], e:bat[:lng]) :bat[:hge]\naddress 
SQLsum\ncomment \"return the sum of groups\";\n\npattern sql.prod(b:bte, s:lng, 
e:lng) :hge\naddress SQLprod\ncomment \"return the product of 
groups\";\n\npattern batsql.prod(b:bat[:bte], s:bat[:lng], e:bat[:lng]) 
:bat[:hge]\naddress SQLprod\ncomment \"return the product of 
groups\";\n\npattern sql.sum(b:sht, s:lng, e:lng) :hge\naddress SQLsum\ncomment 
\"return the sum of groups\";\n\npattern batsql.sum(b:bat[:sht], s:bat[:lng], 
e:bat[:lng]) :bat[:hge]\naddress SQLsum\ncomment \"return the sum of 
groups\";\n\npattern sql.prod(b:sht, s:lng, e:lng) :hge\naddress 
SQLprod\ncomment \"return the product of groups\";\n\npattern 
batsql.prod(b:bat[:sht], s:bat[:lng], e:bat[:lng]) :bat[:hge]\naddress 
SQLprod\ncomment 
 \"return the product of groups\";\n\npattern sql.sum(b:int, s:lng, e:lng) 
:hge\naddress SQLsum\ncomment \"return the sum of groups\";\n\npattern 
batsql.sum(b:bat[:int], s:bat[:lng], e:bat[:lng]) :bat[:hge]\naddress 
SQLsum\ncomment \"return the sum of groups\";\n\npattern sql.prod(b:int, s:lng, 
e:lng) :hge\naddress SQLprod\ncomment \"return the product of 
groups\";\n\npattern batsql.prod(b:bat[:int], s:bat[:lng], e:bat[:lng]) 
:bat[:hge]\naddress SQLprod\ncomment \"return the product of 
groups\";\n\npattern sql.sum(b:lng, s:lng, e:lng) :hge\naddress SQLsum\ncomment 
\"return the sum of groups\";\n\npattern batsql.sum(b:bat[:lng], s:bat[:lng], 
e:bat[:lng]) :bat[:hge]\naddress SQLsum\ncomment \"return the sum of 
groups\";\n\npattern sql.prod(b:lng, s:lng, e:lng) :hge\naddress 
SQLprod\ncomment \"return the product of groups\";\n\npattern 
batsql.prod(b:bat[:lng], s:bat[:lng], e:bat[:lng]) :bat[:hge]\naddress 
SQLprod\ncomment \"return the product of groups\";\n\npattern sql.sum(b:hge, 
s:lng
 , e:lng) :hge\naddress SQLsum\ncomment \"return the sum of 
groups\";\n\npattern batsql.sum(b:bat[:hge], s:bat[:lng], e:bat[:lng]) 
:bat[:hge]\naddress SQLsum\ncomment \"return the sum of groups\";\n\npattern 
sql.prod(b:hge, s:lng, e:lng) :hge\naddress SQLprod\ncomment \"return the 
product of groups\";\n\npattern batsql.prod(b:bat[:hge], s:bat[:lng], 
e:bat[:lng]) :bat[:hge]\naddress SQLprod\ncomment \"return the product of 
groups\";\n\npattern sql.avg(b:hge, s:lng, e:lng) :dbl\naddress SQLavg\ncomment 
\"return the average of groups\";\n\npattern batsql.avg(b:bat[:hge], 
s:bat[:lng], e:bat[:lng]) :bat[:dbl]\naddress SQLavg\ncomment \"return the 
average of groups\";\n" }, 
+{ "sql_rank_hge", "\n\nmodule batsql;\nmodule sql;\n\npattern 
sql.window_bound(b:any_1, unit:int, bound:int, excl:int, start:hge) 
:lng\naddress SQLwindow_bound\ncomment \"computes window ranges for each 
row\";\n\npattern batsql.window_bound(b:bat[:any_1], unit:int, bound:int, 
excl:int, start:hge) :bat[:lng]\naddress SQLwindow_bound\ncomment \"computes 
window ranges for each row\";\n\npattern sql.window_bound(p:bit, b:any_1, 
unit:int, bound:int, excl:int, start:hge) :lng\naddress 
SQLwindow_bound\ncomment \"computes window ranges for each row\";\n\npattern 
batsql.window_bound(p:bat[:bit], b:bat[:any_1], unit:int, bound:int, excl:int, 
start:hge) :bat[:lng]\naddress SQLwindow_bound\ncomment \"computes window 
ranges for each row\";\n\npattern batsql.window_bound(b:bat[:any_1], unit:int, 
bound:int, excl:int, start:bat[:hge]) :bat[:lng]\naddress 
SQLwindow_bound\ncomment \"computes window ranges for each row\";\n\npattern 
batsql.window_bound(p:bat[:bit], b:bat[:any_1], unit:int, bound:int, 
 excl:int, start:bat[:hge]) :bat[:lng]\naddress SQLwindow_bound\ncomment 
\"computes window ranges for each row\";\n\n\npattern sql.sum(b:bte, s:lng, 
e:lng) :hge\naddress SQLsum\ncomment \"return the sum of groups\";\n\npattern 
batsql.sum(b:bat[:bte], s:bat[:lng], e:bat[:lng]) :bat[:hge]\naddress 
SQLsum\ncomment \"return the sum of groups\";\n\npattern sql.prod(b:bte, s:lng, 
e:lng) :hge\naddress SQLprod\ncomment \"return the product of 
groups\";\n\npattern batsql.prod(b:bat[:bte], s:bat[:lng], e:bat[:lng]) 
:bat[:hge]\naddress SQLprod\ncomment \"return the product of 
groups\";\n\npattern sql.sum(b:sht, s:lng, e:lng) :hge\naddress SQLsum\ncomment 
\"return the sum of groups\";\n\npattern batsql.sum(b:bat[:sht], s:bat[:lng], 
e:bat[:lng]) :bat[:hge]\naddress SQLsum\ncomment \"return the sum of 
groups\";\n\npattern sql.prod(b:sht, s:lng, e:lng) :hge\naddress 
SQLprod\ncomment \"return the product of groups\";\n\npattern 
batsql.prod(b:bat[:sht], s:bat[:lng], e:bat[:lng]) :bat[:hge]\naddress S
 QLprod\ncomment \"return the product of groups\";\n\npattern sql.sum(b:int, 
s:lng, e:lng) :hge\naddress SQLsum\ncomment \"return the sum of 
groups\";\n\npattern batsql.sum(b:bat[:int], s:bat[:lng], e:bat[:lng]) 
:bat[:hge]\naddress SQLsum\ncomment \"return the sum of groups\";\n\npattern 
sql.prod(b:int, s:lng, e:lng) :hge\naddress SQLprod\ncomment \"return the 
product of groups\";\n\npattern batsql.prod(b:bat[:int], s:bat[:lng], 
e:bat[:lng]) :bat[:hge]\naddress SQLprod\ncomment \"return the product of 
groups\";\n\npattern sql.sum(b:lng, s:lng, e:lng) :hge\naddress SQLsum\ncomment 
\"return the sum of groups\";\n\npattern batsql.sum(b:bat[:lng], s:bat[:lng], 
e:bat[:lng]) :bat[:hge]\naddress SQLsum\ncomment \"return the sum of 
groups\";\n\npattern sql.prod(b:lng, s:lng, e:lng) :hge\naddress 
SQLprod\ncomment \"return the product of groups\";\n\npattern 
batsql.prod(b:bat[:lng], s:bat[:lng], e:bat[:lng]) :bat[:hge]\naddress 
SQLprod\ncomment \"return the product of groups\";\n\npattern sql.
 sum(b:hge, s:lng, e:lng) :hge\naddress SQLsum\ncomment \"return the sum of 
groups\";\n\npattern batsql.sum(b:bat[:hge], s:bat[:lng], e:bat[:lng]) 
:bat[:hge]\naddress SQLsum\ncomment \"return the sum of groups\";\n\npattern 
sql.prod(b:hge, s:lng, e:lng) :hge\naddress SQLprod\ncomment \"return the 
product of groups\";\n\npattern batsql.prod(b:bat[:hge], s:bat[:lng], 
e:bat[:lng]) :bat[:hge]\naddress SQLprod\ncomment \"return the product of 
groups\";\n\npattern sql.avg(b:hge, s:lng, e:lng) :dbl\naddress SQLavg\ncomment 
\"return the average of groups\";\n\npattern batsql.avg(b:bat[:hge], 
s:bat[:lng], e:bat[:lng]) :bat[:dbl]\naddress SQLavg\ncomment \"return the 
average of groups\";\n" }, 
diff --git a/tools/Makefile.ag b/tools/Makefile.ag
--- a/tools/Makefile.ag
+++ b/tools/Makefile.ag
@@ -4,4 +4,4 @@
 #
 # Copyright 1997 - July 2008 CWI, August 2008 - 2019 MonetDB B.V.
 
-SUBDIRS = HAVE_MONETDB5?mserver NOT_WIN32?merovingian
+SUBDIRS = HAVE_MONETDB5?sql HAVE_MONETDB5?mserver NOT_WIN32?merovingian
diff --git a/tools/mserver/Makefile.ag b/tools/mserver/Makefile.ag
--- a/tools/mserver/Makefile.ag
+++ b/tools/mserver/Makefile.ag
@@ -46,7 +46,7 @@ headers_png = {
 bin_mserver5 = {
        # hack: include mserver5.1.in here to get it expanded
        SOURCES = mserver5.c monet_version.h monet_version.c.in
-       LIBS = ../../sql/backends/monet5/libsqlstart \
+       LIBS = ../sql/libsql \
                ../../monetdb5/tools/libmonetdb5 \
                ../../gdk/libbat \
                ../../common/stream/libstream \
@@ -74,7 +74,7 @@ bin_mserver5 = {
 bin_shutdowntest = {
        CONDINST = HAVE_TESTING
        SOURCES = shutdowntest.c
-       LIBS = ../../sql/backends/monet5/libsqlstart \
+       LIBS = ../sql/libsql \
                ../../monetdb5/tools/libmonetdb5 \
                ../../gdk/libbat \
                ../../common/stream/libstream \
diff --git a/tools/Makefile.ag b/tools/sql/Makefile.ag
copy from tools/Makefile.ag
copy to tools/sql/Makefile.ag
--- a/tools/Makefile.ag
+++ b/tools/sql/Makefile.ag
@@ -4,4 +4,23 @@
 #
 # Copyright 1997 - July 2008 CWI, August 2008 - 2019 MonetDB B.V.
 
-SUBDIRS = HAVE_MONETDB5?mserver NOT_WIN32?merovingian
+MTSAFE
+
+lib_sql = {
+       VERSION = $(MONETDB5_VERSION)
+       NAME = sql
+       DIR = libdir
+       SOURCES = libsql.rc
+       # libmapi on Windows for mcrypt_*
+       LIBS = ../../sql/backends/monet5/libsqlcatalog \
+               ../../sql/server/libsqlserver \
+               ../../sql/scripts/libsqlscripts \
+               ../../sql/storage/libstore \
+               ../../sql/storage/bat/libbatstore \
+               ../../sql/common/libsqlcommon \
+               WIN32?../../clients/mapilib/libmapi \
+               WIN32?../../monetdb5/tools/libmonetdb5 \
+               WIN32?../../gdk/libbat \
+               WIN32?../../common/stream/libstream \
+               WIN32?$(openssl_LIBS)
+}
diff --git a/vertoo.config b/vertoo.config
--- a/vertoo.config
+++ b/vertoo.config
@@ -39,3 +39,8 @@ main.addAnchors("monetdb5/tools/libmonet
                 'VALUE "ProductVersion", "%v\\0"',
                 arguments(pattern = 'FILEVERSION %v', format = '@winrc'),
                 arguments(pattern = 'PRODUCTVERSION %v', format = '@winrc'))
+main.addAnchors("tools/sql/libmonetdb5.rc",
+                'VALUE "FileVersion", "%v\\0"',
+                'VALUE "ProductVersion", "%v\\0"',
+                arguments(pattern = 'FILEVERSION %v', format = '@winrc'),
+                arguments(pattern = 'PRODUCTVERSION %v', format = '@winrc'))
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to