Changeset: 7809e2916a39 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7809e2916a39 Modified Files: sql/server/rel_psm.c sql/server/rel_schema.c sql/server/rel_select.c sql/server/rel_select.h sql/server/rel_updates.c Branch: default Log Message:
fixed cardinality problems with updates/inserts diffs (202 lines): diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c --- a/sql/server/rel_psm.c +++ b/sql/server/rel_psm.c @@ -242,8 +242,9 @@ rel_psm_while_do( sql_query *query, sql_ list *whilestmts; dnode *n = w; sql_rel *rel = NULL; + exp_kind ek = {type_value, card_value, FALSE}; - cond = rel_logical_value_exp(query, &rel, n->data.sym, sql_sel); + cond = rel_logical_value_exp(query, &rel, n->data.sym, sql_sel, ek); n = n->next; whilestmts = sequential_block(query, res, restypelist, n->data.lval, n->next->data.sval, is_func); @@ -280,8 +281,9 @@ psm_if_then_else( sql_query *query, sql_ list *ifstmts, *elsestmts; dnode *n = elseif->data.sym->data.lval->h; sql_rel *rel = NULL; + exp_kind ek = {type_value, card_value, FALSE}; - cond = rel_logical_value_exp(query, &rel, n->data.sym, sql_sel); + cond = rel_logical_value_exp(query, &rel, n->data.sym, sql_sel, ek); n = n->next; ifstmts = sequential_block(query, res, restypelist, n->data.lval, NULL, is_func); n = n->next; @@ -319,8 +321,9 @@ rel_psm_if_then_else( sql_query *query, list *ifstmts, *elsestmts; dnode *n = elseif; sql_rel *rel = NULL; + exp_kind ek = {type_value, card_value, FALSE}; - cond = rel_logical_value_exp(query, &rel, n->data.sym, sql_sel); + cond = rel_logical_value_exp(query, &rel, n->data.sym, sql_sel, ek); n = n->next; ifstmts = sequential_block(query, res, restypelist, n->data.lval, NULL, is_func); n = n->next; @@ -421,7 +424,8 @@ rel_psm_case( sql_query *query, sql_subt while(n) { dnode *m = n->data.sym->data.lval->h; sql_rel *rel = NULL; - sql_exp *cond = rel_logical_value_exp(query, &rel, m->data.sym, sql_sel); + exp_kind ek = {type_value, card_value, FALSE}; + sql_exp *cond = rel_logical_value_exp(query, &rel, m->data.sym, sql_sel, ek); list *if_stmts = NULL; sql_exp *case_stmt = NULL; diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c --- a/sql/server/rel_schema.c +++ b/sql/server/rel_schema.c @@ -449,7 +449,8 @@ column_option( char *err = NULL, *r; if (sym->token == SQL_COLUMN || sym->token == SQL_IDENT) { - sql_exp *e = rel_logical_value_exp(query, NULL, sym, sql_sel); + exp_kind ek = {type_value, card_value, FALSE}; + sql_exp *e = rel_logical_value_exp(query, NULL, sym, sql_sel, ek); if (e && is_atom(e->type)) { atom *a = exp_value(sql, e, sql->args, sql->argc); 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 @@ -637,7 +637,7 @@ rel_named_table_function(sql_query *quer l = l->next; /* skip distinct */ if (l->next) { /* table call with subquery */ if (l->next->type == type_symbol || l->next->type == type_list) { - exp_kind iek = {type_value, card_column, TRUE}; + exp_kind iek = {type_value, card_set, TRUE}; list *exps = sa_list(sql->sa); int count = 0; @@ -2101,10 +2101,9 @@ rel_in_exp(sql_query *query, sql_rel *re } sql_exp * -rel_logical_value_exp(sql_query *query, sql_rel **rel, symbol *sc, int f) +rel_logical_value_exp(sql_query *query, sql_rel **rel, symbol *sc, int f, exp_kind ek) { mvc *sql = query->sql; - exp_kind ek = {type_value, card_column, FALSE}; if (!sc) return NULL; @@ -2119,8 +2118,8 @@ rel_logical_value_exp(sql_query *query, symbol *lo = sc->data.lval->h->data.sym; symbol *ro = sc->data.lval->h->next->data.sym; - sql_exp *ls = rel_logical_value_exp(query, rel, lo, f); - sql_exp *rs = rel_logical_value_exp(query, rel, ro, f); + sql_exp *ls = rel_logical_value_exp(query, rel, lo, f, ek); + sql_exp *rs = rel_logical_value_exp(query, rel, ro, f, ek); if (!ls || !rs) return NULL; @@ -2201,7 +2200,7 @@ rel_logical_value_exp(sql_query *query, n->next->next->next = NULL; /* remove quantifier */ dl->h = n->next->next; n->next->next = NULL; /* (remove comparison) moved righthand side */ - return rel_logical_value_exp(query, rel, sc, f); + return rel_logical_value_exp(query, rel, sc, f, ek); } /* <> ANY -> NOT (= ALL) */ if (quantifier == 1 && cmp_type == cmp_notequal) { @@ -2350,7 +2349,7 @@ rel_logical_value_exp(sql_query *query, return le; } case SQL_NOT: { - sql_exp *le = rel_logical_value_exp(query, rel, sc->data.sym, f); + sql_exp *le = rel_logical_value_exp(query, rel, sc->data.sym, f, ek); if (!le) return le; @@ -2380,7 +2379,7 @@ rel_logical_value_exp(sql_query *query, return NULL; if (ek.card <= card_set && is_project(sq->op) && list_length(sq->exps) > 1) return sql_error(sql, 02, SQLSTATE(42000) "SELECT: subquery must return only one column"); - if (ek.card < card_set && sq->card >= CARD_MULTI && is_sql_sel(f) && (rel && *rel && is_basetable((*rel)->op))) + if (ek.card < card_set && sq->card >= CARD_MULTI && (is_sql_sel(f) | is_sql_where(f)) && rel && (!*rel || is_basetable((*rel)->op))) sq = rel_zero_or_one(sql, sq, ek); return exp_rel(sql, sq); } @@ -3730,7 +3729,7 @@ rel_case(sql_query *query, sql_rel **rel return NULL; cond = rel_binop_(sql, rel ? *rel : NULL, l, r, NULL, "=", card_value); } else { - cond = rel_logical_value_exp(query, rel, when->h->data.sym, f); + cond = rel_logical_value_exp(query, rel, when->h->data.sym, f, ek); } result = rel_value_exp(query, rel, when->h->next->data.sym, f, ek); } @@ -3772,7 +3771,7 @@ rel_case(sql_query *query, sql_rel **rel return NULL; cond = rel_binop_(sql, rel ? *rel : NULL, l, r, NULL, "=", card_value); } else { - cond = rel_logical_value_exp(query, rel, when->h->data.sym, f); + cond = rel_logical_value_exp(query, rel, when->h->data.sym, f, ek); } result = rel_value_exp(query, rel, when->h->next->data.sym, f, ek); } @@ -5094,7 +5093,7 @@ rel_value_exp2(sql_query *query, sql_rel case SQL_XMLTEXT: return rel_xml(query, rel, se, f, ek); default: - return rel_logical_value_exp(query, rel, se, f); + return rel_logical_value_exp(query, rel, se, f, ek); } } diff --git a/sql/server/rel_select.h b/sql/server/rel_select.h --- a/sql/server/rel_select.h +++ b/sql/server/rel_select.h @@ -17,7 +17,7 @@ extern sql_rel *rel_selects(sql_query *q extern sql_rel *schema_selects(sql_query *query, sql_schema *s, symbol *sym); extern sql_rel * rel_subquery(sql_query *query, sql_rel *rel, symbol *sq, exp_kind ek); extern sql_rel * rel_logical_exp(sql_query *query, sql_rel *rel, symbol *sc, int f); -extern sql_exp * rel_logical_value_exp(sql_query *query, sql_rel **rel, symbol *sc, int f); +extern sql_exp * rel_logical_value_exp(sql_query *query, sql_rel **rel, symbol *sc, int f, exp_kind ek); extern sql_exp *rel_column_exp(sql_query *query, sql_rel **rel, symbol *column_e, int f); extern sql_exp * rel_value_exp(sql_query *query, sql_rel **rel, symbol *se, int f, exp_kind ek); diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c --- a/sql/server/rel_updates.c +++ b/sql/server/rel_updates.c @@ -977,31 +977,19 @@ update_generate_assignments(sql_query *q return sql_error(sql, 02, SQLSTATE(42000) "%s: column '%s' has no valid default value", action, col->base.name); } } else if (single) { - v = rel_value_exp(query, &rel_val, a, sql_sel | sql_update_set, ek); + v = rel_value_exp(query, &r, a, sql_sel | sql_update_set, ek); outer = 1; } else { rel_val = rel_subquery(query, NULL, a, ek); } - if ((single && !v) || (!single && !rel_val)) { + if (!single && !rel_val && r) { + outer = 1; sql->errstr[0] = 0; sql->session->status = status; - assert(!rel_val); - outer = 1; - if (single) { - v = rel_value_exp(query, &r, a, sql_sel | sql_update_set, ek); - } else if (!rel_val && r) { - query_push_outer(query, r, sql_sel); - rel_val = rel_subquery(query, NULL, a, ek); - r = query_pop_outer(query); - if (/* DISABLES CODE */ (0) && r) { - list *val_exps = rel_projections(sql, r->r, NULL, 0, 1); - - r = rel_project(sql->sa, r, rel_projections(sql, r, NULL, 1, 1)); - if (r) - list_merge(r->exps, val_exps, (fdup)NULL); - reset_processed(r); - } - } + /* TODO put in else above */ + query_push_outer(query, r, sql_sel); + rel_val = rel_subquery(query, NULL, a, ek); + r = query_pop_outer(query); } if ((single && !v) || (!single && !rel_val)) { rel_destroy(r); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list