Changeset: ecd08de36217 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ecd08de36217
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/include/sql_relation.h
        sql/server/rel_schema.c
        sql/storage/store.c
        sql/test/BugTracker-2015/Tests/adddrop_unknown_table.Bug-3718.stable.err
        sql/test/mergetables/Tests/doubletable.stable.err
        sql/test/mergetables/Tests/mergedropcrash.stable.err
Branch: default
Log Message:

moved the alter table add/del table and alter table set read/append only 
/writable to the mal part only. Reduces a lot of copying of table-structures.
only flush log changes after 1M changes.


diffs (truncated from 540 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, *pt; 
+
+       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; 
+
+       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/include/sql_relation.h b/sql/include/sql_relation.h
--- a/sql/include/sql_relation.h
+++ b/sql/include/sql_relation.h
@@ -117,6 +117,10 @@ typedef struct expression {
 #define DDL_CREATE_ROLE 59
 #define DDL_DROP_ROLE  60
 
+#define DDL_ALTER_TABLE_ADD_TABLE  61
+#define DDL_ALTER_TABLE_DEL_TABLE  62
+#define DDL_ALTER_TABLE_SET_ACCESS  63
+
 #define MAXOPS 21
 
 typedef enum operator_type {
diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -51,6 +51,30 @@ rel_table(mvc *sql, int cat_type, char *
        return rel;
 }
 
+static sql_rel *
+rel_alter_table(sql_allocator *sa, int cattype, char *sname, char *tname, char 
*sname2, char *tname2, int action)
+{
+       sql_rel *rel = rel_create(sa);
+       list *exps = new_exp_list(sa);
+
+       append(exps, exp_atom_clob(sa, sname));
+       append(exps, exp_atom_clob(sa, tname));
+       assert((sname2 && tname2) || (!sname2 && !tname2));
+       if (sname2) {
+               append(exps, exp_atom_clob(sa, sname2));
+               append(exps, exp_atom_clob(sa, tname2));
+       }
+       append(exps, exp_atom_int(sa, action));
+       rel->l = NULL;
+       rel->r = NULL;
+       rel->op = op_ddl;
+       rel->flag = cattype;
+       rel->exps = exps;
+       rel->card = CARD_MULTI;
+       rel->nrcols = 0;
+       return rel;
+}
+
 sql_rel *
 rel_list(sql_allocator *sa, sql_rel *l, sql_rel *r) 
 {
@@ -1073,44 +1097,8 @@ get_schema_name( mvc *sql, char *sname, 
        return sname;
 }
 
-static int
-rel_check_tables(mvc *sql, sql_table *nt, sql_table *nnt)
-{
-       node *n, *m;
-
-       if (cs_size(&nt->columns) != cs_size(&nnt->columns)) {
-               (void) sql_error(sql, 02, "3F000!ALTER MERGE TABLE: to be added 
table doesn't match MERGE TABLE definition");
-               return -1;
-       }
-       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;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to