Changeset: fe04ef515bc2 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/fe04ef515bc2 Removed Files: sql/server/rel_distribute.h Modified Files: sql/backends/monet5/CMakeLists.txt sql/server/CMakeLists.txt sql/server/rel_distribute.c sql/server/rel_optimizer.c sql/server/rel_optimizer_private.h Branch: sqloptimizer Log Message:
Add remote/replica tables rewriters to the post optimizer pipeline. Hide more symbols diffs (267 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 @@ -32,7 +32,6 @@ set(sql_public_headers $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../server/sql_parser.h> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../server/sql_privileges.h> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../server/rel_optimizer.h> - $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../server/rel_distribute.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> @@ -66,7 +65,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_distribute.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> diff --git a/sql/server/CMakeLists.txt b/sql/server/CMakeLists.txt --- a/sql/server/CMakeLists.txt +++ b/sql/server/CMakeLists.txt @@ -64,7 +64,6 @@ target_sources(sqlserver rel_optimizer.h rel_optimizer_private.h rel_partition.h - rel_distribute.h rel_prop.h rel_schema.h rel_select.h diff --git a/sql/server/rel_distribute.c b/sql/server/rel_distribute.c --- a/sql/server/rel_distribute.c +++ b/sql/server/rel_distribute.c @@ -7,11 +7,11 @@ */ #include "monetdb_config.h" -#include "rel_distribute.h" #include "rel_rel.h" #include "rel_basetable.h" #include "rel_exp.h" #include "sql_privileges.h" +#include "rel_optimizer_private.h" static int has_remote_or_replica( sql_rel *rel ) @@ -158,8 +158,8 @@ replica_rewrite(visitor *v, sql_table *t return res; } -sql_rel * -rel_rewrite_replica(visitor *v, sql_rel *rel) +static sql_rel * +rel_rewrite_replica_(visitor *v, sql_rel *rel) { /* for merge statement join, ignore the multiple references */ if (rel_is_ref(rel) && !(rel->flag&MERGE_LEFT)) { @@ -187,8 +187,23 @@ rel_rewrite_replica(visitor *v, sql_rel return rel; } -sql_rel * -rel_rewrite_remote(visitor *v, sql_rel *rel) +static sql_rel * +rel_rewrite_replica(visitor *v, global_props *gp, sql_rel *rel) +{ + (void) gp; + return rel_visitor_bottomup(v, rel, &rel_rewrite_replica_); +} + +run_optimizer +bind_rewrite_replica(visitor *v, global_props *gp) +{ + (void) v; + return gp->needs_mergetable_rewrite || gp->needs_remote_replica_rewrite ? rel_rewrite_replica : NULL; +} + + +static sql_rel * +rel_rewrite_remote_(visitor *v, sql_rel *rel) { prop *p, *pl, *pr; @@ -248,9 +263,9 @@ rel_rewrite_remote(visitor *v, sql_rel * /* cleanup replica's */ visitor rv = { .sql = v->sql }; - l = rel->l = rel_visitor_bottomup(&rv, l, &rel_rewrite_replica); + l = rel->l = rel_visitor_bottomup(&rv, l, &rel_rewrite_replica_); rv.data = NULL; - r = rel->r = rel_visitor_bottomup(&rv, r, &rel_rewrite_replica); + r = rel->r = rel_visitor_bottomup(&rv, r, &rel_rewrite_replica_); if ((!l || !r) && v->sql->session->status) /* if the recursive calls failed */ return NULL; } @@ -259,20 +274,20 @@ rel_rewrite_remote(visitor *v, sql_rel * find_prop(r->p, PROP_REMOTE) == NULL) { visitor rv = { .sql = v->sql, .data = pl->value }; - if (!(r = rel_visitor_bottomup(&rv, r, &rel_rewrite_replica)) && v->sql->session->status) + if (!(r = rel_visitor_bottomup(&rv, r, &rel_rewrite_replica_)) && v->sql->session->status) return NULL; rv.data = NULL; - if (!(r = rel->r = rel_visitor_bottomup(&rv, r, &rel_rewrite_remote)) && v->sql->session->status) + if (!(r = rel->r = rel_visitor_bottomup(&rv, r, &rel_rewrite_remote_)) && v->sql->session->status) return NULL; } else if ((is_join(rel->op) || is_semi(rel->op) || is_set(rel->op)) && find_prop(l->p, PROP_REMOTE) == NULL && (pr = find_prop(r->p, PROP_REMOTE)) != NULL) { visitor rv = { .sql = v->sql, .data = pr->value }; - if (!(l = rel_visitor_bottomup(&rv, l, &rel_rewrite_replica)) && v->sql->session->status) + if (!(l = rel_visitor_bottomup(&rv, l, &rel_rewrite_replica_)) && v->sql->session->status) return NULL; rv.data = NULL; - if (!(l = rel->l = rel_visitor_bottomup(&rv, l, &rel_rewrite_remote)) && v->sql->session->status) + if (!(l = rel->l = rel_visitor_bottomup(&rv, l, &rel_rewrite_remote_)) && v->sql->session->status) return NULL; } @@ -330,8 +345,23 @@ rel_rewrite_remote(visitor *v, sql_rel * return rel; } -sql_rel * -rel_remote_func(visitor *v, sql_rel *rel) +static sql_rel * +rel_rewrite_remote(visitor *v, global_props *gp, sql_rel *rel) +{ + (void) gp; + return rel_visitor_bottomup(v, rel, &rel_rewrite_remote_); +} + +run_optimizer +bind_rewrite_remote(visitor *v, global_props *gp) +{ + (void) v; + return gp->needs_mergetable_rewrite || gp->needs_remote_replica_rewrite ? rel_rewrite_remote : NULL; +} + + +static sql_rel * +rel_remote_func_(visitor *v, sql_rel *rel) { (void) v; @@ -346,3 +376,17 @@ rel_remote_func(visitor *v, sql_rel *rel } return rel; } + +static sql_rel * +rel_remote_func(visitor *v, global_props *gp, sql_rel *rel) +{ + (void) gp; + return rel_visitor_bottomup(v, rel, &rel_remote_func_); +} + +run_optimizer +bind_remote_func(visitor *v, global_props *gp) +{ + (void) v; + return gp->needs_mergetable_rewrite || gp->needs_remote_replica_rewrite ? rel_remote_func : NULL; +} diff --git a/sql/server/rel_distribute.h b/sql/server/rel_distribute.h deleted file mode 100644 --- a/sql/server/rel_distribute.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright 1997 - July 2008 CWI, August 2008 - 2022 MonetDB B.V. - */ - -#ifndef _REL_DISTRIBUTE_H_ -#define _REL_DISTRIBUTE_H_ - -#include "sql_relation.h" -#include "rel_rel.h" -#include "sql_mvc.h" - -extern sql_rel *rel_rewrite_remote(visitor *v, sql_rel *rel); -extern sql_rel *rel_rewrite_replica(visitor *v, sql_rel *rel); -extern sql_rel *rel_remote_func(visitor *v, sql_rel *rel); - -#endif /*_REL_DISTRIBUTE_H_*/ 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 @@ -17,7 +17,6 @@ #include "rel_select.h" #include "rel_planner.h" #include "rel_propagate.h" -#include "rel_distribute.h" #include "rel_rewriter.h" #include "sql_mvc.h" #include "sql_privileges.h" @@ -664,10 +663,15 @@ const sql_optimizer pre_sql_optimizers[] const sql_optimizer post_sql_optimizers[] = { {22, "push_select_up", bind_push_select_up}, /* run rel_push_select_up only once at the end to avoid an infinite optimization loop */ {23, "setjoins_2_joingroupby", bind_setjoins_2_joingroupby}, + /* Merge table rewrites may introduce remote or replica tables */ + /* At the moment, make sure the remote table rewriters always run last */ + {24, "rewrite_remote", bind_rewrite_remote}, + {25, "rewrite_replica", bind_rewrite_replica}, + {26, "remote_func", bind_remote_func}, { 0, NULL, NULL} }; -#define NOPTIMIZERS 24 +#define NREWRITERS 27 /* make sure the outer project (without order by or distinct) has all the aliases */ static sql_rel * @@ -753,7 +757,7 @@ rel_optimizer(mvc *sql, sql_rel *rel, in if (!(rel = rel_keep_renames(sql, rel))) return rel; - sql_optimizer_run *runs = profile ? sa_zalloc(sql->ta, NOPTIMIZERS * sizeof(sql_optimizer_run)) : NULL; + sql_optimizer_run *runs = profile ? sa_zalloc(sql->ta, NREWRITERS * sizeof(sql_optimizer_run)) : NULL; for ( ;rel && gp.opt_cycle < 20 && v.changes; gp.opt_cycle++) { v.changes = 0; gp = (global_props) {.cnt = {0}, .instantiate = (uint8_t)instantiate, .opt_cycle = gp.opt_cycle}; @@ -769,13 +773,5 @@ rel_optimizer(mvc *sql, sql_rel *rel, in /* these optimizers run statistics gathered by the last optimization cycle */ rel = run_optimizer_set(&v, runs, rel, &gp, post_sql_optimizers); - - /* merge table rewrites may introduce remote or replica tables */ - /* at the moment, make sure the remote table rewriters always run last */ - if (gp.needs_mergetable_rewrite || gp.needs_remote_replica_rewrite) { - rel = rel_visitor_bottomup(&v, rel, &rel_rewrite_remote); - rel = rel_visitor_bottomup(&v, rel, &rel_rewrite_replica); - rel = rel_visitor_bottomup(&v, rel, &rel_remote_func); - } return rel; } diff --git a/sql/server/rel_optimizer_private.h b/sql/server/rel_optimizer_private.h --- a/sql/server/rel_optimizer_private.h +++ b/sql/server/rel_optimizer_private.h @@ -6,11 +6,11 @@ * Copyright 1997 - July 2008 CWI, August 2008 - 2022 MonetDB B.V. */ -#include "monetdb_config.h" -#include "rel_optimizer.h" #include "rel_rel.h" #include "sql_mvc.h" +/* This file should be included by SQL optimizers or essential rewriters only! */ + /* relations counts */ typedef struct global_props { int cnt[ddl_maxops]; @@ -82,6 +82,9 @@ extern run_optimizer bind_distinct_proje extern run_optimizer bind_push_select_up(visitor *v, global_props *gp) __attribute__((__visibility__("hidden"))); extern run_optimizer bind_merge_table_rewrite(visitor *v, global_props *gp) __attribute__((__visibility__("hidden"))); extern run_optimizer bind_setjoins_2_joingroupby(visitor *v, global_props *gp) __attribute__((__visibility__("hidden"))); +extern run_optimizer bind_rewrite_remote(visitor *v, global_props *gp) __attribute__((__visibility__("hidden"))); +extern run_optimizer bind_rewrite_replica(visitor *v, global_props *gp) __attribute__((__visibility__("hidden"))); +extern run_optimizer bind_remote_func(visitor *v, global_props *gp) __attribute__((__visibility__("hidden"))); extern sql_rel *rel_split_project_(visitor *v, sql_rel *rel, int top) __attribute__((__visibility__("hidden"))); extern sql_exp *exp_push_down_prj(mvc *sql, sql_exp *e, sql_rel *f, sql_rel *t) __attribute__((__visibility__("hidden"))); _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org