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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list