Changeset: ac37b846fbe3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ac37b846fbe3
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: properties
Log Message:
Propagate unique estimation
diffs (113 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
@@ -215,8 +215,9 @@ rel_basetable_get_statistics(visitor *v,
(void)depth;
if ((c = name_find_column(rel, exp_relname(e), exp_name(e), -2, NULL)))
{
bool nonil = false, unique = false;
+ double unique_est = 0;
ValRecord min, max;
- int ok = mvc_col_stats(sql, c, &nonil, &unique, &min, &max);
+ int ok = mvc_col_stats(sql, c, &nonil, &unique, &unique_est,
&min, &max);
if (has_nil(e) && nonil)
set_has_no_nil(e);
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
@@ -1541,10 +1541,10 @@ mvc_is_duplicate_eliminated(mvc *m, sql_
}
int
-mvc_col_stats(mvc *m, sql_column *col, bool *nonil, bool *unique, ValPtr min,
ValPtr max)
+mvc_col_stats(mvc *m, sql_column *col, bool *nonil, bool *unique, double
*unique_est, ValPtr min, ValPtr max)
{
TRC_DEBUG(SQL_TRANS, "Retrieving column stats for: %s\n",
col->base.name);
- return sql_trans_col_stats(m->session->tr, col, nonil, unique, min,
max);
+ return sql_trans_col_stats(m->session->tr, col, nonil, unique,
unique_est, min, max);
}
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
@@ -218,7 +218,7 @@ extern int mvc_access(mvc *m, sql_table
extern int mvc_is_sorted(mvc *c, sql_column *col);
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,
ValPtr min, ValPtr max);
+extern int mvc_col_stats(mvc *m, sql_column *col, bool *nonil, bool *unique,
double *unique_est, ValPtr min, ValPtr max);
extern int mvc_create_ukey(sql_key **kres, mvc *m, sql_table *t, const char
*name, key_type kt);
extern int mvc_create_fkey(sql_fkey **kres, mvc *m, sql_table *t, const char
*name, key_type kt, sql_key *rkey, int on_delete, int on_update);
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
@@ -2705,7 +2705,7 @@ double_elim_col(sql_trans *tr, sql_colum
}
static int
-col_stats(sql_trans *tr, sql_column *c, bool *nonil, bool *unique, ValPtr min,
ValPtr max)
+col_stats(sql_trans *tr, sql_column *c, bool *nonil, bool *unique, double
*unique_est, ValPtr min, ValPtr max)
{
int ok = 0;
BAT *b = NULL;
@@ -2714,6 +2714,7 @@ col_stats(sql_trans *tr, sql_column *c,
assert(tr->active);
*nonil = false;
*unique = false;
+ *unique_est = 0;
if (!c || !isTable(c->t) || !c->t->s)
return ok;
@@ -2737,7 +2738,11 @@ col_stats(sql_trans *tr, sql_column *c,
bat_iterator_end(&bi);
bat_destroy(b);
}
- *unique = d->cs.ucnt == 0 && (d->cs.st == ST_DICT ?
(((b = quick_descriptor(d->cs.bid)) != NULL) && b->tkey) : b->tkey);
+ /* for dict, check the offsets bat for uniqueness */
+ if (d->cs.ucnt == 0 && (d->cs.st == ST_DEFAULT || (b =
quick_descriptor(d->cs.bid)))) {
+ *unique = b->tkey;
+ *unique_est = b->tunique_est;
+ }
if (*nonil && d->cs.ucnt > 0)
*nonil &= ((b = quick_descriptor(d->cs.uvbid))
!= NULL) && b->tnonil && !b->tnil;
}
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
@@ -154,7 +154,7 @@ typedef size_t (*count_idx_fptr) (sql_tr
typedef size_t (*dcount_col_fptr) (sql_trans *tr, sql_column *c);
typedef int (*min_max_col_fptr) (sql_trans *tr, sql_column *c);
typedef int (*prop_col_fptr) (sql_trans *tr, sql_column *c);
-typedef int (*proprec_col_fptr) (sql_trans *tr, sql_column *c, bool *nonil,
bool *unique, ValPtr min, ValPtr max);
+typedef int (*proprec_col_fptr) (sql_trans *tr, sql_column *c, bool *nonil,
bool *unique, double *unique_est, ValPtr min, ValPtr max);
/*
-- create the necessary storage resources for columns, indices and tables
@@ -396,7 +396,7 @@ extern int sql_trans_alter_storage(sql_t
extern int sql_trans_is_sorted(sql_trans *tr, sql_column *col);
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, ValPtr min, ValPtr max);
+extern int sql_trans_col_stats(sql_trans *tr, sql_column *col, bool *nonil,
bool *unique, double *unique_est, ValPtr min, ValPtr max);
extern size_t sql_trans_dist_count(sql_trans *tr, sql_column *col);
extern int sql_trans_ranges(sql_trans *tr, sql_column *col, void **min, void
**max);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -6173,11 +6173,11 @@ sql_trans_is_duplicate_eliminated( sql_t
}
int
-sql_trans_col_stats( sql_trans *tr, sql_column *col, bool *nonil, bool
*unique, ValPtr min, ValPtr max )
+sql_trans_col_stats( sql_trans *tr, sql_column *col, bool *nonil, bool
*unique, double *unique_est, ValPtr min, ValPtr max )
{
sqlstore *store = tr->store;
if (col && isTable(col->t) && store->storage_api.col_stats)
- return store->storage_api.col_stats(tr, col, nonil, unique,
min, max);
+ return store->storage_api.col_stats(tr, col, nonil, unique,
unique_est, min, max);
return 0;
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list