Changeset: 6d7c10efd0e7 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/6d7c10efd0e7
Modified Files:
sql/backends/monet5/sql_execute.c
sql/server/rel_optimizer.c
Branch: default
Log Message:
Merged with Jul2021
diffs (truncated from 316 to 300 lines):
diff --git a/gdk/gdk_value.c b/gdk/gdk_value.c
--- a/gdk/gdk_value.c
+++ b/gdk/gdk_value.c
@@ -156,10 +156,11 @@ VALcopy(ValPtr d, const ValRecord *s)
d->vtype = s->vtype;
} else if (s->vtype == TYPE_str) {
d->vtype = TYPE_str;
- d->val.sval = GDKstrdup(s->val.sval);
+ d->len = strLen(s->val.sval);
+ d->val.sval = GDKmalloc(d->len);
if (d->val.sval == NULL)
return NULL;
- d->len = strLen(d->val.sval);
+ memcpy(d->val.sval, s->val.sval, d->len);
} else {
ptr p = s->val.pval;
@@ -217,15 +218,16 @@ VALinit(ValPtr d, int tpe, const void *s
d->val.uval = *(const uuid *) s;
break;
case TYPE_str:
- d->val.sval = GDKstrdup(s);
+ d->len = strLen(s);
+ d->val.sval = GDKmalloc(d->len);
if (d->val.sval == NULL)
return NULL;
- d->len = strLen(s);
- break;
+ memcpy(d->val.sval, s, d->len);
+ return d;
case TYPE_ptr:
d->val.pval = *(const ptr *) s;
d->len = ATOMlen(tpe, *(const ptr *) s);
- break;
+ return d;
default:
assert(ATOMextern(ATOMstorage(tpe)));
d->len = ATOMlen(tpe, s);
@@ -235,7 +237,7 @@ VALinit(ValPtr d, int tpe, const void *s
memcpy(d->val.pval, s, d->len);
return d;
}
- d->len = ATOMlen(d->vtype, VALptr(d));
+ d->len = ATOMsize(d->vtype);
return d;
}
diff --git a/sql/backends/monet5/sql_execute.c
b/sql/backends/monet5/sql_execute.c
--- a/sql/backends/monet5/sql_execute.c
+++ b/sql/backends/monet5/sql_execute.c
@@ -816,6 +816,21 @@ is_a_number(char *v)
return 1;
}
+static char *
+parseIdent(char *in, char *out)
+{
+ while (*in && *in != '"') {
+ if (*in == '\\' && (*(in + 1) == '\\' || *(in + 1) == '"')) {
+ *out++ = *(in + 1);
+ in+=2;
+ } else {
+ *out++ = *in++;
+ }
+ }
+ *out++ = '\0';
+ return in;
+}
+
str
RAstatement2(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
@@ -830,7 +845,6 @@ RAstatement2(Client cntxt, MalBlkPtr mb,
str msg = MAL_SUCCEED;
sql_rel *rel;
list *refs, *ops;
- char buf[BUFSIZ];
if ((msg = getSQLContext(cntxt, mb, &m, &be)) != NULL)
return msg;
@@ -843,20 +857,15 @@ RAstatement2(Client cntxt, MalBlkPtr mb,
if (!m->sa)
return RAcommit_statement(be,
createException(SQL,"RAstatement2",SQLSTATE(HY013) MAL_MALLOC_FAIL));
- /* keep copy of signature and relational expression */
- snprintf(buf, BUFSIZ, "%s %s", sig, expr);
-
if (!stack_push_frame(m, NULL))
return RAcommit_statement(be,
createException(SQL,"RAstatement2",SQLSTATE(HY013) MAL_MALLOC_FAIL));
ops = sa_list(m->sa);
while (sig && *sig && !isspace((unsigned char) *sig)) {
- char *vnme = sig, *tnme;
+ char *vnme = sig, *tnme, *nbuf, *sch, *var;
char *p = strchr(++sig, (int)' ');
int d,s,nr = -1;
- sql_subtype t;
- //atom *a;
-
- assert(0);
+ sql_type *t = NULL;
+ sql_subtype tpe;
*p++ = 0;
/* vnme can be name or number */
@@ -866,29 +875,43 @@ RAstatement2(Client cntxt, MalBlkPtr mb,
p = strchr(p, (int)'(');
*p++ = 0;
tnme = sa_strdup(m->sa, tnme);
- if (!tnme)
- return RAcommit_statement(be,
createException(SQL,"RAstatement2",SQLSTATE(HY013) MAL_MALLOC_FAIL));
d = strtol(p, &p, 10);
p++; /* skip , */
s = strtol(p, &p, 10);
- sql_find_subtype(&t, tnme, d, s);
- //a = atom_general(m->sa, &t, NULL);
- //a->isnull = 0; // disable NULL value optimizations ugh
- /* the argument list may have holes and maybe out of order, ie
- * don't use sql_add_arg, but special numbered version
- * sql_set_arg(m, a, nr);
- * */
+ if (!sql_find_subtype(&tpe, tnme, d, s)) {
+ if (!(t = mvc_bind_type(m, tnme))) { /* try an external
type */
+ stack_pop_frame(m);
+ return RAcommit_statement(be,
createException(SQL,"RAstatement2",SQLSTATE(42000) "SQL type %s(%d, %d) not
found\n", tnme, d, s));
+ }
+ sql_init_subtype(&tpe, t, d, s);
+ }
+
if (nr >= 0) {
- append(ops, exp_atom_ref(m->sa, nr, &t));
- //if (!sql_set_arg(m, nr, a)) {
- // sqlcleanup(be, 0);
- // return
createException(SQL,"RAstatement2",SQLSTATE(HY013) MAL_MALLOC_FAIL);
- //}
+ list_append(ops, exp_atom_ref(m->sa, nr, &tpe));
} else {
- if (!push_global_var(m, "sys", vnme+1, &t))
+ sql_schema *s;
+
+ while (*vnme && isdigit(*vnme)) /* skip digit
characters */
+ vnme++;
+
+ nbuf = vnme;
+ sch = nbuf+1;
+ assert(*nbuf == '"');
+ nbuf = parseIdent(nbuf+1, sch);
+ assert(*nbuf == '\0');
+ var = nbuf+2;
+ nbuf = parseIdent(nbuf+2, var);
+
+ if (!(s = mvc_bind_schema(m, sch))) {
+ stack_pop_frame(m);
+ return RAcommit_statement(be,
createException(SQL,"RAstatement2",SQLSTATE(3F000) "No such schema '%s'", sch));
+ }
+ if (!find_global_var(m, s, var) && !push_global_var(m,
sch, var, &tpe)) {
+ stack_pop_frame(m);
return RAcommit_statement(be,
createException(SQL,"RAstatement2",SQLSTATE(HY013) MAL_MALLOC_FAIL));
- append(ops, exp_var(m->sa, NULL, sa_strdup(m->sa,
vnme+1), &t, 0));
+ }
+ list_append(ops, exp_var(m->sa, sa_strdup(m->sa, sch),
sa_strdup(m->sa, var), &tpe, 0));
}
sig = strchr(p, (int)',');
if (sig)
@@ -896,7 +919,6 @@ RAstatement2(Client cntxt, MalBlkPtr mb,
}
refs = sa_list(m->sa);
rel = rel_read(m, expr, &pos, refs);
- stack_pop_frame(m);
if (rel)
rel = sql_processrelation(m, rel, 1, 1);
if (!rel) {
@@ -932,6 +954,7 @@ RAstatement2(Client cntxt, MalBlkPtr mb,
if (!msg && monet5_create_relational_function(m, mod, nme, rel, NULL,
ops, 0) < 0)
msg = createException(SQL, "RAstatement2", "%s", m->errstr);
rel_destroy(rel);
+ stack_pop_frame(m);
return RAcommit_statement(be, msg);
}
diff --git a/sql/backends/monet5/sql_gencode.c
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -387,21 +387,16 @@ static int
/* ops */
if (call && call->type == st_list) {
+ char nbuf[IDLENGTH];
+ int i = 0;
+
for (node *n = call->op4.lval->h; n; n = n->next) {
stmt *op = n->data;
sql_subtype *t = tail_type(op);
- int type = t->type->localtype;
- int varid = 0;
- const char *nme =
(op->op3)?op->op3->op4.aval->data.val.sval:op->cname;
- char *buf = SA_NEW_ARRAY(m->sa, char, strlen(nme) + 2);
+ int type = t->type->localtype, varid = 0;
- if (!buf) {
- GDKfree(lname);
- sql_error(m, 001, SQLSTATE(HY013)
MAL_MALLOC_FAIL);
- return -1;
- }
- stpcpy(stpcpy(buf, "A"), nme);
- if ((varid = newVariable(curBlk, buf,strlen(buf),
type)) < 0) {
+ sprintf(nbuf, "A%d", i++);
+ if ((varid = newVariable(curBlk, nbuf, strlen(nbuf),
type)) < 0) {
GDKfree(lname);
sql_error(m, 003, SQLSTATE(42000) "Internal
error while compiling statement: variable id too long");
return -1;
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -1309,40 +1309,41 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
}
}
- if (!exp && b != e) { /* simple ident */
- /*
- if (!exp) {
- old = *e;
- *e = 0;
- if (stack_find_var(sql, b)) {
- sql_subtype *tpe = stack_find_type(sql, b);
- int frame = stack_find_frame(sql, b);
- exp = exp_param(sql->sa, sa_strdup(sql->sa, b),
tpe, frame);
- }
- *e = old;
- }
- */
- if (!exp && lrel) {
- int amb = 0, mul = 0;
+ if (!exp && lrel && b != e) { /* simple ident */
+ int amb = 0, mul = 0;
- old = *e;
- *e = 0;
- convertIdent(b);
- var_cname = sa_strdup(sql->sa, b);
- if (top_exps) {
- exp = exps_bind_column(top_exps, var_cname,
&amb, &mul, 1);
- if (exp)
- exp = exp_alias_or_copy(sql,
exp_relname(exp), var_cname, lrel, exp);
- }
- (void)amb;
- (void)mul;
- assert(amb == 0 && mul == 0);
- if (!exp && lrel)
- exp = rel_bind_column(sql, lrel, var_cname, 0,
1);
- if (!exp && rrel)
- exp = rel_bind_column(sql, rrel, var_cname, 0,
1);
- *e = old;
- skipWS(r,pos);
+ old = *e;
+ *e = 0;
+ convertIdent(b);
+ var_cname = sa_strdup(sql->sa, b);
+ if (top_exps) {
+ exp = exps_bind_column(top_exps, var_cname, &amb, &mul,
1);
+ if (exp)
+ exp = exp_alias_or_copy(sql, exp_relname(exp),
var_cname, lrel, exp);
+ }
+ (void)amb;
+ (void)mul;
+ assert(amb == 0 && mul == 0);
+ if (!exp && lrel)
+ exp = rel_bind_column(sql, lrel, var_cname, 0, 1);
+ if (!exp && rrel)
+ exp = rel_bind_column(sql, rrel, var_cname, 0, 1);
+ *e = old;
+ skipWS(r,pos);
+ }
+
+ if (!exp && (cname || var_cname)) { /* Try a variable */
+ sql_var *var = NULL;
+ sql_subtype *tpe = NULL;
+ int level = 0;
+ sql_arg *a = NULL;
+ bool has_tname = cname && tname && strcmp(tname, cname) != 0;
+
+ if (find_variable_on_scope(sql, has_tname ? tname : NULL, cname
? cname : var_cname, &var, &a, &tpe, &level, "SELECT")) {
+ if (var) /* if variable is known from the stack or a
global var */
+ exp = exp_param_or_declared(sql->sa, var->sname
? sa_strdup(sql->sa, var->sname) : NULL, sa_strdup(sql->sa, var->name),
&(var->var.tpe), level);
+ if (a) /* if variable is a parameter */
+ exp = exp_param_or_declared(sql->sa, NULL,
sa_strdup(sql->sa, cname), &(a->type), level);
}
}
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -8254,7 +8254,8 @@ reduce_scale(atom *a)
}
a->data.val.shval = v;
}
- a->tpe.scale -= i;
+ if (a->tpe.scale)
+ a->tpe.scale -= i;
return i;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list