Changeset: 54202575eb20 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=54202575eb20 Modified Files: gdk/gdk_calc_compare.h sql/server/rel_optimizer.c sql/server/rel_schema.c sql/server/rel_select.c sql/server/sql_parser.y sql/server/sql_scan.c sql/storage/bat/bat_storage.c sql/test/BugTracker-2010/Tests/ORDER_BY_over_UNION_EXCEPT_INTERSECT.Bug-2606.stable.out sql/test/Tests/identifiers.stable.err sql/test/Tests/identifiers.stable.out Branch: Oct2014 Log Message:
merged with Jan2014 diffs (truncated from 493 to 300 lines): diff --git a/gdk/gdk_calc_compare.h b/gdk/gdk_calc_compare.h --- a/gdk/gdk_calc_compare.h +++ b/gdk/gdk_calc_compare.h @@ -32,11 +32,12 @@ op_typeswitchloop(const void *lft, int t switch (tp1) { case TYPE_void: { - oid v; + oid v = oid_nil; assert(incr1 == 1); assert(tp2 == TYPE_oid || incr2 == 1); /* if void, incr2==1 */ - v = * (const oid *) lft; + if (lft) + v = * (const oid *) lft; CANDLOOP(dst, k, TPE_nil, 0, start); if (v == oid_nil || tp2 == TYPE_void) { TPE res = v == oid_nil || * (const oid *) rgt == oid_nil ? diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c --- a/sql/server/rel_optimizer.c +++ b/sql/server/rel_optimizer.c @@ -2044,14 +2044,16 @@ rel_distinct_project2groupby(int *change node *n; list *exps = new_exp_list(sql->sa), *gbe = new_exp_list(sql->sa); + rel->l = rel_project(sql->sa, rel->l, rel->exps); + for (n = rel->exps->h; n; n = n->next) { sql_exp *e = n->data; if (e->card > CARD_ATOM) { /* no need to group by on constants */ - append(gbe, e); if (!exp_name(e)) exp_label(sql->sa, e, ++sql->label); e = exp_column(sql->sa, exp_relname(e), exp_name(e), exp_subtype(e), exp_card(e), has_nil(e), 0); + append(gbe, e); } append(exps, e); } 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 @@ -1007,6 +1007,9 @@ rel_create_schema(mvc *sql, dlist *auth_ sql_error(sql, 02, "42000!CREATE SCHEMA: insufficient privileges for user '%s'", stack_get_string(sql, "current_user")); return NULL; } + if (!name) + name = auth; + assert(name); if (mvc_bind_schema(sql, name)) { sql_error(sql, 02, "3F000!CREATE SCHEMA: name '%s' already in use", name); return NULL; @@ -1016,9 +1019,7 @@ rel_create_schema(mvc *sql, dlist *auth_ sql_schema *ss = SA_ZNEW(sql->sa, sql_schema); sql_rel *ret; - ret = rel_schema(sql->sa, DDL_CREATE_SCHEMA, - dlist_get_schema_name(auth_name), - schema_auth(auth_name), 0); + ret = rel_schema(sql->sa, DDL_CREATE_SCHEMA, name, auth, 0); ss->base.name = name; ss->auth_id = auth_id; diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -3845,10 +3845,8 @@ static sql_exp * if (groupby->op != op_groupby) /* implicit groupby */ *rel = rel_project2groupby(sql, groupby); - if (!*rel) { - rel_destroy(groupby); + if (!*rel) return NULL; - } if (f == sql_where) { char *uaname = malloc(strlen(aname) + 1); diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y --- a/sql/server/sql_parser.y +++ b/sql/server/sql_parser.y @@ -1061,9 +1061,9 @@ opt_column: ; create_statement: - role_def + create role_def { $$ = $2; } | create table_def { $$ = $2; } - | view_def + | create view_def { $$ = $2; } | type_def | func_def | index_def @@ -1279,18 +1279,18 @@ CREATE [ UNIQUE ] INDEX index_name */ role_def: - create ROLE ident opt_grantor + ROLE ident opt_grantor { dlist *l = L(); - append_string(l, $3); + append_string(l, $2); + append_int(l, $3); + $$ = _symbol_create_list( SQL_CREATE_ROLE, l ); } + | USER ident WITH opt_encrypted PASSWORD string sqlNAME string SCHEMA ident + { dlist *l = L(); + append_string(l, $2); + append_string(l, $6); + append_string(l, $8); + append_string(l, $10); append_int(l, $4); - $$ = _symbol_create_list( SQL_CREATE_ROLE, l ); } - | create USER ident WITH opt_encrypted PASSWORD string sqlNAME string SCHEMA ident - { dlist *l = L(); - append_string(l, $3); - append_string(l, $7); - append_string(l, $9); - append_string(l, $11); - append_int(l, $5); $$ = _symbol_create_list( SQL_CREATE_USER, l ); } ; @@ -1725,12 +1725,12 @@ like_table: ; view_def: - create VIEW qname opt_column_list AS query_expression opt_with_check_option + VIEW qname opt_column_list AS query_expression opt_with_check_option { dlist *l = L(); + append_list(l, $2); append_list(l, $3); - append_list(l, $4); - append_symbol(l, $6); - append_int(l, $7); + append_symbol(l, $5); + append_int(l, $6); append_int(l, TRUE); /* persistent view */ $$ = _symbol_create_list( SQL_CREATE_VIEW, l ); } diff --git a/sql/server/sql_scan.c b/sql/server/sql_scan.c --- a/sql/server/sql_scan.c +++ b/sql/server/sql_scan.c @@ -983,11 +983,11 @@ valid_ident(char *s, char *dst) if (*s == '%') return 0; - /* do unescaping in the loop */ + while (*s && (*s != '"' || escaped)) { - if (*s == '"' && s[1] == '"') { + if (*s == '\\' && s[1] == '"') { escaped = !escaped; - if (!escaped) + if (escaped) dst[p++] = *s; } else if (*s == '"' && escaped) { escaped = 0; @@ -996,8 +996,6 @@ valid_ident(char *s, char *dst) escaped = 0; dst[p++] = *s; } - //if (*s == '\\') - //dst[p++] = *s; s++; if (p >= 1024) return 0; diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c --- a/sql/storage/bat/bat_storage.c +++ b/sql/storage/bat/bat_storage.c @@ -1780,38 +1780,38 @@ update_table(sql_trans *tr, sql_table *f sql_column *cc = n->data; sql_column *oc = m->data; - if (!cc->base.wtime || !cc->base.allocated) { - cc->data = NULL; - cc->base.allocated = cc->base.rtime = cc->base.wtime = 0; - continue; - } + if (cc->base.wtime && cc->base.allocated) { + assert(oc->base.wtime < cc->base.wtime); + if (store_nr_active > 1) { /* move delta */ + sql_delta *b = cc->data, *p = NULL; - assert(oc->base.wtime < cc->base.wtime); - if (store_nr_active > 1) { /* move delta */ - sql_delta *b = cc->data, *p = NULL; - - cc->data = NULL; - b->next = oc->data; - oc->data = b; - while (b && b->wtime > oldest->stime) { - p = b; - b = b->next; + cc->data = NULL; + b->next = oc->data; + oc->data = b; + while (b && b->wtime > oldest->stime) { + p = b; + b = b->next; + } + if (b && b->wtime > oldest->stime && p) { + p->next = NULL; + destroy_bat(tr, b); + } + } else { + assert(oc->base.allocated); + tr_update_delta(tr, oc->data, cc->data, cc->unique == 1); } - if (b && b->wtime > oldest->stime && p) { - p->next = NULL; - destroy_bat(tr, b); - } - } else { - assert(oc->base.allocated); - tr_update_delta(tr, oc->data, cc->data, cc->unique == 1); } oc->null = cc->null; oc->unique = cc->unique; - if (cc->storage_type && (!cc->storage_type || strcmp(cc->storage_type, oc->storage_type) != 0)) + if (cc->storage_type && (!oc->storage_type || strcmp(cc->storage_type, oc->storage_type) != 0)) oc->storage_type = sa_strdup(tr->sa, cc->storage_type); - if (cc->def && (!cc->def || strcmp(cc->def, oc->def) != 0)) + if (!cc->storage_type) + oc->storage_type = NULL; + if (cc->def && (!oc->def || strcmp(cc->def, oc->def) != 0)) oc->def = sa_strdup(tr->sa, cc->def); + if (!cc->def) + oc->def = NULL; if (oc->base.rtime < cc->base.rtime) oc->base.rtime = cc->base.rtime; diff --git a/sql/test/BugTracker-2010/Tests/ORDER_BY_over_UNION_EXCEPT_INTERSECT.Bug-2606.stable.out b/sql/test/BugTracker-2010/Tests/ORDER_BY_over_UNION_EXCEPT_INTERSECT.Bug-2606.stable.out --- a/sql/test/BugTracker-2010/Tests/ORDER_BY_over_UNION_EXCEPT_INTERSECT.Bug-2606.stable.out +++ b/sql/test/BugTracker-2010/Tests/ORDER_BY_over_UNION_EXCEPT_INTERSECT.Bug-2606.stable.out @@ -61,14 +61,18 @@ Ready. % .plan # table_name % rel # name % clob # type -% 43 # length +% 45 # length project ( | distinct union ( | | group by ( -| | | table(sys.t2606a) [ t2606a.a ] COUNT +| | | project ( +| | | | table(sys.t2606a) [ t2606a.a ] COUNT +| | | ) [ t2606a.a ] | | ) [ t2606a.a ] [ t2606a.a ], | | group by ( -| | | table(sys.t2606b) [ t2606b.a ] COUNT +| | | project ( +| | | | table(sys.t2606b) [ t2606b.a ] COUNT +| | | ) [ t2606b.a ] | | ) [ t2606b.a ] [ t2606b.a ] | ) [ t2606a.a as L.a ] ) [ L.a ] [ L.a ASC ] @@ -90,14 +94,18 @@ project ( % .plan # table_name % rel # name % clob # type -% 43 # length +% 45 # length project ( | distinct union ( | | group by ( -| | | table(sys.t2606a) [ t2606a.a ] COUNT +| | | project ( +| | | | table(sys.t2606a) [ t2606a.a ] COUNT +| | | ) [ t2606a.a ] | | ) [ t2606a.a ] [ t2606a.a ], | | group by ( -| | | table(sys.t2606b) [ t2606b.a ] COUNT +| | | project ( +| | | | table(sys.t2606b) [ t2606b.a ] COUNT +| | | ) [ t2606b.a ] | | ) [ t2606b.a ] [ t2606b.a ] | ) [ t2606a.a as L.a ] ) [ L.a ] [ L.a ASC ] @@ -119,14 +127,18 @@ project ( % .plan # table_name % rel # name % clob # type -% 43 # length +% 45 # length project ( | distinct union ( | | group by ( -| | | table(sys.t2606a) [ t2606a.a ] COUNT +| | | project ( +| | | | table(sys.t2606a) [ t2606a.a ] COUNT +| | | ) [ t2606a.a ] | | ) [ t2606a.a ] [ t2606a.a ], | | group by ( -| | | table(sys.t2606b) [ t2606b.a ] COUNT +| | | project ( +| | | | table(sys.t2606b) [ t2606b.a ] COUNT +| | | ) [ t2606b.a ] | | ) [ t2606b.a ] [ t2606b.a ] | ) [ t2606a.a as L.a ] _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list