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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list