Changeset: b4d7e8ed93d1 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b4d7e8ed93d1
Modified Files:
        sql/common/sql_mem.c
        sql/include/sql_mem.h
        sql/server/rel_bin.c
        sql/server/rel_select.c
        sql/test/BugTracker-2011/Tests/All
        sql/test/BugTracker-2011/Tests/ambigous_idx_name.Bug-2800.sql
        sql/test/BugTracker-2011/Tests/ambigous_idx_name.Bug-2800.stable.err
        sql/test/BugTracker-2011/Tests/ambigous_idx_name.Bug-2800.stable.out
Branch: Apr2011
Log Message:

fix bug 2800 (now idx have independent aliases during query compilation)


diffs (243 lines):

diff --git a/sql/common/sql_mem.c b/sql/common/sql_mem.c
--- a/sql/common/sql_mem.c
+++ b/sql/common/sql_mem.c
@@ -157,3 +157,17 @@
 { 
        return sa_strndup( sa, s, strlen(s));
 }
+
+char *sa_strconcat( sql_allocator *sa, const char *s1, const char *s2 )
+{
+       size_t l1 = strlen(s1);
+       size_t l2 = strlen(s2);
+       char *r = sa_alloc(sa, l1+l2+1);
+
+       if (l1) 
+               memcpy(r, s1, l1);
+       if (l2)
+               memcpy(r+l1, s2, l2);
+       r[l1+l2] = 0;
+       return r;
+}
diff --git a/sql/include/sql_mem.h b/sql/include/sql_mem.h
--- a/sql/include/sql_mem.h
+++ b/sql/include/sql_mem.h
@@ -79,6 +79,7 @@
 extern void sa_destroy( sql_allocator *sa );
 extern char *sa_strndup( sql_allocator *sa, const char *s, size_t l);
 extern char *sa_strdup( sql_allocator *sa, const char *s);
+extern char *sa_strconcat( sql_allocator *sa, const char *s1, const char *s2);
 
 #define SA_NEW( sa, type ) ((type*)sa_alloc( sa, sizeof(type)) )
 #define SA_ZNEW( sa, type ) ((type*)sa_zalloc( sa, sizeof(type)) )
diff --git a/sql/server/rel_bin.c b/sql/server/rel_bin.c
--- a/sql/server/rel_bin.c
+++ b/sql/server/rel_bin.c
@@ -483,12 +483,13 @@
                        sql_idx *i = p->value;
                        sql_exp *el = e->l;
                        sql_exp *er = e->r;
+                       char *iname = sa_strconcat(sql->sa, "%", i->base.name);
 
                        /* find out left and right */
-                       l = bin_find_column(sql->sa, left, el->l, i->base.name);
+                       l = bin_find_column(sql->sa, left, el->l, iname);
                        if (!l) {
                                swapped = 1;
-                               l = bin_find_column(sql->sa, right, el->l, 
i->base.name);
+                               l = bin_find_column(sql->sa, right, el->l, 
iname);
                                r = bin_find_column(sql->sa, left, er->l, TID);
                        } else {
                                r = bin_find_column(sql->sa, right, er->l, TID);
@@ -698,7 +699,8 @@
                        sql_idx *i = n->data;
                        stmt *sc = stmt_idxbat(sql->sa, i, RDONLY);
 
-                       sc = stmt_alias(sql->sa, sc, rnme, sa_strdup(sql->sa, 
i->base.name));
+                       /* index names are prefixed, to make them independent */
+                       sc = stmt_alias(sql->sa, sc, rnme, 
sa_strconcat(sql->sa, "%", i->base.name));
                        list_append(l, sc);
                }
        }
@@ -745,7 +747,8 @@
                        stmt *sc = stmt_idxbat(sql->sa, i, RDONLY);
                        char *rnme = sa_strdup(sql->sa, t->base.name);
 
-                       sc = stmt_alias(sql->sa, sc, rnme, sa_strdup(sql->sa, 
i->base.name));
+                       /* index names are prefixed, to make them independent */
+                       sc = stmt_alias(sql->sa, sc, rnme, 
sa_strconcat(sql->sa, "%", i->base.name));
                        list_append(l, sc);
                }
        }
@@ -1588,7 +1591,7 @@
        stmt *bits = stmt_atom_int(sql->sa, 1 + 
((sizeof(wrd)*8)-1)/(list_length(i->columns)+1));
        sql_exp *e = en->data;
        sql_exp *l = e->l;
-       stmt *idx = bin_find_column(sql->sa, sub, l->l, i->base.name);
+       stmt *idx = bin_find_column(sql->sa, sub, l->l, sa_strconcat(sql->sa, 
"%", i->base.name));
 
        /* TODO should be in key order! */
        for( en = rel->exps->h; en; en = en->next ) {
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
@@ -446,12 +446,17 @@
                append(rel->exps, exp_alias(sa, atname, c->base.name, tname, 
c->base.name, &c->type, CARD_MULTI, c->null, 0));
        }
        append(rel->exps, exp_alias(sa, atname, "%TID%", tname, "%TID%", 
sql_bind_localtype("oid"), CARD_MULTI, 0, 1));
+
        if (t->idxs.set) {
                for (cn = t->idxs.set->h; cn; cn = cn->next) {
                        sql_idx *i = cn->data;
-                       sql_subtype *t = sql_bind_localtype("int"); /* hash 
"int", TODO other types */
-
-                       append(rel->exps, exp_alias(sa, atname, i->base.name, 
tname, i->base.name, t, CARD_MULTI, 0, 1));
+                       sql_subtype *t = sql_bind_localtype("wrd"); /* hash 
"wrd" */
+                       char *iname = sa_strconcat( sa, "%", i->base.name);
+
+                       if (i->type == join_idx)
+                               t = sql_bind_localtype("oid"); 
+                       /* index names are prefixed, to make them independent */
+                       append(rel->exps, exp_alias(sa, atname, iname, tname, 
iname, t, CARD_MULTI, 0, 1));
                }
        }
 
diff --git a/sql/test/BugTracker-2011/Tests/All 
b/sql/test/BugTracker-2011/Tests/All
--- a/sql/test/BugTracker-2011/Tests/All
+++ b/sql/test/BugTracker-2011/Tests/All
@@ -5,3 +5,4 @@
 alter_incorrect_syntax_crash.Bug-2795
 crash_in_modulo_rand.Bug-2766
 nested_select.Bug-2801
+ambigous_idx_name.Bug-2800
diff --git a/sql/test/BugTracker-2011/Tests/ambigous_idx_name.Bug-2800.sql 
b/sql/test/BugTracker-2011/Tests/ambigous_idx_name.Bug-2800.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2011/Tests/ambigous_idx_name.Bug-2800.sql
@@ -0,0 +1,24 @@
+CREATE TABLE htmtest (
+              htmid    bigint       NOT NULL,
+              ra       double ,
+              decl     double ,
+              dra      double ,
+              ddecl    double ,
+              flux     double ,
+              dflux    double ,
+              freq     double ,
+              bw       double ,
+              type     decimal(1,0),
+              imageurl varchar(100),
+              comment  varchar(100),
+              CONSTRAINT htmtest_htmid_pkey PRIMARY KEY (htmid)
+);
+
+CREATE INDEX htmid ON htmtest (htmid);
+
+INSERT INTO HTMTEST (HTMID,RA,DECL,FLUX,COMMENT) VALUES (1, 1.2, 2.4, 3.2, 
'vlabla');
+
+
+UPDATE HTMTEST set COMMENT='some update' WHERE HTMID=1;
+
+drop table HTMTEST;
diff --git 
a/sql/test/BugTracker-2011/Tests/ambigous_idx_name.Bug-2800.stable.err 
b/sql/test/BugTracker-2011/Tests/ambigous_idx_name.Bug-2800.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2011/Tests/ambigous_idx_name.Bug-2800.stable.err
@@ -0,0 +1,39 @@
+stderr of test 'ambigous_idx_name.Bug-2800` in directory 
'test/BugTracker-2011` itself:
+
+
+# 13:01:42 >  
+# 13:01:42 >   mserver5  --debug=10 --set gdk_nr_threads=0  --set 
"gdk_dbfarm=/ufs/niels/scratch/rc-clean/Linux-x86_64/var/MonetDB" --set 
mapi_open=true --set mapi_port=37221 --set monet_prompt= --trace --forcemito 
--set mal_listing=2  "--dbname=mTests_test_BugTracker-2011" --set mal_listing=0 
; echo ; echo Over..
+# 13:01:42 >  
+
+# builtin opt  gdk_dbname = demo
+# builtin opt  gdk_dbfarm = 
/ufs/niels/scratch/rc-clean/Linux-x86_64/var/monetdb5/dbfarm
+# builtin opt  gdk_debug = 0
+# builtin opt  gdk_alloc_map = no
+# builtin opt  gdk_vmtrim = yes
+# builtin opt  monet_prompt = >
+# builtin opt  monet_daemon = no
+# builtin opt  mapi_port = 50000
+# builtin opt  mapi_open = false
+# builtin opt  mapi_autosense = false
+# builtin opt  default_pipe = 
inline,remap,evaluate,costModel,coercions,emptySet,aliases,mitosis,mergetable,deadcode,commonTerms,joinPath,reorder,deadcode,reduce,dataflow,history,multiplex,garbageCollector
+# builtin opt  minimal_pipe = inline,remap,deadcode,multiplex,garbageCollector
+# builtin opt  sql_optimizer = default_pipe
+# builtin opt  sql_debug = 0
+# cmdline opt  gdk_nr_threads = 0
+# cmdline opt  gdk_dbfarm = 
/ufs/niels/scratch/rc-clean/Linux-x86_64/var/MonetDB
+# cmdline opt  mapi_open = true
+# cmdline opt  mapi_port = 37221
+# cmdline opt  monet_prompt = 
+# cmdline opt  mal_listing = 2
+# cmdline opt  gdk_dbname = mTests_test_BugTracker-2011
+# cmdline opt  mal_listing = 0
+
+# 13:01:42 >  
+# 13:01:42 >  mclient -lsql -ftest -i -e --host=alf --port=37221 
+# 13:01:42 >  
+
+
+# 13:01:42 >  
+# 13:01:42 >  Done.
+# 13:01:42 >  
+
diff --git 
a/sql/test/BugTracker-2011/Tests/ambigous_idx_name.Bug-2800.stable.out 
b/sql/test/BugTracker-2011/Tests/ambigous_idx_name.Bug-2800.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2011/Tests/ambigous_idx_name.Bug-2800.stable.out
@@ -0,0 +1,53 @@
+stdout of test 'ambigous_idx_name.Bug-2800` in directory 
'test/BugTracker-2011` itself:
+
+
+# 13:01:42 >  
+# 13:01:42 >   mserver5  --debug=10 --set gdk_nr_threads=0  --set 
"gdk_dbfarm=/ufs/niels/scratch/rc-clean/Linux-x86_64/var/MonetDB" --set 
mapi_open=true --set mapi_port=37221 --set monet_prompt= --trace --forcemito 
--set mal_listing=2  "--dbname=mTests_test_BugTracker-2011" --set mal_listing=0 
; echo ; echo Over..
+# 13:01:42 >  
+
+# MonetDB 5 server v11.3.0
+# This is an unreleased version
+# Serving database 'mTests_test_BugTracker-2011', using 4 threads
+# Compiled for x86_64-unknown-linux-gnu/64bit with 64bit OIDs dynamically 
linked
+# Found 7.752 GiB available main-memory.
+# Copyright (c) 1993-July 2008 CWI.
+# Copyright (c) August 2008-2011 MonetDB B.V., all rights reserved
+# Visit http://monetdb.cwi.nl/ for further information
+# Listening for connection requests on mapi:monetdb://alf.ins.cwi.nl:37221/
+# MonetDB/SQL module loaded
+# MonetDB/GIS module loaded
+
+Ready.
+
+Over..
+
+# 13:01:42 >  
+# 13:01:42 >  mclient -lsql -ftest -i -e --host=alf --port=37221 
+# 13:01:42 >  
+
+#CREATE TABLE htmtest (
+#             htmid    bigint       NOT NULL,
+#             ra       double ,
+#             decl     double ,
+#             dra      double ,
+#             ddecl    double ,
+#             flux     double ,
+#             dflux    double ,
+#             freq     double ,
+#             bw       double ,
+#             type     decimal(1,0),
+#             imageurl varchar(100),
+#             comment  varchar(100),
+#             CONSTRAINT htmtest_htmid_pkey PRIMARY KEY (htmid)
+#);
+#CREATE INDEX htmid ON htmtest (htmid);
+#INSERT INTO HTMTEST (HTMID,RA,DECL,FLUX,COMMENT) VALUES (1, 1.2, 2.4, 3.2, 
'vlabla');
+[ 1    ]
+#UPDATE HTMTEST set COMMENT='some update' WHERE HTMID=1;
+[ 1    ]
+#drop table HTMTEST;
+
+# 13:01:42 >  
+# 13:01:42 >  Done.
+# 13:01:42 >  
+
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to