Changeset: 66f872574442 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/66f872574442 Modified Files: gdk/gdk_value.c monetdb5/mal/mal_builder.c monetdb5/mal/mal_builder.h monetdb5/modules/mal/tablet.c monetdb5/modules/mal/tablet.h sql/backends/monet5/rel_bin.c sql/backends/monet5/sql.c sql/backends/monet5/sql_result.c sql/backends/monet5/sql_result.h sql/backends/monet5/sql_statement.c sql/backends/monet5/sql_statement.h sql/common/sql_types.c sql/include/sql_catalog.h sql/storage/bat/bat_storage.c sql/storage/bat/bat_storage.h sql/storage/bat/bat_table.c sql/storage/bat/res_table.c sql/storage/sql_storage.h sql/storage/store.c tools/monetdbe/monetdbe.c Branch: nilmask Log Message:
and insert and select * a no-nil type (much more to do..) diffs (truncated from 931 to 300 lines): diff --git a/gdk/gdk_value.c b/gdk/gdk_value.c --- a/gdk/gdk_value.c +++ b/gdk/gdk_value.c @@ -228,11 +228,16 @@ VALinit(ValPtr d, int tpe, const void *s return d; default: assert(ATOMextern(ATOMstorage(tpe))); - d->len = ATOMlen(tpe, s); - d->val.pval = GDKmalloc(d->len); - if (d->val.pval == NULL) - return NULL; - memcpy(d->val.pval, s, d->len); + if (s) { + d->len = ATOMlen(tpe, s); + d->val.pval = GDKmalloc(d->len); + if (d->val.pval == NULL) + return NULL; + memcpy(d->val.pval, s, d->len); + } else { + d->len = 0; + d->val.pval = NULL; + } return d; } d->len = ATOMsize(d->vtype); diff --git a/monetdb5/mal/mal_builder.c b/monetdb5/mal/mal_builder.c --- a/monetdb5/mal/mal_builder.c +++ b/monetdb5/mal/mal_builder.c @@ -577,6 +577,23 @@ getBitConstant(MalBlkPtr mb, bit val) } InstrPtr +pushMsk(MalBlkPtr mb, InstrPtr q, bit val) +{ + int _t; + ValRecord cst; + + if (q == NULL) + return NULL; + cst.vtype= TYPE_msk; + cst.val.btval= val; + cst.len = 0; + _t = defConstant(mb,TYPE_msk,&cst); + if( _t >= 0) + return pushArgument(mb, q, _t); + return q; +} + +InstrPtr pushBit(MalBlkPtr mb, InstrPtr q, bit val) { int _t; @@ -663,24 +680,25 @@ InstrPtr pushType(MalBlkPtr mb, InstrPtr q, int tpe) { int _t; - ValRecord cst; - str msg; + ValRecord cst = { 0 }; + //str msg; if (q == NULL) return NULL; - cst.vtype=TYPE_void; - cst.val.oval= oid_nil; - cst.len = 0; - msg = convertConstant(tpe, &cst); - if (msg != MAL_SUCCEED){ - addMalException(mb, msg); - freeException(msg); - } else { + cst.vtype=tpe; + //cst.vtype=TYPE_void; + //cst.val.oval= oid_nil; + //cst.len = 0; + //msg = convertConstant(tpe, &cst); + //if (msg != MAL_SUCCEED){ + //addMalException(mb, msg); + //freeException(msg); + //} else { _t = defConstant(mb,tpe,&cst); if( _t >= 0){ return pushArgument(mb, q, _t); } - } + //} return q; } diff --git a/monetdb5/mal/mal_builder.h b/monetdb5/mal/mal_builder.h --- a/monetdb5/mal/mal_builder.h +++ b/monetdb5/mal/mal_builder.h @@ -38,6 +38,7 @@ mal_export InstrPtr pushVoid(MalBlkPtr m mal_export InstrPtr pushDbl(MalBlkPtr mb, InstrPtr q, dbl val); mal_export InstrPtr pushFlt(MalBlkPtr mb, InstrPtr q, flt val); mal_export InstrPtr pushStr(MalBlkPtr mb, InstrPtr q, const char *val); +mal_export InstrPtr pushMsk(MalBlkPtr mb, InstrPtr q, bit val); mal_export InstrPtr pushBit(MalBlkPtr mb, InstrPtr q, bit val); mal_export InstrPtr pushNil(MalBlkPtr mb, InstrPtr q, int tpe); mal_export InstrPtr pushType(MalBlkPtr mb, InstrPtr q, int tpe); diff --git a/monetdb5/modules/mal/tablet.c b/monetdb5/modules/mal/tablet.c --- a/monetdb5/modules/mal/tablet.c +++ b/monetdb5/modules/mal/tablet.c @@ -84,6 +84,8 @@ TABLETdestroy_format(Tablet *as) for (p = 0; p < as->nr_attrs; p++) { BBPreclaim(fmt[p].c); + if (fmt[p].mask) + BBPreclaim(fmt[p].mask); if (fmt[p].data) GDKfree(fmt[p].data); } @@ -277,11 +279,15 @@ output_line(char **buf, size_t *len, cha if (i == nr_attrs) { for (i = 0; i < nr_attrs; i++) { Column *f = fmt + i; - const char *p; + const char *p = NULL; ssize_t l; if (f->c) { - p = BUNtail(f->ci, f->p); + bool isnil = 0; + if (f->mask) + isnil = mskGetVal(f->mask, f->p); + if (!isnil) + p = BUNtail(f->ci, f->p); if (!p || (f->nildata && ATOMcmp(f->adt, f->nildata, p) == 0)) { p = f->nullstr; @@ -321,11 +327,15 @@ output_line_dense(char **buf, size_t *le for (i = 0; i < nr_attrs; i++) { Column *f = fmt + i; - const char *p; + const char *p = NULL; ssize_t l; if (f->c) { - p = BUNtail(f->ci, f->p); + bool isnil = 0; + if (f->mask) + isnil = mskGetVal(f->mask, f->p); + if (!isnil) + p = BUNtail(f->ci, f->p); if (!p || (f->nildata && ATOMcmp(f->adt, f->nildata, p) == 0)) { p = f->nullstr; @@ -366,9 +376,12 @@ output_line_lookup(char **buf, size_t *l Column *f = fmt + i; if (f->c) { + bool isnil = 0; + if (f->mask) + isnil = mskGetVal(f->mask, f->p); const void *p = BUNtail(f->ci, id - f->c->hseqbase); - if (!p || (f->nildata && ATOMcmp(f->adt, f->nildata, p) == 0)) { + if (!p || isnil || (f->nildata && ATOMcmp(f->adt, f->nildata, p) == 0)) { size_t l = strlen(f->nullstr); if (mnstr_write(fd, f->nullstr, 1, l) != (ssize_t) l) return TABLET_error(fd); diff --git a/monetdb5/modules/mal/tablet.h b/monetdb5/modules/mal/tablet.h --- a/monetdb5/modules/mal/tablet.h +++ b/monetdb5/modules/mal/tablet.h @@ -32,6 +32,7 @@ typedef struct Column_t { const char *type; int adt; /* type index */ BAT *c; /* set to NULL when scalar is meant */ + BAT *mask; /* mask with null values, for no null types */ BATiter ci; BUN p; unsigned int tabs; /* field size in tab positions */ 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 @@ -1731,16 +1731,17 @@ stmt_col(backend *be, sql_column *c, stm { stmt *sc = stmt_bat(be, c, RDONLY, part); - if (c->null && c->nullmask) { - printf("todo handle nullmask\n"); - } - if (isTable(c->t) && c->t->access != TABLE_READONLY && (!isNew(c) || !isNew(c->t) /* alter */) && (c->t->persistence == SQL_PERSIST || c->t->s) /*&& !c->t->commit_action*/) { + stmt *cand = sc->cand; stmt *u = stmt_bat(be, c, RD_UPD_ID, part); assert(u); sc = stmt_project_delta(be, sc, u); + if (cand) + sc->cand = cand; + /* todo handle updates on nullmasks */ + /* sc->cand = stmt_project_delta(be, cand, u); */ if (c->storage_type && c->storage_type[0] == 'D') { stmt *v = stmt_bat(be, c, RD_EXT, part); sc = stmt_dict(be, sc, v); @@ -4485,6 +4486,8 @@ rel2bin_insert(backend *be, sql_rel *rel for (n = ol_first_node(t->columns), m = inserts->op4.lval->h; n && m; n = n->next, m = m->next) { sql_column *c = n->data; + /* how to handle split null and value */ + /* probably we need to keep 2 results in the stmt record, ie also time to cleanup stmt */ updates[c->colnr] = m->data; } diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c --- a/sql/backends/monet5/sql.c +++ b/sql/backends/monet5/sql.c @@ -1797,8 +1797,9 @@ mvc_append_wrap(Client cntxt, MalBlkPtr sql_table *t; sql_column *c; sql_idx *i; - BAT *b = NULL, *pos = NULL; + BAT *b = NULL, *pos = NULL, *nullmask = NULL; BUN cnt = 1; + ptr *null = NULL; *res = 0; if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL) @@ -1817,6 +1818,16 @@ mvc_append_wrap(Client cntxt, MalBlkPtr ins = *(ptr *) ins; if ( tpe == TYPE_bat) b = (BAT*) ins; + if (pci->argc == 9 && (tpe == TYPE_msk || (b && b->ttype == TYPE_msk))) { + null = ins; + ins = getArgReference(stk, pci, 8); + if (b && (ins = BATdescriptor(*(bat *) ins)) == NULL) + throw(SQL, "sql.append", SQLSTATE(HY005) "Cannot access append positions descriptor"); + if (b) { + nullmask = b; + b = (BAT*) ins; + } + } s = mvc_bind_schema(m, sname); if (s == NULL) { bat_destroy(pos); @@ -1838,16 +1849,18 @@ mvc_append_wrap(Client cntxt, MalBlkPtr cnt = BATcount(b); sqlstore *store = m->session->tr->store; if (cname[0] != '%' && (c = mvc_bind_column(m, t, cname)) != NULL) { - log_res = store->storage_api.append_col(m->session->tr, c, offset, pos, ins, cnt, tpe); + log_res = store->storage_api.append_col2(m->session->tr, c, offset, pos, null, ins, cnt, tpe); } else if (cname[0] == '%' && (i = mvc_bind_idx(m, s, cname + 1)) != NULL) { log_res = store->storage_api.append_idx(m->session->tr, i, offset, pos, ins, cnt, tpe); } else { bat_destroy(pos); bat_destroy(b); + bat_destroy(nullmask); throw(SQL, "sql.append", SQLSTATE(38000) "Unable to find column or index %s.%s.%s",sname,tname,cname); } bat_destroy(pos); bat_destroy(b); + bat_destroy(nullmask); if (log_res != LOG_OK) /* the conflict case should never happen, but leave it here */ throw(SQL, "sql.append", SQLSTATE(42000) "Append failed %s", log_res == LOG_CONFLICT ? "due to conflict with another transaction" : GDKerrbuf); return MAL_SUCCEED; @@ -2426,7 +2439,7 @@ mvc_result_set_wrap( Client cntxt, MalBl oid o = 0; BATiter itertbl,iteratr,itertpe,iterdig,iterscl; backend *be = NULL; - BAT *b = NULL, *tbl = NULL, *atr = NULL, *tpe = NULL,*len = NULL,*scale = NULL; + BAT *b = NULL, *tbl = NULL, *atr = NULL, *tpe = NULL,*len = NULL,*scale = NULL, *cand = 0; if ((msg = getBackendContext(cntxt, &be)) != NULL) return msg; @@ -2459,18 +2472,26 @@ mvc_result_set_wrap( Client cntxt, MalBl digits = (int*) iterdig.base; scaledigits = (int*) iterscl.base; - for( i = 6; msg == MAL_SUCCEED && i< pci->argc; i++, o++){ + for( i = 6; msg == MAL_SUCCEED && i < pci->argc; i++, o++){ bid = *getArgReference_bat(stk,pci,i); tblname = BUNtvar(itertbl,o); colname = BUNtvar(iteratr,o); tpename = BUNtvar(itertpe,o); b = BATdescriptor(bid); - if ( b == NULL) + if (b && b->ttype == TYPE_msk) { + bid = *getArgReference_bat(stk,pci,++i); + cand = b; + b = BATdescriptor(bid); + } + if (b == NULL) msg = createException(SQL, "sql.resultSet", SQLSTATE(HY005) "Cannot access column descriptor"); - else if (mvc_result_column(be, tblname, colname, tpename, *digits++, *scaledigits++, b)) + else if (mvc_result_column(be, tblname, colname, tpename, *digits++, *scaledigits++, b, cand)) msg = createException(SQL, "sql.resultSet", SQLSTATE(42000) "Cannot access column descriptor %s.%s",tblname,colname); - if( b) + if (b) BBPunfix(bid); + if (cand) + BBPunfix(cand->batCacheid); + cand = NULL; } bat_iterator_end(&itertbl); bat_iterator_end(&iteratr); @@ -2573,7 +2594,7 @@ mvc_export_table_wrap( Client cntxt, Mal b = BATdescriptor(bid); _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org