Changeset: 62d576a33964 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/62d576a33964
Removed Files:
sql/server/rel_partition.c
sql/server/rel_partition.h
Modified Files:
sql/backends/monet5/CMakeLists.txt
sql/backends/monet5/rel_physical.c
sql/backends/monet5/sql.c
sql/server/CMakeLists.txt
Branch: default
Log Message:
moved rel_partition into rel_physical
diffs (truncated from 678 to 300 lines):
diff --git a/sql/backends/monet5/CMakeLists.txt
b/sql/backends/monet5/CMakeLists.txt
--- a/sql/backends/monet5/CMakeLists.txt
+++ b/sql/backends/monet5/CMakeLists.txt
@@ -37,7 +37,6 @@ set(sql_public_headers
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../server/rel_file_loader.h>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../server/rel_optimizer.h>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../server/rel_rewriter.h>
- $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../server/rel_partition.h>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../server/rel_prop.h>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../server/rel_exp.h>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../server/rel_rel.h>
@@ -71,7 +70,6 @@ set(sql_public_headers
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/sql_parser.h>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/sql_privileges.h>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/rel_optimizer.h>
- $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/rel_partition.h>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/rel_prop.h>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/rel_exp.h>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/rel_rel.h>
diff --git a/sql/backends/monet5/rel_physical.c
b/sql/backends/monet5/rel_physical.c
--- a/sql/backends/monet5/rel_physical.c
+++ b/sql/backends/monet5/rel_physical.c
@@ -16,11 +16,274 @@
#include "rel_rewriter.h"
#include "rel_exp.h"
#include "rel_rel.h"
+#include "sql_storage.h"
+#include "rel_bin.h"
#define IS_ORDER_BASED_AGGR(fname, argc) (\
(argc == 2 && (strcmp((fname), "quantile") == 0
|| strcmp((fname), "quantile_avg") == 0)) || \
(argc == 1 && (strcmp((fname), "median") == 0
|| strcmp((fname), "median_avg") == 0)))
+
+/* Returns the row count of a base table or any count info we can get fom the
+ * PROP_COUNT of this 'rel' (i.e. get_rel_count()). */
+static lng
+rel_getcount(mvc *sql, sql_rel *rel)
+{
+ if (!sql->session->tr)
+ return 0;
+
+ switch(rel->op) {
+ case op_basetable: {
+ sql_table *t = rel->l;
+
+ if (t && isTable(t) && t->persistence != SQL_DECLARED_TABLE) {
+ sqlstore *store = sql->session->tr->store;
+ lng nr =
(lng)store->storage_api.count_col(sql->session->tr,
ol_first_node(t->columns)->data, 0);
+ assert(nr >= 0);
+ return nr;
+ }
+ return 0;
+ }
+ case op_groupby:
+ if (rel->l && rel->r)
+ return rel_getcount(sql, rel->l);
+ return 1; /* Global GROUP BY always returns 1 row. */
+ default:
+ if (rel->l)
+ return rel_getcount(sql, rel->l);
+ if (rel->p)
+ return get_rel_count(rel);
+ return 0;
+ }
+}
+
+static void
+find_basetables(mvc *sql, sql_rel *rel, list *tables )
+{
+ if (mvc_highwater(sql)) {
+ (void) sql_error(sql, 10, SQLSTATE(42000) "Query too complex:
running out of stack space");
+ return;
+ }
+
+ if (!rel)
+ return;
+ switch (rel->op) {
+ case op_basetable: {
+ sql_table *t = rel->l;
+
+ if (t && isTable(t))
+ append(tables, rel);
+ break;
+ }
+ case op_table:
+ if (IS_TABLE_PROD_FUNC(rel->flag) || rel->flag ==
TABLE_FROM_RELATION)
+ if (rel->l)
+ find_basetables(sql, rel->l, tables);
+ break;
+ case op_join:
+ case op_left:
+ case op_right:
+ case op_full:
+ case op_inter:
+ case op_except:
+ case op_insert:
+ case op_update:
+ case op_delete:
+ case op_merge:
+ if (rel->l)
+ find_basetables(sql, rel->l, tables);
+ if (rel->r)
+ find_basetables(sql, rel->r, tables);
+ break;
+ case op_munion:
+ assert(rel->l);
+ for (node *n = ((list*)rel->l)->h; n; n = n->next)
+ find_basetables(sql, n->data, tables);
+ break;
+ case op_semi:
+ case op_anti:
+ case op_groupby:
+ case op_project:
+ case op_select:
+ case op_topn:
+ case op_sample:
+ case op_truncate:
+ if (rel->l)
+ find_basetables(sql, rel->l, tables);
+ break;
+ case op_ddl:
+ if (rel->flag == ddl_output || rel->flag == ddl_create_seq ||
rel->flag == ddl_alter_seq/* || rel->flag == ddl_alter_table || rel->flag ==
ddl_create_table || rel->flag == ddl_create_view*/) {
+ if (rel->l)
+ find_basetables(sql, rel->l, tables);
+ } else if (rel->flag == ddl_list || rel->flag == ddl_exception)
{
+ if (rel->l)
+ find_basetables(sql, rel->l, tables);
+ if (rel->r)
+ find_basetables(sql, rel->r, tables);
+ }
+ break;
+ }
+}
+
+static sql_rel *
+_rel_partition(mvc *sql, sql_rel *rel)
+{
+ list *tables = sa_list(sql->sa);
+ /* find basetable relations */
+ /* mark one (largest) with REL_PARTITION */
+ find_basetables(sql, rel, tables);
+ if (list_length(tables)) {
+ sql_rel *r;
+ node *n;
+ int i, mi = 0;
+ lng *sizes = SA_NEW_ARRAY(sql->sa, lng, list_length(tables)), m
= 0;
+
+ for(i=0, n = tables->h; n; i++, n = n->next) {
+ r = n->data;
+ sizes[i] = rel_getcount(sql, r);
+ if (sizes[i] > m) {
+ m = sizes[i];
+ mi = i;
+ }
+ }
+ for(i=0, n = tables->h; i<mi; i++, n = n->next)
+ ;
+ r = n->data;
+ /* TODO, we now pick first (okay?)! In case of self joins we
need to pick the correct table */
+ r->flag = REL_PARTITION;
+ }
+ return rel;
+}
+
+static int
+has_groupby(sql_rel *rel)
+{
+ if (!rel)
+ return 0;
+
+ switch (rel->op) {
+ case op_groupby:
+ return 1;
+ case op_join:
+ case op_left:
+ case op_right:
+ case op_full:
+
+ case op_semi:
+ case op_anti:
+
+ case op_inter:
+ case op_except:
+
+ case op_merge:
+ return has_groupby(rel->l) || has_groupby(rel->r);
+ case op_munion:
+ for (node *n = ((list*)rel->l)->h; n; n = n->next)
+ if (has_groupby(n->data))
+ return 1;
+ return 0;
+ case op_project:
+ case op_select:
+ case op_topn:
+ case op_sample:
+ return has_groupby(rel->l);
+ case op_insert:
+ case op_update:
+ case op_delete:
+ case op_truncate:
+ return has_groupby(rel->r);
+ case op_ddl:
+ if (rel->flag == ddl_output || rel->flag ==
ddl_create_seq || rel->flag == ddl_alter_seq || rel->flag == ddl_alter_table ||
rel->flag == ddl_create_table || rel->flag == ddl_create_view)
+ return has_groupby(rel->l);
+ if (rel->flag == ddl_list || rel->flag == ddl_exception)
+ return has_groupby(rel->l) ||
has_groupby(rel->r);
+ return 0;
+ case op_table:
+ if (IS_TABLE_PROD_FUNC(rel->flag) || rel->flag ==
TABLE_FROM_RELATION)
+ return has_groupby(rel->l);
+ return 0;
+ case op_basetable:
+ return 0;
+ }
+ return 0;
+}
+
+static sql_rel *
+rel_partition(mvc *sql, sql_rel *rel)
+{
+ if (mvc_highwater(sql))
+ return sql_error(sql, 10, SQLSTATE(42000) "Query too complex:
running out of stack space");
+
+ switch (rel->op) {
+ case op_basetable:
+ case op_sample:
+ rel->flag = REL_PARTITION;
+ break;
+ case op_project:
+ case op_select:
+ case op_groupby:
+ case op_topn:
+ if (rel->l)
+ rel_partition(sql, rel->l);
+ break;
+ case op_semi:
+ case op_anti:
+
+ case op_inter:
+ case op_except:
+
+ case op_merge:
+ if (rel->l)
+ rel_partition(sql, rel->l);
+ if (rel->r)
+ rel_partition(sql, rel->r);
+ break;
+ case op_munion:
+ for (node *n = ((list*)rel->l)->h; n; n = n->next)
+ rel_partition(sql, n->data);
+ break;
+ case op_insert:
+ case op_update:
+ case op_delete:
+ case op_truncate:
+ if (rel->r && rel->card <= CARD_AGGR)
+ rel_partition(sql, rel->r);
+ break;
+ case op_join:
+ case op_left:
+ case op_right:
+ case op_full:
+ if (has_groupby(rel->l) || has_groupby(rel->r)) {
+ if (rel->l)
+ rel_partition(sql, rel->l);
+ if (rel->r)
+ rel_partition(sql, rel->r);
+ } else {
+ _rel_partition(sql, rel);
+ }
+ break;
+ case op_ddl:
+ if (rel->flag == ddl_output || rel->flag == ddl_create_seq ||
rel->flag == ddl_alter_seq || rel->flag == ddl_alter_table || rel->flag ==
ddl_create_table || rel->flag == ddl_create_view) {
+ if (rel->l)
+ rel_partition(sql, rel->l);
+ } else if (rel->flag == ddl_list || rel->flag == ddl_exception)
{
+ if (rel->l)
+ rel_partition(sql, rel->l);
+ if (rel->r)
+ rel_partition(sql, rel->r);
+ }
+ break;
+ case op_table:
+ if ((IS_TABLE_PROD_FUNC(rel->flag) || rel->flag ==
TABLE_FROM_RELATION) && rel->l)
+ rel_partition(sql, rel->l);
+ break;
+ default:
+ assert(0);
+ break;
+ }
+ return rel;
+}
+
static sql_rel *
rel_add_orderby(visitor *v, sql_rel *rel)
{
@@ -97,6 +360,8 @@ rel_physical(mvc *sql, sql_rel *rel)
visitor v = { .sql = sql };
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]