Changeset: 89ca45d79d6b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/89ca45d79d6b
Modified Files:
gdk/CMakeLists.txt
sql/backends/monet5/CMakeLists.txt
sql/backends/monet5/mal_backend.c
sql/backends/monet5/mal_backend.h
sql/backends/monet5/sql_result.c
sql/backends/monet5/sql_result.h
sql/backends/monet5/sql_scenario.c
sql/common/sql_backend.h
Branch: default
Log Message:
make it possible too handle (some queries) using a sub-backend, a fast path.
diffs (truncated from 344 to 300 lines):
diff --git a/gdk/CMakeLists.txt b/gdk/CMakeLists.txt
--- a/gdk/CMakeLists.txt
+++ b/gdk/CMakeLists.txt
@@ -18,6 +18,7 @@ set(gdk_public_headers
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/gdk_utils.h>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/gdk_cand.h>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/gdk_calc.h>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/gdk_time.h>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/gdk.h>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/gdk_system.h>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/gdk_posix.h>
@@ -28,7 +29,8 @@ set(gdk_public_headers
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/gdk_bbp.h>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/gdk_utils.h>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/gdk_calc.h>
- $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/gdk_cand.h>)
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/gdk_cand.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/gdk_time.h>)
add_library(bat SHARED)
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
@@ -8,7 +8,73 @@
set(sql_public_headers
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/sql_import.h>
- $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/sql_import.h>)
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../include/sql_mem.h>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../include/sql_list.h>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../include/sql_hash.h>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../include/sql_stack.h>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../include/sql_catalog.h>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../include/sql_relation.h>
+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../include/exception_buffer.h>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../include/sql_keyword.h>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../common/sql_types.h>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../common/sql_string.h>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../common/sql_backend.h>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../storage/sql_storage.h>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../storage/store_sequence.h>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../server/sql_tokens.h>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../server/sql_scan.h>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../server/sql_atom.h>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../server/sql_symbol.h>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../server/sql_semantic.h>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../server/sql_query.h>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../server/sql_qc.h>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../server/sql_mvc.h>
+ $<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>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../server/rel_rel.h>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../server/rel_basetable.h>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../server/rel_semantic.h>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../../server/rel_dump.h>
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/opt_backend.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/sql_import.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/sql_mem.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/sql_list.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/sql_hash.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/sql_stack.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/sql_catalog.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/sql_relation.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/exception_buffer.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/sql_keyword.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/sql_types.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/sql_string.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/sql_backend.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/sql_storage.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/store_sequence.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/sql_tokens.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/sql_scan.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/sql_atom.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/sql_symbol.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/sql_semantic.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/sql_query.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/sql_qc.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/sql_mvc.h>
+ $<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>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/rel_rel.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/rel_basetable.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/rel_semantic.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/rel_dump.h>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/opt_backend.h>)
#add_library(sql MODULE)
add_library(sql SHARED)
@@ -84,6 +150,7 @@ target_sources(sql
sql_datetrunc.c
sql_rank.c sql_rank.h
sql_subquery.c sql_subquery.h
+ opt_backend.h
${MONETDB_CURRENT_SQL_SOURCES}
PUBLIC
${sql_public_headers})
diff --git a/sql/backends/monet5/mal_backend.c
b/sql/backends/monet5/mal_backend.c
--- a/sql/backends/monet5/mal_backend.c
+++ b/sql/backends/monet5/mal_backend.c
@@ -13,6 +13,8 @@
backend *
backend_reset(backend *b)
{
+ if (b->subbackend)
+ b->subbackend->reset(b->subbackend);
*b = (backend) {
.mvc = b->mvc,
.client = b->client,
@@ -20,6 +22,7 @@ backend_reset(backend *b)
.output_format = OFMT_CSV,
.rowcnt = -1,
.last_id = -1,
+ .subbackend = b->subbackend,
};
return b;
}
@@ -35,11 +38,15 @@ backend_create(mvc *m, Client c)
.mvc = m,
.client = c,
};
+ if (b && be_funcs.sub_backend)
+ b->subbackend = be_funcs.sub_backend(m, c);
return backend_reset(b);
}
void
backend_destroy(backend *b)
{
+ if (b->subbackend)
+ b->subbackend->destroy(b->subbackend);
_DELETE(b);
}
diff --git a/sql/backends/monet5/mal_backend.h
b/sql/backends/monet5/mal_backend.h
--- a/sql/backends/monet5/mal_backend.h
+++ b/sql/backends/monet5/mal_backend.h
@@ -13,6 +13,7 @@
#include "mal_client.h"
#include "sql_mvc.h"
#include "sql_qc.h"
+#include "opt_backend.h"
/*
* The back-end structure collects the information needed to support
@@ -61,6 +62,7 @@ typedef struct backend {
res_table *results;
lng last_id;
lng rowcnt;
+ subbackend *subbackend;
} backend;
extern backend *backend_reset(backend *b);
diff --git a/sql/backends/monet5/sql_result.c b/sql/backends/monet5/sql_result.c
--- a/sql/backends/monet5/sql_result.c
+++ b/sql/backends/monet5/sql_result.c
@@ -1330,15 +1330,14 @@ mvc_export_table_columnar(stream *s, res
}
static int
-mvc_export_table(backend *b, stream *s, res_table *t, BAT *order, BUN offset,
BUN nr, const char *btag, const char *sep, const char *rsep, const char *ssep,
const char *ns)
+mvc_export_table_(mvc *m, int output_format, stream *s, res_table *t, BAT
*order, BUN offset, BUN nr, const char *btag, const char *sep, const char
*rsep, const char *ssep, const char *ns)
{
- mvc *m = b->mvc;
Tablet as;
Column *fmt;
int i, ok = 0;
struct time_res *tres;
- int csv = (b->output_format == OFMT_CSV);
- int json = (b->output_format == OFMT_JSON);
+ int csv = (output_format == OFMT_CSV);
+ int json = (output_format == OFMT_JSON);
char *bj;
if (!s || !t)
@@ -1470,6 +1469,28 @@ mvc_export_table(backend *b, stream *s,
return 0;
}
+static int
+mvc_export_table(backend *b, stream *s, res_table *t, BAT *order, BUN offset,
BUN nr, const char *btag, const char *sep, const char *rsep, const char *ssep,
const char *ns)
+{
+ return mvc_export_table_(b->mvc, b->output_format, s, t, order, offset,
nr, btag, sep, rsep, ssep, ns);
+}
+
+int
+mvc_export(mvc *m, stream *s, res_table *t, BUN nr)
+{
+ backend b;
+ b.mvc = m;
+ b.results = t;
+ b.reloptimizer = 0;
+ t->order = t->cols[0].b;
+ t->nr_rows = nr;
+ BBPretain(t->order);
+ if (mvc_export_head(&b, s, t->id, TRUE, TRUE, 0/*starttime*/,
0/*maloptimizer*/) < 0)
+ return -1;
+ return mvc_export_table_(m, OFMT_CSV, s, t, BBPquickdesc(t->cols[0].b),
0, nr, "[ ", ",\t", "\t]\n", "\"", "NULL");
+}
+
+
static lng
get_print_width(int mtype, sql_class eclass, int digits, int scale, int tz,
bat bid, ptr p)
{
@@ -1655,13 +1676,11 @@ mvc_export_operation(backend *b, stream
return 0;
}
+
int
-mvc_export_affrows(backend *b, stream *s, lng val, str w, oid query_id, lng
starttime, lng maloptimizer)
+mvc_affrows(mvc *m, stream *s, lng val, str w, oid query_id, lng last_id, lng
starttime, lng maloptimizer, lng reloptimizer)
{
- mvc *m = b->mvc;
-
- b->rowcnt = val;
- sqlvar_set_number(find_global_var(m, mvc_bind_schema(m, "sys"),
"rowcnt"), b->rowcnt);
+ sqlvar_set_number(find_global_var(m, mvc_bind_schema(m, "sys"),
"rowcnt"), val);
/* if we don't have a stream, nothing can go wrong, so we return
* success. This is especially vital for execution of internal SQL
@@ -1674,7 +1693,7 @@ mvc_export_affrows(backend *b, stream *s
if (mnstr_write(s, "&2 ", 3, 1) != 1 ||
mvc_send_lng(s, val) != 1 ||
mnstr_write(s, " ", 1, 1) != 1 ||
- mvc_send_lng(s, b->last_id) != 1 ||
+ mvc_send_lng(s, last_id) != 1 ||
mnstr_write(s, " ", 1, 1) != 1 ||
mvc_send_lng(s, (lng) query_id) != 1 ||
mnstr_write(s, " ", 1, 1) != 1 ||
@@ -1682,7 +1701,7 @@ mvc_export_affrows(backend *b, stream *s
mnstr_write(s, " ", 1, 1) != 1 ||
mvc_send_lng(s, maloptimizer) != 1 ||
mnstr_write(s, " ", 1, 1) != 1 ||
- mvc_send_lng(s, b->reloptimizer) != 1 ||
+ mvc_send_lng(s, reloptimizer) != 1 ||
mnstr_write(s, "\n", 1, 1) != 1)
return -4;
if (mvc_export_warning(s, w) != 1)
@@ -1691,6 +1710,13 @@ mvc_export_affrows(backend *b, stream *s
return 0;
}
+int
+mvc_export_affrows(backend *b, stream *s, lng val, str w, oid query_id, lng
starttime, lng maloptimizer)
+{
+ b->rowcnt = val;
+ return mvc_affrows(b->mvc, s, val, w, query_id, b->last_id, starttime,
maloptimizer, b->reloptimizer);
+}
+
static int
export_error(BAT *order)
{
diff --git a/sql/backends/monet5/sql_result.h b/sql/backends/monet5/sql_result.h
--- a/sql/backends/monet5/sql_result.h
+++ b/sql/backends/monet5/sql_result.h
@@ -17,6 +17,7 @@
#include "sql_qc.h"
#include "sql_parser.h" /* sql_error */
+extern int mvc_affrows(mvc *c, stream *s, lng val, str w, oid query_id, lng
last_id, lng starttime, lng maloptimizer, lng reloptimizer);
extern int mvc_export_affrows(backend *b, stream *s, lng val, str w, oid
query_id, lng starttime, lng maloptimizer);
extern int mvc_export_operation(backend *b, stream *s, str w, lng starttime,
lng maloptimizer);
extern int mvc_export_result(backend *b, stream *s, int res_id, bool header,
lng starttime, lng maloptimizer);
@@ -42,5 +43,6 @@ extern int mvc_result_value(backend *be,
extern const char *mvc_export_error(backend *be, stream *s, int err_code);
extern ssize_t convert2str(mvc *m, sql_class eclass, int d, int sc, int
has_tz, ptr p, int mtype, char **buf, size_t *len);
+extern int mvc_export(mvc *m, stream *s, res_table *t, BUN nr);
#endif /* sql_result_H */
diff --git a/sql/backends/monet5/sql_scenario.c
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -402,11 +402,9 @@ SQLinit(Client c)
return MAL_SUCCEED;
}
- be_funcs = (backend_functions) {
- .fcode = &monet5_freecode,
- .fresolve_function = &monet5_resolve_function,
- .fhas_module_function = &monet5_has_module,
- };
+ be_funcs.fcode = &monet5_freecode,
+ be_funcs.fresolve_function = &monet5_resolve_function,
+ be_funcs.fhas_module_function = &monet5_has_module,
monet5_user_init(&be_funcs);
if (debug_str)
@@ -1177,6 +1175,17 @@ SQLparser(Client c)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list