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

Reply via email to