Changeset: 46955260b7c2 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=46955260b7c2 Modified Files: clients/Tests/MAL-signatures.stable.out clients/Tests/MAL-signatures.stable.out.int128 monetdb5/modules/atoms/mtime.c sql/server/rel_select.c sql/server/rel_unnest.c sql/test/miscellaneous/Tests/simple_selects.stable.out Branch: typing Log Message:
Merged with Oct2020 diffs (truncated from 4347 to 300 lines): diff --git a/README.rst b/README.rst --- a/README.rst +++ b/README.rst @@ -1,15 +1,28 @@ The MonetDB Database System =========================== -The MonetDB database is developed by the CWI database research group -(see https://www.monetdb.org/). +The MonetDB database was originally developed by the `CWI`__ `database +research group`__ (see https://www.monetdb.org/). Development has now +shifted to the spin-off company `MonetDB Solutions`__. -Via the MonetDB project we have brought the MonetDB system in open source, -where it is accessible at https://www.monetdb.org/Downloads/ +Via the MonetDB project we have brought the MonetDB system in open +source, where it is accessible at https://www.monetdb.org/Downloads/. +Even though development happens mostly in a company, the MonetDB +database system will remain open source. The MonetDB database system is a high-performance database kernel for -query-intensive applications. The MonetDB source can be found at our `Mercurial -server`__. There is also a `github mirror`__ that is updated once a day. +query-intensive applications. The MonetDB source can be found at our +`Mercurial server`__. There is also a `github mirror`__ that is updated +once a day. + +.. _CWI: https://www.cwi.nl/ +__ CWI_ + +.. _DA: https://www.cwi.nl/research/groups/database-architectures +__ DA_ + +.. _solutions: https://www.monetdbsolutions.com +__ solutions_ .. _MonetDB: https://dev.monetdb.org/hg/MonetDB/ __ MonetDB_ @@ -17,12 +30,19 @@ server`__. There is also a `github mirro .. _github: https://github.com/MonetDB/MonetDB __ github_ -If you got a source distribution, please compile and install MonetDB first, -following the instructions in the file `HowToStart.rst`__ (for Unix) -or `buildtools/doc/windowsbuild.rst`__ (for Windows). +If you got a source distribution, please compile and install MonetDB +first, following the instructions in the file `build.rst`__. + +__ documentation/source/build.rst -__ HowToStart.rst -__ buildtools/doc/windowsbuild.rst +Bugs +==== + +We of course hope there aren't any, but if you do find one, you can +report bugs in our `bugzilla`__ instance. + +.. _bugzilla: https://bugs.monetdb.org +__ bugzilla_ Copyright Notice ================ 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 @@ -66,9 +66,9 @@ stdout of test 'MAL-signatures` in direc % clob, clob, clob, clob, clob # type % 12, 28, 313, 42, 0 # length [ "aggr", "all", "command aggr.all(X_1:bat[:any_1]):any_1 ", "SQLall;", "" ] -[ "aggr", "allnotequal", "command aggr.allnotequal(X_1:bat[:any_1], X_2:bat[:any_1]):bit ", "SQLallnotequal;", "" ] +[ "aggr", "allnotequal", "pattern aggr.allnotequal(X_1:bat[:any_1], X_2:bat[:any_1]):bit ", "SQLallnotequal;", "" ] [ "aggr", "anyequal", "pattern aggr.anyequal(X_1:any_1, X_2:any_1):bit ", "CMDvarEQ;", "" ] -[ "aggr", "anyequal", "command aggr.anyequal(X_1:bat[:any_1], X_2:bat[:any_1]):bit ", "SQLanyequal;", "" ] +[ "aggr", "anyequal", "pattern aggr.anyequal(X_1:bat[:any_1], X_2:bat[:any_1]):bit ", "SQLanyequal;", "" ] [ "aggr", "avg", "command aggr.avg(X_1:bat[:bte], X_2:bat[:oid], X_3:bat[:any_1]):bat[:dbl] ", "AGGRavg13_dbl;", "" ] [ "aggr", "avg", "command aggr.avg(X_1:bat[:dbl], X_2:bat[:oid], X_3:bat[:any_1]):bat[:dbl] ", "AGGRavg13_dbl;", "" ] [ "aggr", "avg", "command aggr.avg(X_1:bat[:flt], X_2:bat[:oid], X_3:bat[:any_1]):bat[:dbl] ", "AGGRavg13_dbl;", "" ] @@ -751,6 +751,8 @@ stdout of test 'MAL-signatures` in direc [ "bat", "setPersistent", "command bat.setPersistent(X_1:bat[:any_1]):void ", "BKCsetPersistent;", "" ] [ "bat", "setTransient", "command bat.setTransient(X_1:bat[:any_1]):void ", "BKCsetTransient;", "" ] [ "bat", "single", "pattern bat.single(X_1:any_1):bat[:any_1] ", "CMDBATsingle;", "" ] +[ "bataggr", "allnotequal", "pattern bataggr.allnotequal(X_1:bat[:any_1], X_2:bat[:any_1]):bit ", "SQLallnotequal;", "" ] +[ "bataggr", "anyequal", "pattern bataggr.anyequal(X_1:bat[:any_1], X_2:bat[:any_1]):bat[:bit] ", "SQLanyequal;", "" ] [ "bataggr", "exist", "pattern bataggr.exist(X_1:any_1):bat[:bit] ", "SQLexist;", "" ] [ "bataggr", "exist", "pattern bataggr.exist(X_1:bat[:any_1]):bat[:bit] ", "SQLexist;", "" ] [ "bataggr", "exist", "pattern bataggr.exist(X_1:bat[:any_1]):bit ", "SQLexist;", "" ] @@ -5890,6 +5892,7 @@ stdout of test 'MAL-signatures` in direc [ "batstr", "nbytes", "command batstr.nbytes(X_1:bat[:str]):bat[:int] ", "STRbatBytes;", "" ] [ "batstr", "r_search", "command batstr.r_search(X_1:bat[:str], X_2:bat[:str]):bat[:int] ", "STRbatRstrSearch;", "" ] [ "batstr", "r_search", "command batstr.r_search(X_1:bat[:str], X_2:str):bat[:int] ", "STRbatRstrSearchcst;", "" ] +[ "batstr", "repeat", "command batstr.repeat(X_1:bat[:str], X_2:int):bat[:str] ", "STRbatrepeat;", "" ] [ "batstr", "rpad", "command batstr.rpad(X_1:bat[:str], X_2:bat[:int], X_3:bat[:str]):bat[:str] ", "STRbatRpad2_bat_bat;", "" ] [ "batstr", "rpad", "command batstr.rpad(X_1:bat[:str], X_2:bat[:int], X_3:str):bat[:str] ", "STRbatRpad2_bat_const;", "" ] [ "batstr", "rpad", "command batstr.rpad(X_1:bat[:str], X_2:int, X_3:bat[:str]):bat[:str] ", "STRbatRpad2_const_bat;", "" ] @@ -5905,6 +5908,8 @@ stdout of test 'MAL-signatures` in direc [ "batstr", "startsWith", "command batstr.startsWith(X_1:bat[:str], X_2:str):bat[:bit] ", "STRbatPrefixcst;", "" ] [ "batstr", "string", "command batstr.string(X_1:bat[:str], X_2:bat[:int]):bat[:str] ", "STRbatTail;", "" ] [ "batstr", "string", "command batstr.string(X_1:bat[:str], X_2:int):bat[:str] ", "STRbatTailcst;", "" ] +[ "batstr", "stringleft", "command batstr.stringleft(X_1:bat[:str], X_2:int):bat[:str] ", "STRbatprefix;", "" ] +[ "batstr", "stringright", "command batstr.stringright(X_1:bat[:str], X_2:int):bat[:str] ", "STRbatsuffix;", "" ] [ "batstr", "substitute", "command batstr.substitute(X_1:bat[:str], X_2:str, X_3:str, X_4:bit):bat[:str] ", "STRbatSubstitutecst;", "" ] [ "batstr", "substring", "command batstr.substring(X_1:bat[:str], X_2:bat[:int], X_3:bat[:int]):bat[:str] ", "STRbatsubstring;", "" ] [ "batstr", "substring", "command batstr.substring(X_1:bat[:str], X_2:int, X_3:int):bat[:str] ", "STRbatsubstringcst;", "" ] 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 @@ -70,9 +70,9 @@ stdout of test 'MAL-signatures` in direc % clob, clob, clob, clob, clob # type % 12, 28, 313, 42, 0 # length [ "aggr", "all", "command aggr.all(X_1:bat[:any_1]):any_1 ", "SQLall;", "" ] -[ "aggr", "allnotequal", "command aggr.allnotequal(X_1:bat[:any_1], X_2:bat[:any_1]):bit ", "SQLallnotequal;", "" ] +[ "aggr", "allnotequal", "pattern aggr.allnotequal(X_1:bat[:any_1], X_2:bat[:any_1]):bit ", "SQLallnotequal;", "" ] [ "aggr", "anyequal", "pattern aggr.anyequal(X_1:any_1, X_2:any_1):bit ", "CMDvarEQ;", "" ] -[ "aggr", "anyequal", "command aggr.anyequal(X_1:bat[:any_1], X_2:bat[:any_1]):bit ", "SQLanyequal;", "" ] +[ "aggr", "anyequal", "pattern aggr.anyequal(X_1:bat[:any_1], X_2:bat[:any_1]):bit ", "SQLanyequal;", "" ] [ "aggr", "avg", "command aggr.avg(X_1:bat[:bte], X_2:bat[:oid], X_3:bat[:any_1]):bat[:dbl] ", "AGGRavg13_dbl;", "" ] [ "aggr", "avg", "command aggr.avg(X_1:bat[:dbl], X_2:bat[:oid], X_3:bat[:any_1]):bat[:dbl] ", "AGGRavg13_dbl;", "" ] [ "aggr", "avg", "command aggr.avg(X_1:bat[:flt], X_2:bat[:oid], X_3:bat[:any_1]):bat[:dbl] ", "AGGRavg13_dbl;", "" ] @@ -866,6 +866,8 @@ stdout of test 'MAL-signatures` in direc [ "bat", "setPersistent", "command bat.setPersistent(X_1:bat[:any_1]):void ", "BKCsetPersistent;", "" ] [ "bat", "setTransient", "command bat.setTransient(X_1:bat[:any_1]):void ", "BKCsetTransient;", "" ] [ "bat", "single", "pattern bat.single(X_1:any_1):bat[:any_1] ", "CMDBATsingle;", "" ] +[ "bataggr", "allnotequal", "pattern bataggr.allnotequal(X_1:bat[:any_1], X_2:bat[:any_1]):bit ", "SQLallnotequal;", "" ] +[ "bataggr", "anyequal", "pattern bataggr.anyequal(X_1:bat[:any_1], X_2:bat[:any_1]):bat[:bit] ", "SQLanyequal;", "" ] [ "bataggr", "exist", "pattern bataggr.exist(X_1:any_1):bat[:bit] ", "SQLexist;", "" ] [ "bataggr", "exist", "pattern bataggr.exist(X_1:bat[:any_1]):bat[:bit] ", "SQLexist;", "" ] [ "bataggr", "exist", "pattern bataggr.exist(X_1:bat[:any_1]):bit ", "SQLexist;", "" ] @@ -8166,6 +8168,7 @@ stdout of test 'MAL-signatures` in direc [ "batstr", "nbytes", "command batstr.nbytes(X_1:bat[:str]):bat[:int] ", "STRbatBytes;", "" ] [ "batstr", "r_search", "command batstr.r_search(X_1:bat[:str], X_2:bat[:str]):bat[:int] ", "STRbatRstrSearch;", "" ] [ "batstr", "r_search", "command batstr.r_search(X_1:bat[:str], X_2:str):bat[:int] ", "STRbatRstrSearchcst;", "" ] +[ "batstr", "repeat", "command batstr.repeat(X_1:bat[:str], X_2:int):bat[:str] ", "STRbatrepeat;", "" ] [ "batstr", "rpad", "command batstr.rpad(X_1:bat[:str], X_2:bat[:int], X_3:bat[:str]):bat[:str] ", "STRbatRpad2_bat_bat;", "" ] [ "batstr", "rpad", "command batstr.rpad(X_1:bat[:str], X_2:bat[:int], X_3:str):bat[:str] ", "STRbatRpad2_bat_const;", "" ] [ "batstr", "rpad", "command batstr.rpad(X_1:bat[:str], X_2:int, X_3:bat[:str]):bat[:str] ", "STRbatRpad2_const_bat;", "" ] @@ -8181,6 +8184,8 @@ stdout of test 'MAL-signatures` in direc [ "batstr", "startsWith", "command batstr.startsWith(X_1:bat[:str], X_2:str):bat[:bit] ", "STRbatPrefixcst;", "" ] [ "batstr", "string", "command batstr.string(X_1:bat[:str], X_2:bat[:int]):bat[:str] ", "STRbatTail;", "" ] [ "batstr", "string", "command batstr.string(X_1:bat[:str], X_2:int):bat[:str] ", "STRbatTailcst;", "" ] +[ "batstr", "stringleft", "command batstr.stringleft(X_1:bat[:str], X_2:int):bat[:str] ", "STRbatprefix;", "" ] +[ "batstr", "stringright", "command batstr.stringright(X_1:bat[:str], X_2:int):bat[:str] ", "STRbatsuffix;", "" ] [ "batstr", "substitute", "command batstr.substitute(X_1:bat[:str], X_2:str, X_3:str, X_4:bit):bat[:str] ", "STRbatSubstitutecst;", "" ] [ "batstr", "substring", "command batstr.substring(X_1:bat[:str], X_2:bat[:int], X_3:bat[:int]):bat[:str] ", "STRbatsubstring;", "" ] [ "batstr", "substring", "command batstr.substring(X_1:bat[:str], X_2:int, X_3:int):bat[:str] ", "STRbatsubstringcst;", "" ] diff --git a/clients/mapiclient/mclient.c b/clients/mapiclient/mclient.c --- a/clients/mapiclient/mclient.c +++ b/clients/mapiclient/mclient.c @@ -77,7 +77,7 @@ static char *encoding; static bool errseen = false; static bool allow_remote = false; -#define setPrompt() sprintf(promptbuf, "%.*s>", (int) sizeof(promptbuf) - 2, language) +#define setPrompt() snprintf(promptbuf, sizeof(promptbuf), "%.*s>", (int) sizeof(promptbuf) - 2, language) #define debugMode() (strncmp(promptbuf, "mdb", 3) == 0) /* the internal result set formatters */ @@ -335,7 +335,7 @@ fetch_line(MapiHdl hdl) if (strncmp(reply, "mdb>#EOD", 8) == 0) setPrompt(); else - sprintf(promptbuf, "mdb>"); + snprintf(promptbuf, sizeof(promptbuf), "mdb>"); } return reply; } @@ -1352,7 +1352,7 @@ SQLdebugRendering(MapiHdl hdl) char *reply; int cnt = 0; - sprintf(promptbuf, "mdb>"); + snprintf(promptbuf, sizeof(promptbuf), "mdb>"); while ((reply = fetch_line(hdl))) { cnt++; mnstr_printf(toConsole, "%s\n", reply); diff --git a/clients/mapilib/mapi.c b/clients/mapilib/mapi.c --- a/clients/mapilib/mapi.c +++ b/clients/mapilib/mapi.c @@ -3403,55 +3403,55 @@ mapi_param_store(MapiHdl hdl) switch (hdl->params[i].intype) { case MAPI_TINY: checkSpace(5); - sprintf(hdl->query + k, "%hhd", *(signed char *) src); + snprintf(hdl->query + k, lim - k, "%hhd", *(signed char *) src); break; case MAPI_UTINY: checkSpace(5); - sprintf(hdl->query + k, "%hhu", *(unsigned char *) src); + snprintf(hdl->query + k, lim - k, "%hhu", *(unsigned char *) src); break; case MAPI_SHORT: checkSpace(10); - sprintf(hdl->query + k, "%hd", *(short *) src); + snprintf(hdl->query + k, lim - k, "%hd", *(short *) src); break; case MAPI_USHORT: checkSpace(10); - sprintf(hdl->query + k, "%hu", *(unsigned short *) src); + snprintf(hdl->query + k, lim - k, "%hu", *(unsigned short *) src); break; case MAPI_INT: checkSpace(20); - sprintf(hdl->query + k, "%d", *(int *) src); + snprintf(hdl->query + k, lim - k, "%d", *(int *) src); break; case MAPI_UINT: checkSpace(20); - sprintf(hdl->query + k, "%u", *(unsigned int *) src); + snprintf(hdl->query + k, lim - k, "%u", *(unsigned int *) src); break; case MAPI_LONG: checkSpace(20); - sprintf(hdl->query + k, "%ld", *(long *) src); + snprintf(hdl->query + k, lim - k, "%ld", *(long *) src); break; case MAPI_ULONG: checkSpace(20); - sprintf(hdl->query + k, "%lu", *(unsigned long *) src); + snprintf(hdl->query + k, lim - k, "%lu", *(unsigned long *) src); break; case MAPI_LONGLONG: checkSpace(30); - sprintf(hdl->query + k, "%"PRId64, *(int64_t *) src); + snprintf(hdl->query + k, lim - k, "%"PRId64, *(int64_t *) src); break; case MAPI_ULONGLONG: checkSpace(30); - sprintf(hdl->query + k, "%"PRIu64, *(uint64_t *) src); + snprintf(hdl->query + k, lim - k, "%"PRIu64, *(uint64_t *) src); break; case MAPI_FLOAT: checkSpace(30); - sprintf(hdl->query + k, "%.9g", *(float *) src); + snprintf(hdl->query + k, lim - k, "%.9g", *(float *) src); break; case MAPI_DOUBLE: checkSpace(30); - sprintf(hdl->query + k, "%.17g", *(double *) src); + snprintf(hdl->query + k, lim - k, "%.17g", *(double *) src); break; case MAPI_DATE: checkSpace(50); - sprintf(hdl->query + k, + snprintf(hdl->query + k, lim - k, "DATE '%04hd-%02hu-%02hu'", ((MapiDate *) src)->year, ((MapiDate *) src)->month, @@ -3459,7 +3459,7 @@ mapi_param_store(MapiHdl hdl) break; case MAPI_TIME: checkSpace(60); - sprintf(hdl->query + k, + snprintf(hdl->query + k, lim - k, "TIME '%02hu:%02hu:%02hu'", ((MapiTime *) src)->hour, ((MapiTime *) src)->minute, @@ -3467,7 +3467,7 @@ mapi_param_store(MapiHdl hdl) break; case MAPI_DATETIME: checkSpace(110); - sprintf(hdl->query + k, + snprintf(hdl->query + k, lim - k, "TIMESTAMP '%04hd-%02hu-%02hu %02hu:%02hu:%02hu.%09u'", ((MapiDateTime *) src)->year, ((MapiDateTime *) src)->month, @@ -3493,7 +3493,7 @@ mapi_param_store(MapiHdl hdl) } hdl->query = q; } - sprintf(hdl->query + k, "'%s'", val); + snprintf(hdl->query + k, lim - k, "'%s'", val); free(val); break; case MAPI_VARCHAR: @@ -3510,11 +3510,11 @@ mapi_param_store(MapiHdl hdl) } hdl->query = q; } - sprintf(hdl->query + k, "'%s'", val); + snprintf(hdl->query + k, lim - k, "'%s'", val); free(val); break; default: - strcpy(hdl->query + k, src); + strcpy_len(hdl->query + k, src, lim - k); break; } } diff --git a/clients/odbc/driver/ODBCUtil.c b/clients/odbc/driver/ODBCUtil.c --- a/clients/odbc/driver/ODBCUtil.c +++ b/clients/odbc/driver/ODBCUtil.c @@ -942,12 +942,13 @@ ODBCTranslateSQL(ODBCDbc *dbc, const SQL } n = (int) (q - nquery); pr = (int) (p - q); - q = malloc(length - pr + strlen(buf) + 1); + length += strlen(buf) + 1 - pr; + q = malloc(length); if (q == NULL) { free(nquery); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list