Changeset: f360933fa058 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f360933fa058 Added Files: sql/backends/monet5/UDF/capi/Tests/capi14.sql sql/backends/monet5/UDF/capi/Tests/capi14.stable.err sql/backends/monet5/UDF/capi/Tests/capi14.stable.out sql/test/BugTracker-2018/Tests/sqlitelogictest-complex-case-not-in.Bug-6594.sql sql/test/BugTracker-2018/Tests/temp-table-performance.Bug-6577.sql Modified Files: clients/mapiclient/dump.c clients/mapiclient/mclient.c clients/mapiclient/msqldump.h clients/odbc/driver/SQLColumnPrivileges.c clients/odbc/driver/SQLTablePrivileges.c sql/backends/monet5/UDF/capi/Tests/All sql/backends/monet5/UDF/capi/capi.c sql/storage/bat/bat_logger.c sql/test/BugTracker-2018/Tests/All Branch: default Log Message:
Merge with Mar2018 diffs (truncated from 848 to 300 lines): diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c --- a/clients/mapiclient/dump.c +++ b/clients/mapiclient/dump.c @@ -15,6 +15,16 @@ #include <ctype.h> #include "msqldump.h" +static const char * +get_compat_clause(Mapi mid) +{ + static const char *compat_clause = NULL; + if (!compat_clause) { + compat_clause = get_with_comments_as_clause(mid); + } + return compat_clause; +} + static void quoted_print(stream *f, const char *s, bool singleq) { @@ -790,15 +800,17 @@ describe_table(Mapi mid, const char *sch hashge = has_hugeint(mid); - maxquerylen = 512 + strlen(tname) + strlen(schema); + maxquerylen = 5120 + strlen(tname) + strlen(schema); query = malloc(maxquerylen); snprintf(query, maxquerylen, + "%s\n" "SELECT t.name, t.query, t.type, c.remark " - "FROM sys.schemas s, sys._tables t LEFT OUTER JOIN sys.comments c ON t.id = c.id " + "FROM sys.schemas s, sys._tables t LEFT OUTER JOIN comments c ON t.id = c.id " "WHERE s.name = '%s' AND " "t.schema_id = s.id AND " "t.name = '%s'", + get_compat_clause(mid), schema, tname); if ((hdl = mapi_query(mid, query)) == NULL || mapi_error(mid)) @@ -937,7 +949,10 @@ describe_table(Mapi mid, const char *sch if (cnt) mnstr_printf(toConsole, ");\n"); snprintf(query, maxquerylen, - "SELECT i.name, c.remark FROM sys.idxs i, sys.comments c WHERE i.id = c.id AND i.table_id = (SELECT id FROM sys._tables WHERE schema_id = (select id FROM sys.schemas WHERE name = '%s') AND name = '%s') ORDER BY i.name", schema, tname); + "%s\n" + "SELECT i.name, c.remark FROM sys.idxs i, comments c WHERE i.id = c.id AND i.table_id = (SELECT id FROM sys._tables WHERE schema_id = (select id FROM sys.schemas WHERE name = '%s') AND name = '%s') ORDER BY i.name", + get_compat_clause(mid), + schema, tname); if ((hdl = mapi_query(mid, query)) == NULL || mapi_error(mid)) goto bailout; while (mapi_fetch_row(hdl) != 0) { @@ -950,13 +965,16 @@ describe_table(Mapi mid, const char *sch } snprintf(query, maxquerylen, - "SELECT col.name, com.remark FROM sys._columns col, sys.comments com WHERE col.id = com.id AND col.table_id = (SELECT id FROM sys._tables WHERE schema_id = (SELECT id FROM sys.schemas WHERE name = '%s') AND name = '%s') ORDER BY number", schema, tname); + "%s\n" + "SELECT col.name, com.remark FROM sys._columns col, comments com WHERE col.id = com.id AND col.table_id = (SELECT id FROM sys._tables WHERE schema_id = (SELECT id FROM sys.schemas WHERE name = '%s') AND name = '%s') ORDER BY number", + get_compat_clause(mid), + schema, tname); if ((hdl = mapi_query(mid, query)) == NULL || mapi_error(mid)) goto bailout; while (mapi_fetch_row(hdl) != 0) { comment_on(toConsole, "COLUMN", schema, tname, - mapi_fetch_field(hdl, 0), - mapi_fetch_field(hdl, 1)); + mapi_fetch_field(hdl, 0), + mapi_fetch_field(hdl, 1)); } mapi_close_handle(hdl); hdl = NULL; @@ -1015,10 +1033,11 @@ describe_sequence(Mapi mid, const char * schema = sname; } - maxquerylen = 512 + strlen(tname) + strlen(schema); + maxquerylen = 5120 + strlen(tname) + strlen(schema); query = malloc(maxquerylen); snprintf(query, maxquerylen, + "%s\n" "SELECT s.name, " "seq.name, " "get_value_for(s.name,seq.name), " @@ -1027,12 +1046,13 @@ describe_sequence(Mapi mid, const char * "seq.\"increment\", " "seq.\"cycle\", " "rem.\"remark\" " - "FROM sys.sequences seq LEFT OUTER JOIN sys.comments rem ON seq.id = rem.id, " + "FROM sys.sequences seq LEFT OUTER JOIN comments rem ON seq.id = rem.id, " "sys.schemas s " "WHERE s.id = seq.schema_id AND " "s.name = '%s' AND " "seq.name = '%s' " "ORDER BY s.name,seq.name", + get_compat_clause(mid), schema, tname); if ((hdl = mapi_query(mid, query)) == NULL || mapi_error(mid)) @@ -1095,15 +1115,17 @@ int describe_schema(Mapi mid, const char *sname, stream *toConsole) { MapiHdl hdl = NULL; - char schemas[256]; + char schemas[5120]; - snprintf(schemas, 256, + snprintf(schemas, 5120, + "%s\n" "SELECT s.name, a.name, c.remark " "FROM sys.auths a, " - "sys.schemas s LEFT OUTER JOIN sys.comments c ON s.id = c.id " + "sys.schemas s LEFT OUTER JOIN comments c ON s.id = c.id " "WHERE s.\"authorization\" = a.id AND " "s.name = '%s' " "ORDER BY s.name", + get_compat_clause(mid), sname); if ((hdl = mapi_query(mid, schemas)) == NULL || mapi_error(mid)) { @@ -1161,7 +1183,7 @@ dump_table_data(Mapi mid, const char *sc schema = sname; } - maxquerylen = 512 + strlen(tname) + strlen(schema); + maxquerylen = 5120 + strlen(tname) + strlen(schema); query = malloc(maxquerylen); snprintf(query, maxquerylen, @@ -1308,7 +1330,7 @@ dump_table(Mapi mid, const char *schema, static int dump_function_comment(Mapi mid, stream *toConsole, const char *id) { - int len = 1000; + int len = 5120; char *query = malloc(len); MapiHdl hdl = NULL; int hashge; @@ -1317,6 +1339,7 @@ dump_function_comment(Mapi mid, stream * return 1; snprintf(query, len, + "%s\n" "SELECT \n" " coalesce(function_type_keyword, '') AS category,\n" " s.name AS schema,\n" @@ -1327,12 +1350,14 @@ dump_function_comment(Mapi mid, stream * " CASE RANK() OVER (PARTITION BY f.id ORDER BY p.number DESC) WHEN 1 THEN c.remark ELSE NULL END AS remark,\n" " ROW_NUMBER() OVER (ORDER BY f.id, p.number) AS line\n" "FROM sys.functions f\n" - "JOIN sys.comments c ON f.id = c.id\n" + "JOIN comments c ON f.id = c.id\n" "JOIN sys.schemas s ON f.schema_id = s.id\n" "LEFT OUTER JOIN sys.function_types ft ON f.type = ft.function_type_id\n" "LEFT OUTER JOIN sys.args p ON f.id = p.func_id AND p.inout = 1\n" "WHERE f.id = %s\n" - "ORDER BY line;", id); + "ORDER BY line;", + get_compat_clause(mid), + id); hashge = has_hugeint(mid); hdl = mapi_query(mid, query); @@ -1394,18 +1419,26 @@ static int dump_function(Mapi mid, stream *toConsole, const char *fid, int hashge) { MapiHdl hdl; - size_t qlen = 400 + strlen(fid); + size_t qlen = 5120 + strlen(fid); char *query = malloc(qlen); + char *q, *end_q; const char *sep; - char *ffunc, *flkey; + char *ffunc = NULL, *flkey = NULL; const char *sname, *fname, *ftkey; int flang, ftype; if (!query) return 1; - snprintf(query, qlen, "SELECT f.id, f.func, f.language, f.type, s.name, f.name, ft.function_type_keyword, fl.language_keyword FROM sys.functions f JOIN sys.schemas s ON f.schema_id = s.id JOIN sys.function_types ft ON f.type = ft.function_type_id LEFT OUTER JOIN sys.function_languages fl ON f.language = fl.language_id WHERE f.id = %s", fid); - hdl = mapi_query(mid, query); + q = query; + end_q = query + qlen; + q += snprintf(q, q - end_q, "%s\n", get_compat_clause(mid)); + q += snprintf(q, q - end_q, "SELECT f.id, f.func, f.language, f.type, s.name, f.name, function_type_keyword, language_keyword FROM sys.functions f JOIN sys.schemas s ON f.schema_id = s.id JOIN function_types ft ON f.type = ft.function_type_id LEFT OUTER JOIN function_languages fl ON f.language = fl.language_id WHERE f.id = %s;", fid); + if ((hdl = mapi_query(mid, query)) == NULL || mapi_error(mid)) { + free(query); + return 1; + } + if (mapi_fetch_row(hdl) == 0) { free(query); mapi_close_handle(hdl); @@ -1444,8 +1477,12 @@ dump_function(Mapi mid, stream *toConsol mnstr_printf(toConsole, "("); snprintf(query, qlen, "SELECT a.name, a.type, a.type_digits, a.type_scale, a.inout FROM sys.args a, sys.functions f WHERE a.func_id = f.id AND f.id = %s ORDER BY a.inout DESC, a.number", fid); mapi_close_handle(hdl); - hdl = mapi_query(mid, query); - free(query); + if ((hdl = mapi_query(mid, query)) == NULL || mapi_error(mid)) { + free(query); + free(ffunc); + free(flkey); + return 1; + } sep = ""; while (mapi_fetch_row(hdl) != 0) { const char *aname = mapi_fetch_field(hdl, 0); @@ -1492,6 +1529,7 @@ dump_function(Mapi mid, stream *toConsol } mnstr_printf(toConsole, "\n%s\n", ffunc); free(ffunc); + free(query); return 0; } @@ -1529,7 +1567,7 @@ dump_functions(Mapi mid, stream *toConso wantSystem = 0; } - len = 500 + (sname ? strlen(sname) : 0) + (fname ? strlen(fname) : 0); + len = 5120 + (sname ? strlen(sname) : 0) + (fname ? strlen(fname) : 0); query = malloc(len); if (query == NULL) { if (to_free) @@ -1537,13 +1575,14 @@ dump_functions(Mapi mid, stream *toConso return 1; } q = query; - end_q = q + len; + end_q = query + len; + q += snprintf(q, end_q - q, "%s\n", get_compat_clause(mid)); q += snprintf(q, end_q - q, "SELECT s.id, s.name, f.id, LENGTH(rem.remark) AS remark_len " "FROM sys.schemas s " "JOIN sys.functions f ON s.id = f.schema_id " - "LEFT OUTER JOIN sys.comments rem ON f.id = rem.id " + "LEFT OUTER JOIN comments rem ON f.id = rem.id " "WHERE f.language > 0 "); if (sname) q += snprintf(q, end_q - q, "AND s.name = '%s' ", sname); @@ -1694,34 +1733,15 @@ dump_database(Mapi mid, stream *toConsol "ORDER BY s.name, f.name, a.name, g.name, p.grantable"; const char *schemas = "SELECT s.name, a.name, rem.remark " - "FROM sys.schemas s LEFT OUTER JOIN sys.comments rem ON s.id = rem.id, " + "FROM sys.schemas s LEFT OUTER JOIN comments rem ON s.id = rem.id, " "sys.auths a " "WHERE s.\"authorization\" = a.id AND " "s.system = FALSE " "ORDER BY s.name"; - /* alternative, but then need to handle NULL in second column: - SELECT "s"."name", "a"."name" - FROM "sys"."schemas" "s" - LEFT OUTER JOIN "sys"."auths" "a" - ON "s"."authorization" = "a"."id" AND - "s"."system" = FALSE - ORDER BY "s"."name" - - This may be needed after a sequence: - - CREATE USER "voc" WITH PASSWORD 'voc' NAME 'xxx' SCHEMA "sys"; - CREATE SCHEMA "voc" AUTHORIZATION "voc"; - ALTER USER "voc" SET SCHEMA "voc"; - DROP USER "voc"; - - In this case, the authorization value for voc in the - schemas table has no corresponding value in the auths table - anymore. - */ const char *sequences1 = "SELECT sch.name,seq.name, rem.remark " "FROM sys.schemas sch, " - "sys.sequences seq LEFT OUTER JOIN sys.comments rem ON seq.id = rem.id " + "sys.sequences seq LEFT OUTER JOIN comments rem ON seq.id = rem.id " "WHERE sch.id = seq.schema_id " "ORDER BY sch.name,seq.name"; const char *sequences2 = @@ -1751,14 +1771,14 @@ dump_database(Mapi mid, stream *toConsol /* we must dump views, functions and triggers in order of * creation since they can refer to each other */ const char *views_functions_triggers = - "WITH vft (sname, name, id, query, remark) AS (" + ", vft (sname, name, id, query, remark) AS (" "SELECT s.name AS sname, " "t.name AS name, " "t.id AS id, " "t.query AS query, " "rem.remark AS remark " "FROM sys.schemas s, " - "sys._tables t LEFT OUTER JOIN sys.comments rem ON t.id = rem.id " + "sys._tables t LEFT OUTER JOIN comments rem ON t.id = rem.id " "WHERE t.type = 1 AND " "t.system = FALSE AND " "s.id = t.schema_id AND " @@ -1788,9 +1808,17 @@ dump_database(Mapi mid, stream *toConsol "SELECT id, sname, name, query, remark FROM vft ORDER BY id"; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list