Changeset: ab27ea836e1d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ab27ea836e1d
Modified Files:
clients/Tests/MAL-signatures.stable.out
clients/Tests/MAL-signatures.stable.out.int128
gdk/gdk_bbp.c
gdk/gdk_join.c
monetdb5/modules/atoms/blob.c
monetdb5/modules/atoms/json.c
monetdb5/modules/atoms/json.mal
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql_statement.h
sql/include/sql_catalog.h
sql/server/rel_optimizer.c
sql/server/sql_parser.y
sql/storage/bat/bat_logger.c
sql/storage/store.c
sql/test/emptydb/Tests/check.stable.out
sql/test/emptydb/Tests/check.stable.out.32bit
sql/test/emptydb/Tests/check.stable.out.int128
tools/monetdbe/monetdbe.c
Branch: unlock
Log Message:
merged with default
diffs (truncated from 3179 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
@@ -811,7 +811,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;", "" ]
@@ -8044,7 +8045,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;", "" ]
@@ -8855,10 +8855,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
@@ -916,7 +916,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;", "" ]
@@ -11173,7 +11174,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;", "" ]
@@ -12136,10 +12136,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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list