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