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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list