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