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

Reply via email to