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