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