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 -- [email protected]
To unsubscribe send an email to [email protected]