Changeset: b5e4dea27f93 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b5e4dea27f93
Modified Files:
        sql/backends/monet5/sql_execute.c
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_psm.c
        sql/server/rel_schema.c
        sql/server/rel_schema.h
        sql/server/sql_parser.y
Branch: scoping
Log Message:

Handle schemas at rel_psm

The server doesn't start yet because of the scoping changes. The variables 
handling have to change, so it will run again.


diffs (truncated from 865 to 300 lines):

diff --git a/sql/backends/monet5/sql_execute.c 
b/sql/backends/monet5/sql_execute.c
--- a/sql/backends/monet5/sql_execute.c
+++ b/sql/backends/monet5/sql_execute.c
@@ -946,7 +946,7 @@ RAstatement2(Client cntxt, MalBlkPtr mb,
                                sqlcleanup(m, 0);
                                return 
createException(SQL,"RAstatement2",SQLSTATE(HY013) MAL_MALLOC_FAIL);
                        }
-                       append(ops, exp_var(m->sa, sa_strdup(m->sa, vnme+1), 
&t, m->frame));
+                       append(ops, exp_var(m->sa, NULL, sa_strdup(m->sa, 
vnme+1), &t, m->frame));
                }
                sig = strchr(p, (int)',');
                if (sig)
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
@@ -691,12 +691,13 @@ exp_alias_ref(mvc *sql, sql_exp *e)
 }
 
 sql_exp *
-exp_set(sql_allocator *sa, const char *name, sql_exp *val, int level)
+exp_set(sql_allocator *sa, const char *sname, const char *name, sql_exp *val, 
int level)
 {
        sql_exp *e = exp_create(sa, e_psm);
 
        if (e == NULL)
                return NULL;
+       e->alias.rname = sname;
        e->alias.name = name;
        e->l = val;
        e->flag = PSM_SET + SET_PSM_LEVEL(level);
@@ -704,12 +705,13 @@ exp_set(sql_allocator *sa, const char *n
 }
 
 sql_exp * 
-exp_var(sql_allocator *sa, const char *name, sql_subtype *type, int level)
+exp_var(sql_allocator *sa, const char *sname, const char *name, sql_subtype 
*type, int level)
 {
        sql_exp *e = exp_create(sa, e_psm);
 
        if (e == NULL)
                return NULL;
+       e->alias.rname = sname;
        e->alias.name = name;
        e->tpe = *type;
        e->flag = PSM_VAR + SET_PSM_LEVEL(level);
@@ -717,12 +719,13 @@ exp_var(sql_allocator *sa, const char *n
 }
 
 sql_exp * 
-exp_table(sql_allocator *sa, const char *name, sql_table *t, int level)
+exp_table(sql_allocator *sa, const char *sname, const char *name, sql_table 
*t, int level)
 {
        sql_exp *e = exp_create(sa, e_psm);
 
        if (e == NULL)
                return NULL;
+       e->alias.rname = sname;
        e->alias.name = name;
        e->f = t;
        e->flag = PSM_VAR + SET_PSM_LEVEL(level);
@@ -2377,7 +2380,7 @@ exp_copy( mvc *sql, sql_exp * e)
                break;
        case e_psm:
                if (e->flag & PSM_SET) 
-                       ne = exp_set(sql->sa, e->alias.name, exp_copy(sql, 
e->l), GET_PSM_LEVEL(e->flag));
+                       ne = exp_set(sql->sa, e->alias.rname, e->alias.name, 
exp_copy(sql, e->l), GET_PSM_LEVEL(e->flag));
                if (e->flag & PSM_REL) {
                        if (!exp_name(e))
                                exp_label(sql->sa, e, ++sql->label);
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
@@ -87,9 +87,9 @@ extern sql_exp * exp_ref_save(mvc *sql, 
 extern sql_exp * exp_alias(sql_allocator *sa, const char *arname, const char 
*acname, const char *org_rname, const char *org_cname, sql_subtype *t, unsigned 
int card, int has_nils, int intern);
 extern sql_exp * exp_alias_or_copy( mvc *sql, const char *tname, const char 
*cname, sql_rel *orel, sql_exp *old);
 extern sql_exp * exp_alias_ref(mvc *sql, sql_exp *e);
-extern sql_exp * exp_set(sql_allocator *sa, const char *name, sql_exp *val, 
int level);
-extern sql_exp * exp_var(sql_allocator *sa, const char *name, sql_subtype 
*type, int level);
-extern sql_exp * exp_table(sql_allocator *sa, const char *name, sql_table *t, 
int level);
+extern sql_exp * exp_set(sql_allocator *sa, const char *sname, const char 
*name, sql_exp *val, int level);
+extern sql_exp * exp_var(sql_allocator *sa, const char *sname, const char 
*name, sql_subtype *type, int level);
+extern sql_exp * exp_table(sql_allocator *sa, const char *sname, const char 
*name, sql_table *t, int level);
 extern sql_exp * exp_return(sql_allocator *sa, sql_exp *val, int level);
 extern sql_exp * exp_while(sql_allocator *sa, sql_exp *cond, list *stmts);
 extern sql_exp * exp_exception(sql_allocator *sa, sql_exp *cond, const char 
*error_message);
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
@@ -87,43 +87,50 @@ static sql_exp *
 psm_set_exp(sql_query *query, dnode *n)
 {
        mvc *sql = query->sql;
+       dlist *qname = n->data.lval;
        symbol *val = n->next->data.sym;
-       sql_exp *e = NULL;
-       int level = 0;
+       sql_exp *res = NULL, *e = NULL;
+       int level = 0, single = (dlist_length(qname) == 1);
        sql_subtype *tpe = NULL;
        sql_rel *rel = NULL;
-       sql_exp *res = NULL;
-       int single = (dlist_length(n->data.lval) == 1);
 
        if (single) {
                exp_kind ek = {type_value, card_value, FALSE};
-               const char *name = n->data.sval;
-               /* name can be 
+               const char *sname = qname_schema(qname);
+               const char *vname = qname_schema_object(qname);
+               sql_schema *s = NULL;
+
+               if (sname && !(s = mvc_bind_schema(sql, sname)))
+                       return sql_error(sql, 02, SQLSTATE(3F000) "SET: No such 
schema '%s'", sname);
+               if (s == NULL)
+                       s = cur_schema(sql);
+
+               /* vname can be 
                        'parameter of the function' (ie in the param list)
                        or a local or global variable, declared earlier
                */
 
                /* check if variable is known from the stack */
-               if (!stack_find_var(sql, name)) {
-                       sql_arg *a = sql_bind_param(sql, name);
+               if (!stack_find_var(sql, vname)) {
+                       sql_arg *a = sql_bind_param(sql, vname);
 
                        if (!a) /* not parameter, ie local var ? */
-                               return sql_error(sql, 01, SQLSTATE(42000) 
"Variable %s unknown", name);
+                               return sql_error(sql, 01, SQLSTATE(42000) "SET: 
Variable '%s%s%s' unknown", sname ? sname : "", sname ? "." : "", vname);
                        tpe = &a->type;
                } else { 
-                       tpe = stack_find_type(sql, name);
+                       tpe = stack_find_type(sql, vname);
                }
 
                e = rel_value_exp2(query, &rel, val, sql_sel, ek);
                if (!e || (rel && e->card > CARD_AGGR))
                        return NULL;
 
-               level = stack_find_frame(sql, name);
+               level = stack_find_frame(sql, vname);
                e = rel_check_type(sql, tpe, rel, e, type_cast);
                if (!e)
                        return NULL;
 
-               res = exp_set(sql->sa, name, e, level);
+               res = exp_set(sql->sa, sname, vname, e, level);
        } else { /* multi assignment */
                exp_kind ek = {type_value, card_relation, FALSE};
                sql_rel *rel_val = rel_subquery(query, NULL, val, ek);
@@ -140,15 +147,23 @@ psm_set_exp(sql_query *query, dnode *n)
                b = sa_list(sql->sa);
                append(b, exp_rel(sql, rel_val));
 
-               for(m = vars->h, n = rel_val->exps->h; n && m; n = n->next, m = 
m->next) {
-                       char *vname = m->data.sval;
+               for (m = vars->h, n = rel_val->exps->h; n && m; n = n->next, m 
= m->next) {
+                       dlist *nqname = m->data.lval;
+                       const char *sname = qname_schema(nqname);
+                       const char *vname = qname_schema_object(nqname);
                        sql_exp *v = n->data;
+                       sql_schema *s = NULL;
+
+                       if (sname && !(s = mvc_bind_schema(sql, sname)))
+                               return sql_error(sql, 02, SQLSTATE(3F000) "SET: 
No such schema '%s'", sname);
+                       if (s == NULL)
+                               s = cur_schema(sql);
 
                        if (!stack_find_var(sql, vname)) {
                                sql_arg *a = sql_bind_param(sql, vname);
 
                                if (!a) /* not parameter, ie local var ? */
-                                       return sql_error(sql, 01, 
SQLSTATE(42000) "Variable %s unknown", vname);
+                                       return sql_error(sql, 01, 
SQLSTATE(42000) "SET: Variable '%s%s%s' unknown", sname ? sname : "", sname ? 
"." : "", vname);
                                tpe = &a->type;
                        } else { 
                                tpe = stack_find_type(sql, vname);
@@ -167,7 +182,7 @@ psm_set_exp(sql_query *query, dnode *n)
                                assert(zero_or_one);
                                v = exp_aggr1(sql->sa, v, zero_or_one, 0, 0, 
CARD_ATOM, has_nil(v));
                        }
-                       append(b, exp_set(sql->sa, vname, v, level));
+                       append(b, exp_set(sql->sa, sname, vname, v, level));
                }
                res = exp_rel(sql, rel_psm_block(sql->sa, b));
        }
@@ -194,20 +209,28 @@ rel_psm_declare(mvc *sql, dnode *n)
 {
        list *l = sa_list(sql->sa);
 
-       while(n) { /* list of 'identfiers with type' */
+       while (n) { /* list of 'identfiers with type' */
                dnode *ids = n->data.sym->data.lval->h->data.lval->h;
                sql_subtype *ctype = 
&n->data.sym->data.lval->h->next->data.typeval;
-               while(ids) {
-                       const char *name = ids->data.sval;
+               while (ids) {
+                       dlist *qname = ids->data.lval;
+                       const char *sname = qname_schema(qname);
+                       const char *tname = qname_schema_object(qname);
+                       sql_schema *s = NULL;
                        sql_exp *r = NULL;
 
+                       if (sname && !(s = mvc_bind_schema(sql, sname)))
+                               return sql_error(sql, 02, SQLSTATE(3F000) 
"DECLARE: No such schema '%s'", sname);
+                       if (s == NULL)
+                               s = cur_schema(sql);
+
                        /* check if we overwrite a scope local variable declare 
x; declare x; */
-                       if (frame_find_var(sql, name))
-                               return sql_error(sql, 01, SQLSTATE(42000) 
"Variable '%s' already declared", name);
+                       if (frame_find_var(sql, tname))
+                               return sql_error(sql, 01, SQLSTATE(42000) 
"DECLARE: Variable '%s%s%s' already declared", sname ? sname : "", sname ? "." 
: "", tname);
                        /* variables are put on stack */
-                       if (!stack_push_var(sql, name, ctype))
+                       if (!stack_push_var(sql, tname, ctype))
                                return sql_error(sql, 02, SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
-                       r = exp_var(sql->sa, sa_strdup(sql->sa, name), ctype, 
sql->frame);
+                       r = exp_var(sql->sa, sa_strdup(sql->sa, sname), 
sa_strdup(sql->sa, tname), ctype, sql->frame);
                        append(l, r);
                        ids = ids->next;
                }
@@ -226,30 +249,28 @@ rel_psm_declare_table(sql_query *query, 
        const char *sname = qname_schema(qname);
        sql_table *t;
 
-       if (sname)  /* not allowed here */
-               return sql_error(sql, 02, SQLSTATE(42000) "DECLARE TABLE: 
qualified name not allowed");
        if (frame_find_var(sql, name))
-               return sql_error(sql, 01, SQLSTATE(42000) "Variable '%s' 
already declared", name);
+               return sql_error(sql, 01, SQLSTATE(42000) "DECLARE: Variable 
'%s' already declared", name);
 
        assert(n->next->next->next->type == type_int);
-       rel = rel_create_table(query, cur_schema(sql), SQL_DECLARED_TABLE, 
NULL, name, n->next->next->data.sym,
-                       n->next->next->next->data.i_val, NULL, NULL, NULL, 
false, NULL, 0);
+       rel = rel_create_table(query, cur_schema(sql), SQL_DECLARED_TABLE, 
sname, name, n->next->next->data.sym,
+                                                  
n->next->next->next->data.i_val, NULL, NULL, NULL, false, NULL, 0);
 
        if (!rel)
                return NULL;
-       if(rel->op == op_ddl) {
+       if (rel->op == op_ddl) {
                baset = rel;
-       } else if(rel->op == op_insert) {
+       } else if (rel->op == op_insert) {
                baset = rel->l;
        } else {
                return NULL;
        }
-       if(baset->flag != ddl_create_table)
+       if (baset->flag != ddl_create_table)
                return NULL;
        t = 
(sql_table*)((atom*)((sql_exp*)baset->exps->t->data)->l)->data.val.pval;
-       if(!stack_push_table(sql, name, baset, t))
+       if (!stack_push_table(sql, name, baset, t))
                return sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
-       return exp_table(sql->sa, sa_strdup(sql->sa, name), t, sql->frame);
+       return exp_table(sql->sa, sa_strdup(sql->sa, sname), sa_strdup(sql->sa, 
name), t, sql->frame);
 }
 
 /* [ label: ]
@@ -571,24 +592,32 @@ rel_select_into( sql_query *query, symbo
        nl = sa_list(sql->sa);
        append(nl, exp_rel(sql, r));
        for (m = r->exps->h, n = into->h; m && n; m = m->next, n = n->next) {
+               dlist *qname = n->data.lval;
+               const char *sname = qname_schema(qname);
+               const char *name = qname_schema_object(qname);
                sql_subtype *tpe = NULL;
-               char *nme = n->data.sval;
+               sql_schema *s = NULL;
                sql_exp *v = m->data;
                int level;
 
-               if (!stack_find_var(sql, nme)) 
-                       return sql_error(sql, 02, SQLSTATE(42000) "SELECT INTO: 
variable '%s' unknown", nme);
+               if (sname && !(s = mvc_bind_schema(sql, sname)))
+                       return sql_error(sql, 02, SQLSTATE(3F000) "SELECT INTO: 
No such schema '%s'", sname);
+               if (s == NULL)
+                       s = cur_schema(sql);
+
+               if (!stack_find_var(sql, name)) 
+                       return sql_error(sql, 02, SQLSTATE(42000) "SELECT INTO: 
Variable '%s%s%s' unknown", sname ? sname : "", sname ? "." : "", name);
                /* dynamic check for single values */
                if (v->card > CARD_AGGR) {
                        sql_subfunc *zero_or_one = sql_bind_func(sql->sa, 
sql->session->schema, "zero_or_one", exp_subtype(v), NULL, F_AGGR);
                        assert(zero_or_one);
                        v = exp_aggr1(sql->sa, v, zero_or_one, 0, 0, CARD_ATOM, 
has_nil(v));
                }
-               tpe = stack_find_type(sql, nme);
-               level = stack_find_frame(sql, nme);
+               tpe = stack_find_type(sql, name);
+               level = stack_find_frame(sql, name);
                if (!v || !(v = rel_check_type(sql, tpe, r, v, type_equal)))
                        return NULL;
-               v = exp_set(sql->sa, nme, v, level);
+               v = exp_set(sql->sa, sname, name, v, level);
                list_append(nl, v);
        }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to