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]