Changeset: 6096dc911f06 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6096dc911f06
Modified Files:
        sql/src/backends/monet5/sql.mx
        sql/src/include/sql_catalog.h
        sql/src/server/rel_sequence.mx
        sql/src/server/sql_mvc.mx
        sql/src/server/sql_parser.mx
        sql/src/storage/sql_storage.h
        sql/src/storage/store.mx
Branch: Jun2010
Log Message:

When you create a SERIAL COLUMN a sequence is created for this column.
The sequence is now dropped, and removed from the catalog information,
when you drop the column. However, the sequence can't be dropped using
the SQL statement DROP SEQUENCE.

A new dependency was created to handle with this situation, BEDROPPED.
This means, the SEQUENCE must be dropped when the SERIAL column is dropped.
Like this, we do not need to change the SQL catalog structure avoiding
reloads of databases.

This is fix for BUG:
2184


diffs (215 lines):

diff -r 2da31ab71d30 -r 6096dc911f06 sql/src/backends/monet5/sql.mx
--- a/sql/src/backends/monet5/sql.mx    Wed Jul 07 15:31:59 2010 +0200
+++ b/sql/src/backends/monet5/sql.mx    Wed Jul 07 15:27:30 2010 +0200
@@ -1792,7 +1792,7 @@
        } else if (!schema_privs(sql->role_id, s)) {
                return sql_message( "CREATE SEQUENCE: insufficient privileges 
for '%s' in schema '%s'", stack_get_string(sql, "current_user"), s->base.name);
        }
-       sql_trans_create_sequence(sql->session->tr, s, seq->base.name, 
seq->start, seq->minvalue, seq->maxvalue, seq->increment, seq->cacheinc, 
seq->cycle);  
+       sql_trans_create_sequence(sql->session->tr, s, seq->base.name, 
seq->start, seq->minvalue, seq->maxvalue, seq->increment, seq->cacheinc, 
seq->cycle, seq->bedropped);
        return NULL;
 }
 
@@ -1826,17 +1826,21 @@
 drop_seq(mvc *sql, char *sname, char *name)
 {
        sql_schema *s = NULL;
+       sql_sequence *seq = NULL;
 
        if (sname && !(s = mvc_bind_schema(sql, sname)))
                return sql_message("DROP SEQUENCE: no such schema '%s'", sname);
        if (!s)
                s = cur_schema(sql);
-       if (!find_sql_sequence(s, name)) {
+       if (!(seq = find_sql_sequence(s, name))) {
                return sql_message("DROP SEQUENCE: no such sequence '%s'", 
name);
        } else if (!schema_privs(sql->role_id, s)) {
                return sql_message("DROP SEQUENCE: insufficient privileges for 
'%s' in schema '%s'", stack_get_string(sql, "current_user"),  s->base.name);
        }
-       sql_trans_drop_sequence(sql->session->tr, s, name, 0);  
+       if (mvc_check_dependency(sql, seq->base.id, BEDROPPED_DEPENDENCY, NULL))
+               return sql_message("DROP SEQUENCE: unable to drop sequence %s 
(there are database objects which depend on it)\n", seq->base.name);
+
+       sql_trans_drop_sequence(sql->session->tr, s, seq, 0);
        return NULL;
 }
 
diff -r 2da31ab71d30 -r 6096dc911f06 sql/src/include/sql_catalog.h
--- a/sql/src/include/sql_catalog.h     Wed Jul 07 15:31:59 2010 +0200
+++ b/sql/src/include/sql_catalog.h     Wed Jul 07 15:27:30 2010 +0200
@@ -60,6 +60,7 @@
 #define TYPE_DEPENDENCY 11
 #define SEQ_DEPENDENCY 12
 #define PROC_DEPENDENCY 13
+#define BEDROPPED_DEPENDENCY 14                /*The object must be dropped 
when the dependent object is dropped independently of the DROP type.*/
 #define NO_DEPENDENCY 0
 #define HAS_DEPENDENCY 1
 #define CICLE_DEPENDENCY 2
@@ -326,6 +327,7 @@
        lng increment;
        lng cacheinc;
        bit cycle;
+       bit bedropped;          /*Drop the SEQUENCE if you are dropping the 
column, e.g., SERIAL COLUMN".*/
        sql_schema *s;
 } sql_sequence;
 
diff -r 2da31ab71d30 -r 6096dc911f06 sql/src/server/rel_sequence.mx
--- a/sql/src/server/rel_sequence.mx    Wed Jul 07 15:31:59 2010 +0200
+++ b/sql/src/server/rel_sequence.mx    Wed Jul 07 15:27:30 2010 +0200
@@ -104,7 +104,8 @@
        lng min,
        lng max,
        lng cache,
-       int cycle)
+       int cycle,
+       int bedropped)
 {
        sql_rel *res = NULL;
        sql_sequence *seq = NULL;
@@ -135,6 +136,7 @@
        if (cache <= 0) cache = 1;
 
        seq = create_sql_sequence(sql->sa, s, name, start, min, max, inc, 
cache, cycle);  
+       seq->bedropped = bedropped;
        res = rel_seq(DDL_CREATE_SEQ, s->base.name, seq, NULL, NULL);
        if (res)
                stack_push_rel_view(sql, name, rel_dup(res));
@@ -229,6 +231,7 @@
                        assert(h->h->next->next->next->type == type_lng);
                        assert(h->h->next->next->next->next->type == type_lng);
                        assert(h->h->next->next->next->next->next->type == 
type_int);
+                       assert(h->h->next->next->next->next->next->next->type 
== type_int);
                        res = rel_create_seq(
 /* mvc* sql */         sql,
 /* sql_schema* s */    cur_schema(sql), 
@@ -239,7 +242,8 @@
 /* lng min */          h->h->next->next->data.l_val, 
 /* lng max */          h->h->next->next->next->data.l_val,
 /* lng cache */                h->h->next->next->next->next->data.l_val,
-/* int cycle */                h->h->next->next->next->next->next->data.i_val);
+/* int cycle */                h->h->next->next->next->next->next->data.i_val,
+/* int bedropped */    h->h->next->next->next->next->next->next->data.i_val);
                }
                break;
                case SQL_ALTER_SEQ:
diff -r 2da31ab71d30 -r 6096dc911f06 sql/src/server/sql_mvc.mx
--- a/sql/src/server/sql_mvc.mx Wed Jul 07 15:31:59 2010 +0200
+++ b/sql/src/server/sql_mvc.mx Wed Jul 07 15:27:30 2010 +0200
@@ -1305,7 +1305,7 @@
 {
        if (mvc_debug)
                fprintf(stderr, "mvc_create_dependency %d %d %d\n", id, 
depend_id, depend_type);
-       if (id != depend_id)
+       if ( (id != depend_id) || (depend_type == BEDROPPED_DEPENDENCY) )
                sql_trans_create_dependency(m->session->tr, id, depend_id, 
depend_type);
        
 }
diff -r 2da31ab71d30 -r 6096dc911f06 sql/src/server/sql_parser.mx
--- a/sql/src/server/sql_parser.mx      Wed Jul 07 15:31:59 2010 +0200
+++ b/sql/src/server/sql_parser.mx      Wed Jul 07 15:27:30 2010 +0200
@@ -1280,6 +1280,7 @@
          append_lng(l, $4);
          append_lng(l, $5);
          append_int(l, $6);
+         append_int(l, 0);     /* bedropped */
          $$ = l;
        }
 ;
@@ -1556,6 +1557,7 @@
                        append_lng(o, 0); /* max */
                        append_lng(o, 1); /* cache */
                        append_int(o, 0); /* cycle */
+                       append_int(o, 1); /* bedropped */
                        append_list(l, o);
 
                        if (m->sym) {
@@ -1689,6 +1691,7 @@
                append_lng(o, 0); /* max */
                append_lng(o, 1); /* cache */
                append_int(o, 0); /* cycle */
+               append_int(o, 0); /* bedropped */
                append_list(l, o);
                if (m->scanner.schema)
                        append_string(seqn2, m->scanner.schema);
@@ -1715,6 +1718,7 @@
          append_lng($$, -1); /* max */
          append_lng($$, -1); /* cache */
          append_int($$, 0);  /* cycle */
+         append_int($$, 0);  /* bedropped */
        }
   |    '(' opt_seq_params ')'  { $$ = $2; }
  ;
diff -r 2da31ab71d30 -r 6096dc911f06 sql/src/storage/sql_storage.h
--- a/sql/src/storage/sql_storage.h     Wed Jul 07 15:31:59 2010 +0200
+++ b/sql/src/storage/sql_storage.h     Wed Jul 07 15:27:30 2010 +0200
@@ -343,8 +343,8 @@
 extern void sql_trans_drop_trigger(sql_trans *tr, sql_schema *s, int id, int 
drop_action);
 
 extern sql_sequence *create_sql_sequence(sql_allocator *sa, sql_schema *s, 
char *name, lng start, lng min, lng max, lng inc, lng cacheinc, bit cycle );
-extern sql_sequence * sql_trans_create_sequence(sql_trans *tr, sql_schema *s, 
char *name, lng start, lng min, lng max, lng inc, lng cacheinc, bit cycle );
-extern void sql_trans_drop_sequence(sql_trans *tr, sql_schema *s, char *name, 
int drop_action);
+extern sql_sequence * sql_trans_create_sequence(sql_trans *tr, sql_schema *s, 
char *name, lng start, lng min, lng max, lng inc, lng cacheinc, bit cycle, bit 
bedropped );
+extern void sql_trans_drop_sequence(sql_trans *tr, sql_schema *s, sql_sequence 
*seq, int drop_action);
 extern sql_sequence *sql_trans_alter_sequence(sql_trans *tr, sql_sequence 
*seq, lng min, lng max, lng inc, lng cache, lng cycle);
 extern lng sql_trans_sequence_restart(sql_trans *tr, sql_sequence *seq, lng 
start);
 
diff -r 2da31ab71d30 -r 6096dc911f06 sql/src/storage/store.mx
--- a/sql/src/storage/store.mx  Wed Jul 07 15:31:59 2010 +0200
+++ b/sql/src/storage/store.mx  Wed Jul 07 15:27:30 2010 +0200
@@ -3218,6 +3218,7 @@
 
        assert(rid != oid_nil);
        table_funcs.table_delete(tr, sysseqs, rid);
+       sql_trans_drop_dependencies(tr, seq->base.id);
 
        if (drop_action)
                sql_trans_drop_all_dependencies(tr, seq->s, seq->base.id, 
SEQ_DEPENDENCY);
@@ -3241,10 +3242,15 @@
        if (col->def && (seq_pos = strstr(col->def, next_value_for))) {
                sql_sequence * seq = NULL;
                char *seq_name = _strdup(seq_pos + (strlen(next_value_for) - 
strlen("seq_")));
+               node *n = NULL;
                seq_name[strlen(seq_name)-1] = '\0';
+               n = cs_find_name(&syss->seqs, seq_name);
                seq = find_sql_sequence(syss, seq_name);
-               if (seq)
+               if (seq && sql_trans_get_dependency_type(tr, seq->base.id, 
BEDROPPED_DEPENDENCY)) {
                        sys_drop_sequence(tr, seq, drop_action);                
+                       seq->base.wtime = syss->base.wtime = tr->wtime = 
tr->stime;
+                       cs_del(&syss->seqs, n, seq->base.flag);
+               }
                _DELETE(seq_name);
        }
        
@@ -4475,7 +4481,7 @@
 }
 
 sql_sequence * 
-sql_trans_create_sequence(sql_trans *tr, sql_schema *s, char *name, lng start, 
lng min, lng max, lng inc, lng cacheinc, bit cycle )
+sql_trans_create_sequence(sql_trans *tr, sql_schema *s, char *name, lng start, 
lng min, lng max, lng inc, lng cacheinc, bit cycle, bit bedropped )
 {
        sql_schema *syss = find_sql_schema(tr, "sys");
        sql_table *sysseqs = find_sql_table(syss, "sequences");
@@ -4484,15 +4490,18 @@
        cs_add(&s->seqs, seq, TR_NEW);
        table_funcs.table_insert(tr, sysseqs, &seq->base.id, &s->base.id, 
seq->base.name, &seq->start, &seq->minvalue, &seq->maxvalue, &seq->increment, 
&seq->cacheinc, &seq->cycle);
        s->base.wtime = tr->wtime = tr->stime;
+
+       /*Create a BEDROPPED dependency for a SERIAL COLUMN*/
+       if (bedropped)
+               sql_trans_create_dependency(tr, seq->base.id, seq->base.id, 
BEDROPPED_DEPENDENCY);
+
        return seq;
 }
 
 void
-sql_trans_drop_sequence(sql_trans *tr, sql_schema *s, char *name, int 
drop_action)
+sql_trans_drop_sequence(sql_trans *tr, sql_schema *s, sql_sequence *seq, int 
drop_action)
 {
-       node *n = cs_find_name(&s->seqs, name);
-       sql_sequence *seq = n->data;
-
+       node *n = cs_find_name(&s->seqs, seq->base.name);
        sys_drop_sequence(tr, seq, drop_action);
        seq->base.wtime = s->base.wtime = tr->wtime = tr->stime;
        cs_del(&s->seqs, n, seq->base.flag);
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to