Changeset: bf89cf4f0086 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bf89cf4f0086 Modified Files: clients/Tests/MAL-signatures.stable.out clients/Tests/MAL-signatures.stable.out.int128 sql/backends/monet5/rel_bin.c sql/backends/monet5/sql.c sql/backends/monet5/sql.mal sql/benchmarks/ssbm/Tests/01-plan.stable.out sql/benchmarks/ssbm/Tests/02-plan.stable.out sql/benchmarks/ssbm/Tests/03-plan.stable.out sql/benchmarks/ssbm/Tests/04-plan.stable.out sql/benchmarks/ssbm/Tests/05-plan.stable.out sql/benchmarks/ssbm/Tests/06-plan.stable.out sql/benchmarks/ssbm/Tests/07-plan.stable.out sql/benchmarks/ssbm/Tests/08-plan.stable.out sql/benchmarks/ssbm/Tests/09-plan.stable.out sql/benchmarks/ssbm/Tests/10-plan.stable.out sql/benchmarks/ssbm/Tests/11-plan.stable.out sql/benchmarks/ssbm/Tests/12-plan.stable.out sql/benchmarks/ssbm/Tests/13-plan.stable.out sql/benchmarks/tpch/Tests/02-plan.stable.out sql/benchmarks/tpch/Tests/03-plan.stable.out sql/benchmarks/tpch/Tests/03-plan.stable.out.int128 sql/benchmarks/tpch/Tests/05-plan.stable.out sql/benchmarks/tpch/Tests/05-plan.stable.out.int128 sql/benchmarks/tpch/Tests/07-plan.stable.out.int128 sql/benchmarks/tpch/Tests/08-plan.stable.out sql/benchmarks/tpch/Tests/08-plan.stable.out.int128 sql/benchmarks/tpch/Tests/09-plan.stable.out sql/benchmarks/tpch/Tests/09-plan.stable.out.int128 sql/benchmarks/tpch/Tests/11-explain.stable.out.int128 sql/benchmarks/tpch/Tests/11-plan.stable.out sql/benchmarks/tpch/Tests/11-plan.stable.out.int128 sql/benchmarks/tpch/Tests/12-plan.stable.out sql/benchmarks/tpch/Tests/13-plan.stable.out sql/benchmarks/tpch/Tests/14-plan.stable.out.int128 sql/benchmarks/tpch/Tests/16-plan.stable.out sql/benchmarks/tpch/Tests/17-plan.stable.out sql/benchmarks/tpch/Tests/17-plan.stable.out.int128 sql/benchmarks/tpch/Tests/19-plan.stable.out.int128 sql/benchmarks/tpch/Tests/20-plan.stable.out sql/benchmarks/tpch/Tests/20-plan.stable.out.int128 sql/benchmarks/tpch/Tests/21-plan.stable.out sql/benchmarks/tpch/Tests/22-plan.stable.out sql/include/sql_relation.h sql/server/rel_optimizer.c sql/server/rel_schema.c sql/server/rel_select.c sql/storage/store.c sql/test/BugTracker-2011/Tests/crash_on_alias.Bug-2798.stable.out.int128 sql/test/BugTracker-2015/Tests/adddrop_unknown_table.Bug-3718.stable.err sql/test/BugTracker/Tests/explain.SF-1739353.stable.out sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out.32bit sql/test/Triggers/trigger_activation.sql sql/test/mergetables/Tests/doubletable.stable.err sql/test/mergetables/Tests/mergedropcrash.stable.err Branch: default Log Message:
Merge with default diffs (truncated from 1744 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 @@ -40509,6 +40509,14 @@ pattern sql.clear_table{unsafe}(sname:st address mvc_clear_table_wrap; comment Clear table +pattern sql.catalog(type:int,msname:str,mtname:str,psname:str,ptname:str,action:int):void +address SQLcatalog; +comment a alter table add/del table catalog statement + +pattern sql.catalog(type:int,sname:str,tname:str,access:int):void +address SQLcatalog; +comment a alter table access statement + pattern sql.catalog(type:int,iname:str,itype:int,sname:str,tname:str...):void address SQLcatalog; comment a create index 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 @@ -51444,6 +51444,14 @@ pattern sql.clear_table{unsafe}(sname:st address mvc_clear_table_wrap; comment Clear table +pattern sql.catalog(type:int,msname:str,mtname:str,psname:str,ptname:str,action:int):void +address SQLcatalog; +comment a alter table add/del table catalog statement + +pattern sql.catalog(type:int,sname:str,tname:str,access:int):void +address SQLcatalog; +comment a alter table access statement + pattern sql.catalog(type:int,iname:str,itype:int,sname:str,tname:str...):void address SQLcatalog; comment a create index catalog statement diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c --- a/sql/backends/monet5/rel_bin.c +++ b/sql/backends/monet5/rel_bin.c @@ -4371,7 +4371,7 @@ rel2bin_ddl(mvc *sql, sql_rel *rel, list } else if (rel->flag <= DDL_ALTER_TABLE) { s = rel2bin_catalog_table(sql, rel, refs); sql->type = Q_SCHEMA; - } else if (rel->flag <= DDL_DROP_ROLE) { + } else if (rel->flag <= DDL_ALTER_TABLE_SET_ACCESS) { s = rel2bin_catalog2(sql, rel, refs); sql->type = Q_SCHEMA; } diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c --- a/sql/backends/monet5/sql.c +++ b/sql/backends/monet5/sql.c @@ -516,29 +516,6 @@ alter_table(mvc *sql, char *sname, sql_t } } - if (t->access != nt->access) { - if (t->access && table_has_updates(sql->session->tr, nt)) - return sql_message("40000!ALTER TABLE: set READ or INSERT ONLY not possible with outstanding updates (wait until updates are flushed)\n"); - mvc_access(sql, nt, t->access); - } - - /* check for changes */ - if (t->tables.dset) - for (n = t->tables.dset->h; n; n = n->next) { - /* propagate alter table .. drop table */ - sql_table *at = n->data; - sql_table *pt = mvc_bind_table(sql, nt->s, at->base.name); - - sql_trans_del_table(sql->session->tr, nt, pt, at->drop_action); - } - for (n = t->tables.nelm; n; n = n->next) { - /* propagate alter table .. add table */ - sql_table *at = n->data; - sql_table *pt = mvc_bind_table(sql, nt->s, at->base.name); - - sql_trans_add_table(sql->session->tr, nt, pt); - } - /* check for changes */ if (t->columns.dset) for (n = t->columns.dset->h; n; n = n->next) { @@ -1042,6 +1019,108 @@ drop_trigger(mvc *sql, char *sname, char } static char * +rel_check_tables(sql_table *nt, sql_table *nnt) +{ + node *n, *m; + + if (cs_size(&nt->columns) != cs_size(&nnt->columns)) + return sql_message("3F000!ALTER MERGE TABLE: to be added table doesn't match MERGE TABLE definition"); + for (n = nt->columns.set->h, m = nnt->columns.set->h; n && m; n = n->next, m = m->next) { + sql_column *nc = n->data; + sql_column *mc = m->data; + + if (subtype_cmp(&nc->type, &mc->type) != 0) + return sql_message("3F000!ALTER MERGE TABLE: to be added table column type doesn't match MERGE TABLE definition"); + } + if (cs_size(&nt->idxs) != cs_size(&nnt->idxs)) + return sql_message("3F000!ALTER MERGE TABLE: to be added table index doesn't match MERGE TABLE definition"); + if (cs_size(&nt->idxs)) + for (n = nt->idxs.set->h, m = nnt->idxs.set->h; n && m; n = n->next, m = m->next) { + sql_idx *ni = n->data; + sql_idx *mi = m->data; + + if (ni->type != mi->type) + return sql_message("3F000!ALTER MERGE TABLE: to be added table index type doesn't match MERGE TABLE definition"); + } + return MAL_SUCCEED; +} + +static char * +alter_table_add_table(mvc *sql, char *msname, char *mtname, char *psname, char *ptname) +{ + sql_schema *ms = mvc_bind_schema(sql, msname), *ps = mvc_bind_schema(sql, psname); + sql_table *mt = NULL, *pt = NULL; + + if (ms) + mt = mvc_bind_table(sql, ms, mtname); + if (ps) + pt = mvc_bind_table(sql, ps, ptname); + if (mt && pt) { + char *msg; + node *n = cs_find_id(&mt->tables, pt->base.id); + + if (n) + return sql_message("42S02!ALTER TABLE: table '%s.%s' is already part of the MERGE TABLE '%s.%s'", psname, ptname, msname, mtname); + if ((msg = rel_check_tables(mt, pt)) != NULL) + return msg; + sql_trans_add_table(sql->session->tr, mt, pt); + } else if (mt) { + return sql_message("42S02!ALTER TABLE: no such table '%s' in schema '%s'", ptname, psname); + } else { + return sql_message("42S02!ALTER TABLE: no such table '%s' in schema '%s'", mtname, msname); + } + return MAL_SUCCEED; +} + +static char * +alter_table_del_table(mvc *sql, char *msname, char *mtname, char *psname, char *ptname, int drop_action) +{ + sql_schema *ms = mvc_bind_schema(sql, msname), *ps = mvc_bind_schema(sql, psname); + sql_table *mt = NULL, *pt = NULL; + + if (ms) + mt = mvc_bind_table(sql, ms, mtname); + if (ps) + pt = mvc_bind_table(sql, ps, ptname); + if (mt && pt) { + node *n = NULL; + + if (!pt || (n = cs_find_id(&mt->tables, pt->base.id)) == NULL) + return sql_message("42S02!ALTER TABLE: table '%s.%s' isn't part of the MERGE TABLE '%s.%s'", psname, ptname, msname, mtname); + + sql_trans_del_table(sql->session->tr, mt, pt, drop_action); + } else if (mt) { + return sql_message("42S02!ALTER TABLE: no such table '%s' in schema '%s'", ptname, psname); + } else { + return sql_message("42S02!ALTER TABLE: no such table '%s' in schema '%s'", mtname, msname); + } + return MAL_SUCCEED; +} + +static char * +alter_table_set_access(mvc *sql, char *sname, char *tname, int access) +{ + sql_schema *s = mvc_bind_schema(sql, sname); + sql_table *t = NULL; + + if (s) + t = mvc_bind_table(sql, s, tname); + if (t) { + if (t->type == tt_merge_table) + return sql_message("42S02!ALTER TABLE: read only MERGE TABLES are not supported"); + if (t->access != access) { + if (access && table_has_updates(sql->session->tr, t)) + return sql_message("40000!ALTER TABLE: set READ or INSERT ONLY not possible with outstanding updates (wait until updates are flushed)\n"); + + mvc_access(sql, t, access); + } + } else { + return sql_message("42S02!ALTER TABLE: no such table '%s' in schema '%s'", tname, sname); + } + return MAL_SUCCEED; +} + +static char * SaveArgReference(MalStkPtr stk, InstrPtr pci, int arg) { char *val = *getArgReference_str(stk, pci, arg); @@ -1279,6 +1358,27 @@ SQLcatalog(Client cntxt, MalBlkPtr mb, M msg = drop_trigger(sql, sname, triggername); break; } + case DDL_ALTER_TABLE_ADD_TABLE:{ + char *mtname = SaveArgReference(stk, pci, 3); + char *psname = SaveArgReference(stk, pci, 4); + char *ptname = SaveArgReference(stk, pci, 5); + + return alter_table_add_table(sql, sname, mtname, psname, ptname); + } + case DDL_ALTER_TABLE_DEL_TABLE:{ + char *mtname = SaveArgReference(stk, pci, 3); + char *psname = SaveArgReference(stk, pci, 4); + char *ptname = SaveArgReference(stk, pci, 5); + int drop_action = *getArgReference_int(stk, pci, 6); + + return alter_table_del_table(sql, sname, mtname, psname, ptname, drop_action); + } + case DDL_ALTER_TABLE_SET_ACCESS:{ + char *tname = SaveArgReference(stk, pci, 3); + int access = *getArgReference_int(stk, pci, 4); + + return alter_table_set_access(sql, sname, tname, access); + } default: throw(SQL, "sql.catalog", "catalog unknown type"); } diff --git a/sql/backends/monet5/sql.mal b/sql/backends/monet5/sql.mal --- a/sql/backends/monet5/sql.mal +++ b/sql/backends/monet5/sql.mal @@ -95,6 +95,14 @@ pattern catalog(type:int,iname:str,itype address SQLcatalog comment "a create index catalog statement"; +pattern catalog(type:int,sname:str,tname:str,access:int):void +address SQLcatalog +comment "a alter table access statement"; + +pattern catalog(type:int,msname:str,mtname:str,psname:str,ptname:str,action:int):void +address SQLcatalog +comment "a alter table add/del table catalog statement"; + pattern eval(cmd:str):void address SQLstatement comment "Compile and execute a single sql statement"; diff --git a/sql/benchmarks/ssbm/Tests/01-plan.stable.out b/sql/benchmarks/ssbm/Tests/01-plan.stable.out --- a/sql/benchmarks/ssbm/Tests/01-plan.stable.out +++ b/sql/benchmarks/ssbm/Tests/01-plan.stable.out @@ -41,10 +41,10 @@ project ( | | join ( | | | select ( | | | | table(sys.lineorder) [ lineorder.lo_quantity, lineorder.lo_extendedprice, lineorder.lo_discount, lineorder.%lineorder_lo_orderdate_fkey NOT NULL JOINIDX sys.lineorder.lineorder_lo_orderdate_fkey ] COUNT -| | | ) [ int[tinyint "1"] <= lineorder.lo_discount <= int[tinyint "3"], lineorder.lo_quantity < int[tinyint "25"] ], +| | | ) [ int "1" <= lineorder.lo_discount <= int "3", lineorder.lo_quantity < int "25" ], | | | select ( | | | | table(sys.dwdate) [ dwdate.d_year, dwdate.%TID% NOT NULL ] COUNT -| | | ) [ dwdate.d_year = int[smallint "1993"] ] +| | | ) [ dwdate.d_year = int "1993" ] | | ) [ lineorder.%lineorder_lo_orderdate_fkey NOT NULL = dwdate.%TID% NOT NULL JOINIDX sys.lineorder.lineorder_lo_orderdate_fkey ] | ) [ ] [ sys.sum no nil (sys.sql_mul(bigint[lineorder.lo_extendedprice] as lineorder.lo_extendedprice, lineorder.lo_discount)) as L1.L1 ] ) [ L1 as L1.revenue ] diff --git a/sql/benchmarks/ssbm/Tests/02-plan.stable.out b/sql/benchmarks/ssbm/Tests/02-plan.stable.out --- a/sql/benchmarks/ssbm/Tests/02-plan.stable.out +++ b/sql/benchmarks/ssbm/Tests/02-plan.stable.out @@ -41,7 +41,7 @@ project ( | | join ( | | | select ( | | | | table(sys.lineorder) [ lineorder.lo_quantity, lineorder.lo_extendedprice, lineorder.lo_discount, lineorder.%lineorder_lo_orderdate_fkey NOT NULL JOINIDX sys.lineorder.lineorder_lo_orderdate_fkey ] COUNT -| | | ) [ int[tinyint "4"] <= lineorder.lo_discount <= int[tinyint "6"], int[tinyint "26"] <= lineorder.lo_quantity <= int[tinyint "35"] ], +| | | ) [ int "4" <= lineorder.lo_discount <= int "6", int "26" <= lineorder.lo_quantity <= int "35" ], | | | select ( | | | | table(sys.dwdate) [ dwdate.d_yearmonthnum, dwdate.%TID% NOT NULL ] COUNT | | | ) [ dwdate.d_yearmonthnum = int "199401" ] diff --git a/sql/benchmarks/ssbm/Tests/03-plan.stable.out b/sql/benchmarks/ssbm/Tests/03-plan.stable.out --- a/sql/benchmarks/ssbm/Tests/03-plan.stable.out +++ b/sql/benchmarks/ssbm/Tests/03-plan.stable.out @@ -41,10 +41,10 @@ project ( | | join ( | | | select ( | | | | table(sys.lineorder) [ lineorder.lo_quantity, lineorder.lo_extendedprice, lineorder.lo_discount, lineorder.%lineorder_lo_orderdate_fkey NOT NULL JOINIDX sys.lineorder.lineorder_lo_orderdate_fkey ] COUNT -| | | ) [ int[tinyint "5"] <= lineorder.lo_discount <= int[tinyint "7"], int[tinyint "36"] <= lineorder.lo_quantity <= int[tinyint "40"] ], +| | | ) [ int "5" <= lineorder.lo_discount <= int "7", int "36" <= lineorder.lo_quantity <= int "40" ], | | | select ( | | | | table(sys.dwdate) [ dwdate.d_year, dwdate.d_weeknuminyear, dwdate.%TID% NOT NULL ] COUNT -| | | ) [ dwdate.d_year = int[smallint "1994"], dwdate.d_weeknuminyear = int[tinyint "6"] ] +| | | ) [ dwdate.d_year = int "1994", dwdate.d_weeknuminyear = int "6" ] | | ) [ lineorder.%lineorder_lo_orderdate_fkey NOT NULL = dwdate.%TID% NOT NULL JOINIDX sys.lineorder.lineorder_lo_orderdate_fkey ] | ) [ ] [ sys.sum no nil (sys.sql_mul(bigint[lineorder.lo_extendedprice] as lineorder.lo_extendedprice, lineorder.lo_discount)) as L1.L1 ] ) [ L1 as L1.revenue ] diff --git a/sql/benchmarks/ssbm/Tests/04-plan.stable.out b/sql/benchmarks/ssbm/Tests/04-plan.stable.out --- a/sql/benchmarks/ssbm/Tests/04-plan.stable.out +++ b/sql/benchmarks/ssbm/Tests/04-plan.stable.out @@ -47,11 +47,11 @@ project ( | | | | | table(sys.lineorder) [ lineorder.lo_revenue, lineorder.%lineorder_lo_orderdate_fkey NOT NULL JOINIDX sys.lineorder.lineorder_lo_orderdate_fkey, lineorder.%lineorder_lo_suppkey_fkey NOT NULL JOINIDX sys.lineorder.lineorder_lo_suppkey_fkey, lineorder.%lineorder_lo_partkey_fkey NOT NULL JOINIDX sys.lineorder.lineorder_lo_partkey_fkey ] COUNT , | | | | | select ( | | | | | | table(sys.part) [ part.p_category, part.p_brand1, part.%TID% NOT NULL ] COUNT -| | | | | ) [ part.p_category = clob[char(7) "MFGR#12"] ] +| | | | | ) [ part.p_category = clob "MFGR#12" ] | | | | ) [ lineorder.%lineorder_lo_partkey_fkey NOT NULL = part.%TID% NOT NULL JOINIDX sys.lineorder.lineorder_lo_partkey_fkey ], | | | | select ( | | | | | table(sys.supplier) [ supplier.s_region, supplier.%TID% NOT NULL ] COUNT -| | | | ) [ supplier.s_region = clob[char(7) "AMERICA"] ] +| | | | ) [ supplier.s_region = clob "AMERICA" ] | | | ) [ lineorder.%lineorder_lo_suppkey_fkey NOT NULL = supplier.%TID% NOT NULL JOINIDX sys.lineorder.lineorder_lo_suppkey_fkey ], | | | table(sys.dwdate) [ dwdate.d_year, dwdate.%TID% NOT NULL ] COUNT | | ) [ lineorder.%lineorder_lo_orderdate_fkey NOT NULL = dwdate.%TID% NOT NULL JOINIDX sys.lineorder.lineorder_lo_orderdate_fkey ] diff --git a/sql/benchmarks/ssbm/Tests/05-plan.stable.out b/sql/benchmarks/ssbm/Tests/05-plan.stable.out --- a/sql/benchmarks/ssbm/Tests/05-plan.stable.out +++ b/sql/benchmarks/ssbm/Tests/05-plan.stable.out _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list