Changeset: 66e9dba893f5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=66e9dba893f5
Added Files:
sql/include/sql_querytype.h
sql/server/rel_unnest.c
sql/server/rel_unnest.h
Removed Files:
sql/include/sql_query.h
Modified Files:
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql.c
sql/backends/monet5/sql.h
sql/backends/monet5/sql.mal
sql/backends/monet5/sql_bat2time.c
sql/backends/monet5/sql_cat.c
sql/backends/monet5/sql_execute.c
sql/backends/monet5/sql_gencode.c
sql/backends/monet5/sql_rank.mal
sql/backends/monet5/sql_statement.c
sql/common/sql_types.c
sql/include/Makefile.ag
sql/include/sql_relation.h
sql/server/Makefile.ag
sql/server/rel_dump.c
sql/server/rel_exp.c
sql/server/rel_exp.h
sql/server/rel_optimizer.c
sql/server/rel_partition.c
sql/server/rel_propagate.c
sql/server/rel_propagate.h
sql/server/rel_psm.c
sql/server/rel_psm.h
sql/server/rel_rel.c
sql/server/rel_rel.h
sql/server/rel_schema.c
sql/server/rel_schema.h
sql/server/rel_select.c
sql/server/rel_select.h
sql/server/rel_semantic.c
sql/server/rel_semantic.h
sql/server/rel_sequence.c
sql/server/rel_sequence.h
sql/server/rel_trans.c
sql/server/rel_trans.h
sql/server/rel_updates.c
sql/server/rel_updates.h
sql/server/rel_xml.c
sql/server/rel_xml.h
sql/server/sql_mvc.c
sql/server/sql_mvc.h
sql/server/sql_partition.c
sql/server/sql_semantic.c
sql/test/Tests/marcin1.stable.out
sql/test/Tests/outerref_in_selection.stable.out
sql/test/Tests/outerref_in_selection.stable.out.int128
sql/test/Tests/systemfunctions.stable.out
sql/test/Tests/systemfunctions.stable.out.int128
Branch: subquery
Log Message:
implemented part of the unnest operation (more code needs cleaning up and
changes)
diffs (truncated from 7300 to 300 lines):
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -15,6 +15,7 @@
#include "rel_prop.h"
#include "rel_select.h"
#include "rel_updates.h"
+#include "rel_unnest.h"
#include "rel_optimizer.h"
#include "sql_env.h"
#include "sql_optimizer.h"
@@ -1266,7 +1267,8 @@ rel_parse_value(backend *be, char *query
if (sn->selection->h->data.sym->token == SQL_COLUMN ||
sn->selection->h->data.sym->token == SQL_IDENT) {
int is_last = 0;
sql_rel *rel = NULL;
- sql_exp *e = rel_value_exp2(m, &rel,
sn->selection->h->data.sym->data.lval->h->data.sym, sql_sel, ek, &is_last);
+ sql_query *query = query_create(m);
+ sql_exp *e = rel_value_exp2(query, &rel,
sn->selection->h->data.sym->data.lval->h->data.sym, sql_sel, ek, &is_last);
if (!rel)
s = exp_bin(be, e, NULL, NULL, NULL, NULL,
NULL, NULL);
@@ -3193,9 +3195,10 @@ sql_parse(backend *be, sql_allocator *sa
snprintf(m->errstr, ERRSIZE, "An error occurred when executing "
"internal query: %s", nquery);
} else {
- sql_rel *r = rel_semantic(m, m->sym);
-
- if (r && (r = rel_optimizer(m, r, 1)) != NULL)
+ sql_query *query = query_create(m);
+ sql_rel *r = rel_semantic(query, m->sym);
+
+ if (r && (r = rel_unnest(m,r)) != NULL && (r = rel_optimizer(m,
r, 1)) != NULL)
sq = rel_bin(be, r);
}
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
@@ -24,6 +24,7 @@
#include "sql_optimizer.h"
#include "sql_datetime.h"
#include "sql_partition.h"
+#include "rel_unnest.h"
#include "rel_optimizer.h"
#include "rel_partition.h"
#include "rel_distribute.h"
@@ -115,8 +116,11 @@ sql_rel *
sql_symbol2relation(mvc *c, symbol *sym)
{
sql_rel *r;
-
- r = rel_semantic(c, sym);
+ sql_query *query = query_create(c);
+
+ r = rel_semantic(query, sym);
+ if (r)
+ r = rel_unnest(c, r);
if (r)
r = rel_optimizer(c, r, 1);
if (r)
@@ -430,6 +434,8 @@ create_table_or_view(mvc *sql, char* sna
}
r = rel_parse(sql, s, nt->query, m_deps);
if (r)
+ r = rel_unnest(sql, r);
+ if (r)
r = rel_optimizer(sql, r, 0);
if (r) {
list *id_l = rel_dependencies(sql, r);
@@ -3226,11 +3232,11 @@ SQLanyequal(bit *ret, const bat *bid1, c
const void *p;
if ((l = BATdescriptor(*bid1)) == NULL) {
- throw(SQL, "all", SQLSTATE(HY005) "Cannot access column
descriptor");
+ throw(SQL, "any =", SQLSTATE(HY005) "Cannot access column
descriptor");
}
if ((r = BATdescriptor(*bid2)) == NULL) {
BBPunfix(l->batCacheid);
- throw(SQL, "all", SQLSTATE(HY005) "Cannot access column
descriptor");
+ throw(SQL, "any =", SQLSTATE(HY005) "Cannot access column
descriptor");
}
*ret = FALSE;
if (BATcount(r) > 0) {
@@ -3267,22 +3273,22 @@ SQLanyequal_grp(bat *ret, const bat *bid
(void)no_nil;
if ((l = BATdescriptor(*bid1)) == NULL) {
- throw(SQL, "all", SQLSTATE(HY005) "Cannot access column
descriptor");
+ throw(SQL, "any =", SQLSTATE(HY005) "Cannot access column
descriptor");
}
if ((r = BATdescriptor(*bid2)) == NULL) {
BBPunfix(l->batCacheid);
- throw(SQL, "all", SQLSTATE(HY005) "Cannot access column
descriptor");
+ throw(SQL, "any =", SQLSTATE(HY005) "Cannot access column
descriptor");
}
if ((g = BATdescriptor(*gp)) == NULL) {
BBPunfix(l->batCacheid);
BBPunfix(r->batCacheid);
- throw(SQL, "all", SQLSTATE(HY005) "Cannot access column
descriptor");
+ throw(SQL, "any =", SQLSTATE(HY005) "Cannot access column
descriptor");
}
if ((e = BATdescriptor(*gpe)) == NULL) {
BBPunfix(l->batCacheid);
BBPunfix(r->batCacheid);
BBPunfix(g->batCacheid);
- throw(SQL, "all", SQLSTATE(HY005) "Cannot access column
descriptor");
+ throw(SQL, "any =", SQLSTATE(HY005) "Cannot access column
descriptor");
}
res = BATconstant(0, TYPE_bit, &F, BATcount(e), TRANSIENT);
BAThseqbase(res, e->hseqbase);
@@ -3329,6 +3335,115 @@ SQLanyequal_grp(bat *ret, const bat *bid
}
str
+SQLallnotequal(bit *ret, const bat *bid1, const bat *bid2)
+{
+ BAT *l, *r;
+ const void *p;
+
+ if ((l = BATdescriptor(*bid1)) == NULL) {
+ throw(SQL, "all <>", SQLSTATE(HY005) "Cannot access column
descriptor");
+ }
+ if ((r = BATdescriptor(*bid2)) == NULL) {
+ BBPunfix(l->batCacheid);
+ throw(SQL, "all <>", SQLSTATE(HY005) "Cannot access column
descriptor");
+ }
+ *ret = TRUE;
+ if (BATcount(r) > 0) {
+ BUN q, o;
+ int (*ocmp) (const void *, const void *);
+ BATiter li = bat_iterator(l);
+ BATiter ri = bat_iterator(r);
+ const void *nilp = ATOMnilptr(l->ttype);
+
+ o = BUNlast(r);
+ p = BUNtail(li, 0);
+ ocmp = ATOMcompare(l->ttype);
+ for (q = 0; q < o; q++) {
+ const void *c = BUNtail(ri, q);
+ if (ocmp(nilp, c) == 0)
+ *ret = bit_nil;
+ else if (ocmp(p, c) == 0) {
+ *ret = FALSE;
+ break;
+ }
+ }
+ }
+ BBPunfix(l->batCacheid);
+ BBPunfix(r->batCacheid);
+ return MAL_SUCCEED;
+}
+
+str
+SQLallnotequal_grp(bat *ret, const bat *bid1, const bat *bid2, const bat *gp,
const bat *gpe, bit *no_nil)
+{
+ BAT *l, *r, *g, *e, *res;
+ bit T = TRUE, hasnil = 0;
+ BUN offset = 0;
+
+ (void)no_nil;
+ if ((l = BATdescriptor(*bid1)) == NULL) {
+ throw(SQL, "all <>", SQLSTATE(HY005) "Cannot access column
descriptor");
+ }
+ if ((r = BATdescriptor(*bid2)) == NULL) {
+ BBPunfix(l->batCacheid);
+ throw(SQL, "all <>", SQLSTATE(HY005) "Cannot access column
descriptor");
+ }
+ if ((g = BATdescriptor(*gp)) == NULL) {
+ BBPunfix(l->batCacheid);
+ BBPunfix(r->batCacheid);
+ throw(SQL, "all <>", SQLSTATE(HY005) "Cannot access column
descriptor");
+ }
+ if ((e = BATdescriptor(*gpe)) == NULL) {
+ BBPunfix(l->batCacheid);
+ BBPunfix(r->batCacheid);
+ BBPunfix(g->batCacheid);
+ throw(SQL, "all <>", SQLSTATE(HY005) "Cannot access column
descriptor");
+ }
+ res = BATconstant(0, TYPE_bit, &T, BATcount(e), TRANSIENT);
+ BAThseqbase(res, e->hseqbase);
+ assert(BATcount(l) == BATcount(r));
+ offset = g->hseqbase - l->hseqbase;
+ if (BATcount(g) > 0) {
+ BUN q, o, s;
+ int (*ocmp) (const void *, const void *);
+ BATiter li = bat_iterator(l);
+ BATiter ri = bat_iterator(r);
+ BATiter gi = bat_iterator(g);
+ BATiter rt = bat_iterator(res);
+
+ bit *ret = BUNtail(rt, 0);
+ const void *nilp = ATOMnilptr(l->ttype);
+
+ o = BUNlast(g);
+ ocmp = ATOMcompare(l->ttype);
+ for (q = offset, s = 0; s < o; q++, s++) {
+ const void *lv = BUNtail(li, q);
+ const void *rv = BUNtail(ri, q);
+ oid id = *(oid*)BUNtail(gi, s);
+
+ if (ret[id] != FALSE) {
+ if (ocmp(lv, nilp) == 0 || ocmp(rv, nilp) == 0)
{
+ ret[id] = bit_nil;
+ hasnil = 1;
+ } else if (ocmp(lv, rv) == 0)
+ ret[id] = FALSE;
+ }
+ }
+ }
+ res->hseqbase = g->hseqbase;
+ res->tnil = hasnil != 0;
+ res->tnonil = hasnil == 0;
+ res->tsorted = res->trevsorted = 0;
+ res->tkey = 0;
+ BBPunfix(l->batCacheid);
+ BBPunfix(r->batCacheid);
+ BBPunfix(g->batCacheid);
+ BBPunfix(e->batCacheid);
+ BBPkeepref(*ret = res->batCacheid);
+ return MAL_SUCCEED;
+}
+
+str
not_unique(bit *ret, const bat *bid)
{
BAT *b;
@@ -5175,3 +5290,63 @@ SQLexist(bit *res, bat *id)
BBPunfix(b->batCacheid);
return MAL_SUCCEED;
}
+
+str
+SQLsubexist(bat *ret, const bat *bp, const bat *gp, const bat *gpe, bit
*no_nil)
+{
+ BAT *b, *g, *e, *res;
+ bit F = FALSE, hasnil = 0;
+ BUN offset = 0;
+
+ (void)no_nil;
+ if ((b = BATdescriptor(*bp)) == NULL) {
+ throw(SQL, "exists", SQLSTATE(HY005) "Cannot access column
descriptor");
+ }
+ if ((g = BATdescriptor(*gp)) == NULL) {
+ BBPunfix(b->batCacheid);
+ throw(SQL, "exists", SQLSTATE(HY005) "Cannot access column
descriptor");
+ }
+ if ((e = BATdescriptor(*gpe)) == NULL) {
+ BBPunfix(b->batCacheid);
+ BBPunfix(g->batCacheid);
+ throw(SQL, "exists", SQLSTATE(HY005) "Cannot access column
descriptor");
+ }
+ res = BATconstant(0, TYPE_bit, &F, BATcount(e), TRANSIENT);
+ BAThseqbase(res, e->hseqbase);
+ offset = g->hseqbase - b->hseqbase;
+ if (BATcount(g) > 0) {
+ BUN q, o, s;
+ int (*ocmp) (const void *, const void *);
+ BATiter bi = bat_iterator(b);
+ BATiter gi = bat_iterator(g);
+ BATiter rt = bat_iterator(res);
+
+ bit *ret = BUNtail(rt, 0);
+ const void *nilp = ATOMnilptr(b->ttype);
+
+ o = BUNlast(g);
+ ocmp = ATOMcompare(b->ttype);
+ for (q = offset, s = 0; s < o; q++, s++) {
+ const void *bv = BUNtail(bi, q);
+ oid id = *(oid*)BUNtail(gi, s);
+
+ if (ret[id] != TRUE) {
+ if (ocmp(bv, nilp) == 0) {
+ ret[id] = bit_nil;
+ hasnil = 1;
+ }
+ }
+ }
+ }
+ res->hseqbase = g->hseqbase;
+ res->tnil = hasnil != 0;
+ res->tnonil = hasnil == 0;
+ res->tsorted = res->trevsorted = 0;
+ res->tkey = 0;
+ BBPunfix(b->batCacheid);
+ BBPunfix(g->batCacheid);
+ BBPunfix(e->batCacheid);
+ BBPkeepref(*ret = res->batCacheid);
+ return MAL_SUCCEED;
+}
+
diff --git a/sql/backends/monet5/sql.h b/sql/backends/monet5/sql.h
--- a/sql/backends/monet5/sql.h
+++ b/sql/backends/monet5/sql.h
@@ -123,6 +123,8 @@ sql5_export str SQLany_cmp(bit *ret, con
sql5_export str SQLall_cmp(bit *ret, const bit *cmp, const bit *nl, const bit
*nr);
sql5_export str SQLanyequal(bit *ret, const bat *bid1, const bat *bid2);
sql5_export str SQLanyequal_grp(bat *ret, const bat *bid1, const bat *bid2,
const bat *gp, const bat *gpe, bit *no_nil);
+sql5_export str SQLallnotequal(bit *ret, const bat *bid1, const bat *bid2);
+sql5_export str SQLallnotequal_grp(bat *ret, const bat *bid1, const bat *bid2,
const bat *gp, const bat *gpe, bit *no_nil);
sql5_export str not_unique(bit *ret, const bat *bid);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list