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 -- [email protected]
To unsubscribe send an email to [email protected]