Changeset: 8804b8179901 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8804b8179901
Modified Files:
        sql/server/rel_propagate.c
        sql/server/rel_schema.c
        sql/server/rel_updates.c
        sql/server/rel_updates.h
        sql/server/sql_atom.c
        sql/server/sql_partition.c
        sql/server/sql_var.c
Branch: default
Log Message:

add 'select ' to the rel_parse_val side, reduces copying


diffs (150 lines):

diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c
--- a/sql/server/rel_propagate.c
+++ b/sql/server/rel_propagate.c
@@ -32,7 +32,7 @@ rel_generate_anti_expression(mvc *sql, s
                res = exp_ref(sql, res);
        } else if (isPartitionedByExpressionTable(mt)) {
                *anti_rel = rel_project(sql->sa, *anti_rel, NULL);
-               if (!(res = rel_parse_val(sql, sa_message(sql->sa, "select 
%s;", mt->part.pexp->exp), sql->emode, (*anti_rel)->l)))
+               if (!(res = rel_parse_val(sql, mt->part.pexp->exp, NULL, 
sql->emode, (*anti_rel)->l)))
                        return NULL;
        } else {
                assert(0);
@@ -98,7 +98,7 @@ rel_generate_anti_insert_expression(mvc 
                res = list_fetch((*anti_rel)->exps, colr);
        } else if (isPartitionedByExpressionTable(t)) {
                *anti_rel = rel_project(sql->sa, *anti_rel, 
rel_projections(sql, *anti_rel, NULL, 1, 1));
-               if (!(res = rel_parse_val(sql, sa_message(sql->sa, "select 
%s;", t->part.pexp->exp), sql->emode, (*anti_rel)->l)))
+               if (!(res = rel_parse_val(sql, t->part.pexp->exp, NULL, 
sql->emode, (*anti_rel)->l)))
                        return NULL;
                exp_label(sql->sa, res, ++sql->label);
                append((*anti_rel)->exps, res);
diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -1564,7 +1564,7 @@ sql_alter_table(sql_query *query, dlist 
                for (node *n = nt->columns.nelm; n; n = n->next) {
                        sql_column *c = n->data;
                        if (c->def) {
-                               e = rel_parse_val(sql, sa_message(sql->sa, 
"select %s;", c->def), sql->emode, NULL);
+                               e = rel_parse_val(sql, c->def, &c->type, 
sql->emode, NULL);
                        } else {
                                e = exp_atom(sql->sa, atom_general(sql->sa, 
&c->type, NULL));
                        }
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -29,7 +29,7 @@ insert_value(sql_query *query, sql_colum
                return exp_atom(sql->sa, atom_general(sql->sa, &c->type, NULL));
        } else if (s->token == SQL_DEFAULT) {
                if (c->def) {
-                       sql_exp *e = rel_parse_val(sql, sa_message(sql->sa, 
"select %s;", c->def), sql->emode, NULL);
+                       sql_exp *e = rel_parse_val(sql, c->def, &c->type, 
sql->emode, NULL);
                        if (!e || (e = exp_check_type(sql, &c->type, r ? *r : 
NULL, e, type_equal)) == NULL)
                                return sql_error(sql, 02, SQLSTATE(HY005) "%s: 
default expression could not be evaluated", action);
                        return e;
@@ -342,7 +342,7 @@ rel_inserts(mvc *sql, sql_table *t, sql_
                                                sql_exp *e = NULL;
 
                                                if (c->def) {
-                                                       e = rel_parse_val(sql, 
sa_message(sql->sa, "select %s;", c->def), sql->emode, NULL);
+                                                       e = rel_parse_val(sql, 
c->def, &c->type, sql->emode, NULL);
                                                        if (!e || (e = 
exp_check_type(sql, &c->type, r, e, type_equal)) == NULL)
                                                                return 
sql_error(sql, 02, SQLSTATE(HY005) "%s: default expression could not be 
evaluated", action);
                                                } else {
@@ -938,7 +938,7 @@ update_generate_assignments(sql_query *q
                                if (!c)
                                        return sql_error(sql, 02, 
SQLSTATE(42S22) "%s: no such column '%s.%s'", action, t->base.name, colname);
                                if (c->def) {
-                                       v = rel_parse_val(sql, 
sa_message(sql->sa, "select %s;", c->def), sql->emode, NULL);
+                                       v = rel_parse_val(sql, c->def, 
&c->type, sql->emode, NULL);
                                } else {
                                        return sql_error(sql, 02, 
SQLSTATE(42000) "%s: column '%s' has no valid default value", action, 
c->base.name);
                                }
@@ -1888,7 +1888,7 @@ copyto(sql_query *query, symbol *sq, con
 }
 
 sql_exp *
-rel_parse_val(mvc *m, char *query, char emode, sql_rel *from)
+rel_parse_val(mvc *m, char *query, sql_subtype *tpe, char emode, sql_rel *from)
 {
        mvc o = *m;
        sql_exp *e = NULL;
@@ -1903,13 +1903,14 @@ rel_parse_val(mvc *m, char *query, char 
 
        m->emode = emode;
        b = (buffer*)GDKmalloc(sizeof(buffer));
+       len += 8; /* add 'select ;' */
        n = GDKmalloc(len + 1 + 1);
        if(!b || !n) {
                GDKfree(b);
                GDKfree(n);
                return NULL;
        }
-       snprintf(n, len + 2, "%s\n", query);
+       snprintf(n, len + 2, "select %s;\n", query);
        query = n;
        len++;
        buffer_init(b, query, len);
@@ -1943,6 +1944,8 @@ rel_parse_val(mvc *m, char *query, char 
                        symbol* sq = 
sn->selection->h->data.sym->data.lval->h->data.sym;
                        sql_query *query = query_create(m);
                        e = rel_value_exp2(query, &r, sq, sql_sel | sql_values, 
ek);
+                       if (e && tpe)
+                               e = exp_check_type(m, tpe, from, e, type_cast);
                }
        }
        GDKfree(query);
diff --git a/sql/server/rel_updates.h b/sql/server/rel_updates.h
--- a/sql/server/rel_updates.h
+++ b/sql/server/rel_updates.h
@@ -22,7 +22,7 @@ sql_export sql_rel *rel_insert(mvc *sql,
 extern sql_rel *rel_delete(sql_allocator *sa, sql_rel *t, sql_rel *deletes);
 extern sql_rel *rel_truncate(sql_allocator *sa, sql_rel *t, int drop_action, 
int check_identity);
 
-extern sql_exp *rel_parse_val(mvc *m, char *query, char emode, sql_rel *from);
+extern sql_exp *rel_parse_val(mvc *m, char *query, sql_subtype *tpe, char 
emode, sql_rel *from);
 
 extern sql_rel *rel_updates(sql_query *query, symbol *sym);
 
diff --git a/sql/server/sql_atom.c b/sql/server/sql_atom.c
--- a/sql/server/sql_atom.c
+++ b/sql/server/sql_atom.c
@@ -419,7 +419,7 @@ atom2string(sql_allocator *sa, atom *a)
                        snprintf(buf, BUFSIZ, "atom2string(TYPE_%d) not 
implemented", a->data.vtype);
                } else {
                         char *r = sa_strdup(sa, p);
-                        _DELETE(p);
+                        GDKfree(p);
                         return r;
                }
        }
diff --git a/sql/server/sql_partition.c b/sql/server/sql_partition.c
--- a/sql/server/sql_partition.c
+++ b/sql/server/sql_partition.c
@@ -248,7 +248,7 @@ bootstrap_partition_expression(mvc *sql,
 
        r = rel_basetable(sql, mt, mt->base.name);
        query = mt->part.pexp->exp;
-       if ((exp = rel_parse_val(sql, sa_message(sql->sa, "select %s;", query), 
sql->emode, r)) == NULL) {
+       if ((exp = rel_parse_val(sql, query, NULL, sql->emode, r)) == NULL) {
                if (*sql->errstr) {
                        if (strlen(sql->errstr) > 6 && sql->errstr[5] == '!')
                                throw(SQL, "sql.partition", "%s", sql->errstr);
diff --git a/sql/server/sql_var.c b/sql/server/sql_var.c
--- a/sql/server/sql_var.c
+++ b/sql/server/sql_var.c
@@ -568,11 +568,11 @@ sqlvar_set_string(sql_var *var, const ch
                ValRecord *v = &a->data;
 
                if (v->val.sval)
-                       _DELETE(v->val.sval);
+                       GDKfree(v->val.sval);
                v->val.sval = new_val;
                return new_val;
        } else if (new_val) {
-               _DELETE(new_val);
+               GDKfree(new_val);
        }
        return NULL;
 }
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to