Changeset: e388060548bd for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e388060548bd
Modified Files:
        sql/storage/bat/bat_storage.c
        sql/storage/store.c
Branch: Oct2014
Log Message:

new fix for the name conflict bug


diffs (114 lines):

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
@@ -984,12 +984,6 @@ create_col(sql_trans *tr, sql_column *c)
                sql_column *fc = NULL;
                size_t cnt = 0;
 
-               /* Temp solutions for name conflicts */
-               log_bid bid = logger_find_bat(bat_logger, bat->name);
-
-               if (bid)
-                       return LOG_ERR;
-
                /* alter ? */
                if (c->t->columns.set && (fc = c->t->columns.set->h->data) != 
NULL) 
                        cnt = count_col(tr, fc, 1);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -1955,6 +1955,76 @@ column_dup(sql_trans *tr, int flag, sql_
        return c;
 }
 
+static int
+sql_trans_cname_conflict( sql_trans *tr, sql_table *t, char *extra, char 
*cname)
+{
+       char *tmp;
+
+       if (extra) {
+               tmp = sa_message(tr->sa, "%s_%s", extra, cname);
+       } else {
+                       tmp = cname;
+       }
+       if (find_sql_column(t, tmp))
+               return 1;
+       return 0;
+}
+
+static int
+sql_trans_tname_conflict( sql_trans *tr, sql_schema *s, char *extra, char 
*tname, char *cname)
+{
+       char *tp;
+       char *tmp;
+       sql_table *t = NULL;
+
+       if (extra) {
+               tmp = sa_message(tr->sa, "%s_%s", extra, tname);
+       } else {
+                       tmp = sa_strdup(tr->sa, tname);
+       }
+       tp = tmp;
+       while ((tp = strchr(tp, '_')) != NULL) {
+               *tp = 0;
+               t = find_sql_table(s, tmp);
+               if (t && sql_trans_cname_conflict(tr, t, tp+1, cname))
+                       return 1;
+               *tp++ = '_';
+       }
+       t = find_sql_table(s, tname);
+       if (t && sql_trans_cname_conflict(tr, t, NULL, cname))
+               return 1;
+       return 0;
+}
+
+static int
+sql_trans_name_conflict( sql_trans *tr, char *sname, char *tname, char *cname)
+{
+       char *sp;
+       sql_schema *s = NULL;
+
+       sp = strchr(sname, '_');
+       if (!sp && strchr(tname, '_') == 0 && strchr(cname, '_') == 0)
+               return 0;
+
+       if (sp) {
+               char *tmp = sa_strdup(tr->sa, sname);
+               sp = tmp;
+               while ((sp = strchr(sp, '_')) != NULL) {
+                       *sp = 0;
+                       s = find_sql_schema(tr, tmp);
+                       if (s && sql_trans_tname_conflict(tr, s, sp+1, tname, 
cname))
+                               return 1;
+                       *sp++ = '_';
+               }
+       } else {
+               s = find_sql_schema(tr, sname);
+               if (s)
+                       return sql_trans_tname_conflict(tr, s, NULL, tname, 
cname);
+       }
+       return 0;
+
+}
+
 sql_column *
 sql_trans_copy_column( sql_trans *tr, sql_table *t, sql_column *c )
 {
@@ -1962,6 +2032,8 @@ sql_trans_copy_column( sql_trans *tr, sq
        sql_table *syscolumn = find_sql_table(syss, "_columns");
        sql_column *col = SA_ZNEW(tr->sa, sql_column);
 
+       if (sql_trans_name_conflict(tr, t->s->base.name, t->base.name, 
c->base.name))
+               return NULL;
        base_init(tr->sa, &col->base, c->base.id, TR_NEW, c->base.name);
        col->type = c->type;
        col->def = NULL;
@@ -4177,6 +4249,8 @@ sql_trans_create_column(sql_trans *tr, s
        if (!tpe)
                return NULL;
 
+       if (sql_trans_name_conflict(tr, t->s->base.name, t->base.name, name))
+               return NULL;
        col = create_sql_column(tr->sa, t, name, tpe );
 
        if (isTable(col->t))
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to