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]