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

Reply via email to