Changeset: c9f7d765b989 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c9f7d765b989 Modified Files: ctest/tools/monetdbe/example_append.c tools/monetdbe/monetdbe.c Branch: Oct2020 Log Message:
Merge append-optimization branch into Oct2020. diffs (77 lines): diff --git a/tools/monetdbe/monetdbe.c b/tools/monetdbe/monetdbe.c --- a/tools/monetdbe/monetdbe.c +++ b/tools/monetdbe/monetdbe.c @@ -1100,6 +1100,7 @@ GENERATE_BASE_HEADERS(monetdbe_data_time char* monetdbe_append(monetdbe_database dbhdl, const char* schema, const char* table, monetdbe_column **input /*bat *batids*/, size_t column_count) { + monetdbe_database_internal *mdbe = (monetdbe_database_internal*)dbhdl; mvc *m = NULL; sql_schema *s = NULL; @@ -1143,6 +1144,7 @@ monetdbe_append(monetdbe_database dbhdl, } else { s = cur_schema(m); } + if (!(t = mvc_bind_table(m, s, table))) { mdbe->msg = createException(SQL, "monetdbe.monetdbe_append", "Table missing %s.%s", schema, table); goto cleanup; @@ -1162,7 +1164,6 @@ monetdbe_append(monetdbe_database dbhdl, int mtype = monetdbe_type(input[i]->type); const void* nil = (mtype>=0)?ATOMnilptr(mtype):NULL; char *v = input[i]->data; - int w = 1; if (mtype < 0) { mdbe->msg = createException(SQL, "monetdbe.monetdbe_append", "Cannot find type for column %zu", i); @@ -1175,13 +1176,43 @@ monetdbe_append(monetdbe_database dbhdl, TYPE_lng #endif ) { - w = ATOMsize(mtype); - for (size_t j=0; j<cnt; j++, v+=w){ - if (store_funcs.append_col(m->session->tr, c, v, mtype) != 0) { - mdbe->msg = createException(SQL, "monetdbe.monetdbe_append", "Cannot append values"); - goto cleanup; - } + //------------------------------------- + BAT *bn = NULL; + + if ((bn = COLnew(0, mtype, 0, TRANSIENT)) == NULL) { + BBPreclaim(bn); + mdbe->msg = createException(SQL, "monetdbe.monetdbe_append", "Cannot create append column"); + goto cleanup; } + + //save prev heap pointer + char *prev_base; + size_t prev_size; + prev_base = bn->theap.base; + prev_size = bn->theap.size; + + //BAT heap base to input[i]->data + bn->theap.base = input[i]->data; + bn->theap.size = tailsize(bn, cnt); + + //BATsetdims(bn); called in COLnew + BATsetcapacity(bn, cnt); + BATsetcount(bn, cnt); + + //set default flags + BATsettrivprop(bn); + + if (store_funcs.append_col(m->session->tr, c, bn, TYPE_bat) != 0) { + mdbe->msg = createException(SQL, "monetdbe.monetdbe_append", "Cannot append BAT"); + goto cleanup; + + } + + bn->theap.base = prev_base; + bn->theap.size = prev_size; + BBPreclaim(bn); + + } else if (mtype == TYPE_str) { char **d = (char**)v; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list