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