Changeset: a58d9350b1bf for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a58d9350b1bf
Added Files:
        sql/common/exception_buffer.c
        sql/include/exception_buffer.h
Modified Files:
        sql/backends/monet5/mal_backend.c
        sql/backends/monet5/mal_backend.h
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql.h
        sql/backends/monet5/sql_cat.c
        sql/backends/monet5/sql_execute.c
        sql/backends/monet5/sql_optimizer.c
        sql/backends/monet5/sql_result.c
        sql/backends/monet5/sql_result.h
        sql/backends/monet5/sql_scenario.c
        sql/common/Makefile.ag
        sql/common/sql_mem.c
        sql/include/Makefile.ag
        sql/include/sql_mem.h
        sql/server/rel_optimizer.c
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
        sql/storage/store.c
Branch: context
Log Message:

move more backend only stuf from the mvc structure into the backend structure.
Added exception_buffer (and first calls to setjmp/longjmp)


diffs (truncated from 1551 to 300 lines):

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
@@ -16,7 +16,7 @@ backend_reset(backend *b)
        b->out = b->client->fdout;
        b->language = 0;
        b->depth = 0;
-
+       b->remote = 0;
        b->vtop = 0;
        b->q = NULL;
        b->mb = NULL;
@@ -24,6 +24,11 @@ backend_reset(backend *b)
        b->cur_append = 0;
        b->first_statement_generated = false;
        b->output_format = OFMT_CSV;
+       b->result_id = 0;
+       b->results = NULL;
+       b->rowcnt = b->last_id = -1;
+       b->sizeheader = false;
+       b->reloptimizer = 0;
        return b;
 }
 
@@ -39,7 +44,6 @@ backend_create(mvc *m, Client c)
        b->client = c;
        b->mvc_var = 0;
        b->cur_append = 0;
-       b->first_statement_generated = false;
        b->output_format = OFMT_CSV;
        return backend_reset(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
@@ -26,29 +26,38 @@
  */
 
 typedef enum output_format {
-       OFMT_CSV  =     0,
-       OFMT_JSON =     1,
+       OFMT_CSV  = 0,
+       OFMT_JSON = 1,
        OFMT_NONE = 3
 } ofmt;
 
-/* The cur_append variable on an insert/update/delete on a partitioned table, 
tracks the current MAL variable holding
- * the total number of rows affected. The first_statement_generated looks if 
the first of the sub-statements was
- * generated or not */
-
 typedef struct backend {
-       bool    console;
        char    language;               /* 'S' or 's' or 'X' */
        char    depth;
-       bool    first_statement_generated;
+       int     remote;                 /* counter to make remote function 
names unique */
        mvc     *mvc;
        stream  *out;
        ofmt    output_format;  /* csv, json */
        Client  client;
        MalBlkPtr mb;           /* needed during mal generation */
-       int     mvc_var;
-       int     cur_append;
+
+       int     mvc_var;        /* current variable holding the latest query 
context (used to create dependencies in mal statements) */
+       int     cur_append;     /* The cur_append variable on an 
insert/update/delete on a partitioned table, tracks the current MAL variable 
holding
+                                * the total number of rows affected. The 
first_statement_generated looks if the first of the sub-statements was 
generated or not */
        int     vtop;           /* top of the variable stack before the current 
function */
+       int     join_idx;       /* number of index joins (used in rel_bin) */
+       lng     reloptimizer;   /* timer for optimizer phase */
+
+       bool sizeheader:1,      /* print size header in result set */
+               no_mitosis:1,   /* run query without mitosis */
+               first_statement_generated:1,
+               console:1;
        cq      *q;             /* pointer to the cached query */
+
+       int result_id;
+       res_table *results;
+       lng last_id;
+       lng rowcnt;
 } backend;
 
 extern backend *backend_reset(backend *b);
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -869,7 +869,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
 
                /* mark use of join indices */
                if (right && find_prop(e->p, PROP_JOINIDX) != NULL) 
-                       sql->opt_stats[0]++; 
+                       be->join_idx++; 
 
                if (!l) {
                        l = exp_bin(be, e->l, left, NULL, grp, ext, cnt, sel);
@@ -1671,7 +1671,7 @@ rel2bin_table(backend *be, sql_rel *rel,
                char name[16], *nme;
                sql_rel *fr;
 
-               nme = number2name(name, 16, ++sql->remote);
+               nme = number2name(name, 16, ++be->remote);
 
                l = rel2bin_args(be, rel->l, sa_list(sql->sa));
                if(!l)
@@ -1925,7 +1925,7 @@ rel2bin_join(backend *be, sql_rel *rel, 
 
                /* generate a relational join */
                for( en = rel->exps->h; en; en = en->next ) {
-                       int join_idx = sql->opt_stats[0];
+                       int join_idx = be->join_idx;
                        sql_exp *e = en->data;
                        stmt *s = NULL;
                        prop *p;
@@ -1963,7 +1963,7 @@ rel2bin_join(backend *be, sql_rel *rel, 
                                assert(0);
                                return NULL;
                        }
-                       if (join_idx != sql->opt_stats[0])
+                       if (join_idx != be->join_idx)
                                idx = 1;
 
                        if (s->type != st_join && 
@@ -2273,7 +2273,7 @@ rel2bin_semijoin(backend *be, sql_rel *r
                list *rje = sa_list(sql->sa);
 
                for( en = rel->exps->h; en; en = en->next ) {
-                       int join_idx = sql->opt_stats[0];
+                       int join_idx = be->join_idx;
                        sql_exp *e = en->data;
                        stmt *s = NULL;
 
@@ -2290,7 +2290,7 @@ rel2bin_semijoin(backend *be, sql_rel *r
                                assert(0);
                                return NULL;
                        }
-                       if (join_idx != sql->opt_stats[0])
+                       if (join_idx != be->join_idx)
                                idx = 1;
                        /* stop on first non equality join */
                        if (!join) {
@@ -3270,7 +3270,7 @@ sql_parse(backend *be, sql_allocator *sa
        m->errstr[ERRSIZE-1] = '\0';
 
        /* create private allocator */
-       m->sa = (sa)?sa:sa_create();
+       m->sa = (sa)?sa:sa_create(m->eb);
        if (!m->sa) {
                bstream_destroy(bst);
                *m = *o;
@@ -5643,6 +5643,7 @@ output_rel_bin(backend *be, sql_rel *rel
        int sqltype = sql->type;
        stmt *s;
 
+       be->join_idx = 0;
        if (refs == NULL)
                return NULL;
        s = subrel_bin(be, rel, refs);
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -113,22 +113,25 @@ rel_need_distinct_query(sql_rel *rel)
 }
 
 sql_rel *
-sql_symbol2relation(mvc *c, symbol *sym)
+sql_symbol2relation(backend *be, symbol *sym)
 {
        sql_rel *r;
-       sql_query *query = query_create(c);
+       sql_query *query = query_create(be->mvc);
+       lng Tbegin;
 
        r = rel_semantic(query, sym);
        if (r)
-               r = rel_unnest(c, r);
+               r = rel_unnest(be->mvc, r);
+       Tbegin = GDKusec();
        if (r)
-               r = rel_optimizer(c, r, 1);
+               r = rel_optimizer(be->mvc, r, 1);
        if (r)
-               r = rel_distribute(c, r);
+               r = rel_distribute(be->mvc, r);
        if (r)
-               r = rel_partition(c, r);
+               r = rel_partition(be->mvc, r);
        if (r && (rel_no_mitosis(r) || rel_need_distinct_query(r)))
-               c->no_mitosis = 1;
+               be->no_mitosis = 1;
+       be->reloptimizer += GDKusec() - Tbegin;
        return r;
 }
 
@@ -138,34 +141,34 @@ sql_symbol2relation(mvc *c, symbol *sym)
  * the transaction as well, e.g. commit or rollback.
  */
 int
-sqlcleanup(mvc *c, int err)
+sqlcleanup(backend *be, int err)
 {
-       sql_destroy_params(c);
-       sql_destroy_args(c);
-
-       if ((c->emod & mod_locked) == mod_locked) {
+       sql_destroy_params(be->mvc);
+       sql_destroy_args(be->mvc);
+
+       if ((be->mvc->emod & mod_locked) == mod_locked) {
                /* here we should commit the transaction */
                if (!err) {
-                       sql_trans_commit(c->session->tr);
+                       sql_trans_commit(be->mvc->session->tr);
                        /* write changes to disk */
-                       sql_trans_end(c->session);
+                       sql_trans_end(be->mvc->session);
                        store_apply_deltas();
-                       sql_trans_begin(c->session);
+                       sql_trans_begin(be->mvc->session);
                }
                store_unlock();
-               c->emod = 0;
+               be->mvc->emod = 0;
        }
        /* some statements dynamically disable caching */
-       c->sym = NULL;
-       if (c->sa)
-               c->sa = sa_reset(c->sa);
+       be->mvc->sym = NULL;
+       if (be->mvc->sa)
+               be->mvc->sa = sa_reset(be->mvc->sa);
        if (err >0)
-               c->session->status = -err;
+               be->mvc->session->status = -err;
        if (err <0)
-               c->session->status = err;
-       c->label = 0;
-       c->no_mitosis = 0;
-       scanner_query_processed(&(c->scanner));
+               be->mvc->session->status = err;
+       be->mvc->label = 0;
+       be->no_mitosis = 0;
+       scanner_query_processed(&(be->mvc->scanner));
        return err;
 }
 
@@ -190,6 +193,17 @@ checkSQLContext(Client cntxt)
        return MAL_SUCCEED;
 }
 
+static str
+getBackendContext(Client cntxt, backend **be)
+{
+       str msg;
+
+       if ((msg = checkSQLContext(cntxt)) != MAL_SUCCEED)
+               return msg;
+       *be = (backend *) cntxt->sqlcontext;
+       return MAL_SUCCEED;
+}
+
 str
 getSQLContext(Client cntxt, MalBlkPtr mb, mvc **c, backend **b)
 {
@@ -310,7 +324,7 @@ create_table_or_view(mvc *sql, char* sna
                        sql_rel *r = NULL;
                        list *id_l;
 
-                       sql->sa = sa_create();
+                       sql->sa = sa_create(sql->eb);
                        if(!sql->sa) {
                                sql->sa = osa;
                                throw(SQL, "sql.catalog",SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
@@ -360,7 +374,7 @@ create_table_or_view(mvc *sql, char* sna
 
                nt->part.pexp->exp = sa_strdup(sql->session->tr->sa, 
t->part.pexp->exp);
 
-               sql->sa = sa_create();
+               sql->sa = sa_create(sql->eb);
                if(!sql->sa) {
                        sql->sa = osa;
                        throw(SQL, "sql.catalog",SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
@@ -394,7 +408,7 @@ create_table_or_view(mvc *sql, char* sna
                        sql_key *k = n->data;
                        char *err = NULL;
 
-                       sql->sa = sa_create();
+                       sql->sa = sa_create(sql->eb);
                        if(!sql->sa) {
                                sql->sa = osa;
                                throw(SQL, "sql.catalog",SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
@@ -426,7 +440,7 @@ create_table_or_view(mvc *sql, char* sna
        if (nt->query && isView(nt)) {
                sql_rel *r = NULL;
 
-               sql->sa = sa_create();
+               sql->sa = sa_create(sql->eb);
                if(!sql->sa) {
                        sql->sa = osa;
                        throw(SQL, "sql.catalog",SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to