Changeset: fd5cc9b32190 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fd5cc9b32190
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_statement.c
        sql/backends/monet5/sql_statement.h
        sql/rel.txt
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_psm.c
        sql/server/rel_select.c
        sql/test/miscellaneous/Tests/scoping.sql
Branch: scoping
Log Message:

Server runs sql/test directory. Declared variables now have a schema. Next 
step, fix frame level and variable resolution order


diffs (truncated from 361 to 300 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
@@ -543,12 +543,12 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                                return NULL;
                        if (e->card <= CARD_ATOM && r->nrcols > 0) /* single 
value, get result from bat */
                                r = stmt_fetch(be, r);
-                       return stmt_assign(be, exp_name(e), r, 
GET_PSM_LEVEL(e->flag));
+                       return stmt_assign(be, exp_relname(e), exp_name(e), r, 
GET_PSM_LEVEL(e->flag));
                } else if (e->flag & PSM_VAR) {
                        if (e->f)
-                               return stmt_vars(be, exp_name(e), e->f, 1, 
GET_PSM_LEVEL(e->flag));
+                               return stmt_vars(be, exp_relname(e), 
exp_name(e), e->f, 1, GET_PSM_LEVEL(e->flag));
                        else
-                               return stmt_var(be, exp_name(e), &e->tpe, 1, 
GET_PSM_LEVEL(e->flag));
+                               return stmt_var(be, exp_relname(e), 
exp_name(e), &e->tpe, 1, GET_PSM_LEVEL(e->flag));
                } else if (e->flag & PSM_RETURN) {
                        sql_exp *l = e->l;
                        stmt *r = exp_bin(be, l, left, right, grp, ext, cnt, 
sel);
@@ -628,7 +628,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                        atom *a = e->l;
                        s = stmt_atom(be, atom_dup(sql->sa, a));
                } else if (e->r) {              /* parameters */
-                       s = stmt_var(be, sa_strdup(sql->sa, e->r), 
e->tpe.type?&e->tpe:NULL, 0, e->flag);
+                       s = stmt_var(be, e->alias.rname ? sa_strdup(sql->sa, 
e->alias.rname) : NULL, sa_strdup(sql->sa, e->alias.name), 
e->tpe.type?&e->tpe:NULL, 0, e->flag);
                } else if (e->f) {              /* values */
                        s = value_list(be, e->f, left, sel);
                } else {                        /* arguments */
@@ -674,7 +674,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                if (exps) {
                        int nrcols = 0;
 
-                        if (sel && strcmp(sql_func_mod(f->func), "calc") == 0 
&& strcmp(sql_func_imp(f->func), "ifthenelse") != 0) 
+                       if (sel && strcmp(sql_func_mod(f->func), "calc") == 0 
&& strcmp(sql_func_imp(f->func), "ifthenelse") != 0) 
                                push_cands = 1;
 
                        for (en = exps->h; en; en = en->next) {
@@ -741,7 +741,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                if (cond_execution) {
                        /* var_x = nil; */
                        nme = number2name(name, sizeof(name), ++sql->label);
-                       (void)stmt_var(be, nme, exp_subtype(e), 1, 2);
+                       (void)stmt_var(be, NULL, nme, exp_subtype(e), 1, 2);
                        /* if_barrier ... */
                        cond_execution = stmt_cond(be, cond_execution, NULL, 0, 
0);
                }
@@ -755,10 +755,10 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                        s->cand = sel;
                if (cond_execution) {
                        /* var_x = s */
-                       (void)stmt_assign(be, nme, s, 2);
+                       (void)stmt_assign(be, NULL, nme, s, 2);
                        /* endif_barrier */
                        (void)stmt_control_end(be, cond_execution);
-                       s = stmt_var(be, nme, exp_subtype(e), 0, 2);
+                       s = stmt_var(be, NULL, nme, exp_subtype(e), 0, 2);
                }
        }       break;
        case e_aggr: {
@@ -1622,7 +1622,7 @@ exp2bin_args(backend *be, sql_exp *e, li
 
                        snprintf(nme, sizeof(nme), "A%s", (char*)e->r);
                        if (!list_find(args, nme, (fcmp)&alias_cmp)) {
-                               stmt *s = stmt_var(be, e->r, &e->tpe, 0, 0);
+                               stmt *s = stmt_var(be, NULL, e->r, &e->tpe, 0, 
0);
 
                                s = stmt_alias(be, s, NULL, sa_strdup(sql->sa, 
nme));
                                list_append(args, s);
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -645,19 +645,18 @@ setVariable(Client cntxt, MalBlkPtr mb, 
                return msg;
 
        if (!(s = mvc_bind_schema(m, sname)))
-               throw(SQL, "sql.setVariable", SQLSTATE(3F000) "Cannot find the 
schema %s", sname);
+               throw(SQL, "sql.setVariable", SQLSTATE(3F000) "Cannot find the 
schema '%s'", sname);
 
        *res = 0;
        if (mtype < 0 || mtype >= 255)
                throw(SQL, "sql.setVariable", SQLSTATE(42100) "Variable type 
error");
        if (!strcmp("sys", s->base.name) && !strcmp("optimizer", varname)) {
-               const char *newopt = *getArgReference_str(stk, pci, 3);
+               const char *newopt = *getArgReference_str(stk, pci, 4);
                if (newopt) {
                        char buf[BUFSIZ];
-                       if (!isOptimizerPipe(newopt) && strchr(newopt, (int) 
';') == 0) {
+                       if (!isOptimizerPipe(newopt) && strchr(newopt, (int) 
';') == 0)
                                throw(SQL, "sql.setVariable", SQLSTATE(42100) 
"optimizer '%s' unknown", newopt);
-                       }
-                       snprintf(buf, BUFSIZ, "user_%d", cntxt->idx);
+                       (void) snprintf(buf, BUFSIZ, "user_%d", cntxt->idx);
                        if (!isOptimizerPipe(newopt) || strcmp(buf, newopt) == 
0) {
                                msg = addPipeDefinition(cntxt, buf, newopt);
                                if (msg)
@@ -673,7 +672,7 @@ setVariable(Client cntxt, MalBlkPtr mb, 
                }
                return MAL_SUCCEED;
        }
-       src = &stk->stk[getArg(pci, 3)];
+       src = &stk->stk[getArg(pci, 4)];
        if (stack_find_var(m, s, varname)) {
 #ifdef HAVE_HGE
                hge sgn = val_get_number(src);
@@ -709,11 +708,11 @@ getVariable(Client cntxt, MalBlkPtr mb, 
                return msg;
 
        if (!(s = mvc_bind_schema(m, sname)))
-               throw(SQL, "sql.getVariable", SQLSTATE(3F000) "Cannot find the 
schema %s", sname);
+               throw(SQL, "sql.getVariable", SQLSTATE(3F000) "Cannot find the 
schema '%s'", sname);
        if (mtype < 0 || mtype >= 255)
                throw(SQL, "sql.getVariable", SQLSTATE(42100) "Variable type 
error");
        if (!(a = stack_get_var(m, s, varname)))
-               throw(SQL, "sql.getVariable", SQLSTATE(42100) "Variable'%s.%s' 
unknown", sname, varname);
+               throw(SQL, "sql.getVariable", SQLSTATE(42100) "Variable '%s.%s' 
unknown", sname, varname);
        src = &a->data;
        dst = &stk->stk[getArg(pci, 0)];
        if (VALcopy(dst, src) == NULL)
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
@@ -321,7 +321,7 @@ dump_table(sql_allocator *sa, MalBlkPtr 
 }
 
 stmt *
-stmt_var(backend *be, const char *varname, sql_subtype *t, int declare, int 
level)
+stmt_var(backend *be, const char *sname, const char *varname, sql_subtype *t, 
int declare, int level)
 {
        MalBlkPtr mb = be->mb;
        InstrPtr q = NULL;
@@ -330,8 +330,10 @@ stmt_var(backend *be, const char *varnam
        if (level == 1 ) { /* global */
                int tt = t->type->localtype;
 
+               assert(sname);
                q = newStmt(mb, sqlRef, putName("getVariable"));
                q = pushArgument(mb, q, be->mvc_var);
+               q = pushStr(mb, q, sname);
                q = pushStr(mb, q, varname);
                if (q == NULL)
                        return NULL;
@@ -342,9 +344,8 @@ stmt_var(backend *be, const char *varnam
                q = newAssignment(mb);
                q = pushArgumentId(mb, q, buf);
        } else {
-               int tt;
-
-               tt = t->type->localtype;
+               int tt = t->type->localtype;
+
                (void) snprintf(buf, sizeof(buf), "A%s", varname);
                q = newInstruction(mb, NULL, NULL);
                if (q == NULL) {
@@ -379,12 +380,13 @@ stmt_var(backend *be, const char *varnam
 }
 
 stmt *
-stmt_vars(backend *be, const char *varname, sql_table *t, int declare, int 
level)
+stmt_vars(backend *be, const char *sname, const char *varname, sql_table *t, 
int declare, int level)
 {
        MalBlkPtr mb = be->mb;
        InstrPtr q = NULL;
        int *l;
 
+       (void)sname;
        (void)varname;
        /* declared table */
        if ((l = dump_table(be->mvc->sa, mb, t)) != NULL) {
@@ -3724,7 +3726,7 @@ stmt_return(backend *be, stmt *val, int 
 }
 
 stmt *
-stmt_assign(backend *be, const char *varname, stmt *val, int level)
+stmt_assign(backend *be, const char *sname, const char *varname, stmt *val, 
int level)
 {
        MalBlkPtr mb = be->mb;
        InstrPtr q = NULL;
@@ -3754,6 +3756,7 @@ stmt_assign(backend *be, const char *var
        } else {
                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, varname);
                if (q == NULL)
                        return NULL;
diff --git a/sql/backends/monet5/sql_statement.h 
b/sql/backends/monet5/sql_statement.h
--- a/sql/backends/monet5/sql_statement.h
+++ b/sql/backends/monet5/sql_statement.h
@@ -134,8 +134,8 @@ extern stmt *stmt_none(backend *be);
 
 //#define VAR_DECLARE 1
 #define VAR_GLOBAL(f) ((f>>1)==1)
-extern stmt *stmt_var(backend *be, const char *varname, sql_subtype *t, int 
declare, int level);
-extern stmt *stmt_vars(backend *be, const char *varname, sql_table *t, int 
declare, int level);
+extern stmt *stmt_var(backend *be, const char *sname, const char *varname, 
sql_subtype *t, int declare, int level);
+extern stmt *stmt_vars(backend *be, const char *sname, const char *varname, 
sql_table *t, int declare, int level);
 extern stmt *stmt_varnr(backend *be, int nr, sql_subtype *t);
 
 extern stmt *stmt_table(backend *be, stmt *cols, int temp);
@@ -234,7 +234,7 @@ extern stmt *stmt_affected_rows(backend 
 extern stmt *stmt_cond(backend *be, stmt *cond, stmt *outer, int loop, int 
anti);
 extern stmt *stmt_control_end(backend *be, stmt *cond);
 extern stmt *stmt_return(backend *be, stmt *val, int nr_of_declared_tables);
-extern stmt *stmt_assign(backend *be, const char *varname, stmt *val, int 
level);
+extern stmt *stmt_assign(backend *be, const char *sname, const char *varname, 
stmt *val, int level);
 
 extern sql_subtype *tail_type(stmt *st);
 extern int stmt_has_null(stmt *s);
diff --git a/sql/rel.txt b/sql/rel.txt
--- a/sql/rel.txt
+++ b/sql/rel.txt
@@ -96,7 +96,7 @@ Expressions
 e_atom         (card ATOM)
        -> l    literal (-> l = atom)
        or
-       -> r    parameter ( ->r = varname, ->type = subtype, ->flag = level)
+       -> r    parameter ( ->r = varname, ->type = subtype, ->flag = level, 
->alias rname contains the schema of the variable if it's the case (function 
parameters don't have schema) )
        or
        -> f    list of atom expressions
        or
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -518,11 +518,13 @@ exp_value(mvc *sql, sql_exp *e, atom **a
 }
 
 sql_exp * 
-exp_param(sql_allocator *sa, const char *name, sql_subtype *tpe, int frame) 
+exp_param(sql_allocator *sa, const char *sname, const char *name, sql_subtype 
*tpe, int frame) 
 {
        sql_exp *e = exp_create(sa, e_atom);
        if (e == NULL)
                return NULL;
+       e->alias.name = (char*)name;
+       e->alias.rname = (char*)sname;
        e->r = (char*)name;
        e->card = CARD_ATOM;
        e->flag = frame;
@@ -2376,7 +2378,7 @@ exp_copy( mvc *sql, sql_exp * e)
                else if (!e->r)
                        ne = exp_atom_ref(sql->sa, e->flag, &e->tpe);
                else 
-                       ne = exp_param(sql->sa, e->r, &e->tpe, e->flag);
+                       ne = exp_param(sql->sa, e->alias.rname, e->alias.name, 
&e->tpe, e->flag);
                break;
        case e_psm:
                if (e->flag & PSM_SET) 
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -73,7 +73,7 @@ extern sql_exp * exp_atom_clob(sql_alloc
 extern sql_exp * exp_atom_ptr(sql_allocator *sa, void *s);
 extern sql_exp * exp_atom_ref(sql_allocator *sa, int i, sql_subtype *tpe);
 extern sql_exp * exp_null(sql_allocator *sa, sql_subtype *tpe);
-extern sql_exp * exp_param(sql_allocator *sa, const char *name, sql_subtype 
*tpe, int frame);
+extern sql_exp * exp_param(sql_allocator *sa, const char *sname, const char 
*name, sql_subtype *tpe, int frame);
 extern atom * exp_value(mvc *sql, sql_exp *e, atom **args, int maxarg);
 extern sql_exp * exp_values(sql_allocator *sa, list *exps);
 extern list * exp_get_values(sql_exp *e); /* get expression list from the 
values expression */
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
@@ -56,7 +56,7 @@ psm_set_exp(sql_query *query, dnode *n)
        dlist *qname = n->data.lval;
        symbol *val = n->next->data.sym;
        sql_exp *res = NULL, *e = NULL;
-       int level = 0, single = (dlist_length(qname) == 1);
+       int level = 0, single = (qname->h->type == type_string);
        sql_subtype *tpe = NULL;
        sql_rel *rel = NULL;
 
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
@@ -1019,7 +1019,7 @@ rel_var_ref(mvc *sql, const char *sname,
        if (stack_find_var(sql, s, name)) {
                sql_subtype *tpe = stack_find_type(sql, name);
                int frame = stack_find_frame(sql, s, name);
-               return exp_param(sql->sa, name, tpe, frame);
+               return exp_param(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);
        }
@@ -1106,8 +1106,6 @@ rel_column_ref(sql_query *query, sql_rel
                return NULL;
        } else if (dlist_length(l) == 1) {
                const char *name = l->h->data.sval;
-               sql_arg *a = sql_bind_param(sql, name);
-               int var = stack_find_var(sql, NULL, name); /* find one */
 
                if (!exp && inner)
                        exp = rel_bind_column(sql, inner, name, f, 0);
@@ -1146,23 +1144,28 @@ rel_column_ref(sql_query *query, sql_rel
                        if (exp && outer && is_join(outer->op))
                                set_dependent(outer);
                }
-               if (exp) {
-                       if (var || a)
-                               return sql_error(sql, ERR_AMBIGUOUS, 
SQLSTATE(42000) "SELECT: identifier '%s' ambiguous", name);
-               } else if (a) {
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to