Changeset: e88a139b0ac5 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e88a139b0ac5
Modified Files:
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql.c
sql/backends/monet5/sql.h
sql/backends/monet5/sql.mal
sql/backends/monet5/sql_gencode.c
sql/server/rel_select.c
Branch: arrays
Log Message:
handling default values provided by the users for non-dimensional columns
diffs (truncated from 376 to 300 lines):
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
@@ -559,6 +559,10 @@ exp_bin(mvc *sql, sql_exp *e, stmt *left
print_stmtlist(sql->sa, left);
print_stmtlist(sql->sa, right);
}
+
+ if(e->f) { //it is the default value
+ s->op1 = exp_bin(sql, e->f, NULL, NULL, NULL, NULL,
NULL, NULL);
+ }
} break;
case e_cmp: {
stmt *l = NULL, *r = NULL, *r2 = NULL;
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
@@ -1615,10 +1615,10 @@ mvc_restart_seq(Client cntxt, MalBlkPtr
//when the column belongs to an array extra values shoulb be added in order to
//have values for all cells int he array
static BAT*
-mvc_fill_values(sql_column *c, BAT *b_in, unsigned int cellsNum) {
+mvc_fill_values(sql_column *c, BAT *b_in, unsigned int cellsNum, void* defVal)
{
BAT *b = NULL;
-#define fillVals(TPE) \
+#define fillVals(TPE, def) \
do { \
TPE *elements_in = NULL, *elements = NULL; \
BUN i; \
@@ -1636,10 +1636,7 @@ mvc_fill_values(sql_column *c, BAT *b_in
/*Fill the rest of the cells with the default value or
NULL if no \
* default values is provided*/ \
for(;i<cellsNum; i++) { \
- if(!c->def) \
- elements[i] = TPE##_nil; \
- else \
- fprintf(stderr, "DEFAULT value is
provided but not handled\n"); \
+ elements[i] = def; \
} \
\
b->tsorted = 0; \
@@ -1648,30 +1645,80 @@ mvc_fill_values(sql_column *c, BAT *b_in
switch (c->type.type->localtype) {
case TYPE_bte:
- fillVals(bte);
+ if(!defVal)
+ fillVals(bte, bte_nil);
+ else
+ fillVals(bte, *(bte*)defVal);
break;
case TYPE_sht:
- fillVals(sht);
+ if(!defVal)
+ fillVals(sht, sht_nil);
+ else
+ fillVals(sht, *(sht*)defVal);
break;
case TYPE_int:
- fillVals(int);
+ if(!defVal)
+ fillVals(int, int_nil);
+ else
+ fillVals(int, *(int*)defVal);
break;
case TYPE_lng:
- fillVals(lng);
+ if(!defVal)
+ fillVals(lng, lng_nil);
+ else
+ fillVals(lng, *(lng*)defVal);
break;
#ifdef HAVE_HGE
case TYPE_hge:
- fillVals(hge);
+ if(!defVal)
+ fillVals(hge, hge_nil);
+ else
+ fillVals(hge, *(hge*)defVal);
break;
#endif
case TYPE_flt:
- fillVals(flt);
+ if(!defVal)
+ fillVals(flt, flt_nil);
+ else
+ fillVals(flt, *(flt*)defVal);
break;
case TYPE_dbl:
- fillVals(dbl);
+#if 0
+ {
+ dbl *elements_in = NULL, *elements = NULL;
+ BUN i;
+
+ if((b = BATnew(TYPE_void, TYPE_dbl, cellsNum, TRANSIENT)) ==
NULL)
+ return NULL;
+
+ elements = (dbl*) Tloc(b, BUNfirst(b));
+ elements_in = (dbl*) Tloc(b_in, BUNfirst(b_in));
+
+ /*Add the elements that have been inserted into the
cells*/
+ for(i=0; i<BATcount(b_in); i++) {
+ elements[i] = elements_in[i];
+ }
+ /*Fill the rest of the cells with the default value or
NULL if no \
+ * default values is provided*/
+ for(;i<cellsNum; i++) {
+ if(!c->def)
+ elements[i] = dbl_nil;
+ else
+ elements[i] = defVal->data.val.dval;
+ }
+
+ b->tsorted = 0;
+ b->trevsorted = 0;
+ }
+#endif
+ if(!defVal)
+ fillVals(dbl, dbl_nil);
+ else
+ fillVals(dbl, *(dbl*)defVal);
break;
default:
- fprintf(stderr, "mvc_fill_values: dimension type not
handled\n");
+ fprintf(stderr, "mvc_fill_values: non-dimensional
column type not handled\n");
+ return NULL;
}
BATsetcount(b,cellsNum);
@@ -1703,7 +1750,34 @@ mvc_bind(mvc *m, char *sname, char *tnam
b = store_funcs.bind_col(tr, c, access);
if(isArray(t))
- return mvc_fill_values(c, b, t->cellsNum);
+ return mvc_fill_values(c, b, t->cellsNum, NULL);
+
+ return b;
+}
+
+static BAT *
+mvc_create_cells_bat(mvc *m, char *sname, char *tname, char *cname, void*
defVal, int tpe)
+{
+ sql_trans *tr = m->session->tr;
+ BAT *b = NULL;
+ sql_schema *s = NULL;
+ sql_table *t = NULL;
+ sql_column *c = NULL;
+
+ s = mvc_bind_schema(m, sname);
+ if (s == NULL)
+ return NULL;
+ t = mvc_bind_table(m, s, tname);
+ if (t == NULL)
+ return NULL;
+ c = mvc_bind_column(m, t, cname);
+ if (c == NULL)
+ return NULL;
+
+ b = store_funcs.bind_col(tr, c, 0);
+
+ (void)tpe;
+ return mvc_fill_values(c, b, t->cellsNum, defVal);
return b;
}
@@ -1805,6 +1879,7 @@ fprintf(stderr, "(%ld,%ld)-(%ld,%ld): %d
break;
default:
fprintf(stderr, "mvc_create_dimension_bat: dimension
type not handled\n");
+ return NULL;
}
BATsetcount(b,t->cellsNum);
@@ -1937,16 +2012,46 @@ mvc_bind_wrap(Client cntxt, MalBlkPtr mb
}
str
-mvc_create_dimension_bat_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci)
+mvc_create_cells_bat_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr
pci)
{
- int upd = (pci->argc == 7 || pci->argc == 9);
BAT *b = NULL;
bat *bid = getArgReference_bat(stk, pci, 0);
mvc *m = NULL;
str msg;
- str *sname = getArgReference_str(stk, pci, 2 + upd);
- str *tname = getArgReference_str(stk, pci, 3 + upd);
- str *dname = getArgReference_str(stk, pci, 4 + upd);
+ str *sname = getArgReference_str(stk, pci, 2);
+ str *tname = getArgReference_str(stk, pci, 3);
+ str *cname = getArgReference_str(stk, pci, 4);
+ ptr def = getArgReference(stk, pci, 5);
+ int tpe = getArgType(mb, pci, 5);
+
+ if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
+ return msg;
+ if ((msg = checkSQLContext(cntxt)) != NULL)
+ return msg;
+
+ if (ATOMextern(tpe))
+ def = *(ptr *) def;
+
+ b = mvc_create_cells_bat(m, *sname, *tname, *cname, def, tpe);
+ if(b) {
+ BBPkeepref(*bid = b->batCacheid);
+ return MAL_SUCCEED;
+ }
+ if (*sname && strcmp(*sname, str_nil) != 0)
+ throw(SQL, "sql.create_celss", "unable to find %s.%s(%s)",
*sname, *tname, *cname);
+ throw(SQL, "sql.create_cells", "unable to find %s(%s)", *tname, *cname);
+}
+
+str
+mvc_create_dimension_bat_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci)
+{
+ BAT *b = NULL;
+ bat *bid = getArgReference_bat(stk, pci, 0);
+ mvc *m = NULL;
+ str msg;
+ str *sname = getArgReference_str(stk, pci, 2);
+ str *tname = getArgReference_str(stk, pci, 3);
+ str *dname = getArgReference_str(stk, pci, 4);
if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
return msg;
diff --git a/sql/backends/monet5/sql.h b/sql/backends/monet5/sql.h
--- a/sql/backends/monet5/sql.h
+++ b/sql/backends/monet5/sql.h
@@ -89,6 +89,7 @@ sql5_export str mvc_append_wrap(Client c
sql5_export str mvc_update_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
sql5_export str mvc_bind_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
sql5_export str mvc_create_dimension_bat_wrap(Client cntxt, MalBlkPtr mb,
MalStkPtr stk, InstrPtr pci);
+sql5_export str mvc_create_cells_bat_wrap(Client cntxt, MalBlkPtr mb,
MalStkPtr stk, InstrPtr pci);
sql5_export str mvc_bind_idxbat_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr
stk, InstrPtr pci);
sql5_export str mvc_clear_table_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr
stk, InstrPtr pci);
sql5_export str mvc_delete_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
diff --git a/sql/backends/monet5/sql.mal b/sql/backends/monet5/sql.mal
--- a/sql/backends/monet5/sql.mal
+++ b/sql/backends/monet5/sql.mal
@@ -218,9 +218,13 @@ comment "Bind the 'schema.table.column'
1 - inserts
2 - updates";
+pattern create_cells(mvc:int, sname:str, tname:str, cname:str,
def:any):bat[:oid,:any]
+address mvc_create_cells_bat_wrap
+comment "Create the 'schema.table.column' BAT";
+
pattern create_dimension(mvc:int, schema:str, table:str,
dimension:str):bat[:oid,:any_1]
address mvc_create_dimension_bat_wrap
-comment "Bind the 'schema.table.dimension' BAT";
+comment "Create the 'schema.table.dimension' BAT";
command delta ( col:bat[:oid,:any_3], uid:bat[:oid,:oid],
uval:bat[:oid,:any_3], ins:bat[:oid,:any_3] )
:bat[:oid,:any_3]
diff --git a/sql/backends/monet5/sql_gencode.c
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -906,32 +906,57 @@ static int
s->nr = getDestVar(q);
}
break;
- case st_bat:{
+ case st_bat: {
+ sql_column *c = s->op4.cval;
+
int ht = TYPE_oid;
- int tt = s->op4.cval->type.type->localtype;
- sql_table *t = s->op4.cval->t;
+ int tt = c->type.type->localtype;
+
+ if(c->def) {
+ int def = 0;
+ if ((def = _dumpstmt(sql, mb, s->op1)) < 0)
+ return -1;
- q = newStmt2(mb, sqlRef, bindRef);
- if (q == NULL)
- return -1;
- if (s->flag == RD_UPD_ID) {
- q = pushReturn(mb, q, newTmpVariable(mb,
newBatType(ht, tt)));
- } else {
+ q = newStmt2(mb, sqlRef, "create_cells");
+ if(q == NULL)
+ return -1;
+
setVarType(mb, getArg(q, 0), newBatType(ht,
tt));
setVarUDFtype(mb, getArg(q, 0));
- }
- q = pushArgument(mb, q, sql->mvc_var);
- q = pushSchema(mb, q, t);
- q = pushStr(mb, q, t->base.name);
- q = pushStr(mb, q, s->op4.cval->base.name);
- q = pushInt(mb, q, s->flag);
- if (q == NULL)
- return -1;
- s->nr = getDestVar(q);
+
+ q = pushArgument(mb, q, sql->mvc_var);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list