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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list