Changeset: 4b62f6a9b829 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4b62f6a9b829
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_gencode.c
        sql/backends/monet5/sql_statement.c
        sql/test/miscellaneous/Tests/declared_tables.stable.err
Branch: scoping
Log Message:

Adding a different prefix (B) for function parameters (ie variables with no 
schema), makes name mangling easier


diffs (172 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -1647,13 +1647,23 @@ exp2bin_args(backend *be, sql_exp *e, li
                } else if (e->f) {
                        return exps2bin_args(be, e->f, args);
                } else if (e->r) {
+                       char *nme;
                        sql_var_name *vname = (sql_var_name*) e->r;
-                       const char *mname = vname->sname ? vname->sname : "%%";
-                       char *nme = SA_NEW_ARRAY(sql->sa, char, strlen(mname) + 
strlen(vname->name) + 3);
-
-                       if (!nme)
-                               return NULL;
-                       stpcpy(stpcpy(stpcpy(stpcpy(nme, "A"), mname), "%%"), 
vname->name);
+
+                       if (vname->sname) { /* Declared variable */
+                               char levelstr[16];
+
+                               snprintf(levelstr, sizeof(levelstr), "%u", 
e->flag);
+                               nme = SA_NEW_ARRAY(be->mvc->sa, char, 
strlen(levelstr) + strlen(vname->sname) + strlen(vname->name) + 4);
+                               if (!nme)
+                                       return NULL;
+                               stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(nme, 
"A"), levelstr), "%%"), vname->sname), "%%"), vname->name); /* mangle variable 
name */
+                       } else { /* Parameter */
+                               nme = SA_NEW_ARRAY(be->mvc->sa, char, 
strlen(vname->name) + 2);
+                               if (!nme)
+                                       return NULL;
+                               stpcpy(stpcpy(nme, "B"), vname->name); /* 
mangle variable name */
+                       }
                        if (!list_find(args, nme, (fcmp)&alias_cmp)) {
                                stmt *s = stmt_var(be, vname->sname, 
vname->name, &e->tpe, 0, 0);
 
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
@@ -1344,9 +1344,9 @@ backend_create_sql_func(backend *be, sql
                        char *buf;
 
                        if (a->name) {
-                               buf = SA_NEW_ARRAY(m->sa, char, strlen(a->name) 
+ 6);
+                               buf = SA_NEW_ARRAY(m->sa, char, strlen(a->name) 
+ 2);
                                if (buf)
-                                       stpcpy(stpcpy(buf, "A1%%%%%%"), 
a->name);  /* mangle variable name */
+                                       stpcpy(stpcpy(buf, "B"), a->name);  /* 
mangle variable name */
                        } else {
                                buf = SA_NEW_ARRAY(m->sa, char, IDLENGTH);
                                if (buf)
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
@@ -325,6 +325,7 @@ stmt_var(backend *be, const char *sname,
 {
        MalBlkPtr mb = be->mb;
        InstrPtr q = NULL;
+       char *buf;
 
        if (level == 0) { /* global */
                int tt = t->type->localtype;
@@ -339,27 +340,38 @@ stmt_var(backend *be, const char *sname,
                setVarType(mb, getArg(q, 0), tt);
                setVarUDFtype(mb, getArg(q, 0));
        } else if (!declare) {
-               const char *msname = sname ? sname : "%%";
-               char levelstr[16], *buf;
-
-               snprintf(levelstr, sizeof(levelstr), "%d", level);
-               buf = SA_NEW_ARRAY(be->mvc->sa, char, strlen(levelstr) + 
strlen(msname) + strlen(varname) + 4);
-               if (!buf)
-                       return NULL;
-               stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(buf, "A"), levelstr), 
"%%"), msname), "%%"), varname); /* mangle variable name */
-
+               if (sname) { /* Declared variable */
+                       char levelstr[16];
+
+                       snprintf(levelstr, sizeof(levelstr), "%d", level);
+                       buf = SA_NEW_ARRAY(be->mvc->sa, char, strlen(levelstr) 
+ strlen(sname) + strlen(varname) + 4);
+                       if (!buf)
+                               return NULL;
+                       stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(buf, "A"), 
levelstr), "%%"), sname), "%%"), varname); /* mangle variable name */
+               } else { /* Parameter */
+                       buf = SA_NEW_ARRAY(be->mvc->sa, char, strlen(varname) + 
2);
+                       if (!buf)
+                               return NULL;
+                       stpcpy(stpcpy(buf, "B"), varname); /* mangle variable 
name */
+               }
                q = newAssignment(mb);
                q = pushArgumentId(mb, q, buf);
        } else {
                int tt = t->type->localtype;
-               const char *msname = sname ? sname : "%%";
-               char levelstr[16], *buf;
-
-               snprintf(levelstr, sizeof(levelstr), "%d", level);
-               buf = SA_NEW_ARRAY(be->mvc->sa, char, strlen(levelstr) + 
strlen(msname) + strlen(varname) + 4);
-               if (!buf)
-                       return NULL;
-               stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(buf, "A"), levelstr), 
"%%"), msname), "%%"), varname); /* mangle variable name */
+               if (sname) { /* Declared variable */
+                       char levelstr[16];
+
+                       snprintf(levelstr, sizeof(levelstr), "%d", level);
+                       buf = SA_NEW_ARRAY(be->mvc->sa, char, strlen(levelstr) 
+ strlen(sname) + strlen(varname) + 4);
+                       if (!buf)
+                               return NULL;
+                       stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(buf, "A"), 
levelstr), "%%"), sname), "%%"), varname); /* mangle variable name */
+               } else { /* Parameter */
+                       buf = SA_NEW_ARRAY(be->mvc->sa, char, strlen(varname) + 
2);
+                       if (!buf)
+                               return NULL;
+                       stpcpy(stpcpy(buf, "B"), varname); /* mangle variable 
name */
+               }
 
                q = newInstruction(mb, NULL, NULL);
                if (q == NULL) {
@@ -3791,18 +3803,26 @@ stmt_assign(backend *be, const char *sna
        if (val && val->nr < 0)
                return NULL;
        if (level != 0) {
-               const char *msname = sname ? sname : "%%";
-               char levelstr[16], *buf;
+               char *buf;
 
                if (!val) {
                        /* drop declared table */
                        assert(0);
                }
-               snprintf(levelstr, sizeof(levelstr), "%d", level);
-               buf = SA_NEW_ARRAY(be->mvc->sa, char, strlen(levelstr) + 
strlen(msname) + strlen(varname) + 4);
-               if (!buf)
-                       return NULL;
-               stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(buf, "A"), levelstr), 
"%%"), msname), "%%"), varname); /* mangle variable name */
+               if (sname) { /* Declared variable */
+                       char levelstr[16];
+
+                       snprintf(levelstr, sizeof(levelstr), "%d", level);
+                       buf = SA_NEW_ARRAY(be->mvc->sa, char, strlen(levelstr) 
+ strlen(sname) + strlen(varname) + 4);
+                       if (!buf)
+                               return NULL;
+                       stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(buf, "A"), 
levelstr), "%%"), sname), "%%"), varname); /* mangle variable name */
+               } else { /* Parameter */
+                       buf = SA_NEW_ARRAY(be->mvc->sa, char, strlen(varname) + 
2);
+                       if (!buf)
+                               return NULL;
+                       stpcpy(stpcpy(buf, "B"), varname); /* mangle variable 
name */
+               }
                q = newInstruction(mb, NULL, NULL);
                if (q == NULL) {
                        return NULL;
diff --git a/sql/test/miscellaneous/Tests/declared_tables.stable.err 
b/sql/test/miscellaneous/Tests/declared_tables.stable.err
--- a/sql/test/miscellaneous/Tests/declared_tables.stable.err
+++ b/sql/test/miscellaneous/Tests/declared_tables.stable.err
@@ -17,19 +17,6 @@ MAPI  = (monetdb) /var/tmp/mtest-1000805
 QUERY = select b; --error, b was never declared
 ERROR = !SELECT: identifier 'b' unknown
 CODE  = 42000
-MAPI  = (monetdb) /var/tmp/mtest-522051/.s.monetdb.31503
-QUERY = CREATE OR REPLACE FUNCTION testtruncate() RETURNS INT 
-        BEGIN
-            DECLARE TABLE z (a int);
-            INSERT INTO z VALUES (1);
-            UPDATE z SET a = 2 WHERE a = 1;
-            TRUNCATE z;
-            INSERT INTO z VALUES (3);
-            DELETE FROM z WHERE a = 3;
-            RETURN SELECT a FROM z;
-        END;
-ERROR = !SELECT: identifier 'a' ambiguous
-CODE  = 42000
 
 # 14:29:33 >  
 # 14:29:33 >  "Done."
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to