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

Reply via email to