Changeset: 3a4196c618de for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3a4196c618de
Branch: string_imprints
Log Message:

Merge branch 'master' into branches/string_imprints


diffs (truncated from 4430 to 300 lines):

diff --git a/clients/Tests/MAL-signatures.stable.out 
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -777,7 +777,8 @@ stdout of test 'MAL-signatures` in direc
 [ "batalgebra",        "not_like",     "pattern 
batalgebra.not_like(X_1:bat[:str], X_2:bat[:str], X_3:str):bat[:bit] ",        
"BATPCREnotlike;",      ""      ]
 [ "batalgebra",        "not_like",     "pattern 
batalgebra.not_like(X_1:bat[:str], X_2:str, X_3:str):bat[:bit] ",      
"BATPCREnotlike;",      ""      ]
 [ "batalgebra",        "not_like",     "pattern batalgebra.not_like(X_1:str, 
X_2:bat[:str], X_3:str):bat[:bit] ",      "BATPCREnotlike;",      ""      ]
-[ "batblob",   "nitems",       "command 
batblob.nitems(X_1:bat[:blob]):bat[:int] ",    "BLOBnitems_bulk;",     ""      ]
+[ "batblob",   "nitems",       "pattern 
batblob.nitems(X_1:bat[:blob]):bat[:int] ",    "BLOBnitems_bulk;",     ""      ]
+[ "batblob",   "nitems",       "pattern batblob.nitems(X_1:bat[:blob], 
X_2:bat[:oid]):bat[:int] ",     "BLOBnitems_bulk;",     ""      ]
 [ "batcalc",   "!=",   "pattern batcalc.!=(X_1:any_1, 
X_2:bat[:any_1]):bat[:bit] ",    "CMDbatNE;",    ""      ]
 [ "batcalc",   "!=",   "pattern batcalc.!=(X_1:any_1, X_2:bat[:any_1], 
X_3:bat[:oid]):bat[:bit] ",     "CMDbatNE;",    ""      ]
 [ "batcalc",   "!=",   "pattern batcalc.!=(X_1:any_1, X_2:bat[:any_1], 
X_3:bat[:oid], X_4:bit):bat[:bit] ",    "CMDbatNE;",    ""      ]
@@ -8010,7 +8011,6 @@ stdout of test 'MAL-signatures` in direc
 [ "calc",      "iszero",       "pattern calc.iszero(X_1:int):bit ",    
"CMDvarISZERO;",        ""      ]
 [ "calc",      "iszero",       "pattern calc.iszero(X_1:lng):bit ",    
"CMDvarISZERO;",        ""      ]
 [ "calc",      "iszero",       "pattern calc.iszero(X_1:sht):bit ",    
"CMDvarISZERO;",        ""      ]
-[ "calc",      "json", "command calc.json(X_1:json):json ",    
"JSONstr2json;",        ""      ]
 [ "calc",      "json", "command calc.json(X_1:str):json ",     
"JSONstr2json;",        ""      ]
 [ "calc",      "length",       "command calc.length(X_1:str):int ",    
"CMDstrlength;",        ""      ]
 [ "calc",      "lng",  "pattern calc.lng(X_1:bit):lng ",       
"CMDvarCONVERT;",       ""      ]
@@ -8814,10 +8814,7 @@ stdout of test 'MAL-signatures` in direc
 [ "json",      "fold", "pattern json.fold(X_1:bat[:str], X_2:bat[:any]):json 
",        "JSONfold;",    ""      ]
 [ "json",      "integer",      "command json.integer(X_1:json):lng ",  
"JSONjson2integer;",    ""      ]
 [ "json",      "isarray",      "command json.isarray(X_1:json):bit ",  
"JSONisarray;", ""      ]
-[ "json",      "isarray",      "command json.isarray(X_1:str):bit ",   
"JSONisarray;", ""      ]
 [ "json",      "isobject",     "command json.isobject(X_1:json):bit ", 
"JSONisobject;",        ""      ]
-[ "json",      "isobject",     "command json.isobject(X_1:str):bit ",  
"JSONisobject;",        ""      ]
-[ "json",      "isvalid",      "command json.isvalid(X_1:json):bit ",  
"JSONisvalid;", ""      ]
 [ "json",      "isvalid",      "command json.isvalid(X_1:str):bit ",   
"JSONisvalid;", ""      ]
 [ "json",      "keyarray",     "command json.keyarray(X_1:json):json ",        
"JSONkeyArray;",        ""      ]
 [ "json",      "keys", "command json.keys(X_1:json):bat[:str] ",       
"JSONkeyTable;",        ""      ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128 
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -892,7 +892,8 @@ stdout of test 'MAL-signatures` in direc
 [ "batalgebra",        "not_like",     "pattern 
batalgebra.not_like(X_1:bat[:str], X_2:bat[:str], X_3:str):bat[:bit] ",        
"BATPCREnotlike;",      ""      ]
 [ "batalgebra",        "not_like",     "pattern 
batalgebra.not_like(X_1:bat[:str], X_2:str, X_3:str):bat[:bit] ",      
"BATPCREnotlike;",      ""      ]
 [ "batalgebra",        "not_like",     "pattern batalgebra.not_like(X_1:str, 
X_2:bat[:str], X_3:str):bat[:bit] ",      "BATPCREnotlike;",      ""      ]
-[ "batblob",   "nitems",       "command 
batblob.nitems(X_1:bat[:blob]):bat[:int] ",    "BLOBnitems_bulk;",     ""      ]
+[ "batblob",   "nitems",       "pattern 
batblob.nitems(X_1:bat[:blob]):bat[:int] ",    "BLOBnitems_bulk;",     ""      ]
+[ "batblob",   "nitems",       "pattern batblob.nitems(X_1:bat[:blob], 
X_2:bat[:oid]):bat[:int] ",     "BLOBnitems_bulk;",     ""      ]
 [ "batcalc",   "!=",   "pattern batcalc.!=(X_1:any_1, 
X_2:bat[:any_1]):bat[:bit] ",    "CMDbatNE;",    ""      ]
 [ "batcalc",   "!=",   "pattern batcalc.!=(X_1:any_1, X_2:bat[:any_1], 
X_3:bat[:oid]):bat[:bit] ",     "CMDbatNE;",    ""      ]
 [ "batcalc",   "!=",   "pattern batcalc.!=(X_1:any_1, X_2:bat[:any_1], 
X_3:bat[:oid], X_4:bit):bat[:bit] ",    "CMDbatNE;",    ""      ]
@@ -11149,7 +11150,6 @@ stdout of test 'MAL-signatures` in direc
 [ "calc",      "iszero",       "pattern calc.iszero(X_1:int):bit ",    
"CMDvarISZERO;",        ""      ]
 [ "calc",      "iszero",       "pattern calc.iszero(X_1:lng):bit ",    
"CMDvarISZERO;",        ""      ]
 [ "calc",      "iszero",       "pattern calc.iszero(X_1:sht):bit ",    
"CMDvarISZERO;",        ""      ]
-[ "calc",      "json", "command calc.json(X_1:json):json ",    
"JSONstr2json;",        ""      ]
 [ "calc",      "json", "command calc.json(X_1:str):json ",     
"JSONstr2json;",        ""      ]
 [ "calc",      "length",       "command calc.length(X_1:str):int ",    
"CMDstrlength;",        ""      ]
 [ "calc",      "lng",  "pattern calc.lng(X_1:bit):lng ",       
"CMDvarCONVERT;",       ""      ]
@@ -12112,10 +12112,7 @@ stdout of test 'MAL-signatures` in direc
 [ "json",      "fold", "pattern json.fold(X_1:bat[:str], X_2:bat[:any]):json 
",        "JSONfold;",    ""      ]
 [ "json",      "integer",      "command json.integer(X_1:json):lng ",  
"JSONjson2integer;",    ""      ]
 [ "json",      "isarray",      "command json.isarray(X_1:json):bit ",  
"JSONisarray;", ""      ]
-[ "json",      "isarray",      "command json.isarray(X_1:str):bit ",   
"JSONisarray;", ""      ]
 [ "json",      "isobject",     "command json.isobject(X_1:json):bit ", 
"JSONisobject;",        ""      ]
-[ "json",      "isobject",     "command json.isobject(X_1:str):bit ",  
"JSONisobject;",        ""      ]
-[ "json",      "isvalid",      "command json.isvalid(X_1:json):bit ",  
"JSONisvalid;", ""      ]
 [ "json",      "isvalid",      "command json.isvalid(X_1:str):bit ",   
"JSONisvalid;", ""      ]
 [ "json",      "keyarray",     "command json.keyarray(X_1:json):json ",        
"JSONkeyArray;",        ""      ]
 [ "json",      "keys", "command json.keys(X_1:json):bat[:str] ",       
"JSONkeyTable;",        ""      ]
diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c
--- a/clients/mapiclient/dump.c
+++ b/clients/mapiclient/dump.c
@@ -295,6 +295,42 @@ bailout:
 }
 
 static bool
+has_schema_path(Mapi mid)
+{
+       MapiHdl hdl;
+       bool ret;
+       static int answer = -1;
+
+       if (answer >= 0)
+               return answer;
+
+       if ((hdl = mapi_query(mid, "select id from sys._columns where table_id 
= (select id from sys._tables where name = 'db_user_info' and schema_id = 
(select id from sys.schemas where name = 'sys')) and name = 'schema_path'")) == 
NULL ||
+           mapi_error(mid))
+               goto bailout;
+       ret = mapi_get_row_count(hdl) == 1;
+       while ((mapi_fetch_row(hdl)) != 0) {
+               if (mapi_error(mid))
+                       goto bailout;
+       }
+       if (mapi_error(mid))
+               goto bailout;
+       mapi_close_handle(hdl);
+       answer = ret;
+       return ret;
+
+bailout:
+       if (hdl) {
+               if (mapi_result_error(hdl))
+                       mapi_explain_result(hdl, stderr);
+               else
+                       mapi_explain_query(hdl, stderr);
+               mapi_close_handle(hdl);
+       } else
+               mapi_explain(mid, stderr);
+       return false;
+}
+
+static bool
 has_table_partitions(Mapi mid)
 {
        MapiHdl hdl;
@@ -2225,6 +2261,7 @@ dump_database(Mapi mid, stream *toConsol
        const char *start_trx = "START TRANSACTION";
        const char *end = "ROLLBACK";
        const char *users =
+               has_schema_path(mid) ?
                "SELECT ui.name, "
                       "ui.fullname, "
                       "password_hash(ui.name), "
@@ -2235,6 +2272,17 @@ dump_database(Mapi mid, stream *toConsol
                "WHERE ui.default_schema = s.id "
                  "AND ui.name <> 'monetdb' "
                  "AND ui.name <> '.snapshot' "
+               "ORDER BY ui.name" :
+               "SELECT ui.name, "
+                      "ui.fullname, "
+                      "password_hash(ui.name), "
+                      "s.name, "
+                          "cast(null as clob) "
+               "FROM sys.db_user_info ui, "
+                    "sys.schemas s "
+               "WHERE ui.default_schema = s.id "
+                 "AND ui.name <> 'monetdb' "
+                 "AND ui.name <> '.snapshot' "
                "ORDER BY ui.name";
        const char *roles =
                "SELECT name "
@@ -2481,8 +2529,12 @@ dump_database(Mapi mid, stream *toConsol
                        mnstr_printf(toConsole, " NAME ");
                        squoted_print(toConsole, fullname, '\'', false);
                        mnstr_printf(toConsole, " SCHEMA ");
-                       dquoted_print(toConsole, describe ? sname : "sys", " ");
-                       mnstr_printf(toConsole, "SCHEMA PATH '%s';\n", spath);
+                       dquoted_print(toConsole, describe ? sname : "sys", 
NULL);
+                       if (spath) {
+                               mnstr_printf(toConsole, " SCHEMA PATH ");
+                               squoted_print(toConsole, spath, '\'', false);
+                       }
+                       mnstr_printf(toConsole, ";\n");
                }
                if (mapi_error(mid))
                        goto bailout;
diff --git a/common/utils/mcrypt.c b/common/utils/mcrypt.c
--- a/common/utils/mcrypt.c
+++ b/common/utils/mcrypt.c
@@ -45,6 +45,18 @@ mcrypt_getHashAlgorithms(void)
         * desire.
         */
        static const char *algorithms =
+               /* When compiling MonetDBe for docker, we use 
-DWITH_CRYPTO=OFF. This means that none of the hashing algorithms
+                * are available and so we get a syntax error at 
mcrypt_getHashAlgorithms.
+                *
+                * This used to compile because it
+                * unconditionally included PROT10.
+
+                * This hack is dangerous because it will allow MonetDB server 
to be built even without openssl installed. A
+                * sever like that will be incompatible with all clients 
because it does not implement MAPI correctly. Ideally
+                * we should solve this at CMake level but it is difficult 
because the common modules between MonetDBe and
+                * MonetDB server require substantially different compilation 
parameters.
+                */
+               "INVALID"
 #ifdef HAVE_RIPEMD160_UPDATE
                ",RIPEMD160"
 #endif
diff --git a/ctest/tools/monetdbe/example_remote.c 
b/ctest/tools/monetdbe/example_remote.c
--- a/ctest/tools/monetdbe/example_remote.c
+++ b/ctest/tools/monetdbe/example_remote.c
@@ -20,9 +20,11 @@ main(void)
        char* err = NULL;
        monetdbe_database mdbe = NULL;
        monetdbe_result* result = NULL;
+       monetdbe_remote remote = {.host="localhost", .port=50000, 
.database="devdb", .username="monetdb", .password="monetdb"};
+       monetdbe_options opts = {.remote = &remote};
 
        // second argument is a string for the db directory or NULL for 
in-memory mode
-       if (monetdbe_open(&mdbe, 
"monetdb://localhost:5000/sf1?user=monetdb&password=monetdb", NULL))
+       if (monetdbe_open(&mdbe, NULL, &opts))
                expected_error("Failed to open database")
        /*if ((err = monetdbe_query(mdbe, "CREATE TABLE test (x integer, y 
string)", NULL, NULL)) != NULL)
                error(err)
diff --git a/documentation/monetdbe/manual_pages/monetdbe_open.rst 
b/documentation/monetdbe/manual_pages/monetdbe_open.rst
new file mode 100644
--- /dev/null
+++ b/documentation/monetdbe/manual_pages/monetdbe_open.rst
@@ -0,0 +1,64 @@
+=============
+MONETDBE_OPEN
+=============
+
+NAME
+====
+
+monetdbe_open --- Open a MonetDBe connection
+
+SYNOPSIS
+========
+#include <monetdbe.h>
+
+monetdbe_open(monetdbe_database \*db, char \*url, monetdbe_options \*opts);
+
+DESCRIPTION
+===========
+The monetdbe_open() function opens a connection to a MonetDB database.
+This function takes 3 arguments:
+
+(1) monetdbe_database* database.
+(2) char* url. NULL for in-memory database.
+(3) monetdbe_options* opts. NULL if no options.
+
+RETURN VALUE
+============
+0 for success, else errno.
+
+EXAMPLES
+========
+
+.. code-block:: c
+
+    // Usage of an in-memory database
+    monetdbe_database mdbe = NULL;
+    if (monetdbe_open(&mdbe, NULL, NULL))
+        fprintf(stderr, "Failed to open database")
+
+
+.. code-block:: c
+
+    // Usage of an remote database
+    monetdbe_database remote = NULL;
+    monetdbe_open(&remote, 
"monetdb://localhost:5000/sf1?user=monetdb&password=monetdb", NULL); 
+
+.. code-block:: c
+
+    // Usage of opts
+    monetdbe_options *opts = malloc(sizeof(monetdbe_options));
+    monetdbe_remote *remote = malloc(sizeof(monetdbe_remote));
+
+    remote->host = "localhost";
+    remote->port = 50000;
+    remote->username = "monetdb";
+    remote->password = "monetdb";
+    remote->lang = NULL; // NOT USED
+    opts->remote = remote;
+
+    monetdbe_open(db, "mapi:monetdb://localhost:50000/test", opts);
+
+
+SEE ALSO
+========
+*monetdbe_database*\ (1) *monetdbe_options*\ (1) *monetdbe_remote*\ (1)
diff --git a/documentation/monetdbe/manual_pages/monetdbe_options.rst 
b/documentation/monetdbe/manual_pages/monetdbe_options.rst
new file mode 100644
--- /dev/null
+++ b/documentation/monetdbe/manual_pages/monetdbe_options.rst
@@ -0,0 +1,53 @@
+================
+MONETDBE_OPTIONS
+================
+
+NAME
+====
+
+monetdbe_options --- struct that holds options for a MonetDBe connection
+
+SYNOPSIS
+========
+.. code-block:: c
+
+ #include <monetdbe.h>
+
+    typedef struct {
+        int memorylimit;  
+        int querytimeout;|
+        int sessiontimeout;  
+        int nr_threads;  
+        monetdbe_remote* remote;
+        monetdbe_mapi_server* mapi_server;
+
+    } monetdbe_options;
+
+DESCRIPTION
+===========
+MonetDBe options struct. Object can be passed to a monetdbe_open() function. 
Can also be null, if there are no options. This struct holds these fields:
+
+(1) int memorylimit. Top off the amount of RAM to be used, in MB.
+(2) int querytimeout. Gracefully terminate query after a few seconds.
+(3) int sessiontimeout. Graceful terminate the session after a few seconds.
+(4)    int nr_threads. Maximum number of worker treads, limits level of 
parallelism.
+(5)    monetdbe_remote* remote. Pointer to a monetdbe_remote object.
+(6)    monetdbe_mapi_server* mapi_server. Pointer to a monetdbe_mapi_server 
object.
+
+EXAMPLES
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to