Thread

  1. Re: Re: BIT/BIT VARYING status

    Adriaan Joubert <a.joubert@albourne.com> — 2000-11-05T18:52:25Z

    Peter,
    
    	I've looked at the current implementation of the bit types and still
    have some doubts concerning the following issues:
    
    1. Constants. The current behaviour just seems somewhat strange, and I
    have no idea where to fix it.
    
    test=# select B'1001';
     ?column? 
    ----------
     X9
    (1 row)
    
    test=# select B'1001'::bit;
    ERROR:  Cannot cast this expression to type 'bit'
    test=# select B'1001'::varbit;
    ERROR:  Cannot cast this expression to type 'varbit'
    test=# select 'B1001'::varbit;
     ?column? 
    ----------
     B1001
    (1 row)
    
    test=# select 'B1001'::bit;
     ?column? 
    ----------
     X9
    (1 row)
    
    test=# select X'1001'::varbit;
    ERROR:  varbit_in: The bit string 4097 must start with B or X
    test=# select 'X1001'::varbit;
         ?column?      
    -------------------
     B0001000000000001
    (1 row)
    
    test=# select 'X1001'::bit;
     ?column? 
    ----------
     X1001
    (1 row)
    
    test=# select X'1001'::bit;
    ERROR:  zpbit_in: The bit string 4097 must start with B or X
    
    Also, I have two output routines, that have been renames to zpbit_out
    and varbit_out. In fact, both will work just fine for bot bit and
    varbit, but the first prints as hex and the second as a bit string.
    Printing as hex is more compact, so good for long strings, but printing
    as a bit string is much more intuitive. One solution would be to make
    them both print to a bit string by default and define a function to
    generate a hex string. Another would be to have this under control of a
    variable. Most people who contacted me about bit strings seemed to want
    to use them for flags, so I guess the default should be to print them as
    a bit string.
    
    More for my information, if a user does not know about varbit, how does
    he cast to bit varying? 
    
    2. This is not a problem, more a question. There is no default way to
    compare bit to varbit, as in 
    
    test=# select 'b10'::bit='b10'::varbit;
    ERROR:  Unable to identify an operator '=' for types 'bit' and 'varbit'
            You will have to retype this query using an explicit cast
    
    This may be a good thing, as the comparison does depend on the lenght of
    the bit strings.
    
    3. The ^ operator seems to attempt to coerce the arguments to float8?
    
    select 'B110011'::bit ^ 'B011101'::bit;
    ERROR:  Function 'float8(bit)' does not exist
            Unable to identify a function that satisfies the given argument
    types
            You may need to add explicit typecasts
    
    4. This is a policy question. When I use the bit shift operator, this
    always shifts within the current string only. So if I do
    
    select ('B010'::bit(6) >> 2)::varbit;
     ?column?  
    -----------
     B000100
    
    I get what I would expect. But if I have a bit varying(6) field (in a
    table, this is just an example), I only get
    
    select ('B010'::varbit >> 2)::varbit;
     ?column?  
    -----------
     B000
    
    which I find counter-intuitive. I have thus added 'zpshiftright' and
    'varbitshiftright' functions. The second extends the bitstring to the
    right, while the first is the old bitshiftright function. I find this
    more intuitive at least. 
    
    Question is what a shift left function should do? Should I shorten the
    string in the case of a shift left, to keep it symmetrical to shift
    right? This seems a pure policy decision, as there are arguments for
    both behaviours, although I am a great fan of symmetry. Let me know and
    I can implement a separate function.
    
    
    I have made a start on a file for regression tests, which I append with
    the diffs for the varbit files. Please let me know what else is needed
    and where I can help.
    
    
    Thanks!
    
    Adriaan