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