Mnesia Bug with select and disc_only_copies tables

Dan Gudmundsson <>
Tue Oct 4 16:13:54 CEST 2005


Rudolph van Graan writes:
 > Hey there,
 > 
 > Think I found a bug in mnesia select.
 > 
 > If you use
 > 
 >      select(Tab, MatchSpec, NObjects, Lock)
 > 
 > on a disc_only table, it never returns any rows (I.e. using NObjects  
 > to limit the number of rows). The same query works if you use  
 > disc_copies instead.
 > 
 > Regards,
 > 
 > Rudolph van Graan

hi

See the manual:

 For efficiency
          the NObjects is a recommendation only  and  the  result
          may  contain  anything from an empty list to all avail-
          able results.

(it is written because of dets :-)

It works here: 

1> mnesia:start().
2> mnesia:create_table(a, []).                
{atomic,ok}
6> mnesia:change_table_copy_type(schema, node(), disc_copies).        
{atomic,ok}
7> [mnesia:dirty_write({a, N,N}) || N <- lists:seq(1,1000)].
8> mnesia:change_table_copy_type(a, node(), disc_only_copies).
{atomic,ok}
14> P = ets:fun2ms(fun({a,_,A}) when A > 990 -> A end). 
16> F = fun('$end_of_table', _, Acc) -> Acc; 
           ({Recs,Cont}, Fun,Acc) -> 
	       R = mnesia:select(Cnt), 
               Fun(R, Fun, Recs ++Acc) 
        end.
17> mnesia:transaction(fun() -> 
			     Cont = mnesia:select(a, P, 10, read),      
			     F(Cont, F, []) 
		       end).
{atomic,[996,997,1000,998,994,992,993,995,999,991]}

/Dan




More information about the erlang-questions mailing list