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