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