Changeset: e915cdbda23a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e915cdbda23a
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_cat.c
        sql/common/sql_list.c
        sql/include/sql_catalog.h
        sql/server/rel_distribute.c
        sql/server/rel_optimizer.c
        sql/server/rel_propagate.c
        sql/server/rel_schema.c
        sql/server/rel_select.c
        sql/server/rel_updates.c
        sql/server/sql_partition.c
        sql/storage/sql_catalog.c
        sql/storage/store.c
Branch: Jun2020
Log Message:

moved sql_part to the schema level. When we handle changes at
the schema level (after handling table changes), we are always sure
the tables exist.
sql part now holds a pointer to the merge/replica table and
the member.


diffs (truncated from 1848 to 300 lines):

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
@@ -4079,7 +4079,7 @@ rel2bin_insert(backend *be, sql_rel *rel
                pin = refs_find_rel(refs, prel);
 
        if (constraint && !be->first_statement_generated)
-               sql_insert_check_null(be, (be->cur_append && t->p) ? t->p : t, 
inserts->op4.lval);
+               sql_insert_check_null(be, /*(be->cur_append && t->p) ? t->p :*/ 
t, inserts->op4.lval);
 
        l = sa_list(sql->sa);
 
@@ -4091,12 +4091,14 @@ rel2bin_insert(backend *be, sql_rel *rel
        }
 
 /* before */
+#if 0
        if (be->cur_append && !be->first_statement_generated) {
                for(sql_table *up = t->p ; up ; up = up->p) {
                        if (!sql_insert_triggers(be, up, updates, 0))
                                return sql_error(sql, 02, SQLSTATE(27000) 
"INSERT INTO: triggers failed for table '%s'", up->base.name);
                }
        }
+#endif
        if (!sql_insert_triggers(be, t, updates, 0))
                return sql_error(sql, 02, SQLSTATE(27000) "INSERT INTO: 
triggers failed for table '%s'", t->base.name);
 
@@ -4132,12 +4134,14 @@ rel2bin_insert(backend *be, sql_rel *rel
        if (!insert)
                return NULL;
 
+#if 0
        if (be->cur_append && !be->first_statement_generated) {
                for(sql_table *up = t->p ; up ; up = up->p) {
                        if (!sql_insert_triggers(be, up, updates, 1))
                                return sql_error(sql, 02, SQLSTATE(27000) 
"INSERT INTO: triggers failed for table '%s'", up->base.name);
                }
        }
+#endif
        if (!sql_insert_triggers(be, t, updates, 1))
                return sql_error(sql, 02, SQLSTATE(27000) "INSERT INTO: 
triggers failed for table '%s'", t->base.name);
        if (ddl) {
@@ -4994,7 +4998,7 @@ sql_update(backend *be, sql_table *t, st
        node *n;
 
        if (!be->first_statement_generated)
-               sql_update_check_null(be, (be->cur_append && t->p) ? t->p : t, 
updates);
+               sql_update_check_null(be, /*(be->cur_append && t->p) ? t->p :*/ 
t, updates);
 
        /* check keys + get idx */
        idx_updates = update_idxs_and_check_keys(be, t, rows, updates, l, NULL);
@@ -5004,12 +5008,14 @@ sql_update(backend *be, sql_table *t, st
        }
 
 /* before */
+#if 0
        if (be->cur_append && !be->first_statement_generated) {
                for(sql_table *up = t->p ; up ; up = up->p) {
                        if (!sql_update_triggers(be, up, rows, updates, 0))
                                return sql_error(sql, 02, SQLSTATE(27000) 
"UPDATE: triggers failed for table '%s'", up->base.name);
                }
        }
+#endif
        if (!sql_update_triggers(be, t, rows, updates, 0))
                return sql_error(sql, 02, SQLSTATE(27000) "UPDATE: triggers 
failed for table '%s'", t->base.name);
 
@@ -5024,12 +5030,14 @@ sql_update(backend *be, sql_table *t, st
                return sql_error(sql, 02, SQLSTATE(42000) "UPDATE: cascade 
failed for table '%s'", t->base.name);
 
 /* after */
+#if 0
        if (be->cur_append && !be->first_statement_generated) {
                for(sql_table *up = t->p ; up ; up = up->p) {
                        if (!sql_update_triggers(be, up, rows, updates, 1))
                                return sql_error(sql, 02, SQLSTATE(27000) 
"UPDATE: triggers failed for table '%s'", up->base.name);
                }
        }
+#endif
        if (!sql_update_triggers(be, t, rows, updates, 1))
                return sql_error(sql, 02, SQLSTATE(27000) "UPDATE: triggers 
failed for table '%s'", t->base.name);
 
@@ -5091,7 +5099,7 @@ rel2bin_update(backend *be, sql_rel *rel
                        updates[c->colnr] = bin_find_column(be, update, ce->l, 
ce->r);
        }
        if (!be->first_statement_generated)
-               sql_update_check_null(be, (be->cur_append && t->p) ? t->p : t, 
updates);
+               sql_update_check_null(be, /*(be->cur_append && t->p) ? t->p :*/ 
t, updates);
 
        /* check keys + get idx */
        updcol = first_updated_col(updates, list_length(t->columns.set));
@@ -5119,12 +5127,14 @@ rel2bin_update(backend *be, sql_rel *rel
        }
 
 /* before */
+#if 0
        if (be->cur_append && !be->first_statement_generated) {
                for(sql_table *up = t->p ; up ; up = up->p) {
                        if (!sql_update_triggers(be, up, tids, updates, 0))
                                return sql_error(sql, 02, SQLSTATE(27000) 
"UPDATE: triggers failed for table '%s'", up->base.name);
                }
        }
+#endif
        if (!sql_update_triggers(be, t, tids, updates, 0))
                return sql_error(sql, 02, SQLSTATE(27000) "UPDATE: triggers 
failed for table '%s'", t->base.name);
 
@@ -5141,12 +5151,14 @@ rel2bin_update(backend *be, sql_rel *rel
                return sql_error(sql, 02, SQLSTATE(42000) "UPDATE: cascade 
failed for table '%s'", t->base.name);
 
 /* after */
+#if 0
        if (be->cur_append && !be->first_statement_generated) {
                for(sql_table *up = t->p ; up ; up = up->p) {
                        if (!sql_update_triggers(be, up, tids, updates, 1))
                                return sql_error(sql, 02, SQLSTATE(27000) 
"UPDATE: triggers failed for table '%s'", up->base.name);
                }
        }
+#endif
        if (!sql_update_triggers(be, t, tids, updates, 1))
                return sql_error(sql, 02, SQLSTATE(27000) "UPDATE: triggers 
failed for table '%s'", t->base.name);
 
@@ -5329,12 +5341,14 @@ sql_delete(backend *be, sql_table *t, st
        }
 
 /* before */
+#if 0
        if (be->cur_append && !be->first_statement_generated) {
                for(sql_table *up = t->p ; up ; up = up->p) {
                        if (!sql_delete_triggers(be, up, v, 0, 1, 3))
                                return sql_error(sql, 02, SQLSTATE(27000) 
"DELETE: triggers failed for table '%s'", up->base.name);
                }
        }
+#endif
        if (!sql_delete_triggers(be, t, v, 0, 1, 3))
                return sql_error(sql, 02, SQLSTATE(27000) "DELETE: triggers 
failed for table '%s'", t->base.name);
 
@@ -5350,12 +5364,14 @@ sql_delete(backend *be, sql_table *t, st
        }
 
 /* after */
+#if 0
        if (be->cur_append && !be->first_statement_generated) {
                for(sql_table *up = t->p ; up ; up = up->p) {
                        if (!sql_delete_triggers(be, up, v, 1, 1, 3))
                                return sql_error(sql, 02, SQLSTATE(27000) 
"DELETE: triggers failed for table '%s'", up->base.name);
                }
        }
+#endif
        if (!sql_delete_triggers(be, t, v, 1, 1, 3))
                return sql_error(sql, 02, SQLSTATE(27000) "DELETE: triggers 
failed for table '%s'", t->base.name);
        if (rows)
@@ -5527,6 +5543,7 @@ sql_truncate(backend *be, sql_table *t, 
                v = stmt_tid(be, next, 0);
 
                /* before */
+#if 0
                if (be->cur_append && !be->first_statement_generated) {
                        for (sql_table *up = t->p ; up ; up = up->p) {
                                if (!sql_delete_triggers(be, up, v, 0, 3, 4)) {
@@ -5536,6 +5553,7 @@ sql_truncate(backend *be, sql_table *t, 
                                }
                        }
                }
+#endif
                if (!sql_delete_triggers(be, next, v, 0, 3, 4)) {
                        sql_error(sql, 02, SQLSTATE(27000) "TRUNCATE: triggers 
failed for table '%s'", next->base.name);
                        error = 1;
@@ -5554,6 +5572,7 @@ sql_truncate(backend *be, sql_table *t, 
                        ret = other;
 
                /* after */
+#if 0
                if (be->cur_append && !be->first_statement_generated) {
                        for (sql_table *up = t->p ; up ; up = up->p) {
                                if (!sql_delete_triggers(be, up, v, 1, 3, 4)) {
@@ -5563,6 +5582,7 @@ sql_truncate(backend *be, sql_table *t, 
                                }
                        }
                }
+#endif
                if (!sql_delete_triggers(be, next, v, 1, 3, 4)) {
                        sql_error(sql, 02, SQLSTATE(27000) "TRUNCATE: triggers 
failed for table '%s'", next->base.name);
                        error = 1;
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
@@ -421,12 +421,14 @@ create_table_or_view(mvc *sql, char* sna
                        mvc_copy_key(sql, nt, k);
                }
        }
-       if (t->members.set) {
-               for (n = t->members.set->h; n; n = n->next) {
+       /*
+       if (t->members) {
+               for (n = t->members->h; n; n = n->next) {
                        sql_part *pt = n->data;
                        mvc_copy_part(sql, nt, pt);
                }
        }
+       */
        if (t->triggers.set) {
                for (n = t->triggers.set->h; n; n = n->next) {
                        sql_trigger *tr = n->data;
diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c
--- a/sql/backends/monet5/sql_cat.c
+++ b/sql/backends/monet5/sql_cat.c
@@ -76,7 +76,7 @@ table_has_updates(sql_trans *tr, sql_tab
 }
 
 static char *
-rel_check_tables(sql_table *nt, sql_table *nnt, const char *errtable)
+rel_check_tables(mvc *sql, sql_table *nt, sql_table *nnt, const char *errtable)
 {
        node *n, *m, *nn, *mm;
 
@@ -128,10 +128,8 @@ rel_check_tables(sql_table *nt, sql_tabl
                        }
        }
 
-       for (sql_table *up = nt->p ; up ; up = up->p) {
-               if (!strcmp(up->s->base.name, nnt->s->base.name) && 
!strcmp(up->base.name, nnt->base.name))
-                       throw(SQL,"sql.rel_check_tables",SQLSTATE(3F000) "ALTER 
%s: to be added table is a parent of the %s", errtable, errtable);
-       }
+       if (nested_mergetable(sql->session->tr, nt/*mergetable*/, 
nnt->s->base.name, nnt->base.name/*parts*/))
+               throw(SQL,"sql.rel_check_tables",SQLSTATE(3F000) "ALTER %s: to 
be added table is a parent of the %s", errtable, errtable);
        return MAL_SUCCEED;
 }
 
@@ -159,7 +157,7 @@ validate_alter_table_add_table(mvc *sql,
        const char *errtable = TABLE_TYPE_DESCRIPTION(rmt->type, 
rmt->properties);
        if (!update && (!isMergeTable(rmt) && !isReplicaTable(rmt)))
                throw(SQL,call,SQLSTATE(42S02) "ALTER TABLE: cannot add table 
'%s.%s' to %s '%s.%s'", psname, ptname, errtable, msname, mtname);
-       node *n = cs_find_id(&rmt->members, rpt->base.id);
+       node *n = list_find_base_id(rmt->members, rpt->base.id);
        if (isView(rpt))
                throw(SQL,call,SQLSTATE(42000) "ALTER TABLE: can't add a view 
into a %s", errtable);
        if (isDeclaredTable(rpt))
@@ -172,7 +170,7 @@ validate_alter_table_add_table(mvc *sql,
                throw(SQL,call,SQLSTATE(42S02) "ALTER TABLE: table '%s.%s' is 
already part of %s '%s.%s'", psname, ptname, errtable, msname, mtname);
        if (!n && update)
                throw(SQL,call,SQLSTATE(42S02) "ALTER TABLE: table '%s.%s' 
isn't part of %s '%s.%s'", psname, ptname, errtable, msname, mtname);
-       if ((msg = rel_check_tables(rmt, rpt, errtable)) != MAL_SUCCEED)
+       if ((msg = rel_check_tables(sql, rmt, rpt, errtable)) != MAL_SUCCEED)
                return msg;
 
        *mt = rmt;
@@ -215,7 +213,7 @@ alter_table_add_range_partition(mvc *sql
                                                                        "ALTER 
TABLE: cannot add range partition into a %s table",
                                                                        
(isListPartitionTable(mt))?"list partition":"merge");
                goto finish;
-       } else if (!update && pt->p) {
+       } else if (!update && isPartition(pt)) {
                msg = 
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(42000)
                                                          "ALTER TABLE: table 
'%s.%s' is already part of another table",
                                                          psname, ptname);
@@ -315,8 +313,6 @@ finish:
                GDKfree(conflict_err_min);
        if (conflict_err_max)
                GDKfree(conflict_err_max);
-       if (msg != MAL_SUCCEED)
-               pt->p = NULL;
        return msg;
 }
 
@@ -340,7 +336,7 @@ alter_table_add_value_partition(mvc *sql
                                                                        "ALTER 
TABLE: cannot add value partition into a %s table",
                                                                        
(isRangePartitionTable(mt))?"range partition":"merge");
                goto finish;
-       } else if (!update && pt->p) {
+       } else if (!update && isPartition(pt)) {
                msg = 
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(42000)
                                                          "ALTER TABLE: table 
'%s.%s' is already part of another table",
                                                          psname, ptname);
@@ -394,8 +390,6 @@ alter_table_add_value_partition(mvc *sql
        }
 
 finish:
-       if (msg != MAL_SUCCEED)
-               pt->p = NULL;
        return msg;
 }
 
@@ -421,7 +415,7 @@ alter_table_del_table(mvc *sql, char *ms
        const char *errtable = TABLE_TYPE_DESCRIPTION(mt->type, mt->properties);
        if (!isMergeTable(mt) && !isReplicaTable(mt))
                throw(SQL,"sql.alter_table_del_table",SQLSTATE(42S02) "ALTER 
TABLE: cannot drop table '%s.%s' to %s '%s.%s'", psname, ptname, errtable, 
msname, mtname);
-       if (!(n = cs_find_id(&mt->members, pt->base.id)))
+       if (!(n = list_find_base_id(mt->members, pt->base.id)))
                throw(SQL,"sql.alter_table_del_table",SQLSTATE(42S02) "ALTER 
TABLE: table '%s.%s' isn't part of %s '%s.%s'", ps->base.name, ptname, 
errtable, ms->base.name, mtname);
 
        sql_trans_del_table(sql->session->tr, mt, pt, drop_action);
@@ -1719,7 +1713,7 @@ SQLrename_table(Client cntxt, MalBlkPtr 
                        throw(SQL, "sql.rename_table", SQLSTATE(42000) "ALTER 
TABLE: not possible to change schema of a declared table");
                if (mvc_check_dependency(sql, t->base.id, TABLE_DEPENDENCY, 
NULL))
                        throw(SQL, "sql.rename_table", SQLSTATE(2BM37) "ALTER 
TABLE: unable to set schema of table '%s' (there are database objects which 
depend on it)", otable_name);
-               if (t->members.set || t->triggers.set)
+               if (!list_empty(t->members) || t->triggers.set)
                        throw(SQL, "sql.rename_table", SQLSTATE(2BM37) "ALTER 
TABLE: unable to set schema of table '%s' (there are database objects which 
depend on it)", otable_name);
                if (!(s = mvc_bind_schema(sql, nschema_name)))
                        throw(SQL, "sql.rename_table", SQLSTATE(42S02) "ALTER 
TABLE: no such schema '%s'", nschema_name);
diff --git a/sql/common/sql_list.c b/sql/common/sql_list.c
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to