Changeset: 2c080dea632a for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2c080dea632a Modified Files: sql/backends/monet5/sql.mx sql/include/sql_catalog.h sql/include/sql_relation.h sql/server/rel_schema.c sql/server/sql_statement.c sql/server/sql_statement.h sql/storage/bat/bat_storage.c sql/storage/store.c Branch: sciql Log Message:
implemented DROP ARRAY and fix bugs in CREATE ARRAY - in functions that dup/copy tables/columns, we should also dup/copy the new fields of sql_table and sql_column that were introduced for arrays, - replaced many (but not all) isTable with isTableOrArray to reuse code, e.g., also deal with arrays during processing of transactions - an example where isTable must not be replace by isTableOrArray is: since we now only have persistent arrays, the code that does something with temp tables should not include arrays. diffs (truncated from 680 to 300 lines): diff --git a/sql/backends/monet5/sql.mx b/sql/backends/monet5/sql.mx --- a/sql/backends/monet5/sql.mx +++ b/sql/backends/monet5/sql.mx @@ -1975,14 +1975,14 @@ alter_table( mvc *sql, char *sname, sql_ static char * -drop_table(mvc *sql, char *sname, char *tname, int drop_action) +drop_table(mvc *sql, char *sname, char *tname, int drop_action, char *tOrA) { sql_schema *s = NULL; sql_table *t = NULL; node *n; if (sname && !(s=mvc_bind_schema(sql, sname))) - return sql_message("DROP TABLE: no such schema '%s'", sname); + return sql_message("DROP %s: no such schema '%s'", tOrA, sname); if (!s) s = cur_schema(sql); t = mvc_bind_table(sql, s, tname); @@ -1991,13 +1991,13 @@ drop_table(mvc *sql, char *sname, char * t = mvc_bind_table(sql, s, tname); } if (!t) { - return sql_message("DROP TABLE: no such table '%s'", tname); - } else if (!isTable(t)) { - return sql_message("DROP TABLE: cannot drop VIEW '%s'", tname); + return sql_message("DROP %s: no such table '%s'", tOrA, tname); + } else if (!isTableOrArray(t)) { + return sql_message("DROP %s: cannot drop VIEW '%s'", tOrA, tname); } else if (t->system) { - return sql_message("DROP TABLE: cannot drop system table '%s'", tname); + return sql_message("DROP %s: cannot drop system table '%s'", tOrA, tname); } else if (!schema_privs(sql->role_id, s)) { - return sql_message("DROP TABLE: access denied for %s to schema ;'%s'", stack_get_string(sql, "current_user"), s->base.name); + return sql_message("DROP %s: access denied for %s to schema ;'%s'", tOrA, stack_get_string(sql, "current_user"), s->base.name); } if ( !drop_action && t->keys.set) { for (n = t->keys.set->h; n; n = n->next) { @@ -2013,7 +2013,7 @@ drop_table(mvc *sql, char *sname, char * k = l->data; /* make sure it is not a self referencing key */ if (k->t != t) - return sql_message("DROP TABLE: FOREIGN KEY %s.%s depends on %s", k->t->base.name, k->base.name, tname); + return sql_message("DROP %s: FOREIGN KEY %s.%s depends on %s", tOrA, k->t->base.name, k->base.name, tname); } } } @@ -2021,7 +2021,7 @@ drop_table(mvc *sql, char *sname, char * } if (!drop_action && mvc_check_dependency(sql, t->base.id, TABLE_DEPENDENCY, NULL)) - return sql_message("DROP TABLE: unable to drop table %s (there are database objects which depend on it)\n", t->base.name); + return sql_message("DROP %s: unable to drop table %s (there are database objects which depend on it)\n", tOrA, t->base.name); mvc_drop_table(sql, s, t, drop_action); return MAL_SUCCEED; @@ -2285,18 +2285,19 @@ SQLcatalog(Client cntxt, MalBlkPtr mb, M } break; case DDL_CREATE_TABLE: case DDL_CREATE_VIEW: - case DDL_CREATE_ARRAY: + case DDL_CREATE_ARRAY: /* TODO: if really not used, remove it later */ { sql_table *t = *(sql_table**) getArgReference(stk, pci, 3); int temp = *(int*) getArgReference(stk, pci, 4); msg = create_table_or_view(sql, sname, t, temp); } break; + case DDL_DROP_ARRAY: case DDL_DROP_TABLE: { int action = *(int*) getArgReference(stk, pci, 4); str name = *(str*) getArgReference(stk, pci, 3); - msg = drop_table( sql, sname, name, action); + msg = drop_table( sql, sname, name, action, (type==DDL_DROP_TABLE)?"TABLE":"ARRAY"); } break; case DDL_DROP_VIEW: { int action = *(int*) getArgReference(stk, pci, 4); @@ -6299,7 +6300,7 @@ sql_storage(Client cntxt, MalBlkPtr mb, for(ntab= (s)->tables.set->h ;ntab; ntab= ntab->next){ sql_base *bt= ntab->data; sql_table *t= (sql_table*) bt; - if (isTable(t)) + if (isTableOrArray(t)) for (ncol= (t)->columns.set->h; ncol; ncol= ncol->next){ sql_base *bc = ncol->data; sql_column *c= (sql_column *) ncol->data; @@ -6336,7 +6337,7 @@ sql_storage(Client cntxt, MalBlkPtr mb, BBPunfix(bn->batCacheid); } - if (isTable(t)) + if (isTableOrArray(t)) if(t->idxs.set) for (ncol= (t)->idxs.set->h; ncol; ncol= ncol->next){ sql_base *bc = ncol->data; diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h --- a/sql/include/sql_catalog.h +++ b/sql/include/sql_catalog.h @@ -373,6 +373,7 @@ typedef enum table_types { #define isMergeTable(x) (x->type==tt_merge_table) #define isStream(x) (x->type==tt_stream) #define isArray(x) (x->type==tt_array) +#define isTableOrArray(x)(x->type==tt_array || x->type==tt_table) #define isFixedDim(x) (x->start && x->step && x->stop) typedef struct sql_table { 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 @@ -91,13 +91,14 @@ typedef struct expression { #define DDL_CREATE_VIEW 26 #define DDL_DROP_VIEW 27 #define DDL_DROP_CONSTRAINT 28 -#define DDL_ALTER_TABLE 29 +#define DDL_DROP_ARRAY 29 +#define DDL_ALTER_TABLE 30 -#define DDL_CREATE_TYPE 30 -#define DDL_DROP_TYPE 31 +#define DDL_CREATE_TYPE 31 +#define DDL_DROP_TYPE 32 -#define DDL_CREATE_INDEX 32 -#define DDL_DROP_INDEX 33 +#define DDL_CREATE_INDEX 33 +#define DDL_DROP_INDEX 34 #define DDL_CREATE_FUNCTION 41 #define DDL_DROP_FUNCTION 42 @@ -119,7 +120,6 @@ typedef struct expression { #define DDL_DISCONNECT 62 #define DDL_CREATE_ARRAY 63 -#define DDL_DROP_ARRAY 64 #define DDL_CREATE_VIEW_ARRAY 65 #define MAXOPS 20 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 @@ -591,7 +591,7 @@ create_column(mvc *sql, symbol *s, sql_s int res = SQL_OK; (void)ss; - if (alter && !isTable(t) && !isArray(t)) { + if (alter && !isTableOrArray(t)) { sql_error(sql, 02, "ALTER %s: cannot add column to VIEW '%s'\n", isTable(t)?"TABLE":"ARRAY", t->base.name); return SQL_ERR; } @@ -742,6 +742,9 @@ table_element(mvc *sql, symbol *s, sql_s case SQL_DROP_TABLE: msg = "drop table from"; break; + case SQL_DROP_ARRAY: + msg = "drop array from"; + break; case SQL_DROP_COLUMN: msg = "drop column from"; break; @@ -919,7 +922,7 @@ rel_create_table(mvc *sql, sql_schema *s if (sname && !(s = mvc_bind_schema(sql, sname))) return sql_error(sql, 02, "CREATE %s: no such schema '%s'", t_a, sname); - if (temp != SQL_PERSIST && (tt == tt_table || tt == tt_array) && + if (temp != SQL_PERSIST && tt == tt_table && commit_action == CA_COMMIT) commit_action = CA_DELETE; @@ -962,7 +965,7 @@ rel_create_table(mvc *sql, sql_schema *s if (tt == tt_array && t->ndims == 0) return sql_error(sql, 02, "CREATE ARRAY: an array must have at least one dimension"); - temp = (tt == tt_table || tt == tt_array)?temp:SQL_PERSIST; + temp = (tt == tt_table)?temp:SQL_PERSIST; /* For tables and unbounded arrays we are done */ if ((tt == tt_table) || (tt == tt_array && !t->fixed)) { /* TODO: DDL_CREATE_TABLE looks sufficient for arrays for now */ @@ -1103,7 +1106,7 @@ rel_create_table(mvc *sql, sql_schema *s } /* insert query result into this table */ - temp = (tt == tt_table || tt == tt_array)?temp:SQL_PERSIST; + temp = (tt == tt_table)?temp:SQL_PERSIST; res = rel_table(sql, DDL_CREATE_TABLE, sname, t, temp); if (with_data) { res = rel_insert(sql, res, sq); @@ -1828,6 +1831,7 @@ rel_schemas(mvc *sql, symbol *s) ret = rel_create_view(sql, NULL, l->h->data.lval, l->h->next->data.lval, l->h->next->next->data.sym, l->h->next->next->next->data.i_val, l->h->next->next->next->next->data.i_val); } break; case SQL_DROP_TABLE: + case SQL_DROP_ARRAY: { dlist *l = s->data.lval; char *sname = qname_schema(l->h->data.lval); @@ -1835,7 +1839,7 @@ rel_schemas(mvc *sql, symbol *s) assert(l->h->next->type == type_int); sname = get_schema_name(sql, sname, tname); - ret = rel_schema(sql->sa, DDL_DROP_TABLE, sname, tname, l->h->next->data.i_val); + ret = rel_schema(sql->sa, (s->token == SQL_DROP_TABLE)?DDL_DROP_TABLE:DDL_DROP_ARRAY, sname, tname, l->h->next->data.i_val); } break; case SQL_DROP_VIEW: { diff --git a/sql/server/sql_statement.c b/sql/server/sql_statement.c --- a/sql/server/sql_statement.c +++ b/sql/server/sql_statement.c @@ -412,7 +412,7 @@ stmt_deps(list *dep_list, stmt *s, int d case st_append_col: case st_update_col: if (depend_type == COLUMN_DEPENDENCY) { - if (isTable(s->op4.cval->t)) + if (isTableOrArray(s->op4.cval->t)) dep_list = cond_append(dep_list, &s->op4.cval->base.id); dep_list = cond_append(dep_list, &s->op4.cval->t->base.id); } @@ -576,7 +576,7 @@ stmt_delta_table_bat(sql_allocator *sa, if (c->t->readonly) return s; - if (isTable(c->t) && + if (isTableOrArray(c->t) && (c->base.flag != TR_NEW || c->t->base.flag != TR_NEW /* alter */) && access == RDONLY && c->t->persistence == SQL_PERSIST && !c->t->commit_action) { stmt *i = stmt_bat(sa, c, basetable, RD_INS ); @@ -587,7 +587,7 @@ stmt_delta_table_bat(sql_allocator *sa, s = stmt_union(sa, s, i); } /* even temp tables have deletes because we like to keep void heads */ - if (access == RDONLY && isTable(c->t)) { + if (access == RDONLY && isTableOrArray(c->t)) { stmt *d = stmt_tbat(sa, c->t, RD_INS); s = stmt_diff(sa, s, stmt_reverse(sa, d)); } @@ -613,7 +613,7 @@ stmt_delta_table_idxbat(sql_allocator *s if (idx->t->readonly) return s; - if (isTable(idx->t) && + if (isTableOrArray(idx->t) && (idx->base.flag != TR_NEW || idx->t->base.flag != TR_NEW /* alter */) && access == RDONLY && idx->t->persistence == SQL_PERSIST && !idx->t->commit_action) { stmt *i = stmt_idxbat(sa, idx, RD_INS); @@ -624,7 +624,7 @@ stmt_delta_table_idxbat(sql_allocator *s s = stmt_union(sa, s, i); } /* even temp tables have deletes because we like to keep void heads */ - if (access == RDONLY && isTable(idx->t)) { + if (access == RDONLY && isTableOrArray(idx->t)) { stmt *d = stmt_tbat(sa, idx->t, RD_INS); s = stmt_diff(sa, s, stmt_reverse(sa, d)); } diff --git a/sql/server/sql_statement.h b/sql/server/sql_statement.h --- a/sql/server/sql_statement.h +++ b/sql/server/sql_statement.h @@ -193,7 +193,7 @@ extern stmt *stmt_varnr(sql_allocator *s extern stmt *stmt_table(sql_allocator *sa, stmt *cols, int temp); extern stmt *stmt_basetable(sql_allocator *sa, sql_table *t, char *tname); -#define isbasetable(s) (s->type == st_basetable && isTable(s->op1.tval)) +#define isbasetable(s) (s->type == st_basetable && isTableOrArray(s->op1.tval)) #define basetable_table(s) s->op1.tval extern stmt *stmt_rs_column(sql_allocator *sa, stmt *result_set, stmt *v, sql_subtype *tpe); diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c --- a/sql/storage/bat/bat_storage.c +++ b/sql/storage/bat/bat_storage.c @@ -1208,7 +1208,7 @@ _gtr_update( sql_trans *tr, gtr_update_t for (n = s->tables.set->h; n && ok == LOG_OK; n = n->next) { sql_table *t = n->data; - if (isTable(t) && isGlobal(t)) + if (isTableOrArray(t) && isGlobal(t)) ok = gtr_update_table_f(tr, t); } } diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -119,7 +119,7 @@ idx_destroy(sql_idx * i) /* remove idx from schema */ list_remove_data(i->t->s->idxs, i); list_destroy(i->columns); - if (isTable(i->t)) + if (isTableOrArray(i->t)) store_funcs.destroy_idx(NULL, i); base_destroy(&i->base); _DELETE(i); @@ -146,7 +146,7 @@ trigger_destroy(sql_trigger *tr) void column_destroy(sql_column *c) { - if (isTable(c->t)) + if (isTableOrArray(c->t)) store_funcs.destroy_col(NULL, c); if (c->def) _DELETE(c->def); @@ -162,7 +162,7 @@ table_destroy(sql_table *t) cs_destroy(&t->triggers); _______________________________________________ Checkin-list mailing list Checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list