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

Reply via email to