Changeset: bd112e07a0a7 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/bd112e07a0a7
Modified Files:
        sql/server/rel_schema.c
        sql/test/miscellaneous/Tests/simple_selects.test
Branch: Jan2022
Log Message:

When creating a key/index check if the counterpart name exists and throw error, 
because it will be ambiguous on the backend


diffs (99 lines):

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
@@ -376,6 +376,10 @@ column_constraint_type(mvc *sql, const c
                        (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
%s: key %s already exists", (kt == pkey) ? "PRIMARY KEY" : "UNIQUE", name);
                        return res;
                }
+               if (ol_find_name(t->idxs, name) || mvc_bind_idx(sql, ss, name)) 
{
+                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
%s: an index named '%s' already exists, and it would conflict with the key", kt 
== pkey ? "PRIMARY KEY" : "UNIQUE", name);
+                       return res;
+               }
                switch (mvc_create_ukey(&k, sql, t, name, kt)) {
                        case -1:
                                (void) sql_error(sql, 02, SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
@@ -455,6 +459,10 @@ column_constraint_type(mvc *sql, const c
                        (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
FOREIGN KEY: key '%s' already exists", name);
                        return res;
                }
+               if (ol_find_name(t->idxs, name) || mvc_bind_idx(sql, ss, name)) 
{
+                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
FOREIGN KEY: an index named '%s' already exists, and it would conflict with the 
key", name);
+                       return res;
+               }
 
                /* find unique referenced key */
                if (n->next->data.lval) {
@@ -709,6 +717,10 @@ table_foreign_key(mvc *sql, const char *
                        (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
FOREIGN KEY: key '%s' already exists", name);
                        return SQL_ERR;
                }
+               if (ol_find_name(t->idxs, name) || mvc_bind_idx(sql, ss, name)) 
{
+                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
FOREIGN KEY: an index named '%s' already exists, and it would conflict with the 
key", name);
+                       return SQL_ERR;
+               }
                if (n->next->next->data.lval) { /* find unique referenced key */
                        dnode *rnms = n->next->next->data.lval->h;
                        list *cols = sa_list(sql->sa);
@@ -815,6 +827,10 @@ table_constraint_type(mvc *sql, const ch
                        (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
%s: key '%s' already exists", kt == pkey ? "PRIMARY KEY" : "UNIQUE", name);
                        return SQL_ERR;
                }
+               if (ol_find_name(t->idxs, name) || mvc_bind_idx(sql, ss, name)) 
{
+                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
%s: an index named '%s' already exists, and it would conflict with the key", kt 
== pkey ? "PRIMARY KEY" : "UNIQUE", name);
+                       return SQL_ERR;
+               }
 
                switch (mvc_create_ukey(&k, sql, t, name, kt)) {
                        case -1:
@@ -2185,6 +2201,8 @@ rel_create_index(mvc *sql, char *iname, 
                return sql_error(sql, 02, SQLSTATE(42000) "CREATE INDEX: index 
name cannot contain just digit characters (0 through 9)");
        if ((i = mvc_bind_idx(sql, t->s, iname)))
                return sql_error(sql, 02, SQLSTATE(42S11) "CREATE INDEX: name 
'%s' already in use", iname);
+       if (ol_find_name(t->keys, iname) || mvc_bind_key(sql, t->s, iname))
+               return sql_error(sql, 02, SQLSTATE(42000) "CREATE INDEX: a key 
named '%s' already exists, and it would conflict with the index", iname);
        if (!isTable(t))
                return sql_error(sql, 02, SQLSTATE(42S02) "CREATE INDEX: cannot 
create index on %s '%s'", TABLE_TYPE_DESCRIPTION(t->type, t->properties), 
tname);
        nt = dup_sql_table(sql->sa, t);
diff --git a/sql/test/miscellaneous/Tests/simple_selects.test 
b/sql/test/miscellaneous/Tests/simple_selects.test
--- a/sql/test/miscellaneous/Tests/simple_selects.test
+++ b/sql/test/miscellaneous/Tests/simple_selects.test
@@ -951,3 +951,39 @@ create table bar (i int, FOREIGN KEY (i)
 
 statement ok
 ROLLBACK
+
+statement ok
+START TRANSACTION
+
+statement ok
+create table x (x int primary key)
+
+statement ok
+create table y (y int)
+
+statement ok
+create index ups on y(y)
+
+statement error 42000!CONSTRAINT FOREIGN KEY: an index named 'ups' already 
exists, and it would conflict with the key
+alter table y add constraint ups foreign key (y) references x (x)
+
+statement ok
+ROLLBACK
+
+statement ok
+START TRANSACTION
+
+statement ok
+create table x (x int primary key)
+
+statement ok
+create table y (y int)
+
+statement ok
+alter table y add constraint ups2 foreign key (y) references x (x)
+
+statement error 42S11!CREATE INDEX: name 'ups2' already in use
+create index ups2 on y(y)
+
+statement ok
+ROLLBACK
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to