Changeset: 9da7ad49ac99 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9da7ad49ac99
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_assert.c
Branch: default
Log Message:

Pass proper SQLSTATE on to client.


diffs (255 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -3594,9 +3594,9 @@ insert_check_ukey(backend *be, list *ins
                }
 
                if (k->type == pkey) {
-                       msg = sa_message(sql->sa, "INSERT INTO: PRIMARY KEY 
constraint '%s.%s' violated", k->t->base.name, k->base.name);
+                       msg = sa_message(sql->sa, SQLSTATE(40002) "INSERT INTO: 
PRIMARY KEY constraint '%s.%s' violated", k->t->base.name, k->base.name);
                } else {
-                       msg = sa_message(sql->sa, "INSERT INTO: UNIQUE 
constraint '%s.%s' violated", k->t->base.name, k->base.name);
+                       msg = sa_message(sql->sa, SQLSTATE(40002) "INSERT INTO: 
UNIQUE constraint '%s.%s' violated", k->t->base.name, k->base.name);
                }
                res = stmt_exception(be, s, msg, 00001);
        } else {                /* single column key */
@@ -3648,9 +3648,9 @@ insert_check_ukey(backend *be, list *ins
                        s = stmt_binop(be, s, count_sum, or);
                }
                if (k->type == pkey) {
-                       msg = sa_message( sql->sa,"INSERT INTO: PRIMARY KEY 
constraint '%s.%s' violated", k->t->base.name, k->base.name);
+                       msg = sa_message( sql->sa, SQLSTATE(40002) "INSERT 
INTO: PRIMARY KEY constraint '%s.%s' violated", k->t->base.name, k->base.name);
                } else {
-                       msg = sa_message(sql->sa, "INSERT INTO: UNIQUE 
constraint '%s.%s' violated", k->t->base.name, k->base.name);
+                       msg = sa_message(sql->sa, SQLSTATE(40002) "INSERT INTO: 
UNIQUE constraint '%s.%s' violated", k->t->base.name, k->base.name);
                }
                res = stmt_exception(be, s, msg, 00001);
        }
@@ -3678,7 +3678,7 @@ insert_check_fkey(backend *be, list *ins
        }
 
        /* s should be empty */
-       msg = sa_message(sql->sa, "INSERT INTO: FOREIGN KEY constraint '%s.%s' 
violated", k->t->base.name, k->base.name);
+       msg = sa_message(sql->sa, SQLSTATE(40002) "INSERT INTO: FOREIGN KEY 
constraint '%s.%s' violated", k->t->base.name, k->base.name);
        return stmt_exception(be, s, msg, 00001);
 }
 
@@ -3789,7 +3789,7 @@ sql_insert_check_null(backend *be, sql_t
 
                                s = stmt_unop(be, i, isnil);
                        }
-                       msg = sa_message(sql->sa, "INSERT INTO: NOT NULL 
constraint violated for column %s.%s", c->t->base.name, c->base.name);
+                       msg = sa_message(sql->sa, SQLSTATE(40002) "INSERT INTO: 
NOT NULL constraint violated for column %s.%s", c->t->base.name, c->base.name);
                        (void)stmt_exception(be, s, msg, 00001);
                }
        }
@@ -4084,9 +4084,9 @@ update_check_ukey(backend *be, stmt **up
                }
 
                if (k->type == pkey) {
-                       msg = sa_message(sql->sa, "UPDATE: PRIMARY KEY 
constraint '%s.%s' violated", k->t->base.name, k->base.name);
+                       msg = sa_message(sql->sa, SQLSTATE(40002) "UPDATE: 
PRIMARY KEY constraint '%s.%s' violated", k->t->base.name, k->base.name);
                } else {
-                       msg = sa_message(sql->sa, "UPDATE: UNIQUE constraint 
'%s.%s' violated", k->t->base.name, k->base.name);
+                       msg = sa_message(sql->sa, SQLSTATE(40002) "UPDATE: 
UNIQUE constraint '%s.%s' violated", k->t->base.name, k->base.name);
                }
                res = stmt_exception(be, s, msg, 00001);
        } else {                /* single column key */
@@ -4144,9 +4144,9 @@ update_check_ukey(backend *be, stmt **up
                }
 
                if (k->type == pkey) {
-                       msg = sa_message(sql->sa, "UPDATE: PRIMARY KEY 
constraint '%s.%s' violated", k->t->base.name, k->base.name);
+                       msg = sa_message(sql->sa, SQLSTATE(40002) "UPDATE: 
PRIMARY KEY constraint '%s.%s' violated", k->t->base.name, k->base.name);
                } else {
-                       msg = sa_message(sql->sa, "UPDATE: UNIQUE constraint 
'%s.%s' violated", k->t->base.name, k->base.name);
+                       msg = sa_message(sql->sa, SQLSTATE(40002) "UPDATE: 
UNIQUE constraint '%s.%s' violated", k->t->base.name, k->base.name);
                }
                res = stmt_exception(be, s, msg, 00001);
        }
@@ -4241,7 +4241,7 @@ update_check_fkey(backend *be, stmt **up
                stmt_binop(be, stmt_aggr(be, stmt_selectnil(be, idx_updates), 
NULL, NULL, cnt, 1, 0, 1), cntnulls , ne), or);
 
        /* s should be empty */
-       msg = sa_message(sql->sa, "UPDATE: FOREIGN KEY constraint '%s.%s' 
violated", k->t->base.name, k->base.name);
+       msg = sa_message(sql->sa, SQLSTATE(40002) "UPDATE: FOREIGN KEY 
constraint '%s.%s' violated", k->t->base.name, k->base.name);
        return stmt_exception(be, s, msg, 00001);
 }
 
@@ -4306,7 +4306,7 @@ join_updated_pkey(backend *be, sql_key *
        s = stmt_binop(be, cnteqjoin, stmt_aggr(be, rows, NULL, NULL, cnt, 1, 
0, 1), ne);
 
        /* s should be empty */
-       msg = sa_message(sql->sa, "UPDATE: FOREIGN KEY constraint '%s.%s' 
violated", k->t->base.name, k->base.name);
+       msg = sa_message(sql->sa, SQLSTATE(40002) "UPDATE: FOREIGN KEY 
constraint '%s.%s' violated", k->t->base.name, k->base.name);
        return stmt_exception(be, s, msg, 00001);
 }
 
@@ -4740,7 +4740,7 @@ sql_update_check_null(backend *be, sql_t
 
                                s = stmt_unop(be, updates[c->colnr], isnil);
                        }
-                       msg = sa_message(sql->sa, "UPDATE: NOT NULL constraint 
violated for column '%s.%s'", c->t->base.name, c->base.name);
+                       msg = sa_message(sql->sa, SQLSTATE(40002) "UPDATE: NOT 
NULL constraint violated for column '%s.%s'", c->t->base.name, c->base.name);
                        (void)stmt_exception(be, s, msg, 00001);
                }
        }
@@ -5039,7 +5039,7 @@ sql_delete_ukey(backend *be, stmt *utids
                                        default:        /*RESTRICT*/
                                                /* The overlap between deleted 
primaries and foreign should be empty */
                                                s = stmt_binop(be, 
stmt_aggr(be, tids, NULL, NULL, cnt, 1, 0, 1), stmt_atom_lng(be, 0), ne);
-                                               msg = sa_message(sql->sa, "%s: 
FOREIGN KEY constraint '%s.%s' violated", which, fk->t->base.name, 
fk->base.name);
+                                               msg = sa_message(sql->sa, 
SQLSTATE(40002) "%s: FOREIGN KEY constraint '%s.%s' violated", which, 
fk->t->base.name, fk->base.name);
                                                s = stmt_exception(be, s, msg, 
00001);
                                                list_prepend(l, s);
                                }
diff --git a/sql/backends/monet5/sql_assert.c b/sql/backends/monet5/sql_assert.c
--- a/sql/backends/monet5/sql_assert.c
+++ b/sql/backends/monet5/sql_assert.c
@@ -33,114 +33,61 @@
  * raise an exception. A debugger dump is generated upon request
  * to ease debugging.
  */
+static inline str
+do_assert(bool flg, const char *msg)
+{
+       if (flg) {
+               if (strlen(msg) > 6 &&
+                   msg[5] == '!' &&
+                   (isdigit((unsigned char) msg[0]) ||
+                    isupper((unsigned char) msg[0])) &&
+                   (isdigit((unsigned char) msg[1]) ||
+                    isupper((unsigned char) msg[1])) &&
+                   (isdigit((unsigned char) msg[2]) ||
+                    isupper((unsigned char) msg[2])) &&
+                   (isdigit((unsigned char) msg[3]) ||
+                    isupper((unsigned char) msg[3])) &&
+                   (isdigit((unsigned char) msg[4]) ||
+                    isupper((unsigned char) msg[4])))
+                       throw(SQL, "assert", "%s", msg); /* includes state */
+               throw(SQL, "assert", SQLSTATE(M0M29) "%s", msg);
+       }
+       return MAL_SUCCEED;
+}
 str
 SQLassert(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
-       bit *flg = getArgReference_bit(stk, pci, 1);
-       str *msg = getArgReference_str(stk, pci, 2);
-       const char *sqlstate = SQLSTATE(M0M29) ;
-       (void) sqlstate;
        (void) cntxt;
        (void) mb;
-       if (*flg) {
-               if (strlen(*msg) > 6 &&
-                   (*msg)[5] == '!' &&
-                   (isdigit((unsigned char) (*msg)[0]) ||
-                    ('A' <= (*msg)[0] && (*msg)[0] <= 'Z')) &&
-                   (isdigit((unsigned char) (*msg)[1]) ||
-                    ('A' <= (*msg)[1] && (*msg)[1] <= 'Z')) &&
-                   (isdigit((unsigned char) (*msg)[2]) ||
-                    ('A' <= (*msg)[2] && (*msg)[2] <= 'Z')) &&
-                   (isdigit((unsigned char) (*msg)[3]) ||
-                    ('A' <= (*msg)[3] && (*msg)[3] <= 'Z')) &&
-                   (isdigit((unsigned char) (*msg)[4]) ||
-                    ('A' <= (*msg)[4] && (*msg)[4] <= 'Z')))
-                       sqlstate = "";
-               throw(SQL, "assert", SQLSTATE(M0M29) "%s", *msg);
-       }
-       return MAL_SUCCEED;
+       return do_assert((bool) *getArgReference_bit(stk, pci, 1),
+                        *getArgReference_str(stk, pci, 2));
 }
 
 str
 SQLassertInt(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
-       int *flg = getArgReference_int(stk, pci, 1);
-       str *msg = getArgReference_str(stk, pci, 2);
-       const char *sqlstate = SQLSTATE(M0M29) ;
-       (void) sqlstate;
        (void) cntxt;
        (void) mb;
-       if (*flg) {
-               if (strlen(*msg) > 6 &&
-                   (*msg)[5] == '!' &&
-                   (isdigit((unsigned char) (*msg)[0]) ||
-                    ('A' <= (*msg)[0] && (*msg)[0] <= 'Z')) &&
-                   (isdigit((unsigned char) (*msg)[1]) ||
-                    ('A' <= (*msg)[1] && (*msg)[1] <= 'Z')) &&
-                   (isdigit((unsigned char) (*msg)[2]) ||
-                    ('A' <= (*msg)[2] && (*msg)[2] <= 'Z')) &&
-                   (isdigit((unsigned char) (*msg)[3]) ||
-                    ('A' <= (*msg)[3] && (*msg)[3] <= 'Z')) &&
-                   (isdigit((unsigned char) (*msg)[4]) ||
-                    ('A' <= (*msg)[4] && (*msg)[4] <= 'Z')))
-                       sqlstate = "";
-               throw(SQL, "assert", SQLSTATE(M0M29) "%s", *msg);
-       }
-       return MAL_SUCCEED;
+       return do_assert((bool) *getArgReference_int(stk, pci, 1),
+                        *getArgReference_str(stk, pci, 2));
 }
 
 str
 SQLassertLng(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
-       lng *flg = getArgReference_lng(stk, pci, 1);
-       str *msg = getArgReference_str(stk, pci, 2);
-       const char *sqlstate = SQLSTATE(M0M29) ;
-       (void) sqlstate;
        (void) cntxt;
        (void) mb;
-       if (*flg) {
-               if (strlen(*msg) > 6 &&
-                   (*msg)[5] == '!' &&
-                   (isdigit((unsigned char) (*msg)[0]) ||
-                    ('A' <= (*msg)[0] && (*msg)[0] <= 'Z')) &&
-                   (isdigit((unsigned char) (*msg)[1]) ||
-                    ('A' <= (*msg)[1] && (*msg)[1] <= 'Z')) &&
-                   (isdigit((unsigned char) (*msg)[2]) ||
-                    ('A' <= (*msg)[2] && (*msg)[2] <= 'Z')) &&
-                   (isdigit((unsigned char) (*msg)[3]) ||
-                    ('A' <= (*msg)[3] && (*msg)[3] <= 'Z')) &&
-                   (isdigit((unsigned char) (*msg)[4]) ||
-                    ('A' <= (*msg)[4] && (*msg)[4] <= 'Z')))
-                       sqlstate = "";
-               throw(SQL, "assert", SQLSTATE(M0M29) "%s", *msg);
-       }
-       return MAL_SUCCEED;
+       return do_assert((bool) *getArgReference_lng(stk, pci, 1),
+                        *getArgReference_str(stk, pci, 2));
 }
 
 #ifdef HAVE_HGE
 str
-SQLassertHge(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci){
-       hge *flg = getArgReference_hge(stk,pci, 1);
-       str *msg = getArgReference_str(stk,pci, 2);
+SQLassertHge(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
        (void) cntxt;
-       (void)mb;
-       if (*flg){
-               const char *sqlstate = SQLSTATE(M0M29) ;
-               (void) sqlstate;
-               if (strlen(*msg) > 6 && (*msg)[5] == '!' &&
-                   (isdigit((unsigned char) (*msg)[0]) ||
-                    ('A' <= (*msg)[0] && (*msg)[0] <= 'Z')) &&
-                   (isdigit((unsigned char) (*msg)[1]) ||
-                    ('A' <= (*msg)[1] && (*msg)[1] <= 'Z')) &&
-                   (isdigit((unsigned char) (*msg)[2]) ||
-                    ('A' <= (*msg)[2] && (*msg)[2] <= 'Z')) &&
-                   (isdigit((unsigned char) (*msg)[3]) ||
-                    ('A' <= (*msg)[3] && (*msg)[3] <= 'Z')) &&
-                   (isdigit((unsigned char) (*msg)[4]) ||
-                    ('A' <= (*msg)[4] && (*msg)[4] <= 'Z')))
-                       sqlstate = "";
-               throw(SQL, "assert", SQLSTATE(M0M29) "%s", *msg);
-       }
-       return MAL_SUCCEED;
+       (void) mb;
+       return do_assert((bool) *getArgReference_hge(stk, pci, 1),
+                        *getArgReference_str(stk, pci, 2));
 }
 #endif
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to