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

Reply via email to