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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list