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