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

Reply via email to