Changeset: a7414105eeae for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a7414105eeae
Modified Files:
        sql/server/rel_propagate.c
        sql/server/rel_updates.c
        sql/server/rel_updates.h
        sql/server/sql_partition.c
        sql/storage/store.c
Branch: merge-partitions
Log Message:

More progress.

I need to the get the type of partitions of expressions in store.c, but I 
cannot use the rel_parse_val there, so I have to delay the parsing of the 
ranges/list of values to the upper layers :(


diffs (211 lines):

diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c
--- a/sql/server/rel_propagate.c
+++ b/sql/server/rel_propagate.c
@@ -20,31 +20,50 @@
 extern sql_rel *rel_list(sql_allocator *sa, sql_rel *l, sql_rel *r);
 
 static sql_exp*
-rel_get_anti_expression(sql_rel *anti_rel, sql_table *t)
+rel_generate_anti_expression(mvc *sql, sql_rel **anti_rel, sql_table *mt, 
sql_table *pt)
 {
-       if(isPartitionedByColumnTable(t)) {
-               int colr = t->part.pcol->colnr;
-               return list_fetch(anti_rel->exps, colr);
-       } else if(isPartitionedByExpressionTable(t)) {
-               //TODO
-               return NULL;
+       sql_exp* res = NULL;
+
+       *anti_rel = rel_basetable(sql, pt, pt->base.name);
+
+       if(isPartitionedByColumnTable(mt)) {
+               int colr = mt->part.pcol->colnr;
+               res = list_fetch((*anti_rel)->exps, colr);
+               res = exp_column(sql->sa, exp_relname(res), exp_name(res), 
exp_subtype(res), res->card, has_nil(res),
+                                                is_intern(res));
+       } else if(isPartitionedByExpressionTable(mt)) {
+               *anti_rel = rel_project(sql->sa, *anti_rel, NULL);
+               if(!(res = rel_parse_val(sql, sa_message(sql->sa, "select %s;", 
mt->part.pexp->exp), sql->emode, (*anti_rel)->l)))
+                       return NULL;
+               exp_label(sql->sa, res, ++sql->label);
        } else {
                assert(0);
        }
+       (*anti_rel)->exps = new_exp_list(sql->sa);
+       append((*anti_rel)->exps, res);
+       res = exp_column(sql->sa, exp_relname(res), exp_name(res), 
exp_subtype(res), res->card, has_nil(res),
+                                                is_intern(res));
+       return res;
 }
 
 static sql_exp*
-find_anti_expression(sql_rel *dup, sql_table *t)
+rel_generate_anti_insert_expression(mvc *sql, sql_rel *anti_rel, sql_table *t)
 {
+       sql_exp* res = NULL;
+
        if(isPartitionedByColumnTable(t)) {
                int colr = t->part.pcol->colnr;
-               return list_fetch(dup->exps, colr);
+               res = list_fetch(anti_rel->exps, colr);
        } else if(isPartitionedByExpressionTable(t)) {
-               //TODO
-               return NULL;
+               if(!(res = rel_parse_val(sql, sa_message(sql->sa, "select %s;", 
t->part.pexp->exp), sql->emode, anti_rel)))
+                       return NULL;
+               exp_label(sql->sa, res, ++sql->label);
        } else {
                assert(0);
        }
+       res = exp_column(sql->sa, exp_relname(res), exp_name(res), 
exp_subtype(res), res->card, has_nil(res),
+                                        is_intern(res));
+       return res;
 }
 
 static void
@@ -67,7 +86,7 @@ rel_alter_table_add_partition_range(mvc*
 {
        sql_rel *rel_psm = rel_create(sql->sa), *anti_rel;
        list *exps = new_exp_list(sql->sa);
-       sql_exp *exception, *aggr, *anti_exp = NULL, *anti_le, *e1, *e2, 
*anti_nils;
+       sql_exp *exception, *aggr, *anti_exp, *anti_le, *e1, *e2, *anti_nils;
        sql_subaggr *cf = sql_bind_aggr(sql->sa, sql->session->schema, "count", 
NULL);
        char buf[BUFSIZ], *pmin = min ? atom2string(sql->sa, min): NULL, *pmax 
= max ? atom2string(sql->sa, max) : NULL, *err;
        sql_subtype tpe;
@@ -78,12 +97,7 @@ rel_alter_table_add_partition_range(mvc*
        if((err = find_partition_type(sql, &tpe, mt)))
                return sql_error(sql, 02,"%s", err);
 
-       anti_rel = rel_basetable(sql, pt, tname2);
-       anti_le = rel_get_anti_expression(anti_rel, mt);
-       anti_le = exp_column(sql->sa, exp_relname(anti_le), exp_name(anti_le), 
exp_subtype(anti_le),
-                                                anti_le->card, 
has_nil(anti_le), is_intern(anti_le));
-       anti_rel->exps = new_exp_list(sql->sa);
-       append(anti_rel->exps, anti_le);
+       anti_le = rel_generate_anti_expression(sql, &anti_rel, mt, pt);
        anti_nils = rel_unop_(sql, anti_le, NULL, "isnull", card_value);
 
        assert((!min && !max && with_nills) || (min && max));
@@ -160,12 +174,7 @@ rel_alter_table_add_partition_list(mvc *
        if((err = find_partition_type(sql, &tpe, mt)))
                return sql_error(sql, 02,"%s", err);
 
-       anti_rel = rel_basetable(sql, pt, tname2);
-       anti_le = rel_get_anti_expression(anti_rel, mt);
-       anti_le = exp_column(sql->sa, exp_relname(anti_le), exp_name(anti_le), 
exp_subtype(anti_le),
-                                                anti_le->card, 
has_nil(anti_le), is_intern(anti_le));
-       anti_rel->exps = new_exp_list(sql->sa);
-       append(anti_rel->exps, anti_le);
+       anti_le = rel_generate_anti_expression(sql, &anti_rel, mt, pt);
        anti_nils = rel_unop_(sql, anti_le, NULL, "isnull", card_value);
 
        for (dnode *dn = values->h; dn ; dn = dn->next) { /* parse the atoms 
and generate the expressions */
@@ -439,16 +448,13 @@ rel_generate_subinserts(mvc *sql, sql_re
        char buf[BUFSIZ];
 
        *anti_rel = rel_dup(rel->r);
-       anti_le = rel_get_anti_expression(*anti_rel, t);
-       anti_le = exp_column(sql->sa, exp_relname(anti_le), exp_name(anti_le), 
exp_subtype(anti_le),
-                                                anti_le->card, 
has_nil(anti_le), is_intern(anti_le));
+       anti_le = rel_generate_anti_insert_expression(sql, *anti_rel, t);
 
        for (node *n = t->members.set->h; n; n = n->next) {
                sql_part *pt = (sql_part *) n->data;
                sql_table *sub = find_sql_table(t->s, pt->base.name);
                sql_rel *s1, *dup = rel_dup(rel->r);
-               sql_exp *le = find_anti_expression(dup, t);
-               le = exp_column(sql->sa, exp_relname(le), exp_name(le), 
exp_subtype(le), le->card, has_nil(le), is_intern(le));
+               sql_exp *le = rel_generate_anti_insert_expression(sql, dup, t);
 
                if(isRangePartitionTable(t)) {
                        sql_exp *e1, *e2, *range;
@@ -614,7 +620,7 @@ rel_subtable_insert(mvc *sql, sql_rel *r
        sql_table *upper = t->p; //is part of a partition table and not been 
used yet
        sql_part *pt = find_sql_part(upper, t->base.name);
        sql_rel *anti_dup = rel_dup(rel->r) /* the anti relation */, *left = 
rel->l;
-       sql_exp *anti_exp = NULL, *anti_le = find_anti_expression(anti_dup, 
upper), *aggr = NULL, *exception = NULL;
+       sql_exp *anti_exp = NULL, *anti_le = 
rel_generate_anti_insert_expression(sql, anti_dup, upper), *aggr = NULL, 
*exception = NULL;
        list *anti_exps = new_exp_list(sql->sa);
        sql_subaggr *cf = sql_bind_aggr(sql->sa, sql->session->schema, "count", 
NULL);
        char buf[BUFSIZ];
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -1727,7 +1727,7 @@ copyto(mvc *sql, symbol *sq, str filenam
 }
 
 sql_exp *
-rel_parse_val(mvc *m, char *query, char emode, sql_table *from)
+rel_parse_val(mvc *m, char *query, char emode, sql_rel *from)
 {
        mvc o = *m;
        sql_exp *e = NULL;
@@ -1784,9 +1784,7 @@ rel_parse_val(mvc *m, char *query, char 
                SelectNode *sn = (SelectNode *)m->sym;
                if (sn->selection->h->data.sym->token == SQL_COLUMN) {
                        int is_last = 0;
-                       sql_rel *r = NULL;
-                       if(from)
-                               r = rel_basetable(m, from, from->base.name);
+                       sql_rel *r = from;
                        symbol* sq = 
sn->selection->h->data.sym->data.lval->h->data.sym;
                        e = rel_value_exp2(m, &r, sq, sql_sel, ek, &is_last);
                }
diff --git a/sql/server/rel_updates.h b/sql/server/rel_updates.h
--- a/sql/server/rel_updates.h
+++ b/sql/server/rel_updates.h
@@ -21,7 +21,7 @@ extern sql_rel *rel_insert(mvc *sql, sql
 extern sql_rel *rel_delete(sql_allocator *sa, sql_rel *t, sql_rel *deletes);
 extern sql_rel *rel_truncate(sql_allocator *sa, sql_rel *t, int drop_action, 
int check_identity);
 
-extern sql_exp * rel_parse_val(mvc *m, char *query, char emode, sql_table 
*from);
+extern sql_exp * rel_parse_val(mvc *m, char *query, char emode, sql_rel *from);
 
 extern sql_rel *rel_updates(mvc *sql, symbol *sym);
 
diff --git a/sql/server/sql_partition.c b/sql/server/sql_partition.c
--- a/sql/server/sql_partition.c
+++ b/sql/server/sql_partition.c
@@ -9,6 +9,7 @@
 #include "monetdb_config.h"
 
 #include "sql_partition.h"
+#include "rel_rel.h"
 #include "sql_mvc.h"
 #include "sql_catalog.h"
 #include "sql_relation.h"
@@ -154,11 +155,13 @@ bootstrap_partition_expression(mvc* sql,
        sql_exp *exp;
        char *query, *msg = NULL;
        int sql_ec;
+       sql_rel* baset;
 
        assert(isPartitionedByExpressionTable(mt));
 
+       baset = rel_basetable(sql, mt, mt->base.name);
        query = mt->part.pexp->exp;
-       if((exp = rel_parse_val(sql, sa_message(sql->sa, "select %s;", query), 
sql->emode, mt)) == NULL) {
+       if((exp = rel_parse_val(sql, sa_message(sql->sa, "select %s;", query), 
sql->emode, baset)) == NULL) {
                throw(SQL,"sql.partition", SQLSTATE(42000) "Incorrect 
expression '%s'", query);
        }
 
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -611,7 +611,6 @@ load_value_partition(sql_trans *tr, sql_
        int i = 0;
        int (*atom_cmp) (const void *v1, const void *v2) = 
BATatoms[tpe.type->localtype].atomCmp;
        const void *nil_val = BATatoms[tpe.type->localtype].atomNull;
-       void* prev;
 
        vals = list_new(tr->sa, (fdestroy) NULL);
        if(!vals) {
@@ -644,7 +643,7 @@ load_value_partition(sql_trans *tr, sql_
                        nextv->value = sa_alloc(tr->sa, len);
                        memcpy(nextv->value, pnext, len);
                        nextv->length = len;
-                       if((prev = list_append_sorted(vals, nextv, 
sql_values_list_element_validate_and_insert)) != NULL) {
+                       if(list_append_sorted(vals, nextv, 
sql_values_list_element_validate_and_insert) != NULL) {
                                GDKfree(pnext);
                                table_funcs.rids_destroy(rs);
                                list_destroy(vals);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to