Changeset: cfb8e85a6768 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cfb8e85a6768
Modified Files:
        sql/backends/monet5/sql_gencode.c
        sql/backends/monet5/sql_statement.c
        sql/server/rel_psm.c
        sql/server/rel_select.c
        sql/server/sql_mvc.h
        sql/server/sql_parser.y
        sql/server/sql_var.c
Branch: scoping
Log Message:

Applying name mangling for variables.

This solves which variable to bind in the scoping level.
Also fixed issues for function parameters binding (no schema) vs declared 
variables binding.

The mangled name is -> A + level + '%' + schema name if available + '%' if 
schema name available + varaible name.

With this scheme I think the names will never be ambiguous in the MAL layer.


diffs (truncated from 320 to 300 lines):

diff --git a/sql/backends/monet5/sql_gencode.c 
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -1326,7 +1326,7 @@ backend_create_sql_func(backend *be, sql
                        char buf[IDLENGTH];
 
                        if (a->name)
-                               (void) snprintf(buf, IDLENGTH, "A%s", a->name);
+                               (void) snprintf(buf, IDLENGTH, "A1%%%s", 
a->name); /* mangle variable name */
                        else
                                (void) snprintf(buf, IDLENGTH, "A%d", argc);
                        varid = newVariable(curBlk, buf, strlen(buf), type);
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -333,20 +333,20 @@ stmt_var(backend *be, const char *sname,
                assert(sname);
                q = newStmt(mb, sqlRef, putName("getVariable"));
                q = pushArgument(mb, q, be->mvc_var);
-               q = pushStr(mb, q, sname);
+               q = pushStr(mb, q, sname); /* all global variables have a 
schema */
                q = pushStr(mb, q, varname);
                if (q == NULL)
                        return NULL;
                setVarType(mb, getArg(q, 0), tt);
                setVarUDFtype(mb, getArg(q, 0));
        } else if (!declare) {
-               (void) snprintf(buf, sizeof(buf), "A%s", varname);
+               (void) snprintf(buf, sizeof(buf), "A%d%%%s%s%s", level, sname ? 
sname : "", sname ? "%%" : "", varname); /* mangle variable name */
                q = newAssignment(mb);
                q = pushArgumentId(mb, q, buf);
        } else {
                int tt = t->type->localtype;
 
-               (void) snprintf(buf, sizeof(buf), "A%s", varname);
+               (void) snprintf(buf, sizeof(buf), "A%d%%%s%s%s", level, sname ? 
sname : "", sname ? "%%" : "", varname); /* mangle variable name */
                q = newInstruction(mb, NULL, NULL);
                if (q == NULL) {
                        return NULL;
@@ -3752,7 +3752,7 @@ stmt_assign(backend *be, const char *sna
                        /* drop declared table */
                        assert(0);
                }
-               (void) snprintf(buf, sizeof(buf), "A%s", varname);
+               (void) snprintf(buf, sizeof(buf), "A%d%%%s%s%s", level, sname ? 
sname : "", sname ? "%%" : "", varname); /* mangle variable name */
                q = newInstruction(mb, NULL, NULL);
                if (q == NULL) {
                        return NULL;
@@ -3766,9 +3766,10 @@ stmt_assign(backend *be, const char *sna
                        return NULL;
                q->retc++;
        } else {
+               assert(sname); /* all global variables have a schema */
                q = newStmt(mb, sqlRef, setVariableRef);
                q = pushArgument(mb, q, be->mvc_var);
-               q = pushStr(mb, q, sname ? sname : ATOMnil(TYPE_str));
+               q = pushStr(mb, q, sname);
                q = pushStr(mb, q, varname);
                if (q == NULL)
                        return NULL;
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
@@ -57,7 +57,6 @@ psm_set_exp(sql_query *query, dnode *n)
        symbol *val = n->next->data.sym;
        sql_exp *res = NULL, *e = NULL;
        int level = 0, single = (qname->h->type == type_string);
-       sql_subtype *tpe = NULL;
        sql_rel *rel = NULL;
 
        if (single) {
@@ -65,6 +64,7 @@ psm_set_exp(sql_query *query, dnode *n)
                const char *sname = qname_schema(qname);
                const char *vname = qname_schema_object(qname);
                sql_schema *s = cur_schema(sql);
+               sql_var *var;
 
                if (sname && !(s = mvc_bind_schema(sql, sname)))
                        return sql_error(sql, 02, SQLSTATE(3F000) "SET: No such 
schema '%s'", sname);
@@ -75,11 +75,8 @@ psm_set_exp(sql_query *query, dnode *n)
                */
 
                /* check if variable is known from the stack */
-               if (!stack_find_var(sql, s, vname)) {
+               if (!(var = stack_find_var_frame(sql, s, vname, &level)))
                        return sql_error(sql, 01, SQLSTATE(42000) "SET: 
Variable '%s%s%s' unknown", sname ? sname : "", sname ? "." : "", vname);
-               } else { 
-                       tpe = stack_find_type(sql, vname);
-               }
 
                e = rel_value_exp2(query, &rel, val, sql_sel | sql_update_set, 
ek);
                if (!e)
@@ -90,12 +87,11 @@ psm_set_exp(sql_query *query, dnode *n)
                        e = exp_aggr1(sql->sa, e, zero_or_one, 0, 0, CARD_ATOM, 
has_nil(e));
                }
 
-               level = stack_find_var_frame(sql, s, vname);
-               e = rel_check_type(sql, tpe, rel, e, type_cast);
+               e = rel_check_type(sql, &(var->var.tpe), rel, e, type_cast);
                if (!e)
                        return NULL;
 
-               res = exp_set(sql->sa, s->base.name, vname, e, level);
+               res = exp_set(sql->sa, var->sname ? sa_strdup(sql->sa, 
var->sname) : NULL, sa_strdup(sql->sa, var->name), e, level);
        } else { /* multi assignment */
                exp_kind ek = {type_relation, card_value, FALSE};
                sql_rel *rel_val = rel_subquery(query, NULL, val, ek);
@@ -121,23 +117,19 @@ psm_set_exp(sql_query *query, dnode *n)
                        const char *vname = qname_schema_object(nqname);
                        sql_exp *v = n->data;
                        sql_schema *s = cur_schema(sql);
+                       sql_var *var;
 
                        if (sname && !(s = mvc_bind_schema(sql, sname)))
                                return sql_error(sql, 02, SQLSTATE(3F000) "SET: 
No such schema '%s'", sname);
 
-                       if (!stack_find_var(sql, s, vname)) {
+                       if (!(var = stack_find_var_frame(sql, s, vname, 
&level)))
                                return sql_error(sql, 01, SQLSTATE(42000) "SET: 
Variable '%s%s%s' unknown", sname ? sname : "", sname ? "." : "", vname);
-                       } else { 
-                               tpe = stack_find_type(sql, vname);
-                       }
-
-                       level = stack_find_var_frame(sql, s, vname);
                        if (!exp_name(v)) 
                                exp_label(sql->sa, v, ++sql->label);
                        v = exp_ref(sql->sa, v);
-                       if (!(v = rel_check_type(sql, tpe, rel_val, v, 
type_cast)))
+                       if (!(v = rel_check_type(sql, &(var->var.tpe), rel_val, 
v, type_cast)))
                                return NULL;
-                       append(b, exp_set(sql->sa, s->base.name, vname, v, 
level));
+                       append(b, exp_set(sql->sa, var->sname ? 
sa_strdup(sql->sa, var->sname) : NULL, sa_strdup(sql->sa, var->name), v, 
level));
                }
                res = exp_rel(sql, rel_psm_block(sql->sa, b));
        }
@@ -537,23 +529,21 @@ rel_select_into( sql_query *query, symbo
                dlist *qname = n->data.lval;
                const char *sname = qname_schema(qname);
                const char *name = qname_schema_object(qname);
-               sql_subtype *tpe = NULL;
                sql_schema *s = cur_schema(sql);
                sql_exp *v = m->data;
                int level;
+               sql_var *var;
 
                if (sname && !(s = mvc_bind_schema(sql, sname)))
                        return sql_error(sql, 02, SQLSTATE(3F000) "SELECT INTO: 
No such schema '%s'", sname);
-               if (!stack_find_var(sql, s, name)) 
+               if (!(var = stack_find_var_frame(sql, s, name, &level)))
                        return sql_error(sql, 02, SQLSTATE(42000) "SELECT INTO: 
Variable '%s%s%s' unknown", sname ? sname : "", sname ? "." : "", name);
-               tpe = stack_find_type(sql, name);
-               level = stack_find_var_frame(sql, s, name);
                if (!exp_name(v)) 
                        exp_label(sql->sa, v, ++sql->label);
                v = exp_ref(sql->sa, v);
-               if (!(v = rel_check_type(sql, tpe, r, v, type_equal)))
+               if (!(v = rel_check_type(sql, &(var->var.tpe), r, v, 
type_equal)))
                        return NULL;
-               v = exp_set(sql->sa, s->base.name, name, v, level);
+               v = exp_set(sql->sa, var->sname ? sa_strdup(sql->sa, 
var->sname) : NULL, sa_strdup(sql->sa, var->name), v, level);
                list_append(nl, v);
        }
        return nl;
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
@@ -1070,17 +1070,15 @@ static sql_exp *
 rel_var_ref(mvc *sql, const char *sname, const char *name)
 {
        sql_schema *s = cur_schema(sql);
+       sql_var *var;
+       int level = 0;
 
        if (sname && !(s = mvc_bind_schema(sql, sname)))
                return sql_error(sql, 02, SQLSTATE(3F000) "SELECT: no such 
schema '%s'", sname);
 
-       if (stack_find_var(sql, s, name)) {
-               sql_subtype *tpe = stack_find_type(sql, name);
-               int frame = stack_find_var_frame(sql, s, name);
-               return exp_param_or_declared(sql->sa, s->base.name, name, tpe, 
frame);
-       } else {
-               return sql_error(sql, 02, SQLSTATE(42000) "SELECT: identifier 
'%s%s%s' unknown", sname ? sname : "", sname ? "." : "", name);
-       }
+       if ((var = stack_find_var_frame(sql, s, name, &level)))
+               return exp_param_or_declared(sql->sa, var->sname ? 
sa_strdup(sql->sa, var->sname) : NULL, sa_strdup(sql->sa, var->name), 
&(var->var.tpe), level);
+       return sql_error(sql, 02, SQLSTATE(42000) "SELECT: identifier '%s%s%s' 
unknown", sname ? sname : "", sname ? "." : "", name);
 }
 
 static sql_exp *
diff --git a/sql/server/sql_mvc.h b/sql/server/sql_mvc.h
--- a/sql/server/sql_mvc.h
+++ b/sql/server/sql_mvc.h
@@ -268,9 +268,8 @@ extern void clear_frame(mvc *sql, sql_fr
 extern void stack_pop_until(mvc *sql, int frame);
 
 /* find variable in the stack */
-extern int stack_find_var_frame(mvc *sql, sql_schema *s, const char *name);
+extern sql_var* stack_find_var_frame(mvc *sql, sql_schema *s, const char 
*name, int *level);
 extern int stack_find_var(mvc *sql, sql_schema *s, const char *name);
-extern sql_subtype *stack_find_type(mvc *sql, const char *name);
 extern sql_table *stack_find_table(mvc *sql, sql_schema *s, const char *name);
 extern sql_rel *stack_find_rel_view(mvc *sql, const char *name);
 
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -5706,9 +5706,12 @@ intval:
                }
  |     ident_or_uident {
                  char *name = $1;
+                 sql_var *var;
                  sql_subtype *tpe;
-
-                 if (!stack_find_var(m, cur_schema(m), name)) {
+                 int level = 0;
+
+                 (void) level;
+                 if (!(var = stack_find_var_frame(m, cur_schema(m), name, 
&level))) {
                        char *msg = sql_message(SQLSTATE(22000) "Constant (%s) 
unknown", $1);
 
                        yyerror(m, msg);
@@ -5716,7 +5719,7 @@ intval:
                        $$ = 0;
                        YYABORT;
                  }
-                 tpe = stack_find_type(m, name);
+                 tpe = &(var->var.tpe);
                  if (tpe->type->localtype == TYPE_lng ||
                      tpe->type->localtype == TYPE_int ||
                      tpe->type->localtype == TYPE_sht ||
diff --git a/sql/server/sql_var.c b/sql/server/sql_var.c
--- a/sql/server/sql_var.c
+++ b/sql/server/sql_var.c
@@ -266,13 +266,13 @@ stack_clear_frame_visited_flag(mvc *sql)
 atom *
 stack_set_var(mvc *sql, sql_schema *s, const char *name, ValRecord *v)
 {
-       const char *sname = s->base.name;
+       const char *sname = s ? s->base.name : NULL;
        for (int i = sql->topframes-1; i >= 0; i--) {
                sql_frame *f = sql->frames[i];
                if (f->vars) {
                        for (node *n = f->vars->h; n ; n = n->next) {
                                sql_var *var = (sql_var*) n->data;
-                               if ((!var->sname || !strcmp(var->sname, sname)) 
&& !strcmp(var->name, name)) { /* Function parameters don't have a schema */
+                               if ((!var->sname || (sname && 
!strcmp(var->sname, sname))) && !strcmp(var->name, name)) { /* Function 
parameters don't have a schema */
                                        VALclear(&(var->var.data));
                                        if (VALcopy(&(var->var.data), v) == 
NULL)
                                                return NULL;
@@ -292,13 +292,13 @@ stack_set_var(mvc *sql, sql_schema *s, c
 atom *
 stack_get_var(mvc *sql, sql_schema *s, const char *name)
 {
-       const char *sname = s->base.name;
+       const char *sname = s ? s->base.name : NULL;
        for (int i = sql->topframes-1; i >= 0; i--) {
                sql_frame *f = sql->frames[i];
                if (f->vars) {
                        for (node *n = f->vars->h; n ; n = n->next) {
                                sql_var *var = (sql_var*) n->data;
-                               if ((!var->sname || !strcmp(var->sname, sname)) 
&& !strcmp(var->name, name)) /* Function parameters don't have a schema */
+                               if ((!var->sname || (sname && 
!strcmp(var->sname, sname))) && !strcmp(var->name, name)) /* Function 
parameters don't have a schema */
                                        return &(var->var);
                        }
                }
@@ -361,22 +361,6 @@ stack_pop_frame(mvc *sql)
        clear_frame(sql, f);
 }
 
-sql_subtype *
-stack_find_type(mvc *sql, const char *name)
-{
-       for (int i = sql->topframes-1; i >= 0; i--) {
-               sql_frame *f = sql->frames[i];
-               if (f->vars) {
-                       for (node *n = f->vars->h; n ; n = n->next) {
-                               sql_var *var = (sql_var*) n->data;
-                               if (var->name && !strcmp(var->name, name))
-                                       return &(var->var.tpe);
-                       }
-               }
-       }
-       return NULL;
-}
-
 sql_table *
 stack_find_table(mvc *sql, sql_schema *s, const char *name)
 {
@@ -479,22 +463,26 @@ frame_find_var(mvc *sql, sql_schema *s, 
        return 0;
 }
 
-int
-stack_find_var_frame(mvc *sql, sql_schema *s, const char *name)
+sql_var*
+stack_find_var_frame(mvc *sql, sql_schema *s, const char *name, int *level)
 {
        const char *sname = s->base.name;
+
+       *level = 0;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to