Changeset: ec033fc3426a for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ec033fc3426a
Modified Files:
        clients/mapilib/mapi.c
        java/SQLSTATEs
        sql/backends/monet5/sql.mx
        sql/backends/monet5/sql_scenario.c
        sql/server/sql_parser.y
Branch: Dec2011
Log Message:

SQL: send SQLSTATE numbers in exception messages (incomplete)

This is a first shot at adding SQLSTATEs to error messages.  This needs
to be improved and extended.

Mapi omits the SQLSTATE when printing errors to keep diffs in testing
low (and because users won't find anything interesting in it in general either).


diffs (truncated from 783 to 300 lines):

diff --git a/clients/mapilib/mapi.c b/clients/mapilib/mapi.c
--- a/clients/mapilib/mapi.c
+++ b/clients/mapilib/mapi.c
@@ -1122,6 +1122,17 @@ clean_print(char *msg, const char *prefi
                if (strncmp(msg, prefix, len) == 0)
                        msg += len;
 
+               /* skip SQLSTATE if provided */
+               if (strlen(msg) > 6 && msg[5] == ':' &&
+                               ((msg[0] >= '0' && msg[0] <= '9') || (msg[0] >= 
'A' && msg[0] <= 'Z')) &&
+                               ((msg[1] >= '0' && msg[1] <= '9') || (msg[1] >= 
'A' && msg[1] <= 'Z')) &&
+                               ((msg[2] >= '0' && msg[2] <= '9') || (msg[2] >= 
'A' && msg[2] <= 'Z')) &&
+                               ((msg[3] >= '0' && msg[3] <= '9') || (msg[3] >= 
'A' && msg[3] <= 'Z')) &&
+                               ((msg[4] >= '0' && msg[4] <= '9') || (msg[4] >= 
'A' && msg[4] <= 'Z')))
+               {
+                       msg += 6;
+               }
+
                /* output line */
                fputs(msg, fd);
                fputc('\n', fd);
@@ -1141,6 +1152,18 @@ indented_print(const char *msg, const ch
        while (p && *p) {
                fprintf(fd, "%.*s%c", len - 1, s, t);
                s = "        ";
+
+               /* skip SQLSTATE if provided */
+               if (strlen(p) > 6 && p[5] == ':' &&
+                               ((p[0] >= '0' && p[0] <= '9') || (p[0] >= 'A' 
&& p[0] <= 'Z')) &&
+                               ((p[1] >= '0' && p[1] <= '9') || (p[1] >= 'A' 
&& p[1] <= 'Z')) &&
+                               ((p[2] >= '0' && p[2] <= '9') || (p[2] >= 'A' 
&& p[2] <= 'Z')) &&
+                               ((p[3] >= '0' && p[3] <= '9') || (p[3] >= 'A' 
&& p[3] <= 'Z')) &&
+                               ((p[4] >= '0' && p[4] <= '9') || (p[4] >= 'A' 
&& p[4] <= 'Z')))
+               {
+                       p += 6;
+               }
+
                q = strchr(p, '\n');
                if (q) {
                        q++;    /* also print the newline */
diff --git a/java/SQLSTATEs b/java/SQLSTATEs
--- a/java/SQLSTATEs
+++ b/java/SQLSTATEs
@@ -27,3 +27,8 @@ 01M23 field size limitation not supporte
 01M24 query time out not supported
 M1M25 failed reading from/writing to object stream
 08M26 invalid URI
+M0M27 unknown error
+22M28 invalid BLOB format
+M0M29 assert
+3BM30 autocommit mode active
+2DM30 autocommit mode active
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
@@ -828,7 +828,7 @@ function sql.zero_or_one{inline}( b:bat[
        c1 := calc.>(m,1:wrd);
        c11 := calc.and(c01,c1);
        ms := calc.str(m); 
-       msg := str.+("zero_or_one: cardinality violation (", ms);
+       msg := str.+("21000:zero_or_one: cardinality violation (", ms);
        msg1 := str.+(msg, ">1)");
        sql.assert(c11, msg1);
        return zero_or_one := b;
@@ -1753,38 +1753,38 @@ SQLtransaction(Client cntxt, MalBlkPtr m
        switch (type) {
        case DDL_RELEASE:
                if (sql->session->auto_commit == 1) 
-                       throw(SQL, "sql.trans", "RELEASE SAVEPOINT: not allowed 
in auto commit mode");
+                       throw(SQL, "sql.trans", "3BM30:RELEASE SAVEPOINT: not 
allowed in auto commit mode");
                ret = mvc_release(sql, name);
                if (ret < 0) {
-                       snprintf(buf, BUFSIZ, "RELEASE SAVEPOINT: (%s) failed", 
name);
+                       snprintf(buf, BUFSIZ, "3B000:RELEASE SAVEPOINT: (%s) 
failed", name);
                        throw(SQL, "sql.trans", "%s", buf);
                }
                break;
        case DDL_COMMIT:
                if (sql->session->auto_commit == 1) {
                        if (name)
-                               throw(SQL,"sql.trans", "SAVEPOINT: not allowed 
in auto commit mode");
+                               throw(SQL,"sql.trans", "3BM30:SAVEPOINT: not 
allowed in auto commit mode");
                        else
-                               throw(SQL,"sql.trans", "COMMIT: not allowed in 
auto commit mode");
+                               throw(SQL,"sql.trans", "2DM30:COMMIT: not 
allowed in auto commit mode");
                }
                ret = mvc_commit(sql, chain, name);
                if (ret < 0 && !name) 
-                       throw(SQL, "sql.trans", "COMMIT: failed");
+                       throw(SQL, "sql.trans", "2D000:COMMIT: failed");
                if (ret < 0 && name)
-                       throw(SQL, "sql.trans", "SAVEPOINT: (%s) failed", name);
+                       throw(SQL, "sql.trans", "3B000:SAVEPOINT: (%s) failed", 
name);
                break;
        case DDL_ROLLBACK:
                if (sql->session->auto_commit == 1) 
-                       throw(SQL, "sql.trans", "ROLLBACK: not allowed in auto 
commit mode");
+                       throw(SQL, "sql.trans", "2DM30:ROLLBACK: not allowed in 
auto commit mode");
                ret = mvc_rollback(sql, chain, name);
                if (ret < 0 && name) {
-                       snprintf(buf, BUFSIZ, "ROLLBACK TO SAVEPOINT: (%s) 
failed", name);
+                       snprintf(buf, BUFSIZ, "3B000:ROLLBACK TO SAVEPOINT: 
(%s) failed", name);
                        throw(SQL, "sql.trans", "%s", buf);
                }
                break;
        case DDL_TRANS:
                if (sql->session->auto_commit == 0) 
-                       throw(SQL, "sql.trans", "START TRANSACTION: cannot 
start a transaction within a transaction");
+                       throw(SQL, "sql.trans", "25001:START TRANSACTION: 
cannot start a transaction within a transaction");
                if (sql->session->active)
                        mvc_rollback(sql, 0, NULL);
                sql->session->auto_commit = 0;
@@ -1808,10 +1808,10 @@ SQLcommit(Client cntxt, MalBlkPtr mb, Ma
        (void) pci;
 
        if (sql->session->auto_commit != 0) 
-               throw(SQL,"sql.trans", "COMMIT: not allowed in auto commit 
mode");
+               throw(SQL,"sql.trans", "2DM30:COMMIT: not allowed in auto 
commit mode");
        ret = mvc_commit(sql, 0, 0);
        if (ret < 0 ) 
-               throw(SQL, "sql.trans", "COMMIT: failed");
+               throw(SQL, "sql.trans", "2D000:COMMIT: failed");
        return msg;
 }
 
@@ -1824,7 +1824,7 @@ SQLtransaction2(Client cntxt, MalBlkPtr 
        (void) stk;
        (void) pci;
        if (sql->session->auto_commit == 0) 
-               throw(SQL, "sql.trans", "START TRANSACTION: cannot start a 
transaction within a transaction");
+               throw(SQL, "sql.trans", "25001:START TRANSACTION: cannot start 
a transaction within a transaction");
        if (sql->session->active)
                mvc_rollback(sql, 0, NULL);
        sql->session->auto_commit = 0;
@@ -1842,16 +1842,16 @@ create_table_or_view( mvc *sql, char *sn
        node *n;
 
        if (STORE_READONLY(active_store_type)) 
-               return sql_error(sql, 06, "schema statements cannot be executed 
on a readonly database.");
+               return sql_error(sql, 06, "25006:schema statements cannot be 
executed on a readonly database.");
 
        if (!s) 
-               return sql_message("CREATE %s: schema '%s' doesn't exist", 
(t->query)?"TABLE":"VIEW", sname);
+               return sql_message("3F000:CREATE %s: schema '%s' doesn't 
exist", (t->query)?"TABLE":"VIEW", sname);
 
        if (mvc_bind_table(sql, s, t->base.name)) {
                char *cd = (temp == SQL_DECLARED_TABLE)?"DECLARE":"CREATE";
-               return sql_message("%s TABLE: name '%s' already in use", cd, 
t->base.name);
+               return sql_message("40000:%s TABLE: name '%s' already in use", 
cd, t->base.name);
        } else if (temp != SQL_DECLARED_TABLE && (!schema_privs(sql->role_id, 
s) && !(isTempSchema(s) && temp == SQL_LOCAL_TEMP))){
-               return sql_message("CREATE TABLE: insufficient privileges for 
user '%s' in schema '%s'", stack_get_string(sql, "current_user"), s->base.name);
+               return sql_message("40000:CREATE TABLE: insufficient privileges 
for user '%s' in schema '%s'", stack_get_string(sql, "current_user"), 
s->base.name);
        }
 
        /* first check default values */
@@ -1913,13 +1913,13 @@ alter_table( mvc *sql, char *sname, sql_
        node *n;
 
        if (!s) 
-               return sql_message("ALTER TABLE: no such schema '%s'", sname);
+               return sql_message("3F000:ALTER TABLE: no such schema '%s'", 
sname);
 
        if ((nt = mvc_bind_table(sql, s, t->base.name)) == NULL) {
-               return sql_message("ALTER TABLE: no such table '%s'", 
t->base.name);
+               return sql_message("40000:ALTER TABLE: no such table '%s'", 
t->base.name);
 
        } else if (!schema_privs(sql->role_id, s) && !(isTempSchema(s) && 
t->persistence == SQL_LOCAL_TEMP)){
-               return sql_message("ALTER TABLE: insufficient privileges for 
user '%s' in schema '%s'", stack_get_string(sql, "current_user"), s->base.name);
+               return sql_message("40000:ALTER TABLE: insufficient privileges 
for user '%s' in schema '%s'", stack_get_string(sql, "current_user"), 
s->base.name);
        }
 
        /* First check if all the changes are allowed */
@@ -1929,7 +1929,7 @@ alter_table( mvc *sql, char *sname, sql_
                        for (n = t->idxs.nelm; n; n = n->next) {
                                sql_idx *i = n->data;
                                if (i->key->type == pkey)
-                                       return sql_message("CONSTRAINT PRIMARY 
KEY: a table can have only one PRIMARY KEY\n");
+                                       return sql_message("40000:CONSTRAINT 
PRIMARY KEY: a table can have only one PRIMARY KEY\n");
                        }
                }
        }
@@ -1977,7 +1977,7 @@ alter_table( mvc *sql, char *sname, sql_
                                if (BATcount(b) && b->T->nonil != TRUE) {
                                        BUN bun = BUNfnd(BATmirror(b), 
ATOMnilptr(b->ttype));
                                        if (bun != BUN_NONE)
-                                               return sql_message ("ALTER 
TABLE: NOT NULL constraint violated for column %s.%s", c->t->base.name, 
c->base.name );
+                                               return sql_message 
("40002:ALTER TABLE: NOT NULL constraint violated for column %s.%s", 
c->t->base.name, c->base.name );
                                }
                                BBPunfix(b->batCacheid);
                        }
@@ -2032,7 +2032,7 @@ drop_table(mvc *sql, char *sname, char *
        node *n; 
 
        if (sname && !(s=mvc_bind_schema(sql, sname))) 
-               return sql_message("DROP TABLE: no such schema '%s'", sname);
+               return sql_message("3F000:DROP TABLE: no such schema '%s'", 
sname);
        if (!s)
                s = cur_schema(sql);
        t = mvc_bind_table(sql, s, tname);
@@ -2041,13 +2041,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);
+               return sql_message("40000:DROP TABLE: no such table '%s'", 
tname);
        } else if (!isTable(t) && !isStream(t) && !isRemote(t)) {
-               return sql_message("DROP TABLE: cannot drop VIEW '%s'", tname);
+               return sql_message("40000:DROP TABLE: cannot drop VIEW '%s'", 
tname);
        } else if (t->system) {
-               return sql_message("DROP TABLE: cannot drop system table '%s'", 
tname);
+               return sql_message("40000:DROP TABLE: cannot drop system table 
'%s'", tname);
        } else if (!schema_privs(sql->role_id, s) && !(isTempSchema(s) && 
t->persistence == SQL_LOCAL_TEMP)){
-               return sql_message("DROP TABLE: access denied for %s to schema 
;'%s'", stack_get_string(sql, "current_user"), s->base.name);
+               return sql_message("40000:DROP TABLE: access denied for %s to 
schema ;'%s'", 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) {
@@ -2063,7 +2063,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("40000:DROP TABLE: FOREIGN KEY %s.%s depends on %s", 
k->t->base.name, k->base.name, tname);
                                        }
                                }
                        }
@@ -2071,7 +2071,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("40000:DROP TABLE: unable to drop table %s 
(there are database objects which depend on it)\n", t->base.name);
        
        mvc_drop_table(sql, s, t, drop_action);
        return MAL_SUCCEED;
@@ -2084,7 +2084,7 @@ drop_view(mvc *sql, char *sname, char *t
        sql_schema *ss = NULL;
 
        if (sname != NULL && (ss = mvc_bind_schema(sql, sname)) == NULL)
-               return sql_message("DROP VIEW: no such schema '%s'", sname);
+               return sql_message("3F000:DROP VIEW: no such schema '%s'", 
sname);
 
        if (ss == NULL)
                ss = cur_schema(sql);
@@ -2092,15 +2092,15 @@ drop_view(mvc *sql, char *sname, char *t
        t = mvc_bind_table(sql, ss, tname);
 
        if (!schema_privs(sql->role_id, ss) && !(isTempSchema(ss) && t && 
t->persistence == SQL_LOCAL_TEMP)){  
-               return sql_message("DROP VIEW: access denied for %s to schema 
'%s'", stack_get_string(sql, "current_user"), ss->base.name);
+               return sql_message("40000:DROP VIEW: access denied for %s to 
schema '%s'", stack_get_string(sql, "current_user"), ss->base.name);
        } else if (!t) {
-               return sql_message("DROP VIEW: unknown view '%s'", tname);
+               return sql_message("40000:DROP VIEW: unknown view '%s'", tname);
        } else if (!isView(t)) {
-               return sql_message("DROP VIEW: unable to drop view '%s': is a 
table", tname);
+               return sql_message("40000:DROP VIEW: unable to drop view '%s': 
is a table", tname);
        } else if (t->system) {
-               return sql_message("DROP VIEW: cannot drop system view '%s'", 
tname);
+               return sql_message("40000:DROP VIEW: cannot drop system view 
'%s'", tname);
        } else if (! drop_action && mvc_check_dependency(sql, t->base.id, 
VIEW_DEPENDENCY, NULL)) {
-                       return sql_message("unable to drop view %s (there are 
database objects which depend on it)\n", t->base.name);
+                       return sql_message("40000:DROP VIEW: cannot drop view 
'%s', there are database objects which depend on it", t->base.name);
        } else {
                mvc_drop_table(sql, ss, t, drop_action);
                return MAL_SUCCEED;
@@ -2114,15 +2114,15 @@ drop_key( mvc *sql, char *sname, char *k
        sql_schema *ss = NULL;
 
        if (sname != NULL && (ss = mvc_bind_schema(sql, sname)) == NULL)
-               return sql_message("DROP VIEW: no such schema '%s'", sname);
+               return sql_message("3F000:ALTER TABLE: no such schema '%s'", 
sname);
 
        if (ss == NULL)
                ss = cur_schema(sql);
 
        if ((key = mvc_bind_key(sql, ss, kname )) == NULL) 
-               return sql_message("ALTER TABLE: no such constraint '%s'", 
kname);
+               return sql_message("40000:ALTER TABLE: no such constraint 
'%s'", kname);
        if (!drop_action && mvc_check_dependency(sql, key->base.id, 
KEY_DEPENDENCY, NULL)) 
-               return sql_message("ALTER TABLE: cannot drop constraint '%s': 
there are database objects which depend on it", key->base.name);
+               return sql_message("40000:ALTER TABLE: cannot drop constraint 
'%s': there are database objects which depend on it", key->base.name);
        mvc_drop_key(sql, ss, key, drop_action);
        return MAL_SUCCEED;
 }
@@ -2135,29 +2135,29 @@ create_index( mvc *sql, char *iname, int
        sql_idx *i = NULL;
 
        if (!(s = mvc_bind_schema(sql, sname)))
-               return sql_message("CREATE INDEX: no such schema '%s'", sname);
+               return sql_message("3F000:CREATE INDEX: no such schema '%s'", 
sname);
 
        i = mvc_bind_idx(sql, s, iname);
        t = mvc_bind_table(sql, s, tname);
        if (i) {
-               return sql_message("CREATE INDEX: name '%s' already in use", 
iname);
+               return sql_message("40000:CREATE INDEX: name '%s' already in 
use", iname);
        } else if (!t) {
-               return sql_message("CREATE INDEX: no such table '%s'", tname);
+               return sql_message("40000:CREATE INDEX: no such table '%s'", 
tname);
        } else if (isView(t)) {
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to