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

Reply via email to