Changeset: e3860f4d426f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e3860f4d426f
Modified Files:
        sql/backends/monet5/mal_backend.h
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/rel_bin.h
        sql/backends/monet5/sql_execute.c
        sql/server/rel_propagate.c
        sql/server/rel_schema.c
        sql/server/rel_select.c
        sql/server/rel_semantic.c
        sql/server/rel_updates.c
        sql/server/rel_updates.h
        sql/server/sql_mvc.h
        sql/server/sql_partition.c
        sql/server/sql_scan.c
        sql/server/sql_scan.h
Branch: context
Log Message:

more cleanup (use scanner and parsing routines from the server were possible)


diffs (truncated from 591 to 300 lines):

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
@@ -33,7 +33,7 @@ typedef enum output_format {
 
 typedef struct backend {
        char    language;               /* 'S' or 's' or 'X' */
-       char    depth;
+       char    depth;                  /* depth >= 1 means no output for 
trans/schema statements */
        int     remote;                 /* counter to make remote function 
names unique */
        mvc     *mvc;
        stream  *out;
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
@@ -1218,88 +1218,14 @@ sql_Nop_(backend *be, const char *fname,
 }
 
 static stmt *
-rel_parse_value(backend *be, char *query, char emode)
+parse_value(backend *be, char *query, sql_subtype *tpe, char emode)
 {
-       mvc *m = be->mvc;
-       mvc o = *m;
-       stmt *s = NULL;
-       buffer *b;
-       char *n;
-       int len = _strlen(query);
-       exp_kind ek = {type_value, card_value, FALSE};
-       stream *sr;
-       bstream *bs;
-
-       m->qc = NULL;
-
-       m->caching = 0;
-       m->emode = emode;
-       b = (buffer*)GDKmalloc(sizeof(buffer));
-       n = GDKmalloc(len + 1 + 1);
-       if (b == NULL || n == NULL) {
-               GDKfree(b);
-               GDKfree(n);
-               return sql_error(m, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL);
-       }
-       snprintf(n, len + 2, "%s\n", query);
-       query = n;
-       len++;
-       buffer_init(b, query, len);
-       sr = buffer_rastream(b, "sqlstatement");
-       if (sr == NULL) {
-               buffer_destroy(b);
-               return sql_error(m, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL);
-       }
-       bs = bstream_create(sr, b->len);
-       if(bs == NULL) {
-               buffer_destroy(b);
-               return sql_error(m, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL);
-       }
-       scanner_init(&m->scanner, bs, NULL);
-       m->scanner.mode = LINE_1; 
-       bstream_next(m->scanner.rs);
-
-       m->params = NULL;
-       /*m->args = NULL;*/
-       m->argc = 0;
-       m->sym = NULL;
-       m->errstr[0] = '\0';
-
-       (void) sqlparse(m);     /* blindly ignore errors */
-       
-       /* get out the single value as we don't want an enclosing projection! */
-       if (m->sym->token == SQL_SELECT) {
-               SelectNode *sn = (SelectNode *)m->sym;
-               if (sn->selection->h->data.sym->token == SQL_COLUMN || 
sn->selection->h->data.sym->token == SQL_IDENT) {
-                       int is_last = 0;
-                       sql_rel *rel = NULL;
-                       sql_query *query = query_create(m);
-                       sql_exp *e = rel_value_exp2(query, &rel, 
sn->selection->h->data.sym->data.lval->h->data.sym, sql_sel, ek, &is_last);
-
-                       if (!rel)
-                               s = exp_bin(be, e, NULL, NULL, NULL, NULL, 
NULL, NULL); 
-               }
-       }
-       GDKfree(query);
-       GDKfree(b);
-       bstream_destroy(m->scanner.rs);
-
-       m->sym = NULL;
-       if (m->session->status || m->errstr[0]) {
-               int status = m->session->status;
-               char errstr[ERRSIZE];
-
-               strcpy(errstr, m->errstr);
-               *m = o;
-               m->session->status = status;
-               strcpy(m->errstr, errstr);
-       } else {
-               *m = o;
-       }
-       return s;
+       sql_exp *e = rel_parse_val(be->mvc, query, tpe, emode, NULL);
+       if (e) 
+               return exp_bin(be, e, NULL, NULL, NULL, NULL, NULL, NULL); 
+       return sql_error(be->mvc, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL);
 }
 
-
 static stmt *
 stmt_rename(backend *be, sql_rel *rel, sql_exp *exp, stmt *s )
 {
@@ -3199,123 +3125,15 @@ rel2bin_sample(backend *be, sql_rel *rel
        return sub;
 }
 
-stmt *
+static stmt *
 sql_parse(backend *be, sql_allocator *sa, const char *query, char mode)
 {
-       mvc *m = be->mvc;
-       mvc *o = NULL;
+       (void)sa;
+       sql_rel *r = rel_parse(be->mvc, be->mvc->session->schema, (char*)query, 
mode);
        stmt *sq = NULL;
-       buffer *b;
-       char *nquery;
-       int len = _strlen(query);
-       stream *buf;
-       bstream * bst;
-
-       if (THRhighwater())
-               return sql_error(m, 10, SQLSTATE(42000) "SELECT: too many 
nested operators");
-
-       o = MNEW(mvc);
-       if (!o)
-               return NULL;
-       *o = *m;
-
-       m->qc = NULL;
-
-       m->caching = 0;
-       m->emode = mode;
-       be->depth++;
-
-       b = (buffer*)GDKmalloc(sizeof(buffer));
-       if (b == 0) {
-               *m = *o;
-               GDKfree(o);
-               return sql_error(m, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL);
-       }
-       nquery = GDKmalloc(len + 1 + 1);
-       if (nquery == 0) {
-               *m = *o;
-               GDKfree(o);
-               GDKfree(b);
-               return sql_error(m, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL);
-       }
-       snprintf(nquery, len + 2, "%s\n", query);
-       len++;
-       buffer_init(b, nquery, len);
-       buf = buffer_rastream(b, "sqlstatement");
-       if(buf == NULL) {
-               *m = *o;
-               GDKfree(o);
-               GDKfree(b);
-               GDKfree(nquery);
-               be->depth--;
-               return sql_error(m, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL);
-       }
-       if((bst = bstream_create(buf, b->len)) == NULL) {
-               close_stream(buf);
-               *m = *o;
-               GDKfree(o);
-               GDKfree(b);
-               GDKfree(nquery);
-               be->depth--;
-               return sql_error(m, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL);
-       }
-       scanner_init( &m->scanner, bst, NULL);
-       m->scanner.mode = LINE_1; 
-       bstream_next(m->scanner.rs);
-
-       m->params = NULL;
-       m->argc = 0;
-       m->sym = NULL;
-       m->errstr[0] = '\0';
-       m->errstr[ERRSIZE-1] = '\0';
-
-       /* create private allocator */
-       m->sa = (sa)?sa:sa_create(m->eb);
-       if (!m->sa) {
-               bstream_destroy(bst);
-               *m = *o;
-               GDKfree(o);
-               GDKfree(b);
-               GDKfree(nquery);
-               be->depth--;
-               return sql_error(m, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL);
-       }
-
-       if (sqlparse(m) || !m->sym) {
-               /* oops an error */
-               snprintf(m->errstr, ERRSIZE, "An error occurred when executing "
-                               "internal query: %s", nquery);
-       } else {
-               sql_query *query = query_create(m);
-               sql_rel *r = rel_semantic(query, m->sym);
-
-               if (r && (r = rel_unnest(m,r)) != NULL && (r = rel_optimizer(m, 
r, 1)) != NULL)
-                       sq = rel_bin(be, r);
-       }
-
-       GDKfree(nquery);
-       GDKfree(b);
-       bstream_destroy(m->scanner.rs);
-       be->depth--;
-       if (m->sa && m->sa != sa)
-               sa_destroy(m->sa);
-       m->sym = NULL;
-       {
-               int status = m->session->status;
-               int sizevars = m->sizevars, topvars = m->topvars;
-               sql_var *vars = m->vars;
-               /* cascade list maybe removed */
-               list *cascade_action = m->cascade_action;
-
-               strcpy(o->errstr, m->errstr);
-               *m = *o;
-               m->sizevars = sizevars;
-               m->topvars = topvars;
-               m->vars = vars;
-               m->session->status = status;
-               m->cascade_action = cascade_action;
-       }
-       _DELETE(o);
+
+       if (r && (r = rel_unnest(be->mvc ,r)) != NULL && (r = 
rel_optimizer(be->mvc , r, 1)) != NULL)
+               sq = rel_bin(be, r);
        return sq;
 }
 
@@ -3569,8 +3387,9 @@ sql_insert_triggers(backend *be, sql_tab
 
                        if(!sql_stack_add_inserted(sql, n, t, updates))
                                return 0;
+                       be->depth++;
                        s = sql_parse(be, sql->sa, trigger->statement, 
m_instantiate);
-                       
+                       be->depth--;
                        if (!s) 
                                return 0;
                }
@@ -4156,13 +3975,7 @@ sql_delete_set_Fkeys(backend *be, sql_ke
 
                if (action == ACT_SET_DEFAULT) {
                        if (fc->c->def) {
-                               stmt *sq;
-                               char *msg, *typestr = 
subtype2string2(&fc->c->type);
-                               if(!typestr)
-                                       return sql_error(sql, 02, 
SQLSTATE(HY001) MAL_MALLOC_FAIL);
-                               msg = sa_message(sql->sa, "select cast(%s as 
%s);", fc->c->def, typestr);
-                               _DELETE(typestr);
-                               sq = rel_parse_value(be, msg, sql->emode);
+                               stmt *sq = parse_value(be, fc->c->def, 
&fc->c->type, sql->emode);
                                if (!sq) 
                                        return NULL;
                                upd = sq;
@@ -4219,13 +4032,7 @@ sql_update_cascade_Fkeys(backend *be, sq
                        upd = updates[c->c->colnr];
                } else if (action == ACT_SET_DEFAULT) {
                        if (fc->c->def) {
-                               stmt *sq;
-                               char *msg, *typestr = 
subtype2string2(&fc->c->type);
-                               if(!typestr)
-                                       return sql_error(sql, 02, 
SQLSTATE(HY001) MAL_MALLOC_FAIL);
-                               msg = sa_message(sql->sa, "select cast(%s as 
%s);", fc->c->def, typestr);
-                               _DELETE(typestr);
-                               sq = rel_parse_value(be, msg, sql->emode);
+                               stmt *sq = parse_value(be, fc->c->def, 
&fc->c->type, sql->emode);
                                if (!sq) 
                                        return NULL;
                                upd = sq;
@@ -4533,7 +4340,9 @@ sql_update_triggers(backend *be, sql_tab
 
                        if(!sql_stack_add_updated(sql, o, n, t, tids, updates))
                                return 0;
+                       be->depth++;
                        s = sql_parse(be, sql->sa, trigger->statement, 
m_instantiate);
+                       be->depth--;
                        if (!s) 
                                return 0;
                }
@@ -4800,8 +4609,9 @@ sql_delete_triggers(backend *be, sql_tab
 
                        if(!sql_stack_add_deleted(sql, o, t, tids, 
internal_type))
                                return 0;
+                       be->depth++;
                        s = sql_parse(be, sql->sa, trigger->statement, 
m_instantiate);
-
+                       be->depth--;
                        if (!s) 
                                return 0;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to