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

Reply via email to