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