Changeset: 8226f44eec0c for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/8226f44eec0c Modified Files: sql/backends/monet5/rel_bin.c sql/server/rel_psm.c sql/server/rel_select.c sql/server/rel_semantic.c sql/server/sql_parser.y sql/server/sql_semantic.c sql/server/sql_semantic.h Branch: default Log Message:
read list of named parameters (and types) first. Make named = named possible. diffs (145 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 @@ -855,7 +855,6 @@ exp2bin_named_placeholders(backend *be, getDestVar(q) = varid; q = pushArgument(be->mb, q, s->nr); pushInstruction(be->mb, q); - //setVarType(be->mb, varid, type); } 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 @@ -653,6 +653,7 @@ sequential_block(sql_query *query, sql_s res = rel_psm_case(query, restype, restypelist, s->data.lval->h, is_func); break; case SQL_CALL: + assert(s->type == type_symbol); res = rel_psm_call(query, s->data.sym); break; case SQL_RETURN: @@ -1515,6 +1516,28 @@ create_table_from_loader(sql_query *quer return rel; } +static list * +rel_paramlist( sql_query *query, symbol *nop) +{ + dnode *ops = nop->data.lval->h->next->next->data.lval->h; + list *exps = sa_list(query->sql->sa); + exp_kind iek = {type_value, card_column, FALSE}; + + for (; ops; ops = ops->next) { + sql_exp *e = rel_value_exp(query, NULL, ops->data.sym, sql_farg, iek); + if (!e) + return NULL; + ops = ops->next; + sql_arg *a = sql_find_param(query->sql, ops->data.sval); + if (!a) + return NULL; + a->type = *exp_subtype(e); + append(exps, e); + } + return exps; +} + + sql_rel * rel_psm(sql_query *query, symbol *s) { @@ -1560,7 +1583,17 @@ rel_psm(sql_query *query, symbol *s) return sql_error(sql, 02, SQLSTATE(42000) "Variables cannot be declared on the global scope"); case SQL_CALL: sql->type = Q_UPDATE; - ret = rel_psm_stmt(sql->sa, rel_psm_call(query, s->data.sym)); + if (s->type == type_list) { + list *params = rel_paramlist( query, s->data.lval->h->next->data.sym); + if (!params) + return NULL; + ret = rel_semantic(query, s->data.lval->h->data.sym); + query->last_rel = ret; + if (ret) + ret = rel_psm_stmt(sql->sa, rel_psm_call(query, s->data.lval->h->next->data.sym)); + ret = rel_list(sql->sa, query->last_rel, ret); + } else + ret = rel_psm_stmt(sql->sa, rel_psm_call(query, s->data.sym)); break; case SQL_CREATE_TABLE_LOADER: { 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 @@ -5418,7 +5418,8 @@ rel_value_exp2(sql_query *query, sql_rel if (sql->emode != m_prepare) return sql_error(sql, 02, SQLSTATE(42000) "SELECT: parameters ('?') not allowed in normal queries, use PREPARE"); assert(se->type == type_int); - return exp_atom_ref(sql->sa, se->data.i_val, NULL); + sql_arg *a = sql_bind_paramnr(sql, se->data.i_val); + return exp_atom_ref(sql->sa, se->data.i_val, a?&a->type:NULL); } case SQL_NULL: return exp_null(sql->sa, sql_bind_localtype("void")); diff --git a/sql/server/rel_semantic.c b/sql/server/rel_semantic.c --- a/sql/server/rel_semantic.c +++ b/sql/server/rel_semantic.c @@ -207,8 +207,6 @@ rel_semantic(sql_query *query, symbol *s r = rel_list(sql->sa, r, nr); else r = nr; - if (sql->emode == m_prepare) - query->last_rel = r; } stack_pop_frame(sql); return r; 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 @@ -840,9 +840,13 @@ sqlstmt: append_symbol(stmts, $$ = $1); m->sym = _symbol_create_list(SQL_MULSTMT, stmts); } + /* call( query, nop(-1, false, parameters) ) */ if (m->sym->data.lval) { m->emod |= mod_exec; - append_symbol(m->sym->data.lval, _symbol_create_symbol(SQL_CALL, $3)); + dlist* l = L(); + append_symbol(l, m->sym); + append_symbol(l, $3); + m->sym = _symbol_create_list(SQL_CALL, l); } YYACCEPT; } diff --git a/sql/server/sql_semantic.c b/sql/server/sql_semantic.c --- a/sql/server/sql_semantic.c +++ b/sql/server/sql_semantic.c @@ -83,6 +83,17 @@ sql_bind_paramnr(mvc *sql, int nr) return NULL; } +sql_arg * +sql_find_param(mvc *sql, char *name) +{ + for (node *n = sql->params->h; n; n = n->next) { + sql_arg *a = n->data; + if (strcmp(a->name, name) == 0) + return a; + } + return NULL; +} + void sql_destroy_params(mvc *sql) { diff --git a/sql/server/sql_semantic.h b/sql/server/sql_semantic.h --- a/sql/server/sql_semantic.h +++ b/sql/server/sql_semantic.h @@ -70,6 +70,7 @@ extern sql_arg *sql_bind_paramnr(mvc *sq * function */ extern int set_type_param(mvc *sql, sql_subtype *type, int nr); extern void sql_destroy_params(mvc *sql); /* used in backend */ +extern sql_arg *sql_find_param(mvc *sql, char *name); extern char *symbol2string(mvc *sql, symbol *s, int expression, char **err); //extern char *dlist2string(mvc *sql, dlist *s, int expression, char **err); _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org