Changeset: c13a71261676 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c13a71261676 Added Files: sql/test/BugTracker-2015/Tests/backslash_predecing_separator.Bug-3775.stable.err sql/test/BugTracker-2015/Tests/backslash_predecing_separator.Bug-3775.stable.out sql/test/BugTracker-2015/Tests/quantile_function_resolution.Bug-3773.sql sql/test/BugTracker-2015/Tests/quantile_function_resolution.Bug-3773.stable.err sql/test/BugTracker-2015/Tests/quantile_function_resolution.Bug-3773.stable.out sql/test/Users/Tests/util.py Modified Files: Makefile.ag clients/Tests/MAL-signatures.stable.out clients/Tests/MAL-signatures.stable.out.int128 clients/mapiclient/dump.c clients/mapiclient/mclient.c clients/mapiclient/msqldump.h clients/odbc/driver/SQLTables.c monetdb5/modules/kernel/mmath.c monetdb5/modules/mal/tablet.c sql/backends/monet5/sql.c sql/backends/monet5/sql.mal sql/common/sql_types.c sql/common/sql_types.h sql/server/rel_schema.c sql/server/rel_select.c sql/server/rel_select.h sql/server/sql_parser.y sql/server/sql_privileges.c sql/server/sql_privileges.h sql/test/BugTracker-2015/Tests/All sql/test/BugTracker-2015/Tests/backslash_predecing_separator.Bug-3775.sql sql/test/BugTracker-2015/Tests/create-temp-table-using-like.Bug-3767.stable.err sql/test/BugTracker-2015/Tests/create-temp-table-using-like.Bug-3767.stable.out sql/test/BugTracker-2015/Tests/schema_view2.Bug-3766.stable.err sql/test/BugTracker-2015/Tests/schema_view2.Bug-3766.stable.out sql/test/UserDump/Tests/create.stable.out sql/test/Users/Tests/changePasswordUser.SQL.py sql/test/Users/Tests/changeSchemaUser.SQL.py sql/test/Users/Tests/dropManyUsers.Bug-3764.SQL.py sql/test/Users/Tests/grantMonetdbToRegularUser.Bug-3771.SQL.py sql/test/Users/Tests/grantMonetdbToSchemaOwner.Bug-3771.SQL.py sql/test/Users/Tests/grantRevokeAndGrantAgain.Bug-3765.SQL.py sql/test/Users/Tests/grantRole.Bug-3772.SQL.py sql/test/Users/Tests/renameUser.SQL.py sql/test/Users/Tests/role.SQL.py sql/test/quantiles/Tests/quantiles.stable.err sql/test/quantiles/Tests/quantiles.stable.out sql/test/testdb-upgrade-chain/Tests/dump.stable.out sql/test/testdb-upgrade-chain/Tests/dump.stable.out.Windows sql/test/testdb-upgrade/Tests/dump.stable.out sql/test/testdb-upgrade/Tests/dump.stable.out.Windows sql/test/testdb/Tests/testdb-dump.stable.out sql/test/testdb/Tests/testdb-dump.stable.out.Windows sql/test/testdb/Tests/testdb-load.sql sql/test/testdb/Tests/testdb-load.stable.out Branch: leftmart Log Message:
merge with default diffs (truncated from 2919 to 300 lines): diff --git a/Makefile.ag b/Makefile.ag --- a/Makefile.ag +++ b/Makefile.ag @@ -16,7 +16,7 @@ SUBDIRS = buildtools common clients \ EXTRA_DIST = bootstrap configure configure.ac configure.ag libversions \ MonetDB.spec rpm.mk.in COPYING README license.txt HowToStart.rst -EXTRA_DIST_DIR = NT debian +EXTRA_DIST_DIR = NT debian MacOSX headers_config = { DIR = includedir/monetdb 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 @@ -40543,10 +40543,14 @@ pattern sql.catalog(type:int,user:str,pa address SQLcatalog; comment a user catalog statement -pattern sql.catalog(type:int,grantee:str,role:str):void +pattern sql.catalog(type:int,grantee:str,role:str,grantor:int,admin:int):void address SQLcatalog; comment a grant/revoke role statement +pattern sql.catalog(type:int,sname:str,tname:str):void +address SQLcatalog; +comment a catalog trigger statement + pattern sql.catalog(type:int,sname:str,t:ptr,restart:lng):void address SQLcatalog; comment a catalog statement 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 @@ -51478,10 +51478,14 @@ pattern sql.catalog(type:int,user:str,pa address SQLcatalog; comment a user catalog statement -pattern sql.catalog(type:int,grantee:str,role:str):void +pattern sql.catalog(type:int,grantee:str,role:str,grantor:int,admin:int):void address SQLcatalog; comment a grant/revoke role statement +pattern sql.catalog(type:int,sname:str,tname:str):void +address SQLcatalog; +comment a catalog trigger statement + pattern sql.catalog(type:int,sname:str,t:ptr,restart:lng):void address SQLcatalog; comment a catalog statement diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c --- a/clients/mapiclient/dump.c +++ b/clients/mapiclient/dump.c @@ -758,6 +758,7 @@ describe_table(Mapi mid, char *schema, c MapiHdl hdl = NULL; char *query; char *view = NULL; + int type = 0; size_t maxquerylen; char *sname = NULL; @@ -779,7 +780,7 @@ describe_table(Mapi mid, char *schema, c query = malloc(maxquerylen); snprintf(query, maxquerylen, - "SELECT t.name, t.query " + "SELECT t.name, t.query, t.type " "FROM sys._tables t, sys.schemas s " "WHERE s.name = '%s' AND " "t.schema_id = s.id AND " @@ -791,6 +792,9 @@ describe_table(Mapi mid, char *schema, c cnt = 0; while ((mapi_fetch_row(hdl)) != 0) { cnt++; + view = mapi_fetch_field(hdl, 2); + if (view) + type = atoi(view); view = mapi_fetch_field(hdl, 1); } if (mapi_error(mid)) { @@ -811,15 +815,23 @@ describe_table(Mapi mid, char *schema, c goto bailout; } - if (view) { + if (type == 1) { /* the table is actually a view */ mnstr_printf(toConsole, "%s\n", view); } else { /* the table is a real table */ - mnstr_printf(toConsole, "CREATE TABLE \"%s\".\"%s\" ", schema, tname); + mnstr_printf(toConsole, "CREATE %sTABLE \"%s\".\"%s\" ", + type == 3 ? "MERGE " : + type == 4 ? "STREAM " : + type == 5 ? "REMOTE " : + type == 6 ? "REPLICA " : + "", + schema, tname); if (dump_column_definition(mid, toConsole, schema, tname, NULL, foreign)) goto bailout; + if (type == 5) + mnstr_printf(toConsole, " ON '%s'", view); mnstr_printf(toConsole, ";\n"); snprintf(query, maxquerylen, @@ -1043,7 +1055,7 @@ describe_schema(Mapi mid, char *sname, s return 0; } -int +static int dump_table_data(Mapi mid, char *schema, char *tname, stream *toConsole, const char useInserts) { @@ -1072,7 +1084,7 @@ dump_table_data(Mapi mid, char *schema, query = malloc(maxquerylen); snprintf(query, maxquerylen, - "SELECT t.name, t.query " + "SELECT t.name, t.query, t.type " "FROM sys._tables t, sys.schemas s " "WHERE s.name = '%s' AND " "t.schema_id = s.id AND " @@ -1089,7 +1101,7 @@ dump_table_data(Mapi mid, char *schema, goto bailout; } while ((mapi_fetch_row(hdl)) != 0) { - if (mapi_fetch_field(hdl, 1)) { + if (strcmp(mapi_fetch_field(hdl, 2), "1") == 0) { /* the table is actually a view */ goto doreturn; } @@ -1113,9 +1125,9 @@ dump_table_data(Mapi mid, char *schema, } mnstr_printf(toConsole, - "COPY %s RECORDS INTO \"%s\".\"%s\" " - "FROM stdin USING DELIMITERS '\\t','\\n','\"';\n", - cntfld, schema, tname); + "COPY %s RECORDS INTO \"%s\".\"%s\" " + "FROM stdin USING DELIMITERS '\\t','\\n','\"';\n", + cntfld, schema, tname); } mapi_close_handle(hdl); hdl = NULL; @@ -1141,7 +1153,7 @@ dump_table_data(Mapi mid, char *schema, if (useInserts) mnstr_printf(toConsole, "INSERT INTO \"%s\".\"%s\" VALUES (", - schema, tname); + schema, tname); for (i = 0; i < cnt; i++) { s = mapi_fetch_field(hdl, i); @@ -1408,40 +1420,51 @@ dump_database(Mapi mid, stream *toConsol "sys.schemas s " "WHERE s.id = seq.schema_id " "ORDER BY s.name,seq.name"; - const char *tables_and_functions = - "WITH tf AS (" + const char *tables = + "SELECT s.name AS sname, " + "t.name AS name, " + "t.type AS type " + "FROM sys.schemas s, " + "sys._tables t " + "WHERE t.type IN (0, 3, 4, 5, 6) AND " + "t.system = FALSE AND " + "s.id = t.schema_id AND " + "s.name <> 'tmp' " + "ORDER BY t.id"; + const char *mergetables = "SELECT s1.name, t1.name, s2.name, t2.name FROM sys.schemas s1, sys._tables t1, sys.dependencies d, sys.schemas s2, sys._tables t2 WHERE t1.type = 3 AND t1.schema_id = s1.id AND s1.name <> 'tmp' AND t1.system = FALSE AND t1.id = d.depend_id AND d.id = t2.id AND t2.schema_id = s2.id ORDER BY t1.id, t2.id"; + /* 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 AS (" "SELECT s.name AS sname, " - "f.name AS name, " - "f.id AS id, " - "f.func AS func " - "FROM sys.schemas s, " - "sys.functions f " - "WHERE f.language < 3 AND " - "s.id = f.schema_id " - "%s" /* and f.id not in systemfunctions */ - "UNION " - "SELECT s.name AS sname, " - "t.name AS name, " "t.id AS id, " - "CAST(NULL AS VARCHAR(8196)) AS func " + "t.query AS query " "FROM sys.schemas s, " "sys._tables t " - "WHERE t.type BETWEEN 0 AND 1 AND " + "WHERE t.type = 1 AND " "t.system = FALSE AND " "s.id = t.schema_id AND " "s.name <> 'tmp' " "UNION " "SELECT s.name AS sname, " - "tr.name AS name, " + "f.id AS id, " + "f.func AS query " + "FROM sys.schemas s, " + "sys.functions f " + "WHERE f.language < 3 AND " + "s.id = f.schema_id " + "%s" /* and f.id not in systemfunctions */ + "UNION " + "SELECT s.name AS sname, " "tr.id AS id, " - "tr.\"statement\" AS func " + "tr.\"statement\" AS query " "FROM sys.triggers tr, " "sys.schemas s, " "sys._tables t " "WHERE s.id = t.schema_id AND " "t.id = tr.table_id" ") " - "SELECT * FROM tf ORDER BY tf.id"; + "SELECT sname, query FROM vft ORDER BY id"; char *sname; char *curschema = NULL; MapiHdl hdl; @@ -1616,10 +1639,10 @@ dump_database(Mapi mid, stream *toConsol mapi_close_handle(hdl); hdl = NULL; - /* dump tables and functions */ - snprintf(query, sizeof(query), tables_and_functions, - has_systemfunctions(mid) ? "AND f.id NOT IN (SELECT function_id FROM sys.systemfunctions) " : ""); - if ((hdl = mapi_query(mid, query)) == NULL || + /* dump tables, note that merge tables refer to other tables, + * so we make sure the contents of merge tables are added + * (ALTERed) after all table definitions */ + if ((hdl = mapi_query(mid, tables)) == NULL || mapi_error(mid)) goto bailout; @@ -1628,7 +1651,7 @@ dump_database(Mapi mid, stream *toConsol mapi_fetch_row(hdl) != 0) { char *schema = mapi_fetch_field(hdl, 0); char *tname = mapi_fetch_field(hdl, 1); - char *func = mapi_fetch_field(hdl, 3); + int type = atoi(mapi_fetch_field(hdl, 2)); if (mapi_error(mid)) goto bailout; @@ -1645,15 +1668,81 @@ dump_database(Mapi mid, stream *toConsol mnstr_printf(toConsole, "SET SCHEMA \"%s\";\n", curschema); } - if (func == NULL) { - schema = strdup(schema); - tname = strdup(tname); - rc = dump_table(mid, schema, tname, toConsole, describe, describe, useInserts); - free(schema); - free(tname); - } else - mnstr_printf(toConsole, "%s\n", func); + schema = strdup(schema); + tname = strdup(tname); + rc = dump_table(mid, schema, tname, toConsole, type == 3 || type == 5 ? 1 : describe, describe, useInserts); + free(schema); + free(tname); } + mapi_close_handle(hdl); + hdl = NULL; + + if ((hdl = mapi_query(mid, mergetables)) == NULL || + mapi_error(mid)) + goto bailout; + + while (rc == 0 && + !mnstr_errnr(toConsole) && + mapi_fetch_row(hdl) != 0) { + char *schema1 = mapi_fetch_field(hdl, 0); + char *tname1 = mapi_fetch_field(hdl, 1); + char *schema2 = mapi_fetch_field(hdl, 2); + char *tname2 = mapi_fetch_field(hdl, 3); + + if (mapi_error(mid)) + goto bailout; + if (schema1 == NULL || schema2 == NULL) { + /* cannot happen, but make analysis tools happy */ + continue; + } + if (sname != NULL && strcmp(schema1, sname) != 0) + continue; + if (curschema == NULL || strcmp(schema2, curschema) != 0) { + if (curschema) + free(curschema); + curschema = strdup(schema2); + mnstr_printf(toConsole, "SET SCHEMA \"%s\";\n", + curschema); + } + mnstr_printf(toConsole, "ALTER TABLE \"%s\".\"%s\" ADD TABLE \"%s\";\n", + schema1, tname1, tname2); + } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list