Changeset: 027be675347f for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=027be675347f
Modified Files:
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql.h
        sql/backends/monet5/sql.mal
        sql/backends/monet5/sql_scenario.c
        sql/include/sql_catalog.h
        sql/server/rel_select.c
        sql/server/sql_parser.y
        sql/storage/bat/bat_logger.c
        sql/storage/sql_catalog.c
Branch: Oct2014
Log Message:

upgrade code fixes.
the union functions are now dropped and recreated, this is
needed to solve the storage of multiple return types.


diffs (truncated from 720 to 300 lines):

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
@@ -899,6 +899,49 @@ create_func(mvc *sql, char *sname, sql_f
        return MAL_SUCCEED;
 }
 
+str
+UPGdrop_func(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+       mvc *sql = NULL;
+       str msg = MAL_SUCCEED;
+       int id = *(int *) getArgReference(stk, pci, 1);
+       sql_func *func;
+
+       if ((msg = getSQLContext(cntxt, mb, &sql, NULL)) != NULL)
+               return msg;
+       if ((msg = checkSQLContext(cntxt)) != NULL)
+               return msg;
+
+       func = sql_trans_find_func(sql->session->tr, id);
+       if (func) 
+               mvc_drop_func(sql, func->s, func, 0);
+       return msg;
+}
+
+str
+UPGcreate_func(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+       mvc *sql = NULL;
+       str msg = MAL_SUCCEED;
+       str func = *(str *) getArgReference(stk, pci, 1);
+       stmt *s;
+
+       if ((msg = getSQLContext(cntxt, mb, &sql, NULL)) != NULL)
+               return msg;
+       if ((msg = checkSQLContext(cntxt)) != NULL)
+               return msg;
+       s = sql_parse(sql, sa_create(), func, 0);
+       if (s && s->type == st_catalog) {
+               char *schema = 
((stmt*)s->op1->op4.lval->h->data)->op4.aval->data.val.sval;
+               sql_func *func = 
(sql_func*)((stmt*)s->op1->op4.lval->t->data)->op4.aval->data.val.pval;
+
+               msg = create_func(sql, schema, func);
+       } else {
+               throw(SQL, "sql.catalog", "function creation failed '%s'", 
func);
+       }
+       return msg;
+}
+
 static char *
 create_trigger(mvc *sql, char *sname, char *tname, char *triggername, int 
time, int orientation, int event, char *old_name, char *new_name, char 
*condition, char *query)
 {
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
@@ -109,6 +109,9 @@ sql5_export str mvc_declared_table_colum
 sql5_export str mvc_drop_declared_table_wrap(Client cntxt, MalBlkPtr mb, 
MalStkPtr stk, InstrPtr pci);
 sql5_export str mvc_drop_declared_tables_wrap(Client cntxt, MalBlkPtr mb, 
MalStkPtr stk, InstrPtr pci);
 
+sql5_export str UPGdrop_func(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
+sql5_export str UPGcreate_func(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
+
 sql5_export str mvc_affected_rows_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci);
 sql5_export str mvc_export_result_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci);
 sql5_export str mvc_export_head_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci);
@@ -322,4 +325,5 @@ sql5_export str STRindex_bte(bte *res, s
 sql5_export str BATSTRindex_bte(bat *res, bat *src, bit *u);
 sql5_export str STRstrings(str *res, str src);
 sql5_export str BATSTRstrings(bat *res, bat *src);
+
 #endif /* _SQL_H */
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
@@ -305,6 +305,14 @@ pattern dropDeclaredTables{unsafe}( nr:i
 address mvc_drop_declared_tables_wrap
 comment "drop top n declared tables"; 
 
+pattern drop_func_upgrade_oct2014(id:int) :int
+address UPGdrop_func
+comment "Drop the function identified by id, needed for the Oct2014 upgrade";
+
+pattern create_func_upgrade_oct2014(f:str) :int
+address UPGcreate_func
+comment "Create the function described by f, needed for the Oct2014 upgrade";
+
 pattern exportHead{unsafe}(s:streams, res_id:int) :void
 address mvc_export_head_wrap
 comment "Export a result (in order) to stream s"; 
diff --git a/sql/backends/monet5/sql_scenario.c 
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -598,10 +598,6 @@ sql_update_feb2013_sp3(Client c)
        return err;             /* usually MAL_SUCCEED */
 }
 
-/*
- * TODO
- *     update all table functions, ie make them type F_UNION
- */
 static str
 sql_update_jan2014(Client c)
 {
@@ -877,6 +873,21 @@ sql_update_oct2014(Client c)
        pos += snprintf(buf + pos, bufsize - pos, "delete from _columns where 
table_id in (select id from _tables where name like '#%%');\n");
        pos += snprintf(buf + pos, bufsize - pos, "delete from _tables where 
name like '#%%';\n");
 
+       /* all UNION functions need to be drop and recreated */
+       pos += snprintf(buf + pos, bufsize - pos, "create table upgradeOct2014 
as (select * from functions where type = 5 and language <> 0) with data;\n");
+       pos += snprintf(buf + pos, bufsize - pos, "create table 
upgradeOct2014_changes (c bigint);\n");
+
+       pos += snprintf(buf + pos, bufsize - pos, "create function 
drop_func_upgrade_oct2014( id integer ) returns int external name 
sql.drop_func_upgrade_oct2014;\n"); 
+       pos += snprintf(buf + pos, bufsize - pos, "insert into 
upgradeOct2014_changes select drop_func_upgrade_oct2014(id) from 
upgradeOct2014;\n");
+       pos += snprintf(buf + pos, bufsize - pos, "drop function 
drop_func_upgrade_oct2014;\n");
+
+       pos += snprintf(buf + pos, bufsize - pos, "create function 
create_func_upgrade_oct2014( f string ) returns int external name 
sql.create_func_upgrade_oct2014;\n");
+       pos += snprintf(buf + pos, bufsize - pos, "insert into 
upgradeOct2014_changes select create_func_upgrade_oct2014(func) from 
upgradeOct2014;\n");
+       pos += snprintf(buf + pos, bufsize - pos, "drop function 
create_func_upgrade_oct2014;\n");
+
+       pos += snprintf(buf + pos, bufsize - pos, "drop table 
upgradeOct2014_changes;\n");
+       pos += snprintf(buf + pos, bufsize - pos, "drop table 
upgradeOct2014;\n");
+
        /* change in 25_debug.sql */
        pos += snprintf(buf + pos, bufsize - pos, "drop function sys.bbp;\n");
        pos += snprintf(buf + pos, bufsize - pos, "create function sys.bbp() 
returns table (id int, name string, htype string, ttype string, count BIGINT, 
refcnt int, lrefcnt int, location string, heat int, dirty string, status 
string, kind string) external name bbp.get;\n");
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -560,6 +560,7 @@ extern sql_type *sql_trans_bind_type(sql
 extern sql_func *find_sql_func(sql_schema * s, char *tname);
 extern list *find_all_sql_func(sql_schema * s, char *tname, int type);
 extern sql_func *sql_trans_bind_func(sql_trans *tr, char *name);
+extern sql_func *sql_trans_find_func(sql_trans *tr, int id);
 extern node *find_sql_func_node(sql_schema *s, int id);
 
 #endif /* SQL_CATALOG_H */
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -612,8 +612,6 @@ rel_inplace_project(sql_allocator *sa, s
        if (!l) {
                l = rel_create(sa);
 
-               if (!l)
-                       return NULL;
                l->op = rel->op;
                l->l = rel->l;
                l->r = rel->r;
@@ -632,8 +630,10 @@ rel_inplace_project(sql_allocator *sa, s
        rel->exps = e;
        rel->card = CARD_MULTI;
        rel->flag = 0;
-       rel->nrcols = l->nrcols;
-       assert (exps_card(rel->exps) <= rel->card);
+       if (l) {
+               rel->nrcols = l->nrcols;
+               assert (exps_card(rel->exps) <= rel->card);
+       }
        return rel;
 }
 
@@ -1618,36 +1618,34 @@ rel_values( mvc *sql, symbol *tableref)
        list *exps = sa_list(sql->sa); 
 
        exp_kind ek = {type_value, card_value, TRUE};
-       if (!rowlist->h){
+       if (!rowlist->h)
                r = rel_project(sql->sa, NULL, NULL);
 
-       } else {
-               /* last element in the list is the table_name */
-               for (o = rowlist->h; o->next; o = o->next) {
-                       dlist *values = o->data.lval;
-
-                       if (r && list_length(r->exps) != dlist_length(values)) {
-                               return sql_error(sql, 02, "VALUES: number of 
values doesn't match");
-                       } else {
-                               dnode *n;
-
-                               if (list_empty(exps)) {
-                                       for (n = values->h; n; n = n->next) {
-                                               sql_exp *vals = 
exp_values(sql->sa, sa_list(sql->sa));
-
-                                               exp_label(sql->sa, vals, 
++sql->label);
-                                               list_append(exps, vals);
-                                       }
+       /* last element in the list is the table_name */
+       for (o = rowlist->h; o->next; o = o->next) {
+               dlist *values = o->data.lval;
+
+               if (r && list_length(r->exps) != dlist_length(values)) {
+                       return sql_error(sql, 02, "VALUES: number of values 
doesn't match");
+               } else {
+                       dnode *n;
+
+                       if (list_empty(exps)) {
+                               for (n = values->h; n; n = n->next) {
+                                       sql_exp *vals = exp_values(sql->sa, 
sa_list(sql->sa));
+
+                                       exp_label(sql->sa, vals, ++sql->label);
+                                       list_append(exps, vals);
                                }
-                               for (n = values->h, m = exps->h; n && m; 
-                                               n = n->next, m = m->next) {
-                                       sql_exp *vals = m->data;
-                                       list *vals_list = vals->f;
-                                       sql_exp *e = rel_value_exp(sql, NULL, 
n->data.sym, sql_sel, ek);
-                                       if (!e) 
-                                               return NULL;
-                                       list_append(vals_list, e);
-                               }
+                       }
+                       for (n = values->h, m = exps->h; n && m; 
+                                       n = n->next, m = m->next) {
+                               sql_exp *vals = m->data;
+                               list *vals_list = vals->f;
+                               sql_exp *e = rel_value_exp(sql, NULL, 
n->data.sym, sql_sel, ek);
+                               if (!e) 
+                                       return NULL;
+                               list_append(vals_list, e);
                        }
                }
        }
@@ -1872,7 +1870,7 @@ rel_column_ref(mvc *sql, sql_rel **rel, 
 
                /* some views are just in the stack,
                   like before and after updates views */
-               if (rel && !exp && sql->use_views) {
+               if (!exp && sql->use_views) {
                        sql_rel *v = stack_find_rel_view(sql, tname);
 
                        if (v) {
@@ -2046,7 +2044,7 @@ rel_check_type(mvc *sql, sql_subtype *t,
        sql_exp* nexp = NULL;
        sql_subtype *fromtype = exp_subtype(exp);
        
-       if (!fromtype && rel_set_type_param(sql, t, exp, 0) == 0)
+       if ((!fromtype || !fromtype->type) && rel_set_type_param(sql, t, exp, 
0) == 0)
                return exp;
 
        /* first try cheap internal (in-place) conversions ! */
@@ -2393,7 +2391,7 @@ rel_compare_exp(mvc *sql, sql_rel *rel, 
                if (!e)
                        return NULL;
                if (!reduce) {
-                       if (rel && rel->op == op_project) {
+                       if (rel->op == op_project) {
                                append(rel->exps, e);
                        } else {
                                list *exps = new_exp_list(sql->sa);
@@ -2922,12 +2920,12 @@ rel_logical_exp(mvc *sql, sql_rel *rel, 
                        lr = rel_select_copy(sql->sa, lr, sa_list(sql->sa));
                        lr = rel_logical_exp(sql, lr, lo, f);
                        lexps = lr?lr->exps:NULL;
-                       lr = lr?lr->l:NULL;
+                       lr = lr->l;
 
                        rr = rel_select_copy(sql->sa, rr, sa_list(sql->sa));
                        rr = rel_logical_exp(sql, rr, ro, f);
                        rexps = rr?rr->exps:NULL;
-                       rr = rr?rr->l:NULL;
+                       rr = rr->l;
                        sql->pushdown = pushdown;
                } else {
                        lr = rel_logical_exp(sql, lr, lo, f);
@@ -2974,43 +2972,60 @@ rel_logical_exp(mvc *sql, sql_rel *rel, 
        case SQL_NOT_IN:
        {
                dlist *dl = sc->data.lval;
-               symbol *lo = dl->h->data.sym;
-               dnode *n = dl->h->next;
+               symbol *lo = NULL;
+               dnode *n = dl->h->next, *dn = NULL;
                sql_rel *left = NULL, *right = NULL, *outer = rel;
-               sql_exp *l = rel_value_exp(sql, &left, lo, f, ek), *e, *r = 
NULL;
-               list *vals = NULL;
+               sql_exp *l = NULL, *e, *r = NULL;
+               list *vals = NULL, *ll = sa_list(sql->sa);
                int correlated = 0;
                int l_is_value = 1, r_is_rel = 0;
 
-               if (!l && sql->session->status != -ERR_AMBIGUOUS) {
-                       l_is_value = 0;
-                       /* reset error */
-                       left = rel;
-                       sql->session->status = 0;
-                       sql->errstr[0] = 0;
+               /* complex case */
+               if (dl->h->type == type_list) { /* (a,b..) in (.. ) */
+                       dn = dl->h->data.lval->h;
+                       lo = dn->data.sym;
+                       dn = dn->next;
+               } else {
+                       lo = dl->h->data.sym;
+               }
+               while(lo) {
                        l = rel_value_exp(sql, &left, lo, f, ek);
-               } else if (!left && l) {
-                       left = rel_project_exp(sql->sa, exp_label(sql->sa, l, 
++sql->label));
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to