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