Changeset: 59c6dda43cf2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/59c6dda43cf2
Modified Files:
        sql/server/rel_schema.c
Branch: default
Log Message:

Because key constraints generate indexes, they cannot contain just digits on 
the name as well. Small cleanup


diffs (truncated from 314 to 300 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
@@ -352,7 +352,7 @@ column_constraint_type(mvc *sql, const c
        int res = SQL_ERR;
 
        if (isDeclared && (s->token != SQL_NULL && s->token != SQL_NOT_NULL)) {
-               (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT: 
constraints on declared tables are not supported\n");
+               (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT: 
constraints on declared tables are not supported");
                return res;
        }
        switch (s->token) {
@@ -360,12 +360,23 @@ column_constraint_type(mvc *sql, const c
        case SQL_PRIMARY_KEY: {
                key_type kt = (s->token == SQL_UNIQUE) ? ukey : pkey;
                sql_key *k;
+               const char *ns = name;
 
                if (kt == pkey && t->pkey) {
-                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
PRIMARY KEY: a table can have only one PRIMARY KEY\n");
+                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
PRIMARY KEY: a table can have only one PRIMARY KEY");
+                       return res;
+               }
+               if (!ns || !*ns) { /* add this to be safe */
+                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
%s: key name name cannot be empty", (kt == pkey) ? "PRIMARY KEY" : "UNIQUE");
                        return res;
                }
-               if (name && (ol_find_name(t->keys, name) || mvc_bind_key(sql, 
ss, name))) {
+               while (isdigit((unsigned char) *ns))
+                       ns++;
+               if (!*ns) { /* if a key name just contains digit characters, 
the generated index name can be mistaken with a label */
+                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
%s: key name cannot contain just digit characters (0 through 9)", (kt == pkey) 
? "PRIMARY KEY" : "UNIQUE");
+                       return res;
+               }
+               if (ol_find_name(t->keys, name) || mvc_bind_key(sql, ss, name)) 
{
                        (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
%s: key %s already exists", (kt == pkey) ? "PRIMARY KEY" : "UNIQUE", name);
                        return res;
                }
@@ -414,6 +425,7 @@ column_constraint_type(mvc *sql, const c
                list *cols;
                sql_key *rk = NULL;
                sql_kc *kc;
+               const char *ns = name;
 
                assert(n->next->next->next->type == type_int);
                rt = find_table_or_view_on_scope(sql, ss, rsname, rtname, 
"CONSTRAINT FOREIGN KEY", false);
@@ -423,9 +435,19 @@ column_constraint_type(mvc *sql, const c
                        sql->session->status = 0;
                        rt = t;
                }
-               if (!rt) {
+               if (!rt)
                        return SQL_ERR;
-               } else if (name && (ol_find_name(t->keys, name) || 
mvc_bind_key(sql, ss, name))) {
+               if (!ns || !*ns) { /* add this to be safe */
+                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
FOREIGN KEY: key name name cannot be empty");
+                       return res;
+               }
+               while (isdigit((unsigned char) *ns))
+                       ns++;
+               if (!*ns) { /* if a key name just contains digit characters, 
the generated index name can be mistaken with a label */
+                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
FOREIGN KEY: key name cannot contain just digit characters (0 through 9)");
+                       return res;
+               }
+               if (ol_find_name(t->keys, name) || mvc_bind_key(sql, ss, name)) 
{
                        (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
FOREIGN KEY: key '%s' already exists", name);
                        return res;
                }
@@ -441,17 +463,17 @@ column_constraint_type(mvc *sql, const c
                        rk = &rt->pkey->k;
                }
                if (!rk) {
-                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
FOREIGN KEY: could not find referenced PRIMARY KEY in table %s.%s\n", rsname, 
rtname);
+                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
FOREIGN KEY: could not find referenced PRIMARY KEY in table %s.%s", rsname, 
rtname);
                        return res;
                }
                if (list_length(rk->columns) != 1) {
-                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
FOREIGN KEY: not all columns are handled\n");
+                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
FOREIGN KEY: not all columns are handled");
                        return res;
                }
                kc = rk->columns->h->data;
                if (!foreign_key_check_types(&cs->type, &kc->c->type)) {
                        str tp1 = sql_subtype_string(sql->ta, &cs->type), tp2 = 
sql_subtype_string(sql->ta, &kc->c->type);
-                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
FOREIGN KEY: the type of the FOREIGN KEY column '%s' %s is not compatible with 
the referenced %s KEY column type %s\n",
+                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
FOREIGN KEY: the type of the FOREIGN KEY column '%s' %s is not compatible with 
the referenced %s KEY column type %s",
                                                         cs->base.name, tp1, 
rk->type == pkey ? "PRIMARY" : "UNIQUE", tp2);
                        return res;
                }
@@ -514,7 +536,7 @@ column_constraint_type(mvc *sql, const c
                res = SQL_OK;
        }       break;
        case SQL_CHECK: {
-               (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT CHECK: 
check constraints not supported\n");
+               (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT CHECK: 
check constraints not supported");
                return SQL_ERR;
        }       break;
        default:{
@@ -522,7 +544,7 @@ column_constraint_type(mvc *sql, const c
        }
        }
        if (res == SQL_ERR) {
-               (void) sql_error(sql, 02, SQLSTATE(M0M03) "Unknown constraint 
(%p)->token = %s\n", s, token2string(s->token));
+               (void) sql_error(sql, 02, SQLSTATE(M0M03) "Unknown constraint 
(%p)->token = %s", s, token2string(s->token));
        }
        return res;
 }
@@ -587,7 +609,7 @@ column_options(sql_query *query, dlist *
                                        }
                                        r = symbol2string(sql, s->data.sym, 0, 
&err);
                                        if (!r) {
-                                               (void) sql_error(sql, 02, 
SQLSTATE(42000) "Incorrect default value '%s'\n", err?err:"");
+                                               (void) sql_error(sql, 02, 
SQLSTATE(42000) "Incorrect default value '%s'", err?err:"");
                                                return SQL_ERR;
                                        } else {
                                                switch (mvc_default(sql, cs, 
r)) {
@@ -626,7 +648,7 @@ column_options(sql_query *query, dlist *
                                        }
                                }       break;
                                default: {
-                                       (void) sql_error(sql, 02, 
SQLSTATE(M0M03) "Unknown column option (%p)->token = %s\n", s, 
token2string(s->token));
+                                       (void) sql_error(sql, 02, 
SQLSTATE(M0M03) "Unknown column option (%p)->token = %s", s, 
token2string(s->token));
                                        return SQL_ERR;
                                }
                        }
@@ -636,11 +658,12 @@ column_options(sql_query *query, dlist *
 }
 
 static int
-table_foreign_key(mvc *sql, char *name, symbol *s, sql_schema *ss, sql_table 
*t)
+table_foreign_key(mvc *sql, const char *name, symbol *s, sql_schema *ss, 
sql_table *t)
 {
        dnode *n = s->data.lval->h;
        char *rsname = qname_schema(n->data.lval);
        char *rtname = qname_schema_object(n->data.lval);
+       const char *ns = name;
        sql_table *ft = NULL;
 
        ft = find_table_or_view_on_scope(sql, ss, rsname, rtname, "CONSTRAINT 
FOREIGN KEY", false);
@@ -660,8 +683,18 @@ table_foreign_key(mvc *sql, char *name, 
                int ref_actions = n->next->next->next->next->data.i_val;
 
                assert(n->next->next->next->next->type == type_int);
-               if (name && (ol_find_name(t->keys, name) || mvc_bind_key(sql, 
ss, name))) {
-                       sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT FOREIGN 
KEY: key '%s' already exists", name);
+               if (!ns || !*ns) { /* add this to be safe */
+                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
FOREIGN KEY: key name name cannot be empty");
+                       return SQL_ERR;
+               }
+               while (isdigit((unsigned char) *ns))
+                       ns++;
+               if (!*ns) { /* if a key name just contains digit characters, 
the generated index name can be mistaken with a label */
+                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
FOREIGN KEY: key name cannot contain just digit characters (0 through 9)");
+                       return SQL_ERR;
+               }
+               if (ol_find_name(t->keys, name) || mvc_bind_key(sql, ss, name)) 
{
+                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
FOREIGN KEY: key '%s' already exists", name);
                        return SQL_ERR;
                }
                if (n->next->next->data.lval) { /* find unique referenced key */
@@ -678,7 +711,7 @@ table_foreign_key(mvc *sql, char *name, 
                        rk = &ft->pkey->k;
                }
                if (!rk) {
-                       sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT FOREIGN 
KEY: could not find referenced PRIMARY KEY in table '%s'\n", ft->base.name);
+                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
FOREIGN KEY: could not find referenced PRIMARY KEY in table '%s'", 
ft->base.name);
                        return SQL_ERR;
                }
                switch (mvc_create_fkey(&fk, sql, t, name, fkey, rk, 
ref_actions & 255, (ref_actions>>8) & 255)) {
@@ -699,12 +732,12 @@ table_foreign_key(mvc *sql, char *name, 
                        sql_kc *kc = fnms->data;
 
                        if (!cs) {
-                               sql_error(sql, ERR_NOTFOUND, SQLSTATE(42S22) 
"CONSTRAINT FOREIGN KEY: no such column '%s' in table '%s'\n", nm, 
t->base.name);
+                               (void) sql_error(sql, ERR_NOTFOUND, 
SQLSTATE(42S22) "CONSTRAINT FOREIGN KEY: no such column '%s' in table '%s'", 
nm, t->base.name);
                                return SQL_ERR;
                        }
                        if (!foreign_key_check_types(&cs->type, &kc->c->type)) {
                                str tp1 = sql_subtype_string(sql->ta, 
&cs->type), tp2 = sql_subtype_string(sql->ta, &kc->c->type);
-                               (void) sql_error(sql, 02, SQLSTATE(42000) 
"CONSTRAINT FOREIGN KEY: the type of the FOREIGN KEY column '%s' %s is not 
compatible with the referenced %s KEY column type %s\n",
+                               (void) sql_error(sql, 02, SQLSTATE(42000) 
"CONSTRAINT FOREIGN KEY: the type of the FOREIGN KEY column '%s' %s is not 
compatible with the referenced %s KEY column type %s",
                                                                 cs->base.name, 
tp1, rk->type == pkey ? "PRIMARY" : "UNIQUE", tp2);
                                return SQL_ERR;
                        }
@@ -721,7 +754,7 @@ table_foreign_key(mvc *sql, char *name, 
                        }
                }
                if (nms || fnms) {
-                       sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT FOREIGN 
KEY: not all columns are handled\n");
+                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
FOREIGN KEY: not all columns are handled");
                        return SQL_ERR;
                }
                switch (mvc_create_key_done(sql, (sql_key*)fk)) {
@@ -740,7 +773,7 @@ table_foreign_key(mvc *sql, char *name, 
 }
 
 static int
-table_constraint_type(mvc *sql, char *name, symbol *s, sql_schema *ss, 
sql_table *t)
+table_constraint_type(mvc *sql, const char *name, symbol *s, sql_schema *ss, 
sql_table *t)
 {
        int res = SQL_OK;
 
@@ -750,14 +783,24 @@ table_constraint_type(mvc *sql, char *na
                key_type kt = (s->token == SQL_PRIMARY_KEY ? pkey : ukey);
                dnode *nms = s->data.lval->h;
                sql_key *k;
+               const char *ns = name;
 
                if (kt == pkey && t->pkey) {
-                       sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT PRIMARY 
KEY: a table can have only one PRIMARY KEY\n");
+                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
PRIMARY KEY: a table can have only one PRIMARY KEY");
+                       return SQL_ERR;
+               }
+               if (!ns || !*ns) { /* add this to be safe */
+                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
%s: key name name cannot be empty", kt == pkey ? "PRIMARY KEY" : "UNIQUE");
                        return SQL_ERR;
                }
-               if (name && (ol_find_name(t->keys, name) || mvc_bind_key(sql, 
ss, name))) {
-                       sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT %s: key 
'%s' already exists",
-                                       kt == pkey ? "PRIMARY KEY" : "UNIQUE", 
name);
+               while (isdigit((unsigned char) *ns))
+                       ns++;
+               if (!*ns) { /* if a key name just contains digit characters, 
the generated index name can be mistaken with a label */
+                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
%s: key name cannot contain just digit characters (0 through 9)", kt == pkey ? 
"PRIMARY KEY" : "UNIQUE");
+                       return SQL_ERR;
+               }
+               if (ol_find_name(t->keys, name) || mvc_bind_key(sql, ss, name)) 
{
+                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
%s: key '%s' already exists", kt == pkey ? "PRIMARY KEY" : "UNIQUE", name);
                        return SQL_ERR;
                }
 
@@ -777,7 +820,7 @@ table_constraint_type(mvc *sql, char *na
                        sql_column *c = mvc_bind_column(sql, t, nm);
 
                        if (!c) {
-                               sql_error(sql, ERR_NOTFOUND, SQLSTATE(42S22) 
"CONSTRAINT %s: no such column '%s' for table '%s'",
+                               (void) sql_error(sql, ERR_NOTFOUND, 
SQLSTATE(42S22) "CONSTRAINT %s: no such column '%s' for table '%s'",
                                                kt == pkey ? "PRIMARY KEY" : 
"UNIQUE",
                                                nm, t->base.name);
                                return SQL_ERR;
@@ -810,14 +853,14 @@ table_constraint_type(mvc *sql, char *na
                res = table_foreign_key(sql, name, s, ss, t);
                break;
        case SQL_CHECK: {
-               (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT CHECK: 
check constraints not supported\n");
+               (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT CHECK: 
check constraints not supported");
                return SQL_ERR;
        }       break;
        default:
                res = SQL_ERR;
        }
        if (res != SQL_OK) {
-               sql_error(sql, 02, SQLSTATE(M0M03) "Table constraint type: 
wrong token (%p) = %s\n", s, token2string(s->token));
+               (void) sql_error(sql, 02, SQLSTATE(M0M03) "Table constraint 
type: wrong token (%p) = %s", s, token2string(s->token));
                return SQL_ERR;
        }
        return res;
@@ -841,7 +884,7 @@ table_constraint(mvc *sql, symbol *s, sq
        }
 
        if (res != SQL_OK) {
-               sql_error(sql, 02, SQLSTATE(M0M03) "Table constraint: wrong 
token (%p) = %s\n", s, token2string(s->token));
+               (void) sql_error(sql, 02, SQLSTATE(M0M03) "Table constraint: 
wrong token (%p) = %s", s, token2string(s->token));
                return SQL_ERR;
        }
        return res;
@@ -859,7 +902,7 @@ create_column(sql_query *query, symbol *
 
        (void) ss;
        if (alter && !(isTable(t) || ((isMergeTable(t) || isReplicaTable(t)) && 
list_length(t->members)==0))) {
-               sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: cannot add 
column to %s '%s'%s\n",
+               (void) sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: cannot 
add column to %s '%s'%s",
                                  TABLE_TYPE_DESCRIPTION(t->type, 
t->properties),
                                  t->base.name, ((isMergeTable(t) || 
isReplicaTable(t)) && list_length(t->members)) ? " while it has partitions" : 
"");
                return SQL_ERR;
@@ -871,22 +914,22 @@ create_column(sql_query *query, symbol *
                sql_column *cs = NULL;
 
                if (!isView(t) && cname && cname[0] == '%') {
-                       sql_error(sql, 01, SQLSTATE(42000) "%s TABLE: generated 
labels not allowed in column names, use an alias instead", 
(alter)?"ALTER":"CREATE");
+                       (void) sql_error(sql, 01, SQLSTATE(42000) "%s TABLE: 
generated labels not allowed in column names, use an alias instead", 
(alter)?"ALTER":"CREATE");
                        return SQL_ERR;
                } else if (ctype->type->eclass == EC_ANY) {
-                       sql_error(sql, 01, SQLSTATE(42000) "%s TABLE: any type 
(plain null value) not allowed as a column type, use an explicit cast", 
(alter)?"ALTER":"CREATE");
+                       (void) sql_error(sql, 01, SQLSTATE(42000) "%s TABLE: 
any type (plain null value) not allowed as a column type, use an explicit 
cast", (alter)?"ALTER":"CREATE");
                        return SQL_ERR;
                } else if ((cs = find_sql_column(t, cname))) {
-                       sql_error(sql, 02, SQLSTATE(42S21) "%s TABLE: a column 
named '%s' already exists\n", (alter)?"ALTER":"CREATE", cname);
+                       (void) sql_error(sql, 02, SQLSTATE(42S21) "%s TABLE: a 
column named '%s' already exists", (alter)?"ALTER":"CREATE", cname);
                        return SQL_ERR;
                }
                switch (mvc_create_column(&cs, sql, t, cname, ctype)) {
                        case -1:
-                               sql_error(sql, 01, SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+                               (void) sql_error(sql, 01, SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                                return SQL_ERR;
                        case -2:
                        case -3:
-                               sql_error(sql, 01, SQLSTATE(42000) "%s TABLE: 
transaction conflict detected", (alter)?"ALTER":"CREATE");
+                               (void) sql_error(sql, 01, SQLSTATE(42000) "%s 
TABLE: transaction conflict detected", (alter)?"ALTER":"CREATE");
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to