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