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

Reply via email to