Hi MonetDB developers and users,
sorry for this "blunt" posting, but I thought, the problem, respectively the
solution/recommendation that will hopefully be initiated by this question,
might be interesting for some more of you:
Triggered by a question from Agustin, I noticed that I (believe it or not
;-) apparently lack some knowledge of / experiences with MonetDB/MIL:
Consider you have a variable "a" holding a (possible transient) BAT, and
another variable "b" holding a second BAT, which happens to be a view of the
first one. Both BATs haven't been baptized ("rename()"), yet; hence they
still hold there default names:
var a := new(void,int).seqbase(0(a)0).insert(nil,1).insert(nil,2).access(BAT_READ);
var b := reverse(a);
print(a);
#-----------------#
# h tmp_29 # name
# void int # type
#-----------------#
[ 0@0, 1 ]
[ 1@0, 2 ]
print(b);
#-----------------#
# t tmp_29 # name
# int void # type
#-----------------#
[ 1, 0@0 ]
[ 2, 1@0 ]
Then, these BATs should be gathered in a "container"-BAT. Since (persistent)
nested BATs have disappeared (for good reasons!), we do this by gathering
the BAT's name in the container:
var c := new(void,str).seqbase(10@0);
c.insert(nil,bbpname(a)).insert(nil,bbpname(b));
print(c);
#-------------------------#
# h tmp_28 # name
# void str # type
#-------------------------#
[ 10@0, "tmp_29" ]
[ 11@0, "tmp_29" ]
Since the second BAT is only a view of the first one, they share not only
the same memory/storage, but also the same (bbp-)name; hence, they are not
distinguishable by (only) their (bbp-)names, and thus the container c actually
contains the first BAT twice iso each BAT once:
print(bat(fetch(c,0)));
#-----------------#
# h tmp_29 # name
# void int # type
#-----------------#
[ 0@0, 1 ]
[ 1@0, 2 ]
print(bat(fetch(c,1)));
#-----------------#
# h tmp_29 # name
# void int # type
#-----------------#
[ 0@0, 1 ]
[ 1@0, 2 ]
print(bbpname(a));
[ "tmp_29" ]
print(bbpname(b));
[ "tmp_29" ]
Obviously, the problem can be solved/avoided by baptizing the two BATs, and
hence making them unique "individuals":
rename(a,"BAT_a");
rename(b,"BAT_b");
print(bbpname(a));
[ "BAT_a" ]
print(bbpname(b));
[ "BAT_b" ]
c.insert(nil,bbpname(a)).insert(nil,bbpname(b));
print(c);
#-------------------------#
# h tmp_28 # name
# void str # type
#-------------------------#
[ 10@0, "tmp_29" ]
[ 11@0, "tmp_29" ]
[ 12@0, "BAT_a" ]
[ 13@0, "BAT_b" ]
print(bat(fetch(c,0)));
!ERROR: interpret_params: print(param 1): invalid BAT.
print(bat(fetch(c,1)));
!ERROR: interpret_params: print(param 1): invalid BAT.
print(bat(fetch(c,2)));
#-----------------#
# h BAT_b # name
# void int # type
#-----------------#
[ 0@0, 1 ]
[ 1@0, 2 ]
print(bat(fetch(c,3)));
#-----------------#
# t BAT_b # name
# int void # type
#-----------------#
[ 1, 0@0 ]
[ 2, 1@0 ]
My question is now:
- Is this the only solution, or am I just not aware of another command iso
bbpname() that would return unique "default" name for non-renamed view?
Of course, given the fact that only MonetDB itself has control over the
default "tmp_*" names, it is always recommendable to assign names that you
can control yourself, whenever you use a BAT's name as its only reference...
Stefan
--
| Dr. Stefan Manegold | mailto:Stefan.Manegold@cwi.nl |
| CWI, P.O.Box 94079 | http://www.cwi.nl/~manegold/ |
| 1090 GB Amsterdam | Tel.: +31 (20) 592-4212 |
| The Netherlands | Fax : +31 (20) 592-4312 |