Changeset: 2e39dc782e4e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/2e39dc782e4e
Modified Files:
        sql/server/rel_statistics.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
Branch: pp_hashjoin
Log Message:

added functions too lookup sortedness of idx


diffs (150 lines):

diff --git a/sql/server/rel_statistics.c b/sql/server/rel_statistics.c
--- a/sql/server/rel_statistics.c
+++ b/sql/server/rel_statistics.c
@@ -1322,7 +1322,7 @@ score_se_base(visitor *v, sql_rel *rel, 
        if (e->type == e_convert) /* keep unsafes at the end (TODO improve) */
                return -1000;
        /* can we find out if the underlying table is sorted */
-       if ((c = exp_find_column(rel, e, -2)) && v->storage_based_opt && 
mvc_is_sorted(v->sql, c))
+       if ((c = exp_find_column(rel, e, -2)) && v->storage_based_opt && 
mvc_is_sorted_col(v->sql, c))
                res += 600;
 
        /* prefer the shorter var types over the longer ones */
@@ -1399,7 +1399,7 @@ score_gbe(visitor *v, sql_rel *rel, sql_
        /* can we find out if the underlying table is sorted */
        if (is_unique(e) || find_prop(e->p, PROP_HASHCOL) || (c && 
v->storage_based_opt && mvc_is_unique(v->sql, c))) /* distinct columns */
                res += 700;
-       if (c && v->storage_based_opt && mvc_is_sorted(v->sql, c))
+       if (c && v->storage_based_opt && mvc_is_sorted_col(v->sql, c))
                res += 500;
        if (find_prop(e->p, PROP_HASHIDX)) /* has hash index */
                res += 200;
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -1523,10 +1523,17 @@ mvc_access(mvc *m, sql_table *t, sht acc
 }
 
 int
-mvc_is_sorted(mvc *m, sql_column *col)
+mvc_is_sorted_col(mvc *m, sql_column *col)
 {
        TRC_DEBUG(SQL_TRANS, "Is sorted: %s\n", col->base.name);
-       return sql_trans_is_sorted(m->session->tr, col);
+       return sql_trans_is_sorted_col(m->session->tr, col);
+}
+
+int
+mvc_is_sorted_idx(mvc *m, sql_idx *idx)
+{
+       TRC_DEBUG(SQL_TRANS, "Is sorted: %s\n", idx->base.name);
+       return sql_trans_is_sorted_idx(m->session->tr, idx);
 }
 
 int
diff --git a/sql/server/sql_mvc.h b/sql/server/sql_mvc.h
--- a/sql/server/sql_mvc.h
+++ b/sql/server/sql_mvc.h
@@ -255,7 +255,8 @@ extern int mvc_drop_default(mvc *c, sql_
 extern int mvc_storage(mvc *c, sql_column *col, char *storage);
 extern int mvc_subtype(mvc *m, sql_column *col, sql_subtype *t);
 extern int mvc_access(mvc *m, sql_table *t, sht access);
-extern int mvc_is_sorted(mvc *c, sql_column *col);
+extern int mvc_is_sorted_col(mvc *c, sql_column *col);
+extern int mvc_is_sorted_idx(mvc *c, sql_idx *idx);
 extern int mvc_is_unique(mvc *m, sql_column *col);
 extern int mvc_is_duplicate_eliminated(mvc *c, sql_column *col);
 extern int mvc_col_stats(mvc *m, sql_column *col, bool *nonil, bool *unique, 
double *unique_est, ValPtr min, ValPtr max);
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -2936,6 +2936,24 @@ sorted_col(sql_trans *tr, sql_column *co
 }
 
 static int
+sorted_idx(sql_trans *tr, sql_idx *idx)
+{
+       int sorted = 0;
+
+       assert(tr->active);
+       if (!isTable(idx->t) || !idx->t->s)
+               return 0;
+
+       if (idx && ATOMIC_PTR_GET(&idx->data)) {
+               BAT *b = bind_idx(tr, idx, QUICK);
+
+               if (b)
+                       sorted = b->tsorted || b->trevsorted;
+       }
+       return sorted;
+}
+
+static int
 unique_col(sql_trans *tr, sql_column *col)
 {
        int distinct = 0;
@@ -5303,6 +5321,7 @@ bat_storage_init( store_functions *sf)
        sf->min_max_col = &min_max_col;
        sf->set_stats_col = &set_stats_col;
        sf->sorted_col = &sorted_col;
+       sf->sorted_idx = &sorted_idx;
        sf->unique_col = &unique_col;
        sf->double_elim_col = &double_elim_col;
        sf->col_stats = &col_stats;
diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h
--- a/sql/storage/sql_storage.h
+++ b/sql/storage/sql_storage.h
@@ -150,6 +150,7 @@ typedef size_t (*dcount_col_fptr) (sql_t
 typedef int (*min_max_col_fptr) (sql_trans *tr, sql_column *c);
 typedef int (*set_stats_col_fptr) (sql_trans *tr, sql_column *c, double 
*unique_est, char *min, char *max);
 typedef int (*prop_col_fptr) (sql_trans *tr, sql_column *c);
+typedef int (*prop_idx_fptr) (sql_trans *tr, sql_idx *i);
 typedef int (*proprec_col_fptr) (sql_trans *tr, sql_column *c, bool *nonil, 
bool *unique, double *unique_est, ValPtr min, ValPtr max);
 typedef int (*col_set_range_fptr) (sql_trans *tr, sql_column *c, sql_part *pt, 
bool add_range);
 typedef int (*col_not_null_fptr) (sql_trans *tr, sql_column *c, bool not_null);
@@ -239,6 +240,7 @@ typedef struct store_functions {
        min_max_col_fptr min_max_col;
        set_stats_col_fptr set_stats_col;
        prop_col_fptr sorted_col;
+       prop_idx_fptr sorted_idx;
        prop_col_fptr unique_col;
        prop_col_fptr double_elim_col; /* varsize col with double elimination */
        proprec_col_fptr col_stats;
@@ -405,7 +407,8 @@ extern int sql_trans_alter_default(sql_t
 extern int sql_trans_alter_storage(sql_trans *tr, sql_column *col, char 
*storage);
 extern int sql_trans_alter_type(sql_trans *tr, sql_column *col, sql_subtype 
*t);
 extern int sql_trans_alter_check(sql_trans *tr, sql_column *col, char *check);
-extern int sql_trans_is_sorted(sql_trans *tr, sql_column *col);
+extern int sql_trans_is_sorted_col(sql_trans *tr, sql_column *col);
+extern int sql_trans_is_sorted_idx(sql_trans *tr, sql_idx *idx);
 extern int sql_trans_is_unique(sql_trans *tr, sql_column *col);
 extern int sql_trans_is_duplicate_eliminated(sql_trans *tr, sql_column *col);
 extern int sql_trans_col_stats(sql_trans *tr, sql_column *col, bool *nonil, 
bool *unique, double *unique_est, ValPtr min, ValPtr max);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -6853,7 +6853,7 @@ sql_trans_alter_type(sql_trans *tr, sql_
 }
 
 int
-sql_trans_is_sorted( sql_trans *tr, sql_column *col )
+sql_trans_is_sorted_col( sql_trans *tr, sql_column *col )
 {
        sqlstore *store = tr->store;
        if (col && isTable(col->t) && store->storage_api.sorted_col && 
store->storage_api.sorted_col(tr, col))
@@ -6862,6 +6862,15 @@ sql_trans_is_sorted( sql_trans *tr, sql_
 }
 
 int
+sql_trans_is_sorted_idx( sql_trans *tr, sql_idx *idx )
+{
+       sqlstore *store = tr->store;
+       if (idx && isTable(idx->t) && store->storage_api.sorted_idx && 
store->storage_api.sorted_idx(tr, idx))
+               return 1;
+       return 0;
+}
+
+int
 sql_trans_is_unique( sql_trans *tr, sql_column *col )
 {
        sqlstore *store = tr->store;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to