Changeset: 047ebbcf8f36 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/047ebbcf8f36
Modified Files:
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_statement.c
        sql/server/rel_exp.c
        sql/server/rel_select.c
Branch: nested
Log Message:

fix property of next_value_ms


diffs (161 lines):

diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -1164,7 +1164,7 @@ mvc_next_value_ms(Client cntxt, MalBlkPt
        if (seqbulk_claim_next_values(be->mvc->session->tr->store, seq, card, 
&rb)) {
                int *ip = Tloc(b,0);
                int *op = Tloc(r, 0);
-               int sn = (int)rb;
+               int sn = (int)rb, osn = sn;
                bool nil_val = false;
                for (BUN i = 0; i < card; i++) {
                        if (ip[i] < 0) {
@@ -1181,7 +1181,7 @@ mvc_next_value_ms(Client cntxt, MalBlkPt
                r->tnonil = !nil_val;
                r->tnil = nil_val;
                r->trevsorted = false;
-               if ((sn - rb) == 0)
+               if (((sn-osn) - rb) == 0)
                        r->tsorted = r->tkey = true;
                else
                        r->tsorted = r->tkey = false;
@@ -6172,7 +6172,7 @@ static mel_func sql_init_funcs[] = {
  pattern("sql", "next_value_ms", mvc_next_value_ms, false, "return the next 
value of the sequence", args(1,4, arg("",int),argany("card",1), 
arg("sname",str),arg("sequence",str))),
  pattern("batsql", "next_value", mvc_next_value_bulk, true, "return the next 
value of the sequence", args(1,4, batarg("",lng),arg("card",lng), 
arg("sname",str),arg("sequence",str))),
  pattern("batsql", "next_value_ms", mvc_next_value_ms, false, "return the next 
value of the sequence", args(1,4, batarg("",int),batargany("card",1), 
arg("sname",str),arg("sequence",str))),
- //pattern("batsql", "next_value_ms", mvc_next_value_bulk, false, "return the 
next value of the sequence", args(1,5, batarg("",lng),batargany("card",1), 
arg("sname",str),arg("sequence",str), batarg("cand",oid))),
+ //pattern("batsql", "next_value_ms", mvc_next_value_ms, false, "return the 
next value of the sequence", args(1,5, batarg("",lng),batargany("card",1), 
arg("sname",str),arg("sequence",str), batarg("cand",oid))),
  pattern("sql", "get_value", mvc_get_value, false, "return the current value 
of the sequence (ie the next to be used value)", args(1,3, 
arg("",lng),arg("sname",str),arg("sequence",str))),
  pattern("batsql", "get_value", mvc_get_value_bulk, false, "return the current 
value of the sequence (ie the next to be used value)", args(1,3, 
batarg("",lng),batarg("sname",str),batarg("sequence",str))),
  pattern("batsql", "get_value", mvc_get_value_bulk, false, "return the current 
value of the sequence (ie the next to be used value)", args(1,5, 
batarg("",lng),batarg("sname",str),batarg("sequence",str),batarg("s1",oid),batarg("s2",oid))),
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -3663,19 +3663,21 @@ stmt_append_bulk(backend *be, stmt *c, l
        return NULL;
 }
 
-stmt *
-stmt_pack(backend *be, stmt *c, int n)
+static stmt *
+stmt_packn(backend *be, stmt *c, stmt *n)
 {
        MalBlkPtr mb = be->mb;
        InstrPtr q = NULL;
 
+       if (c->nested)
+               return stmt_nest(be, c, n, &stmt_packn);
        if (c == NULL || c->nr < 0)
                goto bailout;
        q = newStmtArgs(mb, matRef, packIncrementRef, 3);
        if (q == NULL)
                goto bailout;
        q = pushArgument(mb, q, c->nr);
-       q = pushInt(mb, q, n);
+       q = pushArgument(mb, q, n->nr);
        bool enabled = be->mvc->sa->eb.enabled;
        be->mvc->sa->eb.enabled = false;
        stmt *s = stmt_create(be->mvc->sa, st_append);
@@ -3685,6 +3687,7 @@ stmt_pack(backend *be, stmt *c, int n)
                goto bailout;
        }
        s->op1 = c;
+       s->op2 = n;
        s->nrcols = c->nrcols;
        s->key = c->key;
        s->nr = getDestVar(q);
@@ -3696,7 +3699,14 @@ stmt_pack(backend *be, stmt *c, int n)
        if (be->mvc->sa->eb.enabled)
                eb_error(&be->mvc->sa->eb, be->mvc->errstr[0] ? be->mvc->errstr 
: mb->errors ? mb->errors : *GDKerrbuf ? GDKerrbuf : "out of memory", 1000);
        return NULL;
-
+}
+
+stmt *
+stmt_pack(backend *be, stmt *c, int n)
+{
+       if (c->nested)
+               return stmt_nest(be, c, stmt_atom_int(be, n), &stmt_packn);
+       return stmt_packn(be, c, stmt_atom_int(be, n));
 }
 
 stmt *
@@ -3705,6 +3715,9 @@ stmt_pack_add(backend *be, stmt *c, stmt
        MalBlkPtr mb = be->mb;
        InstrPtr q = NULL;
 
+       if (c->nested)
+               return stmt_nest(be, c, a, &stmt_pack_add);
+
        if (c == NULL || a == NULL || c->nr < 0 || a->nr < 0)
                goto bailout;
        q = newStmtArgs(mb, matRef, packIncrementRef, 3);
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -3835,7 +3835,6 @@ exp_check_multiset_type(mvc *sql, sql_su
 
        list *msvals = NULL;
        if (exp_is_rel(exp)) {
-               assert(0);
                sql_rel *valr = exp_rel_get_rel(sql->sa, exp);
                if (!valr || !is_project(valr->op) || !valr->exps)
                        return sql_error( sql, 03, SQLSTATE(42000) "cannot 
convert value into composite type '%s'", t->type->base.name);
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -1419,6 +1419,13 @@ rel_values(sql_query *query, symbol *tab
        list *exps = values_list(query, tableref);
        if (!exps)
                return NULL;
+       if (tableref->token == SQL_SET) {
+               list *nexps = sa_list(query->sql->sa);
+               sql_exp *e = exp_values(query->sql->sa, exps);
+               if ((e = exp_check_multiset(query->sql, e)) == NULL)
+                       return NULL;
+               exps = append(nexps, e);
+       }
        sql_rel *r = rel_project(query->sql->sa, NULL, exps);
        r->nrcols = list_length(exps);
        r->card = exps_card(exps);
@@ -1430,7 +1437,7 @@ rel_values(sql_query *query, symbol *tab
 }
 
 static int
-check_is_lateral(symbol *tableref)
+check_is_lateral(symbol *tableref, bool *unnest)
 {
        if (tableref->token == SQL_NAME || tableref->token == SQL_TABLE ||
                tableref->token == SQL_VALUES) {
@@ -1442,8 +1449,10 @@ check_is_lateral(symbol *tableref)
                        symbol *sym = tableref->data.lval->h->data.sym;
                        dlist *qname = sym->data.lval->h->data.lval;
                        /* first is the qname */
-                       if (dlist_length(qname) == 1 && 
strcmp(qname->h->data.sval, "unnest")==0)
+                       if (dlist_length(qname) == 1 && 
strcmp(qname->h->data.sval, "unnest")==0) {
+                               *unnest = true;
                                return 1;
+                       }
                }
                return 0;
        } else if (tableref->token == SQL_WITH) {
@@ -6148,7 +6157,8 @@ rel_query(sql_query *query, symbol *sq, 
                list *refs = new_exp_list(sql->sa); /* Keep list of relation 
names in order to test for duplicates */
 
                for (dnode *n = fl->h; n ; n = n->next) {
-                       int lateral = check_is_lateral(n->data.sym);
+                       bool unnest = false;
+                       int lateral = check_is_lateral(n->data.sym, &unnest);
 
                        /* just used current expression */
                        if (lateral && res)
@@ -6402,7 +6412,8 @@ rel_joinquery_(sql_query *query, symbol 
        }
 
        /* a dependent join cannot depend on the right side, so disable lateral 
check for right and full joins */
-       lateral = (op == op_join || op == op_left) && check_is_lateral(tab2);
+       bool unnest = false;
+       lateral = (op == op_join || op == op_left) && check_is_lateral(tab2, 
&unnest);
        t1 = table_ref(query, tab1, 0, refs);
        if (t1) {
                if (!lateral) {
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to