Changeset: 6b4d022af697 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6b4d022af697 Added Files: sql/server/rel_propagate.c sql/server/rel_propagate.h sql/server/sql_partition.c sql/server/sql_partition.h sql/test/merge-partitions/Tests/All sql/test/merge-partitions/Tests/mergepart00.sql sql/test/merge-partitions/Tests/mergepart00.stable.err sql/test/merge-partitions/Tests/mergepart00.stable.out sql/test/merge-partitions/Tests/mergepart01.sql sql/test/merge-partitions/Tests/mergepart01.stable.err sql/test/merge-partitions/Tests/mergepart01.stable.out sql/test/merge-partitions/Tests/mergepart02.sql sql/test/merge-partitions/Tests/mergepart02.stable.err sql/test/merge-partitions/Tests/mergepart02.stable.out sql/test/merge-partitions/Tests/mergepart03.sql sql/test/merge-partitions/Tests/mergepart03.stable.err sql/test/merge-partitions/Tests/mergepart03.stable.out sql/test/merge-partitions/Tests/mergepart04.sql sql/test/merge-partitions/Tests/mergepart04.stable.err sql/test/merge-partitions/Tests/mergepart04.stable.out sql/test/merge-partitions/Tests/mergepart05.sql sql/test/merge-partitions/Tests/mergepart05.stable.err sql/test/merge-partitions/Tests/mergepart05.stable.out sql/test/merge-partitions/Tests/mergepart06.sql sql/test/merge-partitions/Tests/mergepart06.stable.err sql/test/merge-partitions/Tests/mergepart06.stable.out sql/test/merge-partitions/Tests/mergepart07.sql sql/test/merge-partitions/Tests/mergepart07.stable.err sql/test/merge-partitions/Tests/mergepart07.stable.out sql/test/merge-partitions/Tests/mergepart08.sql sql/test/merge-partitions/Tests/mergepart08.stable.err sql/test/merge-partitions/Tests/mergepart08.stable.out sql/test/merge-partitions/Tests/mergepart09.sql sql/test/merge-partitions/Tests/mergepart09.stable.err sql/test/merge-partitions/Tests/mergepart09.stable.out sql/test/merge-partitions/Tests/mergepart10.sql sql/test/merge-partitions/Tests/mergepart10.stable.err sql/test/merge-partitions/Tests/mergepart10.stable.out sql/test/merge-partitions/Tests/mergepart11.sql sql/test/merge-partitions/Tests/mergepart11.stable.err sql/test/merge-partitions/Tests/mergepart11.stable.out sql/test/merge-partitions/Tests/mergepart12.sql sql/test/merge-partitions/Tests/mergepart12.stable.err sql/test/merge-partitions/Tests/mergepart12.stable.out sql/test/merge-partitions/Tests/mergepart13.sql sql/test/merge-partitions/Tests/mergepart13.stable.err sql/test/merge-partitions/Tests/mergepart13.stable.out sql/test/merge-partitions/Tests/mergepart14.sql sql/test/merge-partitions/Tests/mergepart14.stable.err sql/test/merge-partitions/Tests/mergepart14.stable.out sql/test/merge-partitions/Tests/mergepart15.sql sql/test/merge-partitions/Tests/mergepart15.stable.err sql/test/merge-partitions/Tests/mergepart15.stable.out sql/test/merge-partitions/Tests/mergepart16.sql sql/test/merge-partitions/Tests/mergepart16.stable.err sql/test/merge-partitions/Tests/mergepart16.stable.out sql/test/merge-partitions/Tests/mergepart17.sql sql/test/merge-partitions/Tests/mergepart17.stable.err sql/test/merge-partitions/Tests/mergepart17.stable.out sql/test/merge-partitions/Tests/mergepart18.sql sql/test/merge-partitions/Tests/mergepart18.stable.err sql/test/merge-partitions/Tests/mergepart18.stable.out sql/test/merge-partitions/Tests/mergepart19.sql sql/test/merge-partitions/Tests/mergepart19.stable.err sql/test/merge-partitions/Tests/mergepart19.stable.out sql/test/merge-partitions/Tests/mergepart20.sql sql/test/merge-partitions/Tests/mergepart20.stable.err sql/test/merge-partitions/Tests/mergepart20.stable.out sql/test/merge-partitions/Tests/mergepart21.sql sql/test/merge-partitions/Tests/mergepart21.stable.err sql/test/merge-partitions/Tests/mergepart21.stable.out sql/test/merge-partitions/Tests/mergepart22.sql sql/test/merge-partitions/Tests/mergepart22.stable.err sql/test/merge-partitions/Tests/mergepart22.stable.out sql/test/merge-partitions/Tests/mergepart23.py sql/test/merge-partitions/Tests/mergepart23.stable.err sql/test/merge-partitions/Tests/mergepart23.stable.out sql/test/merge-partitions/Tests/mergepart24.sql sql/test/merge-partitions/Tests/mergepart24.stable.err sql/test/merge-partitions/Tests/mergepart24.stable.out sql/test/merge-partitions/Tests/mergepart25.sql sql/test/merge-partitions/Tests/mergepart25.stable.err sql/test/merge-partitions/Tests/mergepart25.stable.out sql/test/merge-partitions/Tests/mergepart26.sql sql/test/merge-partitions/Tests/mergepart26.stable.err sql/test/merge-partitions/Tests/mergepart26.stable.out sql/test/merge-partitions/Tests/mergepart27.sql sql/test/merge-partitions/Tests/mergepart27.stable.err sql/test/merge-partitions/Tests/mergepart27.stable.out sql/test/merge-partitions/Tests/mergepart28.sql.in sql/test/merge-partitions/Tests/mergepart28.stable.err sql/test/merge-partitions/Tests/mergepart28.stable.out Modified Files: clients/Tests/MAL-signatures.stable.out clients/Tests/MAL-signatures.stable.out.int128 clients/Tests/exports.stable.out clients/mapiclient/dump.c clients/mapiclient/mclient.c clients/mapiclient/mhelp.c clients/mapiclient/msqldump.c clients/mapiclient/msqldump.h monetdb5/modules/atoms/mtime.c monetdb5/modules/atoms/mtime.h monetdb5/modules/mal/wlc.mal monetdb5/optimizer/opt_prelude.c monetdb5/optimizer/opt_prelude.h sql/backends/monet5/mal_backend.c sql/backends/monet5/mal_backend.h sql/backends/monet5/rel_bin.c sql/backends/monet5/sql.c sql/backends/monet5/sql_cat.c sql/backends/monet5/sql_cat.h sql/backends/monet5/sql_statement.c sql/backends/monet5/sql_statement.h sql/backends/monet5/sql_upgrades.c sql/backends/monet5/sqlcatalog.mal sql/backends/monet5/wlr.mal sql/common/sql_changeset.c sql/common/sql_list.c sql/common/sql_mem.c sql/include/sql_catalog.h sql/include/sql_list.h sql/include/sql_mem.h sql/include/sql_relation.h sql/jdbc/tests/Tests/Bug_Connect_as_voc_getMetaData_Failure_Bug_6388.stable.out sql/jdbc/tests/Tests/Test_Dobjects.stable.out sql/rel.txt sql/scripts/51_sys_schema_extension.sql sql/server/Makefile.ag sql/server/rel_distribute.c sql/server/rel_dump.c sql/server/rel_exp.c sql/server/rel_exp.h sql/server/rel_optimizer.c sql/server/rel_prop.c sql/server/rel_prop.h sql/server/rel_psm.c sql/server/rel_rel.c sql/server/rel_rel.h sql/server/rel_schema.c sql/server/rel_schema.h sql/server/rel_select.c sql/server/rel_select.h sql/server/rel_updates.c sql/server/rel_updates.h sql/server/sql_atom.c sql/server/sql_atom.h sql/server/sql_mvc.c sql/server/sql_parser.h sql/server/sql_parser.y sql/server/sql_privileges.c sql/server/sql_semantic.c sql/server/sql_semantic.h sql/storage/sql_catalog.c sql/storage/sql_storage.h sql/storage/store.c sql/test/BugTracker-2017/Tests/crash_correlated_subqueries_in_select.Bug-6254.stable.out sql/test/BugTracker-2017/Tests/wrong_aggregation_count.Bug-6257.stable.out sql/test/BugTracker-2018/Tests/groupby_having_orderby_count.Bug-6624.stable.out sql/test/Tests/comment-dump.stable.out sql/test/UserDump/Tests/create.stable.out sql/test/emptydb/Tests/check.stable.out sql/test/emptydb/Tests/check.stable.out.32bit sql/test/emptydb/Tests/check.stable.out.int128 sql/test/mapi/Tests/php_monetdb.stable.out sql/test/testdb/Tests/testdb-dump.stable.out Branch: default Log Message:
Merge with merge-partitions branch. diffs (truncated from 15290 to 300 lines): 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 @@ -10999,7 +10999,10 @@ Ready. [ "sqlblob", "#tostr", "command sqlblob.#tostr():void ", "SQLBLOBtostr;", "" ] [ "sqlblob", "sqlblob", "command sqlblob.sqlblob(s:sqlblob):sqlblob ", "BLOBblob_blob;", "Noop routine." ] [ "sqlblob", "sqlblob", "command sqlblob.sqlblob(s:str):sqlblob ", "BLOBsqlblob_fromstr;", "" ] +[ "sqlcatalog", "alter_add_range_partition", "pattern sqlcatalog.alter_add_range_partition(sname:str, mtnme:str, psnme:str, ptnme:str, min:any_1, max:any_1, nills:int, update:int):void ", "SQLalter_add_range_partition;", "Catalog operation alter_add_range_partition" ] [ "sqlcatalog", "alter_add_table", "pattern sqlcatalog.alter_add_table(sname:str, mtnme:str, psnme:str, ptnme:str, action:int):void ", "SQLalter_add_table;", "Catalog operation alter_add_table" ] +[ "sqlcatalog", "alter_add_value_partition", "pattern sqlcatalog.alter_add_value_partition(sname:str, mtnme:str, psnme:str, ptnme:str, nills:int, update:int):void ", "SQLalter_add_value_partition;", "Catalog operation alter_add_value_partition" ] +[ "sqlcatalog", "alter_add_value_partition", "pattern sqlcatalog.alter_add_value_partition(sname:str, mtnme:str, psnme:str, ptnme:str, nills:int, update:int, arg:any...):void ", "SQLalter_add_value_partition;", "Catalog operation alter_add_value_partition" ] [ "sqlcatalog", "alter_del_table", "pattern sqlcatalog.alter_del_table(sname:str, mtnme:str, psnme:str, ptnme:str, action:int):void ", "SQLalter_del_table;", "Catalog operation alter_del_table" ] [ "sqlcatalog", "alter_seq", "pattern sqlcatalog.alter_seq(sname:str, seqname:str, seq:ptr, val:lng):void ", "SQLalter_seq;", "Catalog operation alter_seq" ] [ "sqlcatalog", "alter_set_table", "pattern sqlcatalog.alter_set_table(sname:str, tnme:str, access:int):void ", "SQLalter_set_table;", "Catalog operation alter_set_table" ] @@ -11214,7 +11217,10 @@ Ready. [ "wkba", "#tostr", "command wkba.#tostr():void ", "wkbaTOSTR;", "" ] [ "wkba", "#write", "command wkba.#write():void ", "wkbaWRITE;", "" ] [ "wlc", "action", "pattern wlc.action(q:str):void ", "WLCaction;", "Keep the database changing queries for replay. " ] +[ "wlc", "alter_add_range_partition", "pattern wlc.alter_add_range_partition(sname:str, mtnme:str, psnme:str, ptnme:str, min:str, max:str, nills:int, update:int):void ", "WLCgeneric;", "Catalog operation alter_add_range_partition" ] [ "wlc", "alter_add_table", "pattern wlc.alter_add_table(sname:str, mtnme:str, psnme:str, ptnme:str, action:int):void ", "WLCgeneric;", "Catalog operation alter_add_table" ] +[ "wlc", "alter_add_value_partition", "pattern wlc.alter_add_value_partition(sname:str, mtnme:str, psnme:str, ptnme:str, nills:int, update:int):void ", "WLCgeneric;", "Catalog operation alter_add_value_partition" ] +[ "wlc", "alter_add_value_partition", "pattern wlc.alter_add_value_partition(sname:str, mtnme:str, psnme:str, ptnme:str, nills:int, update:int, arg:str...):void ", "WLCgeneric;", "Catalog operation alter_add_value_partition" ] [ "wlc", "alter_del_table", "pattern wlc.alter_del_table(sname:str, mtnme:str, psnme:str, ptnme:str, action:int):void ", "WLCgeneric;", "Catalog operation alter_del_table" ] [ "wlc", "alter_seq", "pattern wlc.alter_seq(sname:str, seqname:str, val:lng):void ", "WLCgeneric;", "Catalog operation alter_seq" ] [ "wlc", "alter_set_table", "pattern wlc.alter_set_table(sname:str, tnme:str, access:int):void ", "WLCgeneric;", "Catalog operation alter_set_table" ] @@ -11274,7 +11280,10 @@ Ready. [ "wlc", "transaction_rollback", "pattern wlc.transaction_rollback(chain:int, name:str):void ", "WLCgeneric;", "A transaction statement (type can be commit,release,rollback or start)" ] [ "wlc", "update", "pattern wlc.update(sname:str, tname:str, cname:str, tid:any, val:any):int ", "WLCupdate;", "Keep the update in the workload-capture-replay list" ] [ "wlr", "action", "pattern wlr.action(q:str):void ", "WLRaction;", "A query producing updates" ] +[ "wlr", "alter_add_range_partition", "pattern wlr.alter_add_range_partition(sname:str, mtnme:str, psnme:str, ptnme:str, min:str, max:str, nills:int, update:int):void ", "WLRgeneric;", "Catalog operation alter_add_range_partition" ] [ "wlr", "alter_add_table", "pattern wlr.alter_add_table(sname:str, mtnme:str, psnme:str, ptnme:str, action:int):void ", "WLRgeneric;", "Catalog operation alter_add_table" ] +[ "wlr", "alter_add_value_partition", "pattern wlr.alter_add_value_partition(sname:str, mtnme:str, psnme:str, ptnme:str, nills:int, update:int):void ", "WLRgeneric;", "Catalog operation alter_add_value_partition" ] +[ "wlr", "alter_add_value_partition", "pattern wlr.alter_add_value_partition(sname:str, mtnme:str, psnme:str, ptnme:str, nills:int, update:int, arg:str...):void ", "WLRgeneric;", "Catalog operation alter_add_value_partition" ] [ "wlr", "alter_del_table", "pattern wlr.alter_del_table(sname:str, mtnme:str, psnme:str, ptnme:str, action:int):void ", "WLRgeneric;", "Catalog operation alter_del_table" ] [ "wlr", "alter_seq", "pattern wlr.alter_seq(sname:str, seqname:str, val:lng):void ", "WLRgeneric;", "Catalog operation alter_seq" ] [ "wlr", "alter_set_table", "pattern wlr.alter_set_table(sname:str, tnme:str, access:int):void ", "WLRgeneric;", "Catalog operation alter_set_table" ] 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 @@ -15212,7 +15212,10 @@ Ready. [ "sqlblob", "#tostr", "command sqlblob.#tostr():void ", "SQLBLOBtostr;", "" ] [ "sqlblob", "sqlblob", "command sqlblob.sqlblob(s:sqlblob):sqlblob ", "BLOBblob_blob;", "Noop routine." ] [ "sqlblob", "sqlblob", "command sqlblob.sqlblob(s:str):sqlblob ", "BLOBsqlblob_fromstr;", "" ] +[ "sqlcatalog", "alter_add_range_partition", "pattern sqlcatalog.alter_add_range_partition(sname:str, mtnme:str, psnme:str, ptnme:str, min:any_1, max:any_1, nills:int, update:int):void ", "SQLalter_add_range_partition;", "Catalog operation alter_add_range_partition" ] [ "sqlcatalog", "alter_add_table", "pattern sqlcatalog.alter_add_table(sname:str, mtnme:str, psnme:str, ptnme:str, action:int):void ", "SQLalter_add_table;", "Catalog operation alter_add_table" ] +[ "sqlcatalog", "alter_add_value_partition", "pattern sqlcatalog.alter_add_value_partition(sname:str, mtnme:str, psnme:str, ptnme:str, nills:int, update:int):void ", "SQLalter_add_value_partition;", "Catalog operation alter_add_value_partition" ] +[ "sqlcatalog", "alter_add_value_partition", "pattern sqlcatalog.alter_add_value_partition(sname:str, mtnme:str, psnme:str, ptnme:str, nills:int, update:int, arg:any...):void ", "SQLalter_add_value_partition;", "Catalog operation alter_add_value_partition" ] [ "sqlcatalog", "alter_del_table", "pattern sqlcatalog.alter_del_table(sname:str, mtnme:str, psnme:str, ptnme:str, action:int):void ", "SQLalter_del_table;", "Catalog operation alter_del_table" ] [ "sqlcatalog", "alter_seq", "pattern sqlcatalog.alter_seq(sname:str, seqname:str, seq:ptr, val:lng):void ", "SQLalter_seq;", "Catalog operation alter_seq" ] [ "sqlcatalog", "alter_set_table", "pattern sqlcatalog.alter_set_table(sname:str, tnme:str, access:int):void ", "SQLalter_set_table;", "Catalog operation alter_set_table" ] @@ -15428,7 +15431,10 @@ Ready. [ "wkba", "#tostr", "command wkba.#tostr():void ", "wkbaTOSTR;", "" ] [ "wkba", "#write", "command wkba.#write():void ", "wkbaWRITE;", "" ] [ "wlc", "action", "pattern wlc.action(q:str):void ", "WLCaction;", "Keep the database changing queries for replay. " ] +[ "wlc", "alter_add_range_partition", "pattern wlc.alter_add_range_partition(sname:str, mtnme:str, psnme:str, ptnme:str, min:str, max:str, nills:int, update:int):void ", "WLCgeneric;", "Catalog operation alter_add_range_partition" ] [ "wlc", "alter_add_table", "pattern wlc.alter_add_table(sname:str, mtnme:str, psnme:str, ptnme:str, action:int):void ", "WLCgeneric;", "Catalog operation alter_add_table" ] +[ "wlc", "alter_add_value_partition", "pattern wlc.alter_add_value_partition(sname:str, mtnme:str, psnme:str, ptnme:str, nills:int, update:int):void ", "WLCgeneric;", "Catalog operation alter_add_value_partition" ] +[ "wlc", "alter_add_value_partition", "pattern wlc.alter_add_value_partition(sname:str, mtnme:str, psnme:str, ptnme:str, nills:int, update:int, arg:str...):void ", "WLCgeneric;", "Catalog operation alter_add_value_partition" ] [ "wlc", "alter_del_table", "pattern wlc.alter_del_table(sname:str, mtnme:str, psnme:str, ptnme:str, action:int):void ", "WLCgeneric;", "Catalog operation alter_del_table" ] [ "wlc", "alter_seq", "pattern wlc.alter_seq(sname:str, seqname:str, val:lng):void ", "WLCgeneric;", "Catalog operation alter_seq" ] [ "wlc", "alter_set_table", "pattern wlc.alter_set_table(sname:str, tnme:str, access:int):void ", "WLCgeneric;", "Catalog operation alter_set_table" ] @@ -15488,7 +15494,10 @@ Ready. [ "wlc", "transaction_rollback", "pattern wlc.transaction_rollback(chain:int, name:str):void ", "WLCgeneric;", "A transaction statement (type can be commit,release,rollback or start)" ] [ "wlc", "update", "pattern wlc.update(sname:str, tname:str, cname:str, tid:any, val:any):int ", "WLCupdate;", "Keep the update in the workload-capture-replay list" ] [ "wlr", "action", "pattern wlr.action(q:str):void ", "WLRaction;", "A query producing updates" ] +[ "wlr", "alter_add_range_partition", "pattern wlr.alter_add_range_partition(sname:str, mtnme:str, psnme:str, ptnme:str, min:str, max:str, nills:int, update:int):void ", "WLRgeneric;", "Catalog operation alter_add_range_partition" ] [ "wlr", "alter_add_table", "pattern wlr.alter_add_table(sname:str, mtnme:str, psnme:str, ptnme:str, action:int):void ", "WLRgeneric;", "Catalog operation alter_add_table" ] +[ "wlr", "alter_add_value_partition", "pattern wlr.alter_add_value_partition(sname:str, mtnme:str, psnme:str, ptnme:str, nills:int, update:int):void ", "WLRgeneric;", "Catalog operation alter_add_value_partition" ] +[ "wlr", "alter_add_value_partition", "pattern wlr.alter_add_value_partition(sname:str, mtnme:str, psnme:str, ptnme:str, nills:int, update:int, arg:str...):void ", "WLRgeneric;", "Catalog operation alter_add_value_partition" ] [ "wlr", "alter_del_table", "pattern wlr.alter_del_table(sname:str, mtnme:str, psnme:str, ptnme:str, action:int):void ", "WLRgeneric;", "Catalog operation alter_del_table" ] [ "wlr", "alter_seq", "pattern wlr.alter_seq(sname:str, seqname:str, val:lng):void ", "WLRgeneric;", "Catalog operation alter_seq" ] [ "wlr", "alter_set_table", "pattern wlr.alter_set_table(sname:str, tnme:str, access:int):void ", "WLRgeneric;", "Catalog operation alter_set_table" ] 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 @@ -1999,7 +1999,9 @@ str affectedRowsRef; str aggrRef; str alarmRef; str algebraRef; +str alter_add_range_partitionRef; str alter_add_tableRef; +str alter_add_value_partitionRef; str alter_constraintRef; str alter_del_tableRef; str alter_functionRef; diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c --- a/clients/mapiclient/dump.c +++ b/clients/mapiclient/dump.c @@ -813,9 +813,9 @@ dump_column_definition(Mapi mid, stream } int -describe_table(Mapi mid, const char *schema, const char *tname, stream *toConsole, int foreign) +describe_table(Mapi mid, const char *schema, const char *tname, stream *toConsole, int foreign, bool databaseDump) { - int cnt; + int cnt, table_id = 0; MapiHdl hdl = NULL; char *query; char *view = NULL; @@ -846,7 +846,7 @@ describe_table(Mapi mid, const char *sch query = malloc(maxquerylen); snprintf(query, maxquerylen, "%s " - "SELECT t.name, t.query, t.type, c.remark " + "SELECT t.name, t.query, t.type, t.id, c.remark " "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 " @@ -863,7 +863,8 @@ describe_table(Mapi mid, const char *sch if (view) type = atoi(view); view = mapi_fetch_field(hdl, 1); - remark = mapi_fetch_field(hdl, 3); + table_id = atoi(mapi_fetch_field(hdl, 3)); + remark = mapi_fetch_field(hdl, 4); } if (mapi_error(mid)) { view = NULL; @@ -900,14 +901,34 @@ describe_table(Mapi mid, const char *sch mnstr_printf(toConsole, "%s\n", view); comment_on(toConsole, "VIEW", schema, tname, NULL, remark); } else { + if(!databaseDump) { //if it is not a database dump the table might depend on UDFs that must be dumped first + assert(table_id); + snprintf(query, maxquerylen, + "SELECT f.id, s.name, f.name " + "FROM sys.schemas s, " + "sys.functions f " + "WHERE s.id = f.schema_id AND " + "f.id IN (SELECT id FROM sys.dependencies WHERE depend_id = '%d')", + table_id); + if ((hdl = mapi_query(mid, query)) == NULL || mapi_error(mid)) + goto bailout; + while(mapi_fetch_row(hdl) != 0) { + const char* function_id = mapi_fetch_field(hdl, 0); + const char* schema_name = mapi_fetch_field(hdl, 1); + const char* function_name = mapi_fetch_field(hdl, 2); + dump_functions(mid, toConsole, 0, schema_name, function_name, function_id); + } + mapi_close_handle(hdl); + hdl = NULL; + } /* the table is a real table */ mnstr_printf(toConsole, "CREATE %sTABLE \"%s\".\"%s\" ", - type == 3 ? "MERGE " : - type == 4 ? "STREAM " : - type == 5 ? "REMOTE " : - type == 6 ? "REPLICA " : - "", - schema, tname); + (type == 3 || type == 12 || type == 13 || type == 14 || type == 15) ? "MERGE " : + type == 4 ? "STREAM " : + type == 5 ? "REMOTE " : + type == 6 ? "REPLICA " : + "", + schema, tname); if (dump_column_definition(mid, toConsole, schema, tname, NULL, foreign, hashge)) goto bailout; @@ -927,6 +948,29 @@ describe_table(Mapi mid, const char *sch mnstr_printf(toConsole, " ON '%s' WITH USER '%s' ENCRYPTED PASSWORD '%s'", view, rt_user, rt_hash); mapi_close_handle(hdl); hdl = NULL; + } else if(type >= 12 && type <= 15) { /* partitioned table */ + const char *phow = (type == 12 || type == 14) ? "VALUES" : "RANGE"; + const char *pusing = (type == 12 || type == 13) ? "ON" : "USING"; + const char *expr = NULL; + + if(type == 12 || type == 13) { /* by column */ + snprintf(query, maxquerylen, + "SELECT c.name FROM schemas s, tables t, columns c, table_partitions tp " + "WHERE s.name = '%s' AND t.name = '%s' AND s.id = t.schema_id AND t.id = c.table_id " + "AND c.id = tp.column_id", schema, tname); + } else { /* by expression */ + snprintf(query, maxquerylen, + "SELECT tp.expression FROM schemas s, tables t, table_partitions tp " + "WHERE s.name = '%s' AND t.name = '%s' AND s.id = t.schema_id AND t.id = tp.table_id", + schema, tname); + } + if ((hdl = mapi_query(mid, query)) == NULL || mapi_error(mid)) + goto bailout; + while(mapi_fetch_row(hdl) != 0) + expr = mapi_fetch_field(hdl, 0); + mnstr_printf(toConsole, " PARTITION BY %s %s (%s)", phow, pusing, expr); + mapi_close_handle(hdl); + hdl = NULL; } mnstr_printf(toConsole, ";\n"); comment_on(toConsole, "TABLE", schema, tname, NULL, remark); @@ -1412,11 +1456,12 @@ dump_table_data(Mapi mid, const char *sc } int -dump_table(Mapi mid, const char *schema, const char *tname, stream *toConsole, int describe, int foreign, bool useInserts) +dump_table(Mapi mid, const char *schema, const char *tname, stream *toConsole, int describe, int foreign, + bool useInserts, bool databaseDump) { int rc; - rc = describe_table(mid, schema, tname, toConsole, foreign); + rc = describe_table(mid, schema, tname, toConsole, foreign, databaseDump); if (rc == 0 && !describe) rc = dump_table_data(mid, schema, tname, toConsole, useInserts); return rc; @@ -1840,27 +1885,28 @@ dump_database(Mapi mid, stream *toConsol "sys.schemas s " "WHERE s.id = seq.schema_id " "ORDER BY s.name, seq.name"; - 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 = - ", vft (sname, name, id, query, remark) AS (" - "SELECT s.name AS sname, " + /* we must dump tables, views, procedures and triggers in order of creation since they can refer to each other */ + const char *tables_views_functions_triggers = + ", vft (sname, name, id, query, remark, type) AS (" + "SELECT s.name AS sname, " /* tables */ + "t.name AS name, " + "t.id AS id, " + "NULL AS query, " + "NULL AS remark, " + "t.type AS type " + "FROM sys.schemas s, " + "sys._tables t " + "WHERE t.type IN (0, 3, 4, 5, 6, 12, 13, 14, 15) AND " + "t.system = FALSE AND " + "s.id = t.schema_id AND " + "s.name <> 'tmp' " + "UNION " + "SELECT s.name AS sname, " /* views */ "t.name AS name, " "t.id AS id, " "t.query AS query, " - "rem.remark AS remark " + "rem.remark AS remark, " + "NULL AS type " "FROM sys.schemas s, " "sys._tables t LEFT OUTER JOIN comments rem ON t.id = rem.id " "WHERE t.type = 1 AND " @@ -1868,28 +1914,34 @@ dump_database(Mapi mid, stream *toConsol "s.id = t.schema_id AND " "s.name <> 'tmp' " "UNION " - "SELECT s.name AS sname, " + "SELECT s.name AS sname, " /* functions */ "f.name AS name, " "f.id AS id, " "NULL AS query, " - "NULL AS remark " /* emitted separately */ + "NULL AS remark, " /* emitted separately */ + "NULL AS type " "FROM sys.schemas s, " "sys.functions f " "WHERE s.id = f.schema_id " "AND f.id NOT IN (SELECT function_id FROM sys.systemfunctions) " "UNION " - "SELECT s.name AS sname, " + "SELECT s.name AS sname, " /* triggers */ "tr.name AS name, " "tr.id AS id, " "tr.\"statement\" AS query, " - "NULL AS remark " /* not available yet */ + "NULL AS remark, " /* not available yet */ + "NULL AS type " "FROM sys.triggers tr, " "sys.schemas s, " "sys._tables t " "WHERE s.id = t.schema_id AND " "t.id = tr.table_id AND t.system = FALSE" ") " - "SELECT id, sname, name, query, remark FROM vft ORDER BY id"; + "SELECT id, sname, name, query, remark, type FROM vft ORDER BY id"; + const char *mergetables = "SELECT t1.type, 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 IN (3, 12, 13, 14, 15) " + "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"; char *sname = NULL; char *curschema = NULL; MapiHdl hdl = NULL; @@ -2058,19 +2110,28 @@ dump_database(Mapi mid, stream *toConsol mapi_close_handle(hdl); hdl = NULL; - /* dump tables, note that merge tables refer to other tables, + /* dump tables, views, functions and triggers + * note that merge tables refer to other tables, * so we make sure the contents of merge tables are added _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list