Changeset: fc0c49ce382f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fc0c49ce382f Modified Files: gdk/gdk.h gdk/gdk_batop.c gdk/gdk_private.h sql/backends/monet5/rel_bin.c sql/server/rel_dump.c sql/server/rel_exp.c sql/server/rel_exp.h sql/server/rel_optimizer.c sql/server/rel_prop.c sql/server/rel_prop.h sql/server/rel_psm.c sql/server/rel_rel.c sql/server/rel_schema.c sql/server/rel_select.c sql/server/rel_updates.c sql/server/sql_mvc.c sql/server/sql_mvc.h sql/storage/bat/bat_storage.c sql/storage/sql_storage.h sql/storage/store.c tools/monetdbe/monetdbe.c Branch: properties Log Message:
First steps to handle min/max values in the SQL layer, but the server crashes after reloading :( diffs (truncated from 916 to 300 lines): diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -675,6 +675,21 @@ gdk_export int VALisnil(const ValRecord * @c image{http://monetdb.cwi.nl/projects/monetdb-mk/imgs/bat2,,,,feps} */ +enum prop_t { + GDK_MIN_VALUE = 3, /* smallest non-nil value in BAT */ + GDK_MIN_POS, /* BUN position of smallest value */ + GDK_MAX_VALUE, /* largest non-nil value in BAT */ + GDK_MAX_POS, /* BUN position of largest value */ + GDK_HASH_BUCKETS, /* last used hash bucket size */ + GDK_NUNIQUE, /* number of unique values */ +}; + +struct PROPrec { + enum prop_t id; + ValRecord v; + struct PROPrec *next; /* simple chain of properties */ +}; + typedef struct PROPrec PROPrec; /* see also comment near BATassertProps() for more information about @@ -2021,14 +2036,8 @@ gdk_export void VIEWbounds(BAT *b, BAT * * properties. They can be used to improve query processing at higher * levels. */ -enum prop_t { - GDK_MIN_VALUE = 3, /* smallest non-nil value in BAT */ - GDK_MIN_POS, /* BUN position of smallest value */ - GDK_MAX_VALUE, /* largest non-nil value in BAT */ - GDK_MAX_POS, /* BUN position of largest value */ - GDK_HASH_BUCKETS, /* last used hash bucket size */ - GDK_NUNIQUE, /* number of unique values */ -}; + +gdk_export PROPrec *BATgetprop(BAT *b, enum prop_t idx); /* * @- BAT relational operators diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c --- a/gdk/gdk_batop.c +++ b/gdk/gdk_batop.c @@ -2333,7 +2333,7 @@ BATsetprop_nolock(BAT *b, enum prop_t id } else { VALclear(&p->v); } - if (VALinit(&p->v, type, v) == NULL) { + if (v && VALinit(&p->v, type, v) == NULL) { /* failed to initialize, so remove property */ BATrmprop_nolock(b, idx); GDKclrerr(); diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h --- a/gdk/gdk_private.h +++ b/gdk/gdk_private.h @@ -63,8 +63,6 @@ void BATdestroy(BAT *b) __attribute__((__visibility__("hidden"))); void BATfree(BAT *b) __attribute__((__visibility__("hidden"))); -PROPrec *BATgetprop(BAT *b, enum prop_t idx) - __attribute__((__visibility__("hidden"))); PROPrec * BATgetprop_nolock(BAT *b, enum prop_t idx) __attribute__((__visibility__("hidden"))); gdk_return BATgroup_internal(BAT **groups, BAT **extents, BAT **histo, BAT *b, BAT *s, BAT *g, BAT *e, BAT *h, bool subsorted) @@ -298,12 +296,6 @@ BAT *virtualize(BAT *bn) #define BBP_BATMASK (128 * SIZEOF_SIZE_T - 1) #define BBP_THREADMASK 63 -struct PROPrec { - enum prop_t id; - ValRecord v; - struct PROPrec *next; /* simple chain of properties */ -}; - struct Imprints { bte bits; /* how many bits in imprints */ Heap imprints; 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 @@ -3815,10 +3815,15 @@ sql_stack_add_inserted( mvc *sql, const sql_exp *ne; sql_column *c = n->data; bool has_nils = c->null; - - if (has_nils && sql->storage_opt_allowed && mvc_has_no_nil(sql, c)) - has_nils = false; - ne = exp_column(sql->sa, name, c->base.name, &c->type, CARD_MULTI, has_nils, 0); + ValPtr min = NULL, max = NULL; + + if (sql->storage_opt_allowed) { + if (has_nils && mvc_has_no_nil(sql, c)) + has_nils = false; + min = mvc_has_min_value(sql, c); + max = mvc_has_max_value(sql, c); + } + ne = exp_column(sql->sa, name, c->base.name, &c->type, CARD_MULTI, has_nils, 0, min, max); append(exps, ne); } r = rel_table_func(sql->sa, NULL, NULL, exps, TRIGGER_WRAPPER); @@ -4734,18 +4739,23 @@ sql_stack_add_updated(mvc *sql, const ch for (n = t->columns.set->h; n; n = n->next) { sql_column *c = n->data; bool has_nils = c->null; - - if (has_nils && sql->storage_opt_allowed && mvc_has_no_nil(sql, c)) - has_nils = false; + ValPtr min = NULL, max = NULL; + + if (sql->storage_opt_allowed) { + if (has_nils && mvc_has_no_nil(sql, c)) + has_nils = false; + min = mvc_has_min_value(sql, c); + max = mvc_has_max_value(sql, c); + } if (updates[c->colnr]) { - sql_exp *oe = exp_column(sql->sa, on, c->base.name, &c->type, CARD_MULTI, has_nils, 0); - sql_exp *ne = exp_column(sql->sa, nn, c->base.name, &c->type, CARD_MULTI, has_nils, 0); + sql_exp *oe = exp_column(sql->sa, on, c->base.name, &c->type, CARD_MULTI, has_nils, 0, min, max); + sql_exp *ne = exp_column(sql->sa, nn, c->base.name, &c->type, CARD_MULTI, has_nils, 0, min, max); append(exps, oe); append(exps, ne); } else { - sql_exp *oe = exp_column(sql->sa, on, c->base.name, &c->type, CARD_MULTI, has_nils, 0); - sql_exp *ne = exp_column(sql->sa, nn, c->base.name, &c->type, CARD_MULTI, has_nils, 0); + sql_exp *oe = exp_column(sql->sa, on, c->base.name, &c->type, CARD_MULTI, has_nils, 0, min, max); + sql_exp *ne = exp_column(sql->sa, nn, c->base.name, &c->type, CARD_MULTI, has_nils, 0, min, max); append(exps, oe); append(exps, ne); @@ -5034,10 +5044,15 @@ sql_stack_add_deleted(mvc *sql, const ch for (n = t->columns.set->h; n; n = n->next) { sql_column *c = n->data; bool has_nils = c->null; - - if (has_nils && sql->storage_opt_allowed && mvc_has_no_nil(sql, c)) - has_nils = false; - sql_exp *ne = exp_column(sql->sa, name, c->base.name, &c->type, CARD_MULTI, has_nils, 0); + ValPtr min = NULL, max = NULL; + + if (sql->storage_opt_allowed) { + if (has_nils && mvc_has_no_nil(sql, c)) + has_nils = false; + min = mvc_has_min_value(sql, c); + max = mvc_has_max_value(sql, c); + } + sql_exp *ne = exp_column(sql->sa, name, c->base.name, &c->type, CARD_MULTI, has_nils, 0, min, max); append(exps, ne); } diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c --- a/sql/server/rel_dump.c +++ b/sql/server/rel_dump.c @@ -870,7 +870,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re if (!exp && rrel) exp = rel_bind_column2(sql, rrel, tname, cname, 0); } else if (!exp) { - exp = exp_column(sql->sa, tname, cname, NULL, CARD_ATOM, 1, cname[0] == '%'); + exp = exp_column(sql->sa, tname, cname, NULL, CARD_ATOM, 1, cname[0] == '%', NULL, NULL); } break; /* atom */ @@ -1629,7 +1629,7 @@ rel_read(mvc *sql, char *r, int *pos, li if (r[*pos] == ',') (*pos)++; - next = exp_column(sql->sa, nrname, ncname, &a->type, CARD_MULTI, 1, 0); + next = exp_column(sql->sa, nrname, ncname, &a->type, CARD_MULTI, 1, 0, NULL, NULL); set_basecol(next); append(outputs, next); m = m->next; 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 @@ -663,7 +663,7 @@ have_nil(list *exps) } sql_exp * -exp_column(sql_allocator *sa, const char *rname, const char *cname, sql_subtype *t, unsigned int card, int has_nils, int intern) +exp_column(sql_allocator *sa, const char *rname, const char *cname, sql_subtype *t, unsigned int card, int has_nils, int intern, ValPtr min, ValPtr max) { sql_exp *e = exp_create(sa, e_column); @@ -681,6 +681,14 @@ exp_column(sql_allocator *sa, const char set_has_no_nil(e); if (intern) set_intern(e); + if (min) { + prop *p = e->p = prop_create(sa, PROP_MIN, e->p); + p->value = min; + } + if (max) { + prop *p = e->p = prop_create(sa, PROP_MAX, e->p); + p->value = max; + } return e; } @@ -720,7 +728,7 @@ exp_ref(mvc *sql, sql_exp *e) { if (!exp_name(e)) exp_label(sql->sa, e, ++sql->label); - return exp_propagate(sql->sa, exp_column(sql->sa, exp_relname(e), exp_name(e), exp_subtype(e), exp_card(e), has_nil(e), is_intern(e)), e); + return exp_propagate(sql->sa, exp_column(sql->sa, exp_relname(e), exp_name(e), exp_subtype(e), exp_card(e), has_nil(e), is_intern(e), get_min(e), get_max(e)), e); } sql_exp * @@ -739,9 +747,9 @@ exp_ref_save(mvc *sql, sql_exp *e) } sql_exp * -exp_alias(sql_allocator *sa, const char *arname, const char *acname, const char *org_rname, const char *org_cname, sql_subtype *t, unsigned int card, int has_nils, int intern) +exp_alias(sql_allocator *sa, const char *arname, const char *acname, const char *org_rname, const char *org_cname, sql_subtype *t, unsigned int card, int has_nils, int intern, ValPtr min, ValPtr max) { - sql_exp *e = exp_column(sa, org_rname, org_cname, t, card, has_nils, intern); + sql_exp *e = exp_column(sa, org_rname, org_cname, t, card, has_nils, intern, min, max); if (e == NULL) return NULL; @@ -759,16 +767,16 @@ exp_alias_or_copy( mvc *sql, const char tname = exp_relname(old); if (!cname && exp_name(old) && has_label(old)) { - ne = exp_column(sql->sa, exp_relname(old), exp_name(old), exp_subtype(old), orel && old->card != CARD_ATOM?orel->card:CARD_ATOM, has_nil(old), is_intern(old)); + ne = exp_column(sql->sa, exp_relname(old), exp_name(old), exp_subtype(old), orel && old->card != CARD_ATOM?orel->card:CARD_ATOM, has_nil(old), is_intern(old), get_min(old), get_max(old)); return exp_propagate(sql->sa, ne, old); } else if (!cname) { exp_label(sql->sa, old, ++sql->label); - ne = exp_column(sql->sa, exp_relname(old), exp_name(old), exp_subtype(old), orel && old->card != CARD_ATOM?orel->card:CARD_ATOM, has_nil(old), is_intern(old)); + ne = exp_column(sql->sa, exp_relname(old), exp_name(old), exp_subtype(old), orel && old->card != CARD_ATOM?orel->card:CARD_ATOM, has_nil(old), is_intern(old), get_min(old), get_max(old)); return exp_propagate(sql->sa, ne, old); } else if (cname && !old->alias.name) { exp_setname(sql->sa, old, tname, cname); } - ne = exp_column(sql->sa, tname, cname, exp_subtype(old), orel && old->card != CARD_ATOM?orel->card:CARD_ATOM, has_nil(old), is_intern(old)); + ne = exp_column(sql->sa, tname, cname, exp_subtype(old), orel && old->card != CARD_ATOM?orel->card:CARD_ATOM, has_nil(old), is_intern(old), get_min(old), get_max(old)); return exp_propagate(sql->sa, ne, old); } @@ -2678,7 +2686,7 @@ exp_copy(mvc *sql, sql_exp * e) return NULL; switch(e->type){ case e_column: - ne = exp_column(sql->sa, e->l, e->r, exp_subtype(e), e->card, has_nil(e), is_intern(e)); + ne = exp_column(sql->sa, e->l, e->r, exp_subtype(e), e->card, has_nil(e), is_intern(e), get_min(e), get_max(e)); ne->flag = e->flag; break; case e_cmp: diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h --- a/sql/server/rel_exp.h +++ b/sql/server/rel_exp.h @@ -17,6 +17,9 @@ #define new_exp_list(sa) sa_list(sa) #define exp2list(sa,e) append(sa_list(sa),e) +#define get_min(e) find_prop_and_get((e)->p, PROP_MIN) +#define get_max(e) find_prop_and_get((e)->p, PROP_MAX) + #define is_compare_func(sf) (!sf->func->s && \ (strcmp(sf->func->base.name, "<") == 0 || strcmp(sf->func->base.name, "<=") == 0 || \ strcmp(sf->func->base.name, "=") == 0 || strcmp(sf->func->base.name, "<>") == 0 || \ @@ -85,11 +88,11 @@ extern list * exp_get_values(sql_exp *e) extern list * exp_types(sql_allocator *sa, list *exps); extern int have_nil(list *exps); -sql_export sql_exp * exp_column(sql_allocator *sa, const char *rname, const char *name, sql_subtype *t, unsigned int card, int has_nils, int intern); +sql_export sql_exp * exp_column(sql_allocator *sa, const char *rname, const char *name, sql_subtype *t, unsigned int card, int has_nils, int intern, ValPtr min, ValPtr max); extern sql_exp * exp_propagate(sql_allocator *sa, sql_exp *ne, sql_exp *oe); extern sql_exp * exp_ref(mvc *sql, sql_exp *e); extern sql_exp * exp_ref_save(mvc *sql, sql_exp *e); /* if needed mark the input expression as a referenced expression, return reference to e */ -extern sql_exp * exp_alias(sql_allocator *sa, const char *arname, const char *acname, const char *org_rname, const char *org_cname, sql_subtype *t, unsigned int card, int has_nils, int intern); +extern sql_exp * exp_alias(sql_allocator *sa, const char *arname, const char *acname, const char *org_rname, const char *org_cname, sql_subtype *t, unsigned int card, int has_nils, int intern, ValPtr min, ValPtr max); extern sql_exp * exp_alias_or_copy( mvc *sql, const char *tname, const char *cname, sql_rel *orel, sql_exp *old); extern sql_exp * exp_alias_ref(mvc *sql, sql_exp *e); extern sql_exp * exp_set(sql_allocator *sa, const char *sname, const char *name, sql_exp *val, int level); diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c --- a/sql/server/rel_optimizer.c +++ b/sql/server/rel_optimizer.c @@ -2186,7 +2186,7 @@ exp_push_down_prj(mvc *sql, sql_exp *e, if (ne->type == e_atom) e = exp_copy(sql, ne); else - e = exp_alias(sql->sa, exp_relname(e), exp_name(e), ne->l, ne->r, exp_subtype(e), e->card, has_nil(e), is_intern(e)); + e = exp_alias(sql->sa, exp_relname(e), exp_name(e), ne->l, ne->r, exp_subtype(e), e->card, has_nil(e), is_intern(e), get_min(e), get_max(e)); return exp_propagate(sql->sa, e, ne); case e_cmp: if (e->flag == cmp_or || e->flag == cmp_filter) { @@ -3684,7 +3684,7 @@ rel_project_cse(visitor *v, sql_rel *rel sql_exp *e2 = m->data; if (exp_name(e2) && exp_match_exp(e1, e2) && (e1->type != e_column || exps_bind_column2(nexps, exp_relname(e1), exp_name(e1), NULL) == e1)) { - sql_exp *ne = exp_alias(v->sql->sa, exp_relname(e1), exp_name(e1), exp_relname(e2), exp_name(e2), exp_subtype(e2), e2->card, has_nil(e2), is_intern(e1)); + sql_exp *ne = exp_alias(v->sql->sa, exp_relname(e1), exp_name(e1), exp_relname(e2), exp_name(e2), exp_subtype(e2), e2->card, has_nil(e2), is_intern(e1), get_min(e2), get_max(e2)); ne = exp_propagate(v->sql->sa, ne, e1); exp_prop_alias(v->sql->sa, ne, e1); @@ -5798,7 +5798,7 @@ rel_reduce_groupby_exps(visitor *v, sql_ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list