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

Reply via email to