Changeset: c360d9d37e73 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/c360d9d37e73 Branch: Jul2021 Log Message:
merged diffs (185 lines): diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h --- a/sql/include/sql_catalog.h +++ b/sql/include/sql_catalog.h @@ -798,7 +798,7 @@ typedef struct { } sql_emit_col; extern int nested_mergetable(sql_trans *tr, sql_table *t, const char *sname, const char *tname); -extern sql_part *partition_find_part(sql_trans *tr, sql_table *pt, sql_part *pp); +sql_export sql_part *partition_find_part(sql_trans *tr, sql_table *pt, sql_part *pp); extern node *members_find_child_id(list *l, sqlid id); #define outside_str 1 diff --git a/sql/server/rel_updates.h b/sql/server/rel_updates.h --- a/sql/server/rel_updates.h +++ b/sql/server/rel_updates.h @@ -27,7 +27,7 @@ extern sql_exp *rel_parse_val(mvc *m, sq extern sql_rel *rel_updates(sql_query *query, symbol *sym); extern sql_exp *update_check_column(mvc *sql, sql_table *t, sql_column *c, sql_exp *v, sql_rel *r, char *cname, const char *action); -extern sql_table *insert_allowed(mvc *sql, sql_table *t, char *tname, char *op, char *opname); +sql_export sql_table *insert_allowed(mvc *sql, sql_table *t, char *tname, char *op, char *opname); extern sql_table *update_allowed(mvc *sql, sql_table *t, char *tname, char *op, char *opname, int is_delete); #endif /*_REL_UPDATES_H_*/ diff --git a/tools/monetdbe/monetdbe.c b/tools/monetdbe/monetdbe.c --- a/tools/monetdbe/monetdbe.c +++ b/tools/monetdbe/monetdbe.c @@ -191,10 +191,14 @@ set_error( monetdbe_database_internal *m static char* commit_action(mvc* m, monetdbe_database_internal *mdbe, monetdbe_result **result, monetdbe_result_internal *res_internal) { - /* handle autocommit */ - char *commit_msg = SQLautocommit(m); - - if ((mdbe->msg != MAL_SUCCEED || commit_msg != MAL_SUCCEED)) { + char *commit_msg = MAL_SUCCEED; + + /* if an error already exists from MonetDBe set the session status to dirty */ + if (mdbe->msg != MAL_SUCCEED && m->session->tr->active && !m->session->status) + m->session->status = -1; + commit_msg = SQLautocommit(m); /* handle autocommit */ + + if (mdbe->msg != MAL_SUCCEED || commit_msg != MAL_SUCCEED) { if (res_internal) { char* other = monetdbe_cleanup_result_internal(mdbe, res_internal); if (other) @@ -2082,6 +2086,7 @@ remote_cleanup: } else { // !mdbe->mid // inserting into existing local table. + sql_part *pt = NULL; if ((mdbe->msg = SQLtrans(m)) != MAL_SUCCEED) goto cleanup; @@ -2089,7 +2094,14 @@ remote_cleanup: mdbe->msg = createException(SQL, "monetdbe.monetdbe_append", "%s", m->errstr + 6); /* Skip error code */ goto cleanup; } - + if (!insert_allowed(m, t, t->base.name, "APPEND", "append")) { + mdbe->msg = createException(SQL, "monetdbe.monetdbe_append", "%s", m->errstr + 6); /* Skip error code */ + goto cleanup; + } + if ((t->s && t->s->parts && (pt = partition_find_part(m->session->tr, t, NULL))) || isRangePartitionTable(t) || isListPartitionTable(t)) { + mdbe->msg = createException(SQL, "monetdbe.monetdbe_append", "Appending to a table from a merge table hierarchy via 'monetdbe_append' is not possible at the moment"); + goto cleanup; + } if (t->idxs) { for (node *n = ol_first_node(t->idxs); n; n = n->next) { sql_idx *i = n->data; @@ -2237,26 +2249,58 @@ remote_cleanup: bn->theap->size = prev_size; BBPreclaim(bn); } else if (mtype == TYPE_str) { - int err = 0; + int err = 0, found_nil = 0; char **d = (char**)v; + unsigned int max_digits = c->type.digits; if (c->null) { - for (size_t j=0; j<cnt; j++) - if (!d[j]) - d[j] = (char*) nil; + if (max_digits) { + for (size_t j=0; j<cnt; j++) { + if (!d[j]) { + d[j] = (char*) nil; + found_nil = 1; + } else if ((unsigned int)UTF8_strlen(d[j]) > max_digits) { + mdbe->msg = createException(SQL, "monetdbe.monetdbe_append", "Value too long for type (var)char(%u)", max_digits); + err = 1; + break; + } + } + } else { + for (size_t j=0; j<cnt; j++) { + if (!d[j]) { + d[j] = (char*) nil; + found_nil = 1; + } + } + } } else { - for (size_t j=0; j<cnt; j++) - if (!d[j]) { - mdbe->msg = createException(MAL, "monetdbe.monetdbe_append", "NOT NULL constraint violated for column %s.%s", c->t->base.name, c->base.name); - err = 1; - break; + if (max_digits) { + for (size_t j=0; j<cnt; j++) { + if (!d[j]) { + mdbe->msg = createException(SQL, "monetdbe.monetdbe_append", "NOT NULL constraint violated for column %s.%s", c->t->base.name, c->base.name); + err = 1; + break; + } else if ((unsigned int)UTF8_strlen(d[j]) > max_digits) { + mdbe->msg = createException(SQL, "monetdbe.monetdbe_append", "Value too long for type (var)char(%u)", max_digits); + err = 1; + break; + } } + } else { + for (size_t j=0; j<cnt; j++) { + if (!d[j]) { + mdbe->msg = createException(SQL, "monetdbe.monetdbe_append", "NOT NULL constraint violated for column %s.%s", c->t->base.name, c->base.name); + err = 1; + break; + } + } + } } if (!err && store->storage_api.append_col(m->session->tr, c, pos, d, mtype) != 0) { mdbe->msg = createException(SQL, "monetdbe.monetdbe_append", "Cannot append values"); err = 1; } - if (c->null) { /* revert pointers before cleanup */ + if (c->null && found_nil) { /* revert pointers before cleanup */ for (size_t j=0; j<cnt; j++) if (d[j] == (char*)nil) d[j] = NULL; @@ -2287,7 +2331,7 @@ remote_cleanup: monetdbe_data_timestamp mdt = ts[j]; if (timestamp_is_null(&mdt)) { - mdbe->msg = createException(MAL, "monetdbe.monetdbe_append", "NOT NULL constraint violated for column %s.%s", c->t->base.name, c->base.name); + mdbe->msg = createException(SQL, "monetdbe.monetdbe_append", "NOT NULL constraint violated for column %s.%s", c->t->base.name, c->base.name); err = 1; break; } else { @@ -2326,7 +2370,7 @@ remote_cleanup: monetdbe_data_date mdt = de[j]; if (date_is_null(&mdt)) { - mdbe->msg = createException(MAL, "monetdbe.monetdbe_append", "NOT NULL constraint violated for column %s.%s", c->t->base.name, c->base.name); + mdbe->msg = createException(SQL, "monetdbe.monetdbe_append", "NOT NULL constraint violated for column %s.%s", c->t->base.name, c->base.name); err = 1; break; } else { @@ -2365,7 +2409,7 @@ remote_cleanup: monetdbe_data_time mdt = t[j]; if (time_is_null(&mdt)) { - mdbe->msg = createException(MAL, "monetdbe.monetdbe_append", "NOT NULL constraint violated for column %s.%s", c->t->base.name, c->base.name); + mdbe->msg = createException(SQL, "monetdbe.monetdbe_append", "NOT NULL constraint violated for column %s.%s", c->t->base.name, c->base.name); err = 1; break; } else { @@ -2401,7 +2445,7 @@ remote_cleanup: } else { for (j=0; j<cnt; j++){ if (blob_is_null(be+j)) { - mdbe->msg = createException(MAL, "monetdbe.monetdbe_append", "NOT NULL constraint violated for column %s.%s", c->t->base.name, c->base.name); + mdbe->msg = createException(SQL, "monetdbe.monetdbe_append", "NOT NULL constraint violated for column %s.%s", c->t->base.name, c->base.name); err = 1; break; } else { @@ -2420,6 +2464,9 @@ remote_cleanup: GDKfree(d); if (err) goto cleanup; + } else { + mdbe->msg = createException(SQL, "monetdbe.monetdbe_append", "The internal type '%s' is not supported on monetdbe append at the moment", ATOMname(mtype)); + goto cleanup; } } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list