Changeset: cc0a82689811 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/cc0a82689811
Modified Files:
        sql/server/rel_psm.c
        sql/server/rel_select.c
        sql/server/rel_select.h
        sql/server/rel_updates.c
Branch: default
Log Message:

cleanup no need for double calls too rel_subquery* anymore, just push the 
current relation onto the query context always


diffs (truncated from 382 to 300 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
@@ -88,7 +88,7 @@ psm_set_exp(sql_query *query, dnode *n)
                res = exp_set(sql->sa, var && var->sname ? sa_strdup(sql->sa, 
var->sname) : NULL, sa_strdup(sql->sa, vname), e, level);
        } else { /* multi assignment */
                exp_kind ek = {type_relation, card_value, FALSE};
-               sql_rel *rel_val = rel_subquery(query, NULL, val, ek);
+               sql_rel *rel_val = rel_subquery(query, val, ek);
                dlist *vars = n->data.lval;
                dnode *m;
                node *n;
@@ -543,7 +543,7 @@ rel_select_into( sql_query *query, symbo
 
        /* SELECT ... INTO var_list */
        sn->into = NULL;
-       r = rel_subquery(query, NULL, sq, ek);
+       r = rel_subquery(query, sq, ek);
        if (!r)
                return NULL;
        if (!is_project(r->op))
@@ -833,7 +833,7 @@ rel_create_func(sql_query *query, dlist 
                return sql_error(sql, ERR_NOTFOUND, SQLSTATE(3F000) "CREATE %s: 
no such schema '%s'", F, sname);
        if (create && !mvc_schema_privs(sql, s))
                return sql_error(sql, 02, SQLSTATE(42000) "CREATE %s: 
insufficient privileges for user '%s' in schema '%s'", F,
-                                                get_string_global_var(sql, 
"current_user"), s->base.name); 
+                                                get_string_global_var(sql, 
"current_user"), s->base.name);
 
        type_list = create_type_list(sql, params, 1);
 
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
@@ -153,7 +153,7 @@ rel_orderby(mvc *sql, sql_rel *l)
 
 /* forward refs */
 static sql_rel * rel_setquery(sql_query *query, symbol *sq);
-static sql_rel * rel_joinquery(sql_query *query, sql_rel *rel, symbol *sq, 
list *refs);
+static sql_rel * rel_joinquery(sql_query *query, symbol *sq, list *refs);
 
 static sql_rel *
 rel_table_optname(mvc *sql, sql_rel *sq, symbol *optname, list *refs)
@@ -225,12 +225,12 @@ rel_table_optname(mvc *sql, sql_rel *sq,
 }
 
 static sql_rel *
-rel_subquery_optname(sql_query *query, sql_rel *rel, symbol *ast, list *refs)
+rel_subquery_optname(sql_query *query, symbol *ast, list *refs)
 {
        mvc *sql = query->sql;
        SelectNode *sn = (SelectNode *) ast;
        exp_kind ek = {type_value, card_relation, TRUE};
-       sql_rel *sq = rel_subquery(query, rel, ast, ek);
+       sql_rel *sq = rel_subquery(query, ast, ek);
 
        assert(ast->token == SQL_SELECT);
        if (!sq)
@@ -301,7 +301,7 @@ rel_with_query(sql_query *query, symbol 
 }
 
 static sql_rel *
-query_exp_optname(sql_query *query, sql_rel *r, symbol *q, list *refs)
+query_exp_optname(sql_query *query, symbol *q, list *refs)
 {
        mvc *sql = query->sql;
        switch (q->token) {
@@ -317,7 +317,7 @@ query_exp_optname(sql_query *query, sql_
        }
        case SQL_JOIN:
        {
-               sql_rel *tq = rel_joinquery(query, r, q, refs);
+               sql_rel *tq = rel_joinquery(query, q, refs);
 
                if (!tq)
                        return NULL;
@@ -620,7 +620,7 @@ rel_named_table_function(sql_query *quer
                                                                 sname ? 
"'":"", sname ? sname : "", sname ? "'.":"", fname);
 
                        if (subquery) {
-                               if (!(sq = rel_subquery(query, NULL, subquery, 
ek)))
+                               if (!(sq = rel_subquery(query, subquery, ek)))
                                        return NULL;
                        } else {
                                for ( ; n; n = n->next) {
@@ -914,7 +914,7 @@ rel_reduce_on_column_privileges(mvc *sql
 }
 
 sql_rel *
-table_ref(sql_query *query, sql_rel *rel, symbol *tableref, int lateral, list 
*refs)
+table_ref(sql_query *query, symbol *tableref, int lateral, list *refs)
 {
        mvc *sql = query->sql;
        char *tname = NULL;
@@ -1035,9 +1035,9 @@ table_ref(sql_query *query, sql_rel *rel
        } else if (tableref->token == SQL_VALUES) {
                return rel_values(query, tableref, refs);
        } else if (tableref->token == SQL_TABLE) {
-               return rel_named_table_function(query, rel, tableref, lateral, 
refs);
+               return rel_named_table_function(query, NULL, tableref, lateral, 
refs);
        } else if (tableref->token == SQL_SELECT) {
-               return rel_subquery_optname(query, rel, tableref, refs);
+               return rel_subquery_optname(query, tableref, refs);
        } else if (tableref->token == SQL_UNION || tableref->token == 
SQL_EXCEPT || tableref->token == SQL_INTERSECT) {
                /* subqueries will be called, ie no need to test for duplicate 
references */
                sql_rel *tq = rel_setquery(query, tableref);
@@ -1048,7 +1048,7 @@ table_ref(sql_query *query, sql_rel *rel
                symbol *optname = tableref->data.lval->t->type == type_symbol ? 
tableref->data.lval->t->data.sym : NULL;
                return rel_table_optname(sql, tq, optname, refs);
        } else {
-               return query_exp_optname(query, rel, tableref, refs);
+               return query_exp_optname(query, tableref, refs);
        }
 }
 
@@ -1900,7 +1900,7 @@ rel_exists_exp(sql_query *query, sql_rel
                query_processed(query);
                query_push_outer(query, rel, f);
        }
-       sq = rel_subquery(query, NULL, sc->data.sym, ek);
+       sq = rel_subquery(query, sc->data.sym, ek);
        if (rel)
                rel = query_pop_outer(query);
        assert(!is_sql_sel(f));
@@ -5181,7 +5181,7 @@ rel_value_exp2(sql_query *query, sql_rel
                        r = rel_values(query, se, NULL);
                } else {
                        assert(se->token == SQL_SELECT);
-                       r = rel_subquery(query, NULL, se, ek);
+                       r = rel_subquery(query, se, ek);
                }
                if (rel && *rel) {
                        *rel = query_pop_outer(query);
@@ -5774,14 +5774,14 @@ rel_unique_names(mvc *sql, sql_rel *rel)
 }
 
 static sql_rel *
-rel_query(sql_query *query, sql_rel *rel, symbol *sq, int toplevel, exp_kind 
ek)
+rel_query(sql_query *query, symbol *sq, exp_kind ek)
 {
        mvc *sql = query->sql;
        sql_rel *res = NULL;
        SelectNode *sn = NULL;
 
        if (sq->token != SQL_SELECT)
-               return table_ref(query, rel, sq, 0, NULL);
+               return table_ref(query, sq, 0, NULL);
 
        /* select ... into is currently not handled here ! */
        sn = (SelectNode *) sq;
@@ -5814,16 +5814,11 @@ rel_query(sql_query *query, sql_rel *rel
                        int lateral = check_is_lateral(n->data.sym);
 
                        /* just used current expression */
-                       fnd = table_ref(query, NULL, n->data.sym, lateral, 
refs);
-                       if (!fnd && res && lateral && sql->session->status != 
-ERR_AMBIGUOUS) {
-                               /* reset error */
-                               sql->session->status = 0;
-                               sql->errstr[0] = 0;
-
+                       if (lateral && res)
                                query_push_outer(query, res, sql_from);
-                               fnd = table_ref(query, NULL, n->data.sym, 
lateral, refs);
+                       fnd = table_ref(query, n->data.sym, lateral, refs);
+                       if (lateral && res)
                                res = query_pop_outer(query);
-                       }
                        if (!fnd)
                                break;
                        if (res) {
@@ -5839,9 +5834,11 @@ rel_query(sql_query *query, sql_rel *rel
                                rel_destroy(res);
                        return NULL;
                }
-       } else if (toplevel || !res) /* only on top level query */
-               return rel_select_exp(query, rel, sn, ek);
-
+       } else if (!query_has_outer(query) || !res) {/* only on top level query 
*/
+               return rel_select_exp(query, NULL, sn, ek);
+       }
+
+       sql_rel *rel = NULL;
        if (res)
                rel = rel_select_exp(query, res, sn, ek);
        if (!rel && res)
@@ -5886,10 +5883,10 @@ rel_setquery(sql_query *query, symbol *q
        sql_rel *t1, *t2;
 
        assert(n->next->type == type_int);
-       t1 = table_ref(query, NULL, tab_ref1, 0, NULL);
+       t1 = table_ref(query, tab_ref1, 0, NULL);
        if (!t1)
                return NULL;
-       t2 = table_ref(query, NULL, tab_ref2, 0, NULL);
+       t2 = table_ref(query, tab_ref2, 0, NULL);
        if (!t2)
                return NULL;
 
@@ -5927,14 +5924,13 @@ rel_setquery(sql_query *query, symbol *q
 }
 
 static sql_rel *
-rel_joinquery_(sql_query *query, sql_rel *rel, symbol *tab1, int natural, jt 
jointype, symbol *tab2, symbol *js, list *refs)
+rel_joinquery_(sql_query *query, symbol *tab1, int natural, jt jointype, 
symbol *tab2, symbol *js, list *refs)
 {
        mvc *sql = query->sql;
        operator_type op = op_join;
-       sql_rel *t1 = NULL, *t2 = NULL, *inner;
+       sql_rel *t1 = NULL, *t2 = NULL, *inner, *rel = NULL;
        int l_nil = 0, r_nil = 0, lateral = 0;
 
-       assert(!rel);
        switch(jointype) {
        case jt_inner:
        case jt_cross: op = op_join;
@@ -5953,32 +5949,26 @@ rel_joinquery_(sql_query *query, sql_rel
 
        /* a dependent join cannot depend on the right side, so disable lateral 
check for right and full joins */
        lateral = (op == op_join || op == op_left) && check_is_lateral(tab2);
-       t1 = table_ref(query, NULL, tab1, 0, refs);
-       if (rel && !t1 && sql->session->status != -ERR_AMBIGUOUS) {
-               /* reset error */
-               sql->session->status = 0;
-               sql->errstr[0] = 0;
-               t1 = table_ref(query, NULL, tab1, 0, refs);
-       }
+       t1 = table_ref(query, tab1, 0, refs);
        if (t1) {
                if (!lateral)
-                       t2 = table_ref(query, NULL, tab2, 0, refs);
+                       t2 = table_ref(query, tab2, 0, refs);
                else if (lateral && !t2) {
                        query_push_outer(query, t1, sql_from);
-                       t2 = table_ref(query, NULL, tab2, 0, refs);
+                       t2 = table_ref(query, tab2, 0, refs);
                        t1 = query_pop_outer(query);
                }
        }
-       if (rel)
-               rel_destroy(rel);
        if (!t1 || !t2)
                return NULL;
 
        query_processed(query);
        inner = rel = rel_crossproduct(sql->sa, t1, t2, op_join);
-       inner->op = op;
+       if (!rel)
+               return NULL;
+       rel->op = op;
        if (lateral)
-               set_dependent(inner);
+               set_dependent(rel);
 
        assert(jointype != jt_cross || (!natural && !js)); /* there are no 
natural cross joins, or cross joins with conditions */
        if (js && natural)
@@ -6073,7 +6063,7 @@ rel_joinquery_(sql_query *query, sql_rel
 }
 
 static sql_rel *
-rel_joinquery(sql_query *query, sql_rel *rel, symbol *q, list *refs)
+rel_joinquery(sql_query *query, symbol *q, list *refs)
 {
        dnode *n = q->data.lval->h;
        symbol *tab_ref1 = n->data.sym;
@@ -6084,21 +6074,20 @@ rel_joinquery(sql_query *query, sql_rel 
 
        assert(n->next->type == type_int);
        assert(n->next->next->type == type_int);
-       return rel_joinquery_(query, rel, tab_ref1, natural, jointype, 
tab_ref2, joinspec, refs);
+       return rel_joinquery_(query, tab_ref1, natural, jointype, tab_ref2, 
joinspec, refs);
 }
 
 sql_rel *
-rel_subquery(sql_query *query, sql_rel *rel, symbol *sq, exp_kind ek)
+rel_subquery(sql_query *query, symbol *sq, exp_kind ek)
 {
        mvc *sql = query->sql;
-       int toplevel = (!rel || (rel->op == op_project && (!rel->exps || 
list_length(rel->exps) == 0)));
 
        query_processed(query);
        if (!stack_push_frame(sql, NULL))
                return sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
-       rel = rel_query(query, rel, sq, toplevel, ek);
+       sql_rel *rel = rel_query(query, sq, ek);
        stack_pop_frame(sql);
-       if (toplevel)
+       if (!query_has_outer(query))
                query_processed(query);
        if (rel && ek.type == type_relation && ek.card < card_set && rel->card 
>= CARD_AGGR)
                return rel_zero_or_one(sql, rel, ek);
@@ -6128,12 +6117,12 @@ rel_selects(sql_query *query, symbol *s)
                        sql->type = Q_SCHEMA;
                        ret = rel_select_with_into(query, s);
                } else {
-                       ret = rel_subquery(query, NULL, s, ek);
+                       ret = rel_subquery(query, s, ek);
                        sql->type = Q_TABLE;
                }
        }       break;
        case SQL_JOIN:
-               ret = rel_joinquery(query, NULL, s, NULL);
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to