Changeset: 2b006ed01ff8 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2b006ed01ff8 Modified Files: sql/server/rel_psm.c sql/server/rel_select.c Branch: scoping Log Message:
Simplify diffs (159 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 @@ -48,6 +48,27 @@ rel_psm_stmt(sql_allocator *sa, sql_exp return NULL; } +/* vname can be + - 'parameter of the function' (ie in the param list) + - local variable, declared earlier + - global variable, also declared earlier +*/ +static void* +resolve_variable_on_scope(mvc *sql, sql_schema *s, const char *sname, const char *vname, sql_var **var, sql_arg **a, sql_subtype **tpe, int *level, const char *action) +{ + if (!sname && (*var = stack_find_var_frame(sql, vname, level))) { /* check if variable is known from the stack */ + *tpe = &((*var)->var.tpe); + } else if (!sname && (*a = sql_bind_param(sql, vname))) { /* then if it is a parameter */ + *tpe = &((*a)->type); + *level = 1; + } else if ((*var = find_global_var(sql, s, vname))) { /* then if it is a global var */ + *tpe = &((*var)->var.tpe); + *level = 0; + } else + return sql_error(sql, 01, SQLSTATE(42000) "%s: Variable '%s%s%s' unknown", action, sname ? sname : "", sname ? "." : "", vname); + return level; +} + /* SET [ schema '.' ] variable = value and set ( [ schema1 '.' ] variable1, .., [ schemaN '.' ] variableN) = (query) */ static sql_exp * psm_set_exp(sql_query *query, dnode *n) @@ -71,21 +92,8 @@ psm_set_exp(sql_query *query, dnode *n) if (sname && !(s = mvc_bind_schema(sql, sname))) return sql_error(sql, 02, SQLSTATE(3F000) "SET: No such schema '%s'", sname); - /* vname can be - 'parameter of the function' (ie in the param list) - or a local or global variable, declared earlier - */ - if (!sname && (var = stack_find_var_frame(sql, vname, &level))) { /* check if variable is known from the stack */ - tpe = &var->var.tpe; - } else if (!sname && (a = sql_bind_param(sql, vname))) { /* then if it is a parameter */ - tpe = &a->type; - level = 1; - } else if ((var = find_global_var(sql, s, vname))) { /* then if it is a global var */ - tpe = &var->var.tpe; - level = 0; - } else - return sql_error(sql, 01, SQLSTATE(42000) "SET: Variable '%s%s%s' unknown", sname ? sname : "", sname ? "." : "", vname); - + if (!resolve_variable_on_scope(sql, s, sname, vname, &var, &a, &tpe, &level, "SET")) + return NULL; if (!(e = rel_value_exp2(query, &rel, val, sql_sel | sql_update_set, ek))) return NULL; if (e->card > CARD_AGGR) { @@ -128,16 +136,8 @@ psm_set_exp(sql_query *query, dnode *n) if (sname && !(s = mvc_bind_schema(sql, sname))) return sql_error(sql, 02, SQLSTATE(3F000) "SET: No such schema '%s'", sname); - if (!sname && (var = stack_find_var_frame(sql, vname, &level))) { /* check if variable is known from the stack */ - tpe = &var->var.tpe; - } else if (!sname && (a = sql_bind_param(sql, vname))) { /* then if it is a parameter */ - tpe = &a->type; - level = 1; - } else if ((var = find_global_var(sql, s, vname))) { /* then if it is a global var */ - tpe = &var->var.tpe; - level = 0; - } else - return sql_error(sql, 01, SQLSTATE(42000) "SET: Variable '%s%s%s' unknown", sname ? sname : "", sname ? "." : "", vname); + if (!resolve_variable_on_scope(sql, s, sname, vname, &var, &a, &tpe, &level, "SET")) + return NULL; v = exp_ref(sql, v); if (!(v = rel_check_type(sql, tpe, rel_val, v, type_cast))) @@ -600,16 +600,8 @@ rel_select_into( sql_query *query, symbo if (sname && !(s = mvc_bind_schema(sql, sname))) return sql_error(sql, 02, SQLSTATE(3F000) "SELECT INTO: No such schema '%s'", sname); - if (!sname && (var = stack_find_var_frame(sql, vname, &level))) { /* check if variable is known from the stack */ - tpe = &var->var.tpe; - } else if (!sname && (a = sql_bind_param(sql, vname))) { /* then if it is a parameter */ - tpe = &a->type; - level = 1; - } else if ((var = find_global_var(sql, s, vname))) { /* then if it is a global var */ - tpe = &var->var.tpe; - level = 0; - } else - return sql_error(sql, 01, SQLSTATE(42000) "SELECT INTO: Variable '%s%s%s' unknown", sname ? sname : "", sname ? "." : "", vname); + if (!resolve_variable_on_scope(sql, s, sname, vname, &var, &a, &tpe, &level, "SELECT INTO")) + return NULL; v = exp_ref(sql, v); if (!(v = rel_check_type(sql, tpe, r, v, type_equal))) 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 @@ -1050,26 +1050,31 @@ table_ref(sql_query *query, sql_rel *rel } } +static inline sql_exp * +rel_exp_variable_on_scope(mvc *sql, sql_schema *s, const char *sname, const char *vname) +{ + sql_var *var = NULL; + sql_arg *a = NULL; + int level = 1; + + if (!sname && (var = stack_find_var_frame(sql, vname, &level))) /* check if variable is known from the stack */ + return exp_param_or_declared(sql->sa, NULL, sa_strdup(sql->sa, var->name), &(var->var.tpe), level); + if (!sname && (a = sql_bind_param(sql, vname))) /* then if it is a parameter */ + return exp_param_or_declared(sql->sa, NULL, sa_strdup(sql->sa, vname), &(a->type), 1); + if ((var = find_global_var(sql, s, vname))) /* then if it is a global var */ + return exp_param_or_declared(sql->sa, sa_strdup(sql->sa, var->sname), sa_strdup(sql->sa, var->name), &(var->var.tpe), 0); + return NULL; +} + static sql_exp * rel_var_ref(mvc *sql, const char *sname, const char *vname) { sql_schema *s = cur_schema(sql); - sql_var *var = NULL; - sql_arg *a = NULL; - int level = 1; sql_exp *res = NULL; if (sname && !(s = mvc_bind_schema(sql, sname))) return sql_error(sql, 02, SQLSTATE(3F000) "SELECT: no such schema '%s'", sname); - - if (!sname && (var = stack_find_var_frame(sql, vname, &level))) /* check if variable is known from the stack */ - res = exp_param_or_declared(sql->sa, NULL, sa_strdup(sql->sa, var->name), &(var->var.tpe), level); - else if (!sname && (a = sql_bind_param(sql, vname))) /* then if it is a parameter */ - res = exp_param_or_declared(sql->sa, NULL, sa_strdup(sql->sa, vname), &(a->type), 1); - else if ((var = find_global_var(sql, s, vname))) /* then if it is a global var */ - res = exp_param_or_declared(sql->sa, sa_strdup(sql->sa, var->sname), sa_strdup(sql->sa, var->name), &(var->var.tpe), 0); - - if (!res) + if (!(res = rel_exp_variable_on_scope(sql, s, sname, vname))) return sql_error(sql, 02, SQLSTATE(42000) "SELECT: identifier '%s%s%s' unknown", sname ? sname : "", sname ? "." : "", vname); return res; } @@ -1200,17 +1205,8 @@ rel_column_ref(sql_query *query, sql_rel set_dependent(outer); } if (!exp) { /* If no column was found, try a variable or parameter */ - sql_arg *a = NULL; - sql_var *var = NULL; - int level = 1; sql_schema *s = cur_schema(sql); - - if ((var = stack_find_var_frame(sql, name, &level))) /* check if variable is known from the stack */ - exp = exp_param_or_declared(sql->sa, NULL, sa_strdup(sql->sa, var->name), &(var->var.tpe), level); - else if ((a = sql_bind_param(sql, name))) /* then if it is a parameter */ - exp = exp_param_or_declared(sql->sa, NULL, sa_strdup(sql->sa, name), &(a->type), 1); - else if ((var = find_global_var(sql, s, name))) /* then if it is a global var */ - exp = exp_param_or_declared(sql->sa, sa_strdup(sql->sa, var->sname), sa_strdup(sql->sa, var->name), &(var->var.tpe), 0); + exp = rel_exp_variable_on_scope(sql, s, NULL, name); } if (!exp) _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list