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

Reply via email to