Changeset: cb3f87ec2e45 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/cb3f87ec2e45
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/server/rel_psm.c
        sql/server/rel_unnest.c
        sql/server/sql_parser.y
        sql/server/sql_scan.c
        sql/server/sql_semantic.c
        sql/server/sql_semantic.h
Branch: default
Log Message:

add v1 of named placeholders, ie :name can now be handled by the sql server. 
TODO adapt clients to use this native version.


diffs (155 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
@@ -1420,7 +1420,12 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                } else if (e->f) {              /* values */
                        s = value_list(be, e->f, left, sel);
                } else {                        /* arguments */
-                       s = stmt_varnr(be, e->flag, e->tpe.type?&e->tpe:NULL);
+                       sql_subtype *t = e->tpe.type?&e->tpe:NULL;
+                       if (!t && 0) {
+                               sql_arg *a = sql_bind_paramnr(be->mvc, e->flag);
+                               t = a->type.type?&a->type:NULL;
+                       }
+                       s = stmt_varnr(be, e->flag, t);
                }
        }       break;
        case e_convert: {
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
@@ -156,12 +156,11 @@ rel_psm_declare(mvc *sql, dnode *n)
                        const char *sname = qname_schema(qname);
                        const char *tname = qname_schema_object(qname);
                        sql_exp *r = NULL;
-                       sql_arg *a;
 
                        if (sname)
                                return sql_error(sql, 01, SQLSTATE(42000) 
"DECLARE: Declared variables don't have a schema");
                        /* find if there's a parameter with the same name */
-                       if (sql->frame == 1 && (a = sql_bind_param(sql, tname)))
+                       if (sql->frame == 1 && sql_bind_param(sql, tname) >= 0)
                                return sql_error(sql, 01, SQLSTATE(42000) 
"DECLARE: Variable '%s' declared as a parameter", tname);
                        /* check if we overwrite a scope local variable declare 
x; declare x; */
                        if (frame_find_var(sql, tname))
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -2376,6 +2376,11 @@ rel_set_type(visitor *v, sql_rel *rel)
                                                        te->tpe = 
*sql_bind_localtype("bte");
                                                        if (te->l)
                                                                te->l = 
atom_set_type(v->sql->sa, te->l, &te->tpe);
+                                               } else if (!t && !te->l && 
!te->r) { /* parameter, set type, or return ERR?? */
+                                                       sql_arg *a = 
sql_bind_paramnr(v->sql, te->flag);
+                                                       if (!a->type.type)
+                                                               return 
sql_error(v->sql, 10, SQLSTATE(42000) "Parameter has no type");
+                                                       te->tpe = a->type;
                                                }
                                        }
                                }
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
@@ -4272,6 +4272,16 @@ param:
          sql_add_param(m, NULL, NULL);
          $$ = _symbol_create_int( SQL_PARAMETER, nr );
        }
+  | ':' ident
+       {
+         int nr = sql_bind_param( m, $2);
+
+         if (nr < 0) {
+               nr = (m->params)?list_length(m->params):0;
+               sql_add_param(m, $2, NULL);
+         }
+         $$ = _symbol_create_int( SQL_PARAMETER, nr );
+       }
   ;
 
 window_specification:
@@ -5614,6 +5624,8 @@ ident:
 
 non_reserved_word:
   AS           { $$ = sa_strdup(SA, "as"); }           /* sloppy: officially 
reserved */
+| ASC          { $$ = sa_strdup(SA, "asc"); }          /* sloppy: officially 
reserved */
+| DESC         { $$ = sa_strdup(SA, "desc"); }         /* sloppy: officially 
reserved */
 | AUTHORIZATION        { $$ = sa_strdup(SA, "authorization"); }/* sloppy: 
officially reserved */
 | COLUMN       { $$ = sa_strdup(SA, "column"); }       /* sloppy: officially 
reserved */
 | CYCLE                { $$ = sa_strdup(SA, "cycle"); }        /* sloppy: 
officially reserved */
diff --git a/sql/server/sql_scan.c b/sql/server/sql_scan.c
--- a/sql/server/sql_scan.c
+++ b/sql/server/sql_scan.c
@@ -1149,6 +1149,7 @@ int scanner_symbol(mvc * c, int cur)
        case '^': /* binary xor */
        case '*':
        case '?':
+       case ':':
        case '%':
        case '+':
        case '(':
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
@@ -50,23 +50,24 @@ sql_add_param(mvc *sql, const char *name
        list_append(sql->params, a);
 }
 
-sql_arg *
+int
 sql_bind_param(mvc *sql, const char *name)
 {
        node *n;
+       int nr = 0;
 
        if (sql->params) {
-               for (n = sql->params->h; n; n = n->next) {
+               for (n = sql->params->h; n; n = n->next, nr++) {
                        sql_arg *a = n->data;
 
                        if (a->name && strcmp(a->name, name) == 0)
-                               return a;
+                               return nr;
                }
        }
-       return NULL;
+       return -1;
 }
 
-static sql_arg *
+sql_arg *
 sql_bind_paramnr(mvc *sql, int nr)
 {
        int i=0;
@@ -214,7 +215,8 @@ find_trigger_on_scope(mvc *sql, const ch
                        if ((*var = stack_find_var_frame(sql, name, level))) { 
/* check if variable is known from the stack */ \
                                *tpe = &((*var)->var.tpe); \
                                res = true; \
-                       } else if ((*a = sql_bind_param(sql, name))) { /* then 
if it is a parameter */ \
+                       } else if ((nr = sql_bind_param(sql, name)) >= 0) { /* 
then if it is a parameter */ \
+                               *a = sql_bind_paramnr(sql, nr); \
                                *tpe = &((*a)->type); \
                                *level = 1; \
                                res = true; \
@@ -236,7 +238,9 @@ find_variable_on_scope(mvc *sql, const c
 {
        const char *objstr = "variable";
        bool res = false;
+       int nr = 0;
 
+       (void)nr;
        search_object_on_path(var_find_on_global, DO_NOTHING, variable_extra, 
SQLSTATE(42000));
        return res;
 }
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
@@ -64,7 +64,8 @@ typedef enum {
  * functions and procedures are kept in the param list.  */
 
 extern void sql_add_param(mvc *sql, const char *name, sql_subtype *st);
-extern sql_arg *sql_bind_param(mvc *sql, const char *name);
+extern int sql_bind_param(mvc *sql, const char *name); /* -1 error, 0 nr-1, 
param */
+extern sql_arg *sql_bind_paramnr(mvc *sql, int nr);
 /* once the type of the '?' parameters is known it's set using the set_type
  * function */
 extern int set_type_param(mvc *sql, sql_subtype *type, int nr);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to