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 -- [email protected]
To unsubscribe send an email to [email protected]