Changeset: 9f4fbec3b181 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/9f4fbec3b181 Modified Files: sql/test/emptydb/Tests/check.stable.out.int128 Branch: balanced_union Log Message:
merged with default diffs (truncated from 1181 to 300 lines): diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out --- a/clients/Tests/exports.stable.out +++ b/clients/Tests/exports.stable.out @@ -717,11 +717,11 @@ int64_t mapi_rows_affected(MapiHdl hdl) MapiMsg mapi_seek_row(MapiHdl hdl, int64_t rowne, int whence) __attribute__((__nonnull__(1))); MapiHdl mapi_send(Mapi mid, const char *cmd) __attribute__((__nonnull__(1))); MapiMsg mapi_setAutocommit(Mapi mid, bool autocommit) __attribute__((__nonnull__(1))); -void mapi_set_application_name(const char *name); MapiMsg mapi_set_columnar_protocol(Mapi mid, bool columnar_protocol) __attribute__((__nonnull__(1))); MapiMsg mapi_set_size_header(Mapi mid, bool value) __attribute__((__nonnull__(1))); MapiMsg mapi_set_time_zone(Mapi mid, int seconds_east_of_utc) __attribute__((__nonnull__(1))); MapiMsg mapi_set_timeout(Mapi mid, unsigned int timeout, bool (*callback)(void *), void *callback_data) __attribute__((__nonnull__(1))); +void mapi_setclientprefix(Mapi mid, const char *prefix); void mapi_setfilecallback(Mapi mid, char *(*getfunc)(void *priv, const char *filename, bool binary, uint64_t offset, size_t *size), char *(*putfunc)(void *priv, const char *filename, const void *data, size_t size), void *priv) __attribute__((__nonnull__(1))); void mapi_setfilecallback2(Mapi mid, char *(*getfunc)(void *priv, const char *filename, bool binary, uint64_t offset, size_t *size), char *(*putfunc)(void *priv, const char *filename, bool binary, const void *data, size_t size), void *priv) __attribute__((__nonnull__(1))); Mapi mapi_settings(msettings *settings) __attribute__((__nonnull__(1))); diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c --- a/clients/mapiclient/dump.c +++ b/clients/mapiclient/dump.c @@ -1131,14 +1131,15 @@ dump_column_definition(Mapi mid, stream "SELECT kc.name, " /* 0 */ "kc.nr, " /* 1 */ "k.name, " /* 2 */ - "kc.id " /* 3 */ + "kc.id, " /* 3 */ + "k.type " /* 4 */ "FROM sys.objects kc, " "sys.keys k, " "sys.schemas s, " "sys._tables t " "WHERE kc.id = k.id " "AND k.table_id = t.id " - "AND k.type = 1 " + "AND k.type in (1, 3) " "AND t.schema_id = s.id " "AND s.name = '%s' " "AND t.name = '%s' " @@ -1150,6 +1151,7 @@ dump_column_definition(Mapi mid, stream const char *c_column = mapi_fetch_field(hdl, 0); const char *kc_nr = mapi_fetch_field(hdl, 1); const char *k_name = mapi_fetch_field(hdl, 2); + const char *k_type = mapi_fetch_field(hdl, 4); if (mapi_error(mid)) goto bailout; @@ -1161,7 +1163,7 @@ dump_column_definition(Mapi mid, stream mnstr_printf(sqlf, "CONSTRAINT "); dquoted_print(sqlf, k_name, " "); } - mnstr_printf(sqlf, "UNIQUE ("); + mnstr_printf(sqlf, "UNIQUE%s (", strcmp(k_type, "1") == 0 ? "" : " NULLS NOT DISTINCT"); cnt = 1; } else mnstr_printf(sqlf, ", "); diff --git a/clients/mapiclient/mclient.c b/clients/mapiclient/mclient.c --- a/clients/mapiclient/mclient.c +++ b/clients/mapiclient/mclient.c @@ -3682,7 +3682,6 @@ main(int argc, char **argv) } else { mid = mapi_mapi(host, port, user, passwd, language, dbname); } - mapi_set_application_name("mclient"); free(user_allocated); user_allocated = NULL; free(passwd_allocated); diff --git a/clients/mapiclient/msqldump.c b/clients/mapiclient/msqldump.c --- a/clients/mapiclient/msqldump.c +++ b/clients/mapiclient/msqldump.c @@ -237,7 +237,6 @@ main(int argc, char **argv) } else { mid = mapi_mapi(host, port, user, passwd, "sql", dbname); } - mapi_set_application_name("msqldump"); free(user_allocated); user_allocated = NULL; free(passwd_allocated); diff --git a/clients/mapilib/connect.c b/clients/mapilib/connect.c --- a/clients/mapilib/connect.c +++ b/clients/mapilib/connect.c @@ -381,10 +381,27 @@ connect_socket_tcp_addr(Mapi mid, struct return s; } +static const char * +base_name(const char *file) +{ + char *p = strrchr(file, '/'); +#ifdef _MSC_VER + char *q = strrchr(file, '\\'); + if (q != NULL) { + if (p == NULL || p < q) + p = q; + } +#endif + if (p) + return p + 1; + return file; +} + static void send_all_clientinfo(Mapi mid) { msettings *mp = mid->settings; + void *free_this = NULL; if (!mid->clientinfo_supported) return; if (!msetting_bool(mp, MP_CLIENT_INFO)) @@ -398,9 +415,13 @@ send_all_clientinfo(Mapi mid) hostname[sizeof(hostname) - 1] = '\0'; } const char *application_name = msetting_string(mp, MP_CLIENT_APPLICATION); - if (!application_name[0]) - application_name = mapi_application_name; - const char *client_library = "libmapi " MONETDB_VERSION; + if (!application_name[0]) { + application_name = get_bin_path(); + if (application_name) { + free_this = strdup(application_name); + application_name = base_name(application_name); + } + } const char *client_remark = msetting_string(mp, MP_CLIENT_REMARK); long pid = getpid(); @@ -411,7 +432,10 @@ send_all_clientinfo(Mapi mid) reallocprintf(&buf, &pos, &cap, "ClientHostName=%s\n", hostname); if (application_name[0]) reallocprintf(&buf, &pos, &cap, "ApplicationName=%s\n", application_name); - reallocprintf(&buf, &pos, &cap, "ClientLibrary=%s\n", client_library); + reallocprintf(&buf, &pos, &cap, "ClientLibrary="); + if (mid->clientprefix) + reallocprintf(&buf, &pos, &cap, "%s / ", mid->clientprefix); + reallocprintf(&buf, &pos, &cap, "libmapi %s\n", MONETDB_VERSION); if (client_remark[0]) reallocprintf(&buf, &pos, &cap, "ClientRemark=%s\n", client_remark); if (pid > 0) @@ -425,7 +449,9 @@ send_all_clientinfo(Mapi mid) if (pos <= cap) mapi_Xcommand(mid, "clientinfo", buf); + free(buf); + free(free_this); } static MapiMsg diff --git a/clients/mapilib/mapi.c b/clients/mapilib/mapi.c --- a/clients/mapilib/mapi.c +++ b/clients/mapilib/mapi.c @@ -794,8 +794,6 @@ static void mapi_store_bind(struct MapiR static ATOMIC_FLAG mapi_initialized = ATOMIC_FLAG_INIT; -char mapi_application_name[256] = { 0 }; - /* * Blocking * -------- @@ -2023,6 +2021,7 @@ mapi_destroy(Mapi mid) free(mid->noexplain); if (mid->errorstr && mid->errorstr != mapi_nomem) free(mid->errorstr); + free(mid->clientprefix); msettings_destroy(mid->settings); @@ -2121,15 +2120,6 @@ mapi_disconnect(Mapi mid) return MOK; } -void -mapi_set_application_name(const char *name) -{ - if (name) - strncpy(mapi_application_name, name, sizeof(mapi_application_name)-1); - else - mapi_application_name[0] = '\0'; -} - /* Set callback function to retrieve or send file content for COPY * INTO queries. * @@ -2257,6 +2247,17 @@ mapi_setfilecallback(Mapi mid, mid->filecontentprivate_old = filecontentprivate; } +void +mapi_setclientprefix(Mapi mid, const char *prefix) +{ + free(mid->clientprefix); + if (prefix == NULL) + mid->clientprefix = NULL; + else + mid->clientprefix = strdup(prefix); + +} + #define testBinding(hdl,fnr) \ do { \ mapi_hdl_check(hdl); \ diff --git a/clients/mapilib/mapi.h b/clients/mapilib/mapi.h --- a/clients/mapilib/mapi.h +++ b/clients/mapilib/mapi.h @@ -76,9 +76,6 @@ extern "C" { # endif #endif -/* global state */ -mapi_export void mapi_set_application_name(const char *name); - /* connection-oriented functions */ mapi_export Mapi mapi_mapi(const char *host, int port, const char *username, const char *password, const char *lang, const char *dbname); mapi_export Mapi mapi_mapiuri(const char *url, const char *user, const char *pass, const char *lang); @@ -108,6 +105,7 @@ mapi_export void mapi_setfilecallback( const void *data, size_t size), void *priv) __attribute__((__nonnull__(1))); +mapi_export void mapi_setclientprefix(Mapi mid, const char *prefix); mapi_export MapiMsg mapi_error(Mapi mid) __attribute__((__nonnull__(1))); diff --git a/clients/mapilib/mapi_intern.h b/clients/mapilib/mapi_intern.h --- a/clients/mapilib/mapi_intern.h +++ b/clients/mapilib/mapi_intern.h @@ -238,6 +238,7 @@ struct MapiStruct { MapiMsg error; /* Error occurred */ char *errorstr; /* error from server */ const char *action; /* pointer to constant string */ + char *clientprefix; /* prefix for 'client' clientinfo; NULL or allocated string */ struct BlockCache blk; bool connected; @@ -310,8 +311,6 @@ MapiMsg mapi_Xcommand(Mapi mid, const ch extern const struct MapiStruct MapiStructDefaults; -extern char mapi_application_name[]; - // 'settings' will be newly allocated if NULL Mapi mapi_new(msettings *settings); diff --git a/clients/odbc/driver/ODBCAttrs.c b/clients/odbc/driver/ODBCAttrs.c --- a/clients/odbc/driver/ODBCAttrs.c +++ b/clients/odbc/driver/ODBCAttrs.c @@ -47,6 +47,9 @@ const struct attr_setting attr_settings[ { "LOGFILE", "Log File", MP_LOGFILE }, { "LOGINTIMEOUT", "Login Timeout", MP_CONNECT_TIMEOUT}, { "CONNECTIONTIMEOUT", "Connection Timeout", MP_REPLY_TIMEOUT}, + { "CLIENTINFO", "Send Client Info", MP_CLIENT_INFO }, + { "APPNAME", "Application Name", MP_CLIENT_APPLICATION }, + { "CLIENTREMARK", "Client Remark", MP_CLIENT_REMARK }, }; const int attr_setting_count = sizeof(attr_settings) / sizeof(attr_settings[0]); diff --git a/clients/odbc/driver/SQLConnect.c b/clients/odbc/driver/SQLConnect.c --- a/clients/odbc/driver/SQLConnect.c +++ b/clients/odbc/driver/SQLConnect.c @@ -481,6 +481,7 @@ MNDBConnectSettings(ODBCDbc *dbc, const Mapi mid = mapi_settings(settings); if (mid) { settings = NULL; // will be free'd as part of 'mid' now + mapi_setclientprefix(mid, "ODBC " MONETDB_VERSION); mapi_setAutocommit(mid, dbc->sql_attr_autocommit == SQL_AUTOCOMMIT_ON); mapi_set_size_header(mid, true); mapi_reconnect(mid); diff --git a/clients/odbc/driver/SQLSpecialColumns.c b/clients/odbc/driver/SQLSpecialColumns.c --- a/clients/odbc/driver/SQLSpecialColumns.c +++ b/clients/odbc/driver/SQLSpecialColumns.c @@ -209,7 +209,7 @@ MNDBSpecialColumns(ODBCStmt *stmt, } /* construct the query */ - querylen = 6100 + (sch ? strlen(sch) : 0) + (tab ? strlen(tab) : 0); + querylen = 6130 + (sch ? strlen(sch) : 0) + (tab ? strlen(tab) : 0); query = malloc(querylen); if (query == NULL) goto nomem; @@ -235,9 +235,9 @@ MNDBSpecialColumns(ODBCStmt *stmt, "SELECT \"id\", \"table_id\" FROM \"sys\".\"keys\" WHERE \"type\" = 0 " "UNION ALL " /* and first unique constraint of a table when table has no pkey */ - "SELECT \"id\", \"table_id\" FROM \"sys\".\"keys\" WHERE \"type\" = 1 " + "SELECT \"id\", \"table_id\" FROM \"sys\".\"keys\" WHERE \"type\" IN (1, 3) " "AND \"table_id\" NOT IN (select \"table_id\" from \"sys\".\"keys\" where \"type\" = 0) " - "AND (\"table_id\", \"id\") IN (select \"table_id\", min(\"id\") from \"sys\".\"keys\" where \"type\" = 1 group by \"table_id\"))", + "AND (\"table_id\", \"id\") IN (select \"table_id\", min(\"id\") from \"sys\".\"keys\" where \"type\" IN (1, 3) group by \"table_id\"))", querylen - pos); if (inclTmpKey) { /* we must also include the primary key or unique constraint of local temporary tables which are stored in tmp.keys */ @@ -246,9 +246,9 @@ MNDBSpecialColumns(ODBCStmt *stmt, ", tmpkeys as (" "SELECT \"id\", \"table_id\" FROM \"tmp\".\"keys\" WHERE \"type\" = 0 " "UNION ALL " - "SELECT \"id\", \"table_id\" FROM \"tmp\".\"keys\" WHERE \"type\" = 1 " + "SELECT \"id\", \"table_id\" FROM \"tmp\".\"keys\" WHERE \"type\" IN (1, 3) " "AND \"table_id\" NOT IN (select \"table_id\" from \"tmp\".\"keys\" where \"type\" = 0) " - "AND (\"table_id\", \"id\") IN (select \"table_id\", min(\"id\") from \"tmp\".\"keys\" where \"type\" = 1 group by \"table_id\"))", + "AND (\"table_id\", \"id\") IN (select \"table_id\", min(\"id\") from \"tmp\".\"keys\" where \"type\" IN (1, 3) group by \"table_id\"))", querylen - pos); } _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org