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